我的pygame玩家精灵未移动和/或更新

2024-05-28 18:52:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试建立一个简单的“flappy鸟”一样的游戏。我试图将所有代码分类为类和方法。如何解决此问题?是因为调用某个方法太早导致代码无法工作,还是因为缺少某些东西?如果有人能给我解释一下,我会很高兴的

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

多谢各位


Tags: rectimageimportselfeventgameinitdef
1条回答
网友
1楼 · 发布于 2024-05-28 18:52:36

有两个错误。在每个帧中重新创建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()

相关问题 更多 >

    热门问题