Pygame - 在保持单独功能的同时创建具有相同功能的多行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pygame - 在保持单独功能的同时创建具有相同功能的多行相关的知识,希望对你有一定的参考价值。

我正在为我的cs类创建一个游戏,模型是Tron。基本上,我让我的两个球员一直在前进,他们可以左转或右转(以90°角度),同时在他们后面创建线条。我想创建一个函数,在给定玩家的最后位置时绘制这些线。然而,我无法弄清楚的是如何在玩家转动的同时创建新的线条,同时保持旧的线条正常运行(我会稍微了解这意味着什么)。此外,由于我每次都会从同一个变量中调用这个“绘制线”函数,我是否可以通过调用一个变量来检测播放器与任何给定行之间的冲突,即使这些行在技术上都不同?这是一本词典的优化情况吗?

到目前为止,我和我的伙伴已经尝试过延长一个矩形,创建一个列表(虽然我在这个领域没有太多经验,所以也许我只是把它搞砸了)以及其他字面上创建多个变量......

My code(如果您决定检查代码并玩游戏,请记住,说明屏幕中的下一个按钮因某些原因被破坏并需要点击垃圾邮件)。

答案

您可以这样做:使用pygame.Rects作为行,因为它们具有有用的碰撞检测方法。当玩家移动时,你只需增加当前矩形的大小,当方向改变时,你可以将这个矩形附加到一个rects列表并创建一个新的。对于碰撞检测,您将遍历rects列表并使用播放器rect的.colliderect方法。

这是一个完整的解决方案:

import pygame as pg
from pygame.math import Vector2


def main():
    screen = pg.display.set_mode((800, 600))
    clock = pg.time.Clock()

    background_color = (30, 30, 30)
    blue = pg.Color('dodgerblue1')
    lightblue = pg.Color('cadetblue3')
    sienna = pg.Color('sienna1')
    player_color = lightblue

    player = pg.Rect(400, 300, 10, 10)
    vel = Vector2(3, 0)
    current_rect = pg.Rect(400, 300, 0, 10)
    rects = [current_rect]

    done = False
    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_d:
                    vel.x = 3
                    vel.y = 0
                    # A new rect with 0 width.
                    current_rect = pg.Rect(player.topleft, (0, 10))
                elif event.key == pg.K_a:
                    vel.x = -3
                    vel.y = 0
                    current_rect = pg.Rect(player.topright, (0, 10))
                elif event.key == pg.K_w:
                    vel.y = -3
                    vel.x = 0
                    current_rect = pg.Rect(player.bottomleft, (10, 0))
                elif event.key == pg.K_s:
                    vel.y = 3
                    vel.x = 0
                    current_rect = pg.Rect(player.topleft, (10, 0))
                if event.key in (pg.K_d, pg.K_a, pg.K_w, pg.K_s):
                    # Append the new current rect.
                    rects.append(current_rect)

        # Update the position of the player.
        player[0] += vel.x
        player[1] += vel.y

        # Need to adjust the rect position if we're moving up or left.
        if vel.x < 0:
            current_rect.x += vel.x
        elif vel.y < 0:
            current_rect.y += vel.y
        # Increase the size of the current rect.
        # abs is needed to avoid negative width & height.
        current_rect.w += abs(vel.x)
        current_rect.h += abs(vel.y)

        player_color = lightblue
        # Collision detection with the rects.
        for line_rect in rects:
            if player.colliderect(line_rect):
                player_color = sienna
                break

        screen.fill(background_color)
        # Draw all rects in the list.
        for line_rect in rects:
            pg.draw.rect(screen, blue, line_rect)
        # Draw the player rect.
        pg.draw.rect(screen, player_color, player)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()

以上是关于Pygame - 在保持单独功能的同时创建具有相同功能的多行的主要内容,如果未能解决你的问题,请参考以下文章

相同的变量名,但在两个单独的“ def”函数中具有不同的值。他们不能以某种方式更改代码吗?

PyGame:具有每像素 alpha 的半透明精灵

Python 或 Pygame 可以创建单独的文件以保存游戏进度吗?

在pygame中加入多处理

图像滑块:保持所有图像的高度相同,同时保持滑块响应

如何在进行选择之前使我的代码中的复选框默认为未选中,同时保持我的功能相同?