微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用pygame,如何更新类定义的对象位置

如何解决使用pygame,如何更新类定义的对象位置

我正在尝试用Python构建Google Dinosaur游戏。我有

class Dino():
    def __init__(self,posy):
        self.score = 0
        self.isDead = False
        self.isJumping = False
        self.isDucking = False
        self.pos = (100,posy)

    def draw(self):
        dinoImport = pygame.image.load("assets\dino1.png")
        dino = pygame.transform.scale(dinoImport,(50,50))

        screen.blit(dino,self.pos)

然后我拥有游戏实际运行的主要功能

def gameplay():

    global flag
    flag = True
    color = (255,255,255)
    y = 300
    playerDino = Dino(y)

    gamespeed = 4
    ground = Ground(-1*gamespeed)

    while flag:
        screen.fill(color)
        ground.draw()
        playerDino.draw()


        pygame.display.flip()
        events = pygame.event.get()    
       
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit() 
                exit(0) 

        keys = pygame.key.get_pressed()
 
        if keys[pygame.K_s]:
               pass
        if keys[pygame.K_w]:
               y += 3
               playerDino.draw()
               
        pygame.display.update()

一切都正确放置,但是当我按w键时,恐龙的y位置不会向上移动3,它也不会移动。我到底在这里想念什么?

解决方法

恐龙的坐标存储在属性pos的元组中。您必须更改元组属性,而不是y

y += 3

playerDino.pos = (playerDino.pos[0],playerDino.pos[1] + 3)

无论如何,我建议使用pygame.Rect对象作为恐龙的位置。您可以通过pygame.Surfaceget_rect对象获得矩形。将 Surface 加载到Dino的构造函数中,而不是在每个帧中加载:

class Dino():
    def __init__(self,posy):
        self.score = 0
        self.isDead = False
        self.isJumping = False
        self.isDucking = False
        dinoImport = pygame.image.load("assets\dino1.png").convert_alpha()
        self.image = pygame.transform.scale(dinoImport,(50,50))
        self.rect = self.image.get_rect(topleft = (100,posy))

    def draw(self):
        screen.blit(self.image,self.rect)

可以通过更改playerDino 属性来更改rect的位置。由于多次调用pygame.event.get(),因此事件循环将无法正常工作。由于pygame.event.get()从队列中删除了事件,因此第二次调用不会返回任何事件。删除pygame.event.get()的第一个电话:

def gameplay():
    global flag

    color = (255,255,255)
    playerDino = Dino(300)
    gamespeed = 4
    ground = Ground(-1*gamespeed)

    clock = pygame.time.Clock()
    flag = True
    while flag:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                flag = False

        keys = pygame.key.get_pressed()
        if keys[pygame.K_s]:
               pass
        if keys[pygame.K_w]:
               playerDino.rect.y += 3

        screen.fill(color)
        ground.draw()
        playerDino.draw()
        pygame.display.flip()

    pygame.quit() 
    exit(0) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。