如何在pygame中添加残像?

2024-01-13

由于角色移动是基于网格的,因此当角色从一个方格移动到另一个方格时,它们看起来有点奇怪,因为它们只是从一个方格出现到另一个方格。为了让动作感觉更自然,我想添加“残像”,以便模拟平滑的动作。

Demonstrational image: enter image description here Since my code has characters moving directly onto the next square, I don't know how to blit sprites in between.

if IDO.get_key(pygame.K_RIGHT):
    if PhaseFocus == 0 or PhaseFocus == 2:
        Reticlex +=1
    if Currently_Selected != 0 and Currently_Selected.Phase == 2:
        if Currently_Selected.x != Reticlex:
            Currently_Selected.x = Reticlex
        if Currently_Selected.x != Reticley:
            Currently_Selected.y = Reticley

if IDO.get_key(pygame.K_LEFT):
    if PhaseFocus == 0 or PhaseFocus == 2:
        Reticlex -=1
    if Currently_Selected != 0 and Currently_Selected.Phase == 2:
        if Currently_Selected.x != Reticlex:
            Currently_Selected.x = Reticlex
        if Currently_Selected.x != Reticley:
            Currently_Selected.y = Reticley

当当前选择的角色处于第二阶段(携带)时,他们应该有这些残像。


让我们看看如何做到这一点。

第 1 步:基本设置

我们从一个“空”的 pygame 游戏开始,如下所示:

import pygame

def main():
    screen = pygame.display.set_mode((640, 480))
    clock = pygame.time.Clock()
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        screen.fill((30, 30, 30))
        pygame.display.flip()
        clock.tick(60)

if __name__ == '__main__':
    main()

我们有一个Clock,单个游戏循环并处理QUIT事件。我总是存储事件event.get()在变量中,以防我想再次迭代它们,例如当一个Sprite想要监听一个事件。总是打电话event.get()每帧仅一次!


第 2 步:网格

我们想要一个基于网格的游戏,所以让我们画一个网格。此外,我们还存储了一堆Rects 在一个列表中,这样我们就可以很容易地查找屏幕坐标一个物体的。我们希望将对象置于其图块的中心,因此使用Rect类将为我们做肮脏的工作。

import pygame

TILESIZE = 32
GRID_W, GRID_H = (20, 15)

def create_grid():
    surf = pygame.Surface((TILESIZE * GRID_W, TILESIZE * GRID_H))
    surf.set_colorkey((2, 2, 2))
    surf.fill((2, 2, 2))
    grid = []
    for y in range(GRID_H):
        line = []
        for x in range(GRID_W):
            r = pygame.Rect(x * TILESIZE, y * TILESIZE, TILESIZE, TILESIZE)
            line.append(r)
            pygame.draw.rect(surf, pygame.Color('grey'), r, 1)
        grid.append(line)

    return grid, surf

def main():
    screen = pygame.display.set_mode((TILESIZE * GRID_W, TILESIZE * GRID_H))
    clock = pygame.time.Clock()
    grid, grid_surf = create_grid()
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        screen.fill((30, 30, 30))
        screen.blit(grid_surf, (0, 0))
        pygame.display.flip()
        clock.tick(60)

第三步:网格上有东西在移动

我们现在创建一个在这个网格上移动的演员。在这种情况下,这是一个简单的Sprite每秒都在移动。

import pygame
import random

TILESIZE = 32
GRID_W, GRID_H = (20, 15)
LOOKUP = None

class Actor(pygame.sprite.Sprite):
    def __init__(self, grid_pos):
        super().__init__()
        self.image = pygame.Surface((TILESIZE // 2, TILESIZE // 2))
        self.rect = self.image.get_rect()
        self.pos = pygame.Vector2()
        self.update_pos(grid_pos)
        self.image.fill(pygame.Color('dodgerblue'))
        self.timeout = 1000

    def update_pos(self, grid_pos):
        self.grid_pos = grid_pos
        self.rect.center = get_grid_rect(grid_pos).center
        self.pos = pygame.Vector2(self.rect.topleft)

    def move_random(self):
        d = random.choice([-1, 1])
        x, y = self.grid_pos
        if random.randint(0, 2):
            x += d
        else:
            y += d
        self.update_pos((x, y))

    def update(self, events, dt):
        self.timeout -= dt
        if self.timeout <= 0:
            self.timeout = 1000
            self.move_random()

def get_grid_rect(pos):
    x, y = pos
    return LOOKUP[y][x]

def create_grid():
    surf = pygame.Surface((TILESIZE * GRID_W, TILESIZE * GRID_H))
    surf.set_colorkey((2, 2, 2))
    surf.fill((2, 2, 2))
    grid = []
    for y in range(GRID_H):
        line = []
        for x in range(GRID_W):
            r = pygame.Rect(x * TILESIZE, y * TILESIZE, TILESIZE, TILESIZE)
            line.append(r)
            pygame.draw.rect(surf, pygame.Color('grey'), r, 1)
        grid.append(line)

    return grid, surf

def main():
    screen = pygame.display.set_mode((TILESIZE * GRID_W, TILESIZE * GRID_H))
    dt, clock = 0, pygame.time.Clock()
    grid, grid_surf = create_grid()
    global LOOKUP 
    LOOKUP = grid
    sprites = pygame.sprite.Group(Actor((9, 6)))
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        sprites.update(events, dt)
        screen.fill((30, 30, 30))
        screen.blit(grid_surf, (0, 0))
        sprites.draw(screen)
        pygame.display.flip()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()

第四步:平稳移动

我们不是总是将 Actor 绘制在图块的中心,而是设置了一个target_grid_pos当我们想要移动时。每一帧,我们都会稍微移动 Actor,直到到达目标图块。我们使用 pygame 的Vector2类,它是lerp and distance_to方法。

import pygame
import random

TILESIZE = 32
GRID_W, GRID_H = (20, 15)
LOOKUP = None

class Actor(pygame.sprite.Sprite):
    def __init__(self, grid_pos):
        super().__init__()
        self.image = pygame.Surface((TILESIZE // 2, TILESIZE // 2))
        self.rect = self.image.get_rect()
        self.pos = pygame.Vector2()
        self.update_pos(grid_pos)
        self.image.fill(pygame.Color('dodgerblue'))
        self.timeout = 1000

    def update_pos(self, grid_pos):#
        self.target_pos = None
        self.target_grid_pos = None
        self.grid_pos = grid_pos
        self.rect.center = get_grid_rect(grid_pos).center
        self.pos = pygame.Vector2(self.rect.center)

    def move_random(self):
        d = random.choice([-1, 1])
        x, y = self.grid_pos
        if random.randint(0, 2):
            x += d
        else:
            y += d
        self.target_pos = pygame.Vector2(get_grid_rect((x, y)).center)
        self.target_grid_pos = (x, y)

    def update(self, events, dt):
        self.timeout -= dt
        if self.timeout <= 0:
            self.timeout = 1000
            self.move_random()
        if self.target_grid_pos:
            self.pos = self.pos.lerp(self.target_pos, 0.1)
            if self.pos.distance_to(self.target_pos) < 1:
                self.update_pos(self.target_grid_pos)
        self.rect.center = self.pos

def get_grid_rect(pos):
    x, y = pos
    return LOOKUP[y][x]

def create_grid():
    surf = pygame.Surface((TILESIZE * GRID_W, TILESIZE * GRID_H))
    surf.set_colorkey((2, 2, 2))
    surf.fill((2, 2, 2))
    grid = []
    for y in range(GRID_H):
        line = []
        for x in range(GRID_W):
            r = pygame.Rect(x * TILESIZE, y * TILESIZE, TILESIZE, TILESIZE)
            line.append(r)
            pygame.draw.rect(surf, pygame.Color('grey'), r, 1)
        grid.append(line)

    return grid, surf

def main():
    screen = pygame.display.set_mode((TILESIZE * GRID_W, TILESIZE * GRID_H))
    dt, clock = 0, pygame.time.Clock()
    grid, grid_surf = create_grid()
    global LOOKUP 
    LOOKUP = grid
    sprites = pygame.sprite.Group(Actor((9, 6)))
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        sprites.update(events, dt)
        screen.fill((30, 30, 30))
        screen.blit(grid_surf, (0, 0))
        sprites.draw(screen)
        pygame.display.flip()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()

第5步:添加效果

每 300 毫秒,我们创建一个 Actor 图像的副本,将其复制到 Actor 的位置,并确保在 200 毫秒后将其删除。在真实的游戏中,您可能想要缓存图像或使用预渲染的图像。

我切换了Group for LayeredUpdates所以我们可以确保原始图像始终绘制在“阴影”上方。

我还添加了一张图片(来自rltiles http://rltiles.sf.net)而不是一个简单的矩形,因此在这个演示中看起来更好。

import pygame
import random
import gzip
import base64

TILESIZE = 64
GRID_W, GRID_H = (10, 7)
LOOKUP = None

class Shadow(pygame.sprite.Sprite):
    def __init__(self, source):
        super().__init__()
        self._layer = 5
        self.image = source.image.copy().convert_alpha()
        self.image.fill((0, 0, 200, 100), special_flags=pygame.BLEND_ADD)
        self.rect = source.rect.copy()
        self.timeout = 200

    def update(self, events, dt):
        self.timeout -= dt
        if self.timeout <= 0:
            self.kill()

class Actor(pygame.sprite.Sprite):
    def __init__(self, grid_pos):
        super().__init__()
        self._layer = 10
        data, size = gzip.decompress(base64.b64decode(HYDRA)), (64, 64)
        self.image = pygame.image.fromstring(data, size, "RGB")
        self.image.set_colorkey((71, 108, 108))
        self.rect = self.image.get_rect()
        self.pos = pygame.Vector2()
        self.update_pos(grid_pos)
        self.timeout = 1000
        self.shadow_timeout = 100

    def update_pos(self, grid_pos):#
        self.target_pos = None
        self.target_grid_pos = None
        self.grid_pos = grid_pos
        self.rect.center = get_grid_rect(grid_pos).center
        self.pos = pygame.Vector2(self.rect.center)

    def move_random(self):
        d = random.choice([-1, 1])
        x, y = self.grid_pos
        if random.randint(0, 2):
            x += d
        else:
            y += d
        self.target_pos = pygame.Vector2(get_grid_rect((x, y)).center)
        self.target_grid_pos = (x, y)

    def update(self, events, dt):
        self.timeout -= dt
        if self.timeout <= 0:
            self.timeout = 1000
            self.move_random()
        if self.target_grid_pos:
            self.shadow_timeout -= dt
            if self.shadow_timeout <= 0:
                self.shadow_timeout = 100
                self.groups()[0].add(Shadow(self))
            self.pos = self.pos.lerp(self.target_pos, 0.1)
            if self.pos.distance_to(self.target_pos) < 1:
                self.update_pos(self.target_grid_pos)
        self.rect.center = self.pos

def get_grid_rect(pos):
    x, y = pos
    return LOOKUP[y][x]

def create_grid():
    surf = pygame.Surface((TILESIZE * GRID_W, TILESIZE * GRID_H))
    surf.set_colorkey((2, 2, 2))
    surf.fill((2, 2, 2))
    grid = []
    for y in range(GRID_H):
        line = []
        for x in range(GRID_W):
            r = pygame.Rect(x * TILESIZE, y * TILESIZE, TILESIZE, TILESIZE)
            line.append(r)
            pygame.draw.rect(surf, pygame.Color('grey'), r, 1)
        grid.append(line)

    return grid, surf

def main():
    screen = pygame.display.set_mode((TILESIZE * GRID_W, TILESIZE * GRID_H))
    dt, clock = 0, pygame.time.Clock()
    grid, grid_surf = create_grid()
    global LOOKUP 
    LOOKUP = grid
    sprites = pygame.sprite.LayeredUpdates(Actor((4, 3)))
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        sprites.update(events, dt)
        screen.fill((30, 30, 30))
        screen.blit(grid_surf, (0, 0))
        sprites.draw(screen)
        pygame.display.flip()
        dt = clock.tick(60)

HYDRA = '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'

if __name__ == '__main__':
    main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在pygame中添加残像? 的相关文章

  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar

随机推荐

  • 将数据从视图传递到控制器

    在 ASP NET MVC 应用程序中 我正在为管理员制定接受或拒绝新成员的逻辑 我显示了成员列表和两个按钮 接受 和 拒绝 如下所示 tr td Username td td tr td Firstname td td etc tr td
  • 使用新的 MediaCodec 库在 Android 上进行视频压缩

    在我的应用程序中 我尝试上传用户从图库中选择的一些视频 问题是 通常 Android 视频文件太大而无法上传 因此我们希望首先通过较低的比特率 分辨率来压缩它们 我刚刚听说新的媒体编解码器 http developer android co
  • 在处理 HTML 表单时显示 jQuery 对话框 onSubmit

    我有一个 HTML 表单 允许用户添加最多 X MB 的附件 由于用户的连接速度各不相同 我想显示一个对话框 其中显示 您的请求正在处理 请勿离开此页面 成功提交表单后 此对话框将关闭 不是逐字逐句 但类似 该表单会发送给自身并使用 PHP
  • Eclipse:有没有办法让 Eclipse 输出运行程序的命令?

    我在 Eclipse 中遇到了一些构建问题 因为它在 Eclipse 中运行我的应用程序运行得很好 但由于某种原因 当尝试使用 gt java MyClass 由于找不到该类 它最终无法运行 这没有任何意义 所以我想知道是否有一种方法可以让
  • 错误“必需:找到字符串:字符串?” Kotlin 和 Android Studio

    正如标题所示 我在 var myNote Note id title note ServerValue TIMESTAMP 行的 id 下出现红色下划线 错误 必需 找到字符串 字符串 Kotlin 和 Android Studio cla
  • 从浏览器中的udp端口读取

    除了 Java Applet 之外 我们还有什么可以从 UDP 套接字读取数据的方法吗 我知道 websockets 是 TCP 套接字 但我需要通过 udp 套接字 HTML5 中的任何东西或任何东西与服务器通信 我从以下位置查看了这篇文
  • Angular2 限制模板驱动输入字段中的空白

    前言 我并不想使用反应形式 限制 Angular2 中空白的正确方法是什么 我懂了this https stackoverflow com questions 27322826 angular restriction to not allo
  • FirebaseInstanceIdService 已弃用

    希望大家都知道这个类 用于在 firebase 通知令牌刷新时获取通知令牌 我们从此类中获取刷新的令牌 通过以下方法 Override public void onTokenRefresh Get updated InstanceID to
  • OCaml 中的“Eval”字符串

    我正在尝试 评估 表示 OCaml 中的 OCaml 表达式的字符串 我想做一些与 Python 类似的事情eval https docs python org 3 library functions html eval 到目前为止我还没有
  • 为什么相同的Python代码有不同的时钟时间?

    我正在使用以下 python 代码对我的服务器进行基准测试 import time initial clock time clock res 0 for i in range 1 10000000 res i i print time cl
  • 无法绑定到具有嵌套(匿名)类型的 pyxb 类

    我按照以下指示进行操作这个线程 https stackoverflow com questions 17584287 unable binding to pyxb classes with nested anonymous types 并从
  • 使用 Zlib for gzip 压缩 ruby​​ 中的大文件

    我有一个非常大的文件 大约 2亿行数据 我想用 Zlib 库来压缩它 特别是使用 Writer 一次一页地阅读每一行似乎需要相当多的时间 有更好的方法来实现这一点吗 这是我现在所拥有的 require zlib Zlib GzipWrite
  • 如果文件不存在,如何激活 Maven 配置文件?

    我使用的是 Maven 3 2 3 如果文件系统上不存在文件 如何激活配置文件 我尝试过以下方法 但发现
  • VS2010 编辑样式表 - 操作无法完成。未指定的错误

    最近我注意到 当我使用 VS2010 创建 Web 应用程序并向解决方案添加样式表时 我无法使用 vs2010 默认 css 编辑器打开样式表 我尝试进行修复 但没有效果 回想起来 问题是在我加载 HTML 5 标准补丁的时候开始的 有关如
  • 如何获取与另一个像素成一定角度的像素值?

    我正在尝试实现一种方法 其中我必须获取所有这些像素的值 这些像素通过像素 i j 以一定角度形成一条线 考虑以下代码片段 sum image getpixel i 7 j 2 image getpixel i 6 j 2 image get
  • 递归二叉搜索树插入

    这是我的第一个 java 程序 但我已经使用 c 几年了 我写了我认为应该有效的内容 但实际上却无效 所以我有一个规定 必须为这个调用编写一个方法 tree insertNode value 其中 value 是一个 int 出于显而易见的
  • 从隔离函数调用异步函数

    我正在尝试从 Isolate 函数调用异步函数 class IsolateExample final ReceivePort port new ReceivePort IsolateExample Isolate spawn isolate
  • 如何在 laravel dompdf 中自定义字体和页面?

    我从这里得到 https github com barryvdh laravel dompdf https github com barryvdh laravel dompdf 我的控制器是这样的 public function listd
  • 如何绘制survreg(R的包生存)生成的生存曲线?

    我正在尝试根据生存数据拟合并绘制威布尔模型 该数据只有一个协变量 即从 2006 年到 2010 年运行的队列 那么 对于在后面的两行代码中添加什么来绘制 2010 年队列的生存曲线 有什么想法吗 library survival s lt
  • 如何在pygame中添加残像?

    由于角色移动是基于网格的 因此当角色从一个方格移动到另一个方格时 它们看起来有点奇怪 因为它们只是从一个方格出现到另一个方格 为了让动作感觉更自然 我想添加 残像 以便模拟平滑的动作 Demonstrational image Since