为了账号安全,请及时绑定邮箱和手机立即绑定

我的 pygame 播放器精灵没有移动和/或更新

我的 pygame 播放器精灵没有移动和/或更新

慕婉清6462132 2023-06-20 17:37:16
我正在尝试构建一个简单的“飞扬的小鸟”之类的游戏。我正在尝试将所有代码分类为类和方法。我该如何解决这个问题?是因为过早调用某些方法导致代码无法运行,还是因为缺少某些东西?如果有人愿意向我解释,我真的很喜欢。sprites.py:import pygameclass Player(pygame.sprite.Sprite):    def __init__(self):        pygame.sprite.Sprite.__init__(self)        self.image = pygame.Surface((50, 50))        self.image.fill((255, 255, 0))        self.rect = self.image.get_rect()        self.rect.x = 0        self.rect.y = (700 / 2)        self.movex = 0        self.movey = 0    def control(self, x, y):        self.movex += x        self.movey += y    def update(self):        self.rect.x += self.movex        self.rect.y += self.movey    def animate(self):        passclass Obstacle(pygame.sprite.Sprite):    def __init__(self, x, y, width, height):        pygame.sprite.Sprite.__init__(self)        self.x = x        self.y = y        self.width = width        self.height = heightmain.py:from sprites import *import pygameWIDTH = 700HEIGHT = 700class Game:    def __init__(self):        pygame.init()        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))        self.clock = pygame.time.Clock()        self.score = 0        self.running = True    def new(self):        pass    def events(self):        self.game_on = True        for event in pygame.event.get():            if event.type == pygame.QUIT:                self.game_on = False                self.running = False            if event.type == pygame.KEYDOWN:                if event.type == pygame.K_UP:                    self.croc.control(0, -20)    def update(self):        self.croc = Player()        self.all_sprites = pygame.sprite.Group()        self.all_sprites.add(self.croc)        self.all_sprites.update()    def draw(self):        self.screen.fill((0, 0, 0))        self.all_sprites.draw(self.screen)        pygame.display.flip()game = Game()while game.running:    game.clock.tick(60)    game.new()    game.events()    game.update()    game.draw()谢谢
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

有2个错误。Player在每一帧中重新创建对象。Game在 的构造函数中而不是在方法中创建播放器update:


class Game:

    def __init__(self):

        # [...]


        self.croc = Player()                     # <--- ADD

        self.all_sprites = pygame.sprite.Group() # <--- ADD

        self.all_sprites.add(self.croc)          # <--- ADD


    def update(self):

        # self.croc = Player()                     # <--- DELETE

        # self.all_sprites = pygame.sprite.Group() # <--- DELETE

        # self.all_sprites.add(self.croc)          # <--- DELETE

        self.all_sprites.update()

事件循环中有一个类型。.key您必须从属性而不是属性中获取密钥.type:


if event.type == pygame.K_UP:


if event.key == pygame.K_UP:

完整代码:


import pygame


class Player(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface((50, 50))

        self.image.fill((255, 255, 0))

        self.rect = self.image.get_rect()

        self.rect.x = 0

        self.rect.y = (700 / 2)

        self.movex = 0

        self.movey = 0


    def control(self, x, y):

        self.movex += x

        self.movey += y


    def update(self):

        self.rect.x += self.movex

        self.rect.y += self.movey


    def animate(self):

        pass



class Obstacle(pygame.sprite.Sprite):

    def __init__(self, x, y, width, height):

        pygame.sprite.Sprite.__init__(self)

        self.x = x

        self.y = y

        self.width = width

        self.height = height



WIDTH = 700

HEIGHT = 700


class Game:


    def __init__(self):

        pygame.init()

        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))

        self.clock = pygame.time.Clock()

        self.score = 0

        self.running = True

        self.croc = Player()

        self.all_sprites = pygame.sprite.Group()

        self.all_sprites.add(self.croc)


    def new(self):

        pass


    def events(self):

        self.game_on = True

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                self.game_on = False

                self.running = False

            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_UP:

                    self.croc.control(0, -20)


    def update(self):

        self.all_sprites.update()


    def draw(self):

        self.screen.fill((0, 0, 0))

        self.all_sprites.draw(self.screen)

        pygame.display.flip()



game = Game()


while game.running:

    game.clock.tick(60)

    game.new()

    game.events()

    game.update()

    game.draw()



查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信