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

问题描述 投票:1回答:1

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

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

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

python dictionary pygame
1个回答
0
投票

您可以这样做:使用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()
© www.soinside.com 2019 - 2024. All rights reserved.