python - 如何对与许多不同矩形的碰撞进行矩形检查?游戏
问题描述
如何进行矩形检查是否与许多不同的矩形发生冲突?我正在制作一个平台游戏,我在一个平台上遇到了碰撞,但不知道如何添加多个。
我不知道如何通过变量添加更多矩形。我唯一的另一个想法是制作一堆具有不同名称的矩形,并分别检查每个矩形。如果我要在我的关卡中放置 30 个矩形,那将不会很有效,而且它看起来像意大利面条。
我在网上搜索了有关如何执行此操作的信息,但我发现完全不相关的问题!
如果相关,这是代码。编辑:不再剪断,现在是整个代码。对不起,如果它很长,88 行。
import pygame
import math
# Defining important variables
pygame.init()
keys = pygame.key.get_pressed()
clock = pygame.time.Clock()
# LEVEL DESIGN
ground_rect = []
ground_rect.append(pygame.Rect(0, 200, 200, 50))
ground_rect.append(pygame.Rect(0, 200, 300, 100))
# Screen stuff
bg_color = 204, 255, 220
screen_y = 360
screen_x = 480
screen = pygame.display.set_mode((screen_x, screen_y))
# Player's img and start coordinates.
player_img = pygame.image.load("player.png").convert()
player_y = 0
player_x = 0
player_y_velocity = 0
player_x_velocity = 0
coyote = 0
def pic(img, x, y):
screen.blit(img, (x + 0, y + 0))
def main():
screen.fill(bg_color)
# Get the variables global
global player_y # Y position of player
global player_x # X position of player
global player_y_velocity # Y velocity of player
global player_x_velocity # X velocity of player
global coyote # Checks if you are on ground, and gives a bit of extra frames to jump if not.
# Inputs
if pygame.key.get_pressed()[pygame.K_UP] and coyote > 0:
player_y_velocity = -9
coyote = 0
# This makes your jump lower when you release!
if not pygame.key.get_pressed()[pygame.K_UP] and player_y_velocity < -1:
player_y_velocity = -1
# Move left/right when pressing left/right!
player_x_velocity = (pygame.key.get_pressed()[pygame.K_RIGHT] - pygame.key.get_pressed()[pygame.K_LEFT]) * 2.5
# Velocity effects
player_y_velocity += 0.4
player_y_velocity = min(player_y_velocity, 10)
player_x += player_x_velocity
player_y += player_y_velocity
coyote -= 1
# Rectangles
player_rect = pygame.Rect(player_x, player_y, 32, 32)
# !!Collision!!
for i in range(10):
if player_rect.colliderect(ground_rect):
player_y -= 1
player_y_velocity = 0.5
coyote = 4
player_rect = pygame.Rect(player_x, player_y, 32, 32)
# Draw stuff (pic is a function I made to shorten the blit)
pic(player_img, player_x, player_y)
pygame.draw.rect(screen, (64, 0, 0), ground_rect)
# Main script
while True:
main()
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
break
if player_y > 376:
pygame.quit()
break
clock.tick(60)
编辑:我将包括我尝试制作地面矩形列表的方式以及我收到的错误消息。
# LEVEL DESIGN
ground_rect = []
ground_rect.append(pygame.Rect(0, 200, 200, 50))
ground_rect.append(pygame.Rect(0, 200, 300, 100))
这是我正在使用的 IDE,Pycharm 向我抛出的错误。
Expected type 'Union[Rect, RectType, tuple[int, int, int, int], list[int], tuple[Union[tuple[float, float], list[float], Vector2, Vector2], Union[tuple[float, float], list[float], Vector2, Vector2]], list[Union[tuple[float, float], list[float], Vector2, Vector2]], _HasRectAttribute]', got 'list[Rect]' instead
这是回溯日志:
Traceback (most recent call last):
File "C:\Users\Matt\PycharmProjects\lettherebechaos\main.py", line 77, in <module>
main()
File "C:\Users\Matt\PycharmProjects\lettherebechaos\main.py", line 65, in main
if player_rect.colliderect(ground_rect):
TypeError: Argument must be rect style object
解决方案
正如 Alian 所提到的,您必须使用一个列表来存储多个矩形(如果您想要的不仅仅是几个,也可以使用任何东西)。然后您可以遍历该列表并检查冲突。这是一个新的快速示例,因为您的代码没有提供任何与之相关的内容。
import pygame
#make a list and add 30 rects in it
rects = []
for x in range(5):
for y in range(6):
rects.append(pygame.Rect(x * 50 + 10, y * 50 + 10, 40, 40))
pygame.init()
screen = pygame.display.set_mode((260, 310))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((255, 255, 255))
#go through all the rects and check for collision
for rect in rects:
color = (255, 0, 0)
if (rect.collidepoint(pygame.mouse.get_pos())):
color = (0, 255, 0)
pygame.draw.rect(screen, color, rect)
pygame.display.update()
推荐阅读
- java - AntPathRequestMatcher 已弃用。更换方法是什么?
- xmpp - 从哪里获取 Ejabberd api url 和主机名
- javascript - 将不同对齐的excel转换为json
- html - 范围滑块会不一致地消失?
- go - 如何在 GO 中初始化多层嵌套结构?
- c++ - 快速且无锁的单写入器,多读取器
- azure - 通过 terraform 创建 Azure 警报失败,错误代码为 400
- javascript - Angular Pipe - 字符串的 groupBy 子串(自定义管道)
- c# - 如何从 Solace 队列中轮询消息(而不是默认推送行为)?
- spring-boot - 大型 IP f5 负载均衡器中的 SSE 支持