当前位置: 首页 > 知识库问答 >
问题:

无法在pyplay中移动对象

郎雪风
2023-03-14

我正在为我的计算机科学课做一个项目,在这个项目中,我们使用pyplay在屏幕上移动一个物体。我不使用pygamesprites,而是导入到pygamesprites中的图像,并使用这些图像作为自定义sprites。当我试图在屏幕上移动兔子或“玩家”对象时,它似乎确实更新了位置。这是我试图改变位置的Player对象:

class Player(object):
    def __init__(self, x, y, filename):
        self.x = x
        self.y = y
        self.image = pygame.transform.scale(pygame.image.load(filename), (150, 200))
        self.moving_left = False
        self.moving_right = False
        self.moving_up = False
        self.moving_down = False

    def moveUpdate(self):
        if self.moving_left:
            self.x -= 25
            pygame.display.update()
        if self.moving_right:
            self.y += 25
            pygame.display.update()
        if self.moving_up:
            self.y -= 25
            pygame.display.update()
        if self.moving_down:
            self.y += 25
            pygame.display.update()

    def moveEvent(self, event):
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    self.moving_left = True
                if event.key == pygame.K_RIGHT:
                    self.moving_right = True
                if event.key == pygame.K_UP:
                    self.moving_up = True
                if event.key == pygame.K_DOWN:
                    self.moving_down = True
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    self.moving_left = False
                if event.key == pygame.K_RIGHT:
                    self.moving_right = False
                if event.key == pygame.K_UP:
                    self.moving_up = False
                if event.key == pygame.K_DOWN:
                    self.moving_down = False

    def draw(self, screen):
        screen.blit(self.image, (self.x, self.y))

这是我用来运行游戏本身的类:

class Game(object):
    def __init__(self):
        self.screensize = [1000, 1000]
        self.white = [255, 255, 255]
        self.black = [0, 0, 0]
        self.screen = pygame.display.set_mode(self.screensize)
        #self.bunny = pygame.transform.scale(pygame.image.load('bunny.png'), (150, 200))
        self.clock = pygame.time.Clock()
        self.player = Player(500, 500, 'bunny.png')

    def Run(self):
        run = True
        while run:
            self.clock.tick(60)
            self.screen.fill(self.white)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                    pygame.quit()
                    exit()
                elif event.type == pygame.K_ESCAPE:
                    run = False
                    pygame.quit()
                    exit()

                # - Objects Event Handle - 
                self.player.moveEvent(event)
            # - Updates - 
            #self.player.moveUpdate()

            # - Draws - 
            self.player.draw(self.screen)
            pygame.display.flip()

game = Game()
game.Run()

共有1个答案

韩高峯
2023-03-14

播放器中删除事件循环。移动事件

class Player(object):

    # [...]

    def moveEvent(self, event):

        # for event in pygame.event.get(): <----- to be removed

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                self.moving_left = True
            if event.key == pygame.K_RIGHT:
                self.moving_right = True
            if event.key == pygame.K_UP:
                self.moving_up = True
            if event.key == pygame.K_DOWN:
                self.moving_down = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                self.moving_left = False
            if event.key == pygame.K_RIGHT:
                self.moving_right = False
            if event.key == pygame.K_UP:
                self.moving_up = False
            if event.key == pygame.K_DOWN:
                self.moving_down = False

注意,在事件循环中调用该方法,并将事件传递给该方法。该方法必须处理输入参数事件:

while run:
    self.clock.tick(60)
    self.screen.fill(self.white)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
            exit()
        elif event.type == pygame.K_ESCAPE:
            run = False
            pygame.quit()
            exit()
        # - Objects Event Handle - 
        self.player.moveEvent(event)

    # - Updates - 
    self.player.moveUpdate()
 类似资料:
  • 我已经通过HTTP脚本记录器记录了一个脚本,但当我运行脚本时,我得到的对象移动到这里错误的登录事务的采样器上。当在记录的xml中搜索相同的请求时,我可以看到它给出了一个有效的输出。有人能告诉我为什么当我运行脚本时,只有它显示这个错误。请参考以下快照。 来自录制xml的请求:录制的\u请求\u正文 来自录制xml的请求头:录制的请求头 录制xml的请求-响应:录制的请求-响应 脚本请求:脚本请求正文

  • 在mac电脑上安装composer时,使用: curl-sShttps://getcomposer.org/installer|php 然后试着像这样移动它: sudo mv php composer.phar/usr/local/bin/composer 它在告诉我: 将composer.phar重命名为/usr/local/bin/composer:没有这样的文件或目录 当我展望我的道路时:

  • 我的任务是使用LibGdx游戏引擎在java中创建自己的碰撞物理引擎。这是自上而下的,所以忽略重力。我一直在琢磨如何对物体施加力。我通过求速度随时间的变化来求加速度。下面是如何找到x分量的加速度: 是x速度,和是一个,用于在不同时间存储速度的x分量(我使用的是均值定理)。基本上,我已经找到了x分量的加速度。现在如果我施加一个力,我做加速度*质量。这就是我完全困惑的地方。 F=ma.是的,所以我能够

  • 我是Twilio的新手,我需要一些关于特定场景的帮助。一段时间以来,我一直试图为这个问题找到解决办法,但一直未能如愿。 我想使用一个移动(a)的Twilio号码打电话给移动(B)的另一个用户。我想这样做的方式,其中呼叫是由Twilio号码发起的,而不是由(a)的电话号码发起的。 换句话说,(A)从移动台拨Twilio号码,Twilio依次拨(B)并将(B)与(A)连接。 我已经将(A)拨打的Twi

  • 如果这个问题以前已经被问过,我很抱歉,但是我到处都查过了,找不到答案。 你如何做自上而下的移动pyplay? 如果我只使用矩形,这将很容易,但我将使用单个角色精灵(例如,如果我按d键使玩家向右移动,它将显示他向右移动的角色精灵并将角色向右移动)。 我所指的示例图像: 这是我的代码: 我知道这段代码可以改进,但我真的只想知道如何移动精灵。

  • 当一个包含不可移动的内容时,我不知道如何完美地转发它。