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

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

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

我正在尝试构建一个简单的类似游戏的“飞扬的小鸟”。我正在尝试将所有代码分类为类和方法。我该如何解决这个问题?是因为过早调用某些方法导致代码不起作用,还是因为缺少某些东西?如果有人尝试向我解释,我真的很喜欢。

sprites.py:

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,y,width,height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height

main.py:

from sprites import *
import pygame

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

    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))
        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()

谢谢

解决方法

有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,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))
        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()

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