Pygame问题

0 投票
1 回答
743 浏览
提问于 2025-04-17 07:26

我最近在开发一个简单的游戏,游戏里有一个方块在屏幕上移动。最近我尝试用类来整理代码,但现在这个方块却不再移动了。我不太确定哪里出了问题。以下是我的代码:

import os, sys
import pygame
from pygame.locals import *

class Player(pygame.sprite.Sprite):
    def __init__(self, xy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((40, 40))
        self.rect = pygame.Rect(500, 300, 40, 40)
        self.rect.centerx, self.rect.centery = xy
        self.moveLeft = False
        self.moveRight = False
        self.moveUp = False
        self.moveDown = False
        self.movementspeed = 6

    def up(self):
        self.moveUp = True

    def down(self):
        self.moveDown = True

    def left(self):
        self.moveLeft = True

    def right(self):
        self.moveRight = True

    def move(self, dy, dx):
        if self.rect.bottom + dy > 700:
            self.rect.bottom = 700
        elif self.rect.top + dy < 0:
            self.rect.top = 0
        elif self.rect.left + dx > 0:
            self.rect.left = 0
        elif self.rect.right + dx < 1000:
            self.rect.right = 1000

    def update(self):
        self.move(self.movementspeed, self.movementspeed)

class Game(object):
    def __init__(self):
        pygame.init()
        self.window = pygame.display.set_mode((1000, 700))
        self.clock = pygame.time.Clock()
        pygame.display.set_caption("Avoid!")
        pygame.event.set_allowed([QUIT, KEYDOWN, KEYUP])
        self.background = pygame.Surface((800, 400))
        self.background.fill((255, 255, 255))
        self.window.blit(self.background, (0, 0))
        self.sprites = pygame.sprite.RenderUpdates()
        self.player = Player((500, 300))
        self.sprites.add(self.player)

    def run(self):
        running = True
        while running:
            self.clock.tick(60)
            running = self.handleEvents()
            for sprite in self.sprites:
                sprite.update()
            self.sprites.clear(self.window, self.background)
            dirty = self.sprites.draw(self.window)
            pygame.display.update(dirty)

    def handleEvents(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                return False
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    return False
                if event.key == K_UP:
                    self.player.up
                if event.key == K_DOWN:
                    self.player.down
                if event.key == K_LEFT:
                    self.player.left
                if event.key == K_RIGHT:
                    self.player.right
            elif event.type == KEYUP:
                if event.key == K_UP:
                    self.player.up
                if event.key == K_DOWN:
                    self.player.down
                if event.key == K_LEFT:
                    self.player.left
                if event.key == K_RIGHT:
                    self.player.right

        return True

if __name__ == "__main__":
    game = Game()
    game.run()

这是我最初的代码:

import os, sys
import pygame
from pygame.locals import *

pygame.init()
mainClock = pygame.time.Clock()

WINDOWWIDTH = 1000
WINDOWHEIGHT = 700
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption("Avoid!")

BLACK = (0, 0, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)

player = pygame.Rect(500, 300, 40, 40)
playerImage = pygame.Surface((40, 40))

enemy = pygame.Rect(300, 400, 20, 20)
enemyImage = pygame.Surface((20, 20))
enemyImage.fill((RED))

food = pygame.Rect(300, 500 , 20, 20)
foodImage = pygame.Surface((20, 20))
foodImage.fill((GREEN))

class Score(pygame.sprite.Sprite):
    """A sprite for the score."""

    def __init__(self, xy):
        pygame.sprite.Sprite.__init__(self)
        self.xy = xy    # save xy -- will center our rect on it when we change the score
        self.font = pygame.font.Font(None, 50)  # load the default font, size 50
        self.color = (BLACK)         # our font color in rgb
        self.score = 0  # start at zero
        self.reRender() # generate the image

    def update(self):
        pass

    def add(self, points):
        """Adds the given number of points to the score."""
        self.score += points
        self.reRender()

    def reset(self):
        """Resets the scores to zero."""
        self.score = 0
        self.reRender()

    def reRender(self):
        """Updates the score. Renders a new image and re-centers at the initial coordinates."""
        self.image = self.font.render("%d"%(self.score), True, self.color)
        self.rect = self.image.get_rect()
        self.rect.center = self.xy



my_score = Score((75, 575))

font = pygame.font.Font(None, 36)
text = font.render("%d" % (my_score.score), 1, (10, 10, 10))
textpos = text.get_rect(centerx=windowSurface.get_width()/2)

moveLeft = False
moveRight = False
moveUp = False
moveDown = False

MOVESPEED = 6

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                moveRight = False
                moveLeft = True
            if event.key == K_RIGHT:
                moveLeft = False
                moveRight = True
            if event.key == K_UP:
                moveDown = False
                moveUp = True
            if event.key == K_DOWN:
                moveUp = False
                moveDown = True
        if event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            if event.key == K_LEFT:
                moveRight = False
                moveLeft = True
            if event.key == K_RIGHT:
                moveLeft = False
                moveRight = True
            if event.key == K_UP:
                moveDown = False
                moveUp = True
            if event.key == K_DOWN:
                moveUp = False
                moveDown = True

    windowSurface.fill(WHITE)

    if moveDown and player.bottom < WINDOWHEIGHT:
        player.top += MOVESPEED
    if moveUp and player.top > 0:
        player.top -= MOVESPEED
    if moveLeft and player.left > 0:
        player.left -= MOVESPEED
    if moveRight and player.right < WINDOWWIDTH:
        player.right +=MOVESPEED

    if player.colliderect(enemy):
        my_score.reset

    if not player.colliderect(food):
        windowSurface.blit(text, textpos)
    else:
        my_score.add(5)
        windowSurface.blit(text, textpos)


    windowSurface.blit(playerImage, player)
    windowSurface.blit(enemyImage, enemy)
    windowSurface.blit(foodImage, food)

    pygame.display.update()
    mainClock.tick(40)

之前能正常工作的代码现在似乎不行了。有没有人能告诉我这是为什么呢?

1 个回答

1

你不仅仅是改变了你第一个脚本的结构,还有很多其他的变化。以下是一些要点:

  • 你在哪里设置了玩家角色的颜色?或者你是在哪里填充角色的表面?我在你更新的版本中看不到任何角色,我觉得可能是因为你的背景颜色和角色颜色是一样的。
  • 我觉得你的 move 方法有问题。你并没有真正移动你的角色,而只是把它的位置设置到了某个点。
  • 在你的游戏循环中,你没有调用玩家的 downup 方法,你忘记在方法名后面加上 () 了。
  • 你没有给玩家的矩形设置初始位置。
  • 你从来没有把 Player.moveDownPlayer.moveUp 等设置为 false。这意味着一旦玩家开始向上移动,就永远不会停下来(而且当玩家向上移动后再向下移动时,你会遇到另一个问题)。

解决这些问题中的一个或多个应该能解决你的困扰。

撰写回答