python - 如何在 pygame 中应用碰撞?我见过很多,但没有什么印象深刻
问题描述
我迫切需要帮助。几个小时以来,我一直在尝试为我的 pygame 代码实现碰撞,但没有任何效果。我研究了很多方法,但没有一个是我的想法,或者是否有可能的方法来实现它们。
这是代码:
import pygame
import random
pygame.init()
#SCREEN
screeenWidth = 320
screenHeight = 600
screen = pygame.display.set_mode((screeenWidth, screenHeight))
screenBackground = pygame.image.load('assets/background.png')
screen.blit(screenBackground, (0,0))
pygame.display.set_caption("Evading Game")
#CLOCK
clock = pygame.time.Clock()
#PLAYER
playerX = 20 #which is lane 1
playerY = screenHeight * 0.8
playerImage = pygame.image.load('assets/car_img.png')
lane_dictionary = {1:20,2:85,3:160,4:240}
player_current_lane = 1
#OBSTACLE
obstacle_current_lane = random.randint(1,4)
obstacleX = lane_dictionary[obstacle_current_lane]
obstacleY = 0
obstacleImage = pygame.image.load('assets/obstacle_img.png')
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT: #Lane 1 = 20, lane 2 = 80, lane 3 = 160, lane 4 = 240
if not player_current_lane == 4:
player_current_lane += 1
e = lane_dictionary[player_current_lane]
playerX = e
if event.key == pygame.K_LEFT: #Lane 1 = 20, lane 2 = 80, lane 3 = 160, lane 4 = 240
if not player_current_lane == 1:
player_current_lane -= 1
e = lane_dictionary[player_current_lane]
playerX = e
obstacleY += 1 #Obstacle movement
screen.blit(screenBackground, (0,0)) #Blit background
screen.blit(playerImage, (playerX, playerY)) #blit player
screen.blit(obstacleImage, (obstacleX, obstacleY)) #Blit obstacle
pygame.display.update()
clock.tick(60) #fps
pygame.quit()
quit()
解决方案
创建一个具有播放器pygame.Rect
大小playerImage
和位置的对象 ( playerX
, playerY
)。
创建一个 2nd pygame.Rect
,具有障碍物的大小obstacleImage
和位置 ( obstacleX
, obstacleY
)。
用于colliderect
检测 2 个矩形之间的碰撞。例如:
while running:
# [...]
playerRect = playerImage.get_rect(topleft = (playerX, playerY))
obstacleRect = obstacleImage.get_rect(topleft = (obstacleX, obstacleY))
if playerRect.colliderect(obstacleRect):
print("hit")
# [...]
推荐阅读
- r - 我遍历数据框,为每列绘制直方图,使用列名作为图表标题,改为打印第一个值
- tcl - 在文件中每 30 分钟打印一次当前时间
- hierarchy - 如何显示 Modelica 库的层次结构?
- swift - 一个 ObservedObject 需要接受另一个 ObservedObject 作为参数;你怎么做到这一点?
- java - Tomcat 9 上的 Spring Boot 无法映射控制器(404)
- node.js - Node.js 没有正确执行嵌套的 for 循环,因为它是异步的
- java - 以表格格式显示地图,其中对象为键,Arraylist为jsp中的值
- c++ - 是否绝对有必要加载指向OpenGL函数的指针
- arrays - “categorie.forEach 不是函数”
- python - 使用 psutil 获取“psutil.AccessDenied (pid=6836)”错误