【问题标题】:Pygame: Sprite changing due to direction of movementPygame:精灵因运动方向而改变
【发布时间】:2009-04-09 12:01:58
【问题描述】:

我昨天刚开始学习如何使用 pygame。我读过这本非常有用的书,并遵循了它的所有教程、示例和内容。我想尝试制作一个非常简单的横向卷轴/平台游戏,但是这本书很快就进入了 3D 建模,没有说明如何为上下左右移动制作变化的精灵以及如何循环播放动画图像。

我今天花了所有时间试图让一个精灵显示并能够上下左右移动。但由于脚本简单,它使用静态图像并且拒绝更改。

谁能给我一些关于如何更改精灵的知识。或者发给我一个教程?

每个参考和尝试它的人一直在使用生成的形状,所以我永远无法使用它们。

非常感谢任何帮助。

补充:在弄清楚如何在我的场景中放置复杂的动画之前,我想知道如何让我的“播放器”更改为关于我向左或向右按​​下的不动图像。如果人们知道它真的很复杂,可能是对角线。

添加:这是我迄今为止汇总的内容。 http://animania1.ca/ShowFriends/dev/dirmove.rar 是否有可能让方向/动作设置动作的列,并让小列设置代码也让它循环下来做动画? (或者那会是对效率的严重误用?)

【问题讨论】:

  • 我已经有一段时间没有使用 pygame 了,但是我在这个教程中遇到了一些运气:Hulk want animation! 和这个类:animsprite.py 出于好奇,你在使用哪本书?由于没有时间和好的材料,我最终放弃了。
  • 这有点好笑。我也发现了绿巨人实验的东西。我试图让它向上、向下、向左、向右移动,但我从来没有成功过。书:McGugan - 使用 Python 和 Pygame 开始游戏开发我用它做了这个:animania1.ca/ShowFriends/antgame.rar 包括图片

标签: python 2d pygame sprite


【解决方案1】:

这是一个愚蠢的例子,当你按下左/右时,它会在 spritesheet 的前两个图像之间切换:

import pygame

quit = False
pygame.init()
display = pygame.display.set_mode((640,480))
sprite_sheet = pygame.image.load('sprite.bmp').convert()

# by default, display the first sprite
image_number = 0

while quit == False:
    event = pygame.event.poll()
    no_more_events = True if event == pygame.NOEVENT else False

    # handle events (update game state)
    while no_more_events == False:
        if event.type == pygame.QUIT:
            quit = True
            break
        elif event.type == pygame.NOEVENT:
            no_more_events = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                image_number = 0
            elif event.key == pygame.K_RIGHT:
                image_number = 1

        event = pygame.event.poll()

    if quit == False:
        # redraw the screen
        display.fill(pygame.Color('white'))
        area = pygame.Rect(image_number * 100, 0, 100, 150)
        display.blit(sprite_sheet, (0,0), area)
        pygame.display.flip()

我以前从未真正使用过 Pygame,所以也许这段代码不应该被当作一个例子。不过我希望它显示了基础知识。

为了更完整,我应该在更新之前等待一段时间,例如控制我每秒只更新 60 次。

编写一个可以简化工作的精灵类也很方便。您将在构造函数中传递精灵帧的大小,并且您将拥有像 update()draw() 这样的方法,它们会自动完成选择下一帧、对精灵进行 blitting 等工作。

Pygame 似乎为此提供了一个基类:link text

【讨论】:

  • 太棒了。效果很好。现在。我刚在想。如果是这样的话。我会拥有它,所以它基本上作为网格类型系统运行。单子上的左右是具体的动作然后循环一定数量的帧吗?我会手动设置每个动作的帧数。
  • 对不起,我没听懂你的问题。
  • 好吧,代码只是说数字的每一次变化都是多少精灵空间。所以在我的代码(上面链接)中,我将它用于运行和动作框架。但它们不是动画的。在设置精灵编号后,是否有办法让另一个代码循环向下。 ...
  • 为了制作一个动作的动画。例如。可以说'1'向左运行​​。动画是一个 4 帧的循环。所以在设置 '1' 之后,它会向下循环 3 个精灵并返回到第一个精灵,直到指定另一列。
【解决方案2】:

老兄,你唯一要做的就是离场

导入 pygame 和所有其他需要的东西 输入代码和东西............然后 当涉及到你做一个 spri 时

class .your class nam here. (pygame.sprite.Sprite):
     def __init__(self):
          pygame.sprite.Sprite.init(self)
          self.image=pygame.image.load(your image and path)
          self.rect=self.image.get_rect()
          x=0
          y=0

          # any thing else is what you want like posistion and other variables

     def update(self):
          self.rect.move_ip((x,y))

就是这样!!!!但这不是结束。如果你这样做,你只会制作精灵 移动它你需要

【讨论】:

    【解决方案3】:

    我对 Pygame 了解不多,但我使用过 SDL(Pygame 所基于的)。

    如果你使用Surface.blit()link text

    您可以使用可选的area 参数来选择要绘制曲面的哪个部分。 因此,如果您将作为动画一部分的所有图像放在一个文件中,您可以选择要绘制的图像。 这叫做“剪辑”。

    我猜你会有一个游戏循环来更新游戏状态(如果需要,更改精灵的当前图像),然后使用它们的状态绘制精灵。

    【讨论】:

    • 所以你是说我会在整个精灵表中使用 1 张图像,并让它在每个滴答声上划出一个精灵部分?如果精灵是 150p 高和 100px 宽,代码会是什么样子?
    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2017-09-13
    • 2014-05-23
    相关资源
    最近更新 更多