【问题标题】:Pygame player spawnPygame 玩家生成
【发布时间】:2022-11-13 06:58:56
【问题描述】:

我正在制作游戏并且玩家生成已关闭我已经尝试过教程但我没有找到任何东西这是我的代码和照片我尝试过使用代码但我似乎无法找到如何更改我的玩家生成请帮助我被困

from pickle import FALSE
import pygame
 
from pygame.locals import *
 
pygame.init()
Clock = pygame.time.Clock()
fps = 60
 
 
screen_width =  800
screen_height = 800
 
screen = pygame.display.set_mode((screen_width,screen_height))
pygame.display.set_caption('Platformer')
 
#define game variables
tile_size = 40
#load images
 
bg_img = pygame.image.load("sky.png")
sun_img = pygame.image.load("sun.png")
 
 
 
 
 
#draw player onto the screen
class Player():
    def __init__(self, x, y):
        self.images_right = []
        self.images_left = []
        self.index = 0
        self.count = 0
        for num in range (1,3):
            img_right = pygame.image.load(f'guy{num}.png')
            img_right = pygame.transform.scale(img_right, (30, 60))
            img_left = pygame.transform.flip(img_right, True, False)
            self.images_right.append(img_right)
            self.images_left.append(img_left)
        self.image = self.images_right[self.index]
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.width = self.image.get_width()
        self.height = self.image.get_height()
        self.vel_y = 0
        self.jumped = False
        self.direction = 0
  
    def update(self):
        dx = 0        
        dy = 0
        walk_cooldown = 15
 
        #draw player onto the screen
        key = pygame.key.get_pressed()
        if key[pygame.K_SPACE] and self.jumped == False:
            self.vel_y = -15
            self.jumped = True
        if key[pygame.K_SPACE] == False: 
             self.jumped = False
        if key[pygame.K_RIGHT]:
            dx += 5
            self.count += 1
            self.direction = 1
        if key[pygame.K_LEFT]:
            dx -= 5
            self.count += 1
            self.direction = -1
        if key[pygame.K_LEFT] == False and key[pygame.K_RIGHT] == False:
            self.counter = 0
            self.index = 0
            if self.direction == 1:
                self.image = self.images_right[self.index]
            if self.direction == -1:
                self.image = self.images_left[self.index]
 
        #handle Animation
         
        if self.count > walk_cooldown:
            self.count = 0
            self.index += 1
            if self.index >= len(self.images_right):
                self.index = 0
            if self.direction == 1:
                self.image = self.images_right[self.index]
            if self.direction == -1:
                self.image = self.images_left[self.index]
            
             
 
 
 
        #add gravity
        self.vel_y += 1.5
        if self.vel_y > 10:
            self.vel_y = 10
        dy += self.vel_y
           
 
        #check for collision
        for tile in world.tile_list:                                                                      
            # check for collision in yt direction
            if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height):
                # check if below the ground i.e jumping
                if self.vel_y < 0:
                    dy = tile[1].bottom - self.rect.top    
                if self.vel_y >= 0:
                    dy = tile[1].top - self.rect.bottom 
                 
              
 
 
 
 
 
         
        #update player coordinates
        self.rect.x += dx
        self.rect.y += dy
        if self.rect.bottom > screen_height:
            self.rect.bottom = screen_height
            dy = 0
         
             
        screen.blit(self.image, self.rect)
        pygame.draw.rect(screen, (255, 0, 255), self.rect, 2)
 
 
 
 
class World():
   def __init__(self, data):
        self.tile_list = []
 
        #load images
        dirt_img = pygame.image.load("dirt.png")
        grass_img = pygame.image.load("grass.png")
         
        row_count = 0
        for row in data: 
            col_count = 0
            for tile in row:
                if tile == 1:
                    img = pygame.transform.scale(dirt_img, (tile_size, tile_size)) 
                    img_rect = img.get_rect()
                    img_rect.x = col_count * tile_size
                    img_rect.y = row_count * tile_size
                    tile = (img, img_rect) 
                    self.tile_list.append(tile)              
                if tile == 2:
                    img = pygame.transform.scale(grass_img, (tile_size, tile_size)) 
                    img_rect = img.get_rect()
                    img_rect.x = col_count * tile_size
                    img_rect.y = row_count * tile_size
                    tile = (img, img_rect) 
                    self.tile_list.append(tile)              
                col_count += 1
            row_count += 1
 
   def draw(self):
        for tile in self.tile_list:
            screen.blit(tile[0], tile[1])
            pygame.draw.rect(screen, (255, 255, 255), tile[1], 2 )
          
 
 
     
  
world_data = world_data = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,],
[1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1,], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 2, 2, 1,], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 0, 0, 1,], 
[1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 1,], 
[1, 7, 0, 0, 2, 2, 2, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1,], 
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 1,], 
[1, 0, 2, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,], 
[1, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 1,], 
[1, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1,],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,],  
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 1,], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 1,], 
[1, 0, 0, 0, 0, 0, 2, 2, 2, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1,], 
[1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],  
[1, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,], 
[1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,]
]
 
 
 
player = Player(100, screen_height - 130)
world = World(world_data)
 
 
 
run = True
while run:
     
    Clock.tick(fps)
 
    screen.blit(bg_img, (0,0))
    screen.blit(sun_img, (100,100))
 
    world.draw()
 
    player.update()
 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
             
 
    pygame.display.update()
 
pygame.quit()

我以为玩家产卵在世界数据列表下,但那是他在左太右产卵的地方他没有在我制作的瓷砖上产卵

【问题讨论】:

  • 100, screen_height - 130 是播放器矩形的左上角位置

标签: python pygame


【解决方案1】:

在您的代码中,指定矩形的左上角位置:

self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y

一个pygame.Rect 对象有很多虚拟属性:

x,y
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
size, width, height
w,h

例如,如果要指定底部中心:

self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y

您可以将位置传递给pygame.Surfaceget_rect 函数:

self.rect = self.image.get_rect(midbottom = (x, y))

【讨论】:

    【解决方案2】:

    所以目前播放器的 x 和 y 坐标是 Player 类的参数。创建 Player 实例时使用的参数是 100 和 screen_height - 130。 x 坐标 100 表示播放器左侧距离屏幕左侧 100 像素,y 坐标 800 (屏幕高度)- 130 = 670。因此,播放器的顶部比屏幕顶部低 670 像素。

    我发现将其视为有点像使用笛卡尔坐标系在图形上绘制点很有帮助。在这种情况下,您要绘制的点是图像的左上角。但是,不同之处在于,在传统图形中,原点(即 0、0)位于图形的左下角,而在 pygame 上它位于左上角。

    这是 Desmos 上的一个例子:

    图表上的点代表播放器的左上角。该图和 pygame 之间的唯一区别是 y 坐标是负数,原因在上一段中描述。

    希望这可以帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多