Python 如何将碰撞检查添加到pygame模块中的2D汽车游戏中

Python 如何将碰撞检查添加到pygame模块中的2D汽车游戏中,python,pygame,collision-detection,collision,2d-games,Python,Pygame,Collision Detection,Collision,2d Games,我是Python和Pygame的初学者,我希望有人能帮助我实现检查car和car2之间碰撞的代码。我为此做了很多研究,但我无法将代码实现到我的项目中,也无法理解它。如果有人能帮助解决这个问题,那将意义重大。我使用Python 3.8.3 代码如下: import pygame import random import math pygame.init() black = (0, 0, 0) screen_width = 600 screen_length = 800 screen =

我是Python和Pygame的初学者,我希望有人能帮助我实现检查car和car2之间碰撞的代码。我为此做了很多研究,但我无法将代码实现到我的项目中,也无法理解它。如果有人能帮助解决这个问题,那将意义重大。我使用Python 3.8.3

代码如下:

import pygame
import random
import math


pygame.init()


black = (0, 0, 0)

screen_width = 600
screen_length = 800
screen = pygame.display.set_mode((screen_length, screen_width))
clock = pygame.time.Clock()
FPS = 60

icon = pygame.image.load('car.png')
pygame.display.set_icon(icon)

#game caption
pygame.display.set_caption("Car game")




#Main car
car = pygame.image.load('car.png')
carX = 370
carY = 470 
carX_change = 0

#second car
car2 = pygame.image.load('car2.png')
car2_X = random.randint(200, 600)
car2_Y = random.randint(-50, 0)
car2Y_speed = 13


#road side trees
tree1Img = pygame.image.load('tree1.png')
tree1_X = 70
tree1_Y = 30

tree2Img = pygame.image.load("tree2.png")
tree2_X = 700
tree2_Y = 300


tree3Img = pygame.image.load("tree3.png")
tree3_X = 70
tree3_Y = 400

tree4Img = pygame.image.load("tree4.png")
tree4_X = 700
tree4_Y = 50



#game functions
def car1(x, y):
    screen.blit(car, (x, y))

def car_2(x, y):
    global car2_Y
    global car2_X
    screen.blit(car2, (x, y))
    car2_Y += car2Y_speed
    if car2_Y > screen_length:
        car2_X = random.randint(200, 545)
        car2_Y = random.randint(-50, 0)   


def tree1(x, y):
    global tree1_Y
    screen.blit(tree1Img, (x, y))
    tree1_Y += 10
    if tree1_Y >= screen_width:
        tree1_Y = -50


def tree2(x, y):
    global tree2_Y
    screen.blit(tree2Img, (x, y))
    tree2_Y += 10
    if tree2_Y >= screen_width:
        tree2_Y = -50


def tree3(x, y):
    global tree3_Y
    screen.blit(tree2Img, (x, y))
    tree3_Y += 10
    if tree3_Y >= screen_width:
        tree3_Y = -50


def tree4(x, y):
    global tree4_Y
    screen.blit(tree4Img, (x, y))
    tree4_Y += 10
    if tree4_Y >= screen_width:
        tree4_Y = -50

# 1st Road marker's movement
rectangleX = 426
rectangleY = 100
def roadmarker_move():
    global rectangleY
    if running == True:
        rectangleY += 10
    if rectangleY == 610:
        rectangleY = -50


#2nd road marker's movement
rectangle2_X = 426
rectangle2_Y = 410
def roadmarker2_move():
    global rectangle2_Y
    if running == True:
        rectangle2_Y += 10
    if rectangle2_Y == 610:
        rectangle2_Y = -50




#Main game loop
running = True
while running:
    screen.fill((119, 118, 110))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                carX_change = 48
            if event.key == pygame.K_LEFT:
                carX_change = -48

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                carX_change = 0
        carX += carX_change



    #drawing Road lines
    pygame.draw.line(screen, black, (639, 0), (639, 600), 10)
    pygame.draw.line(screen, black, (200, 0), (200, 600), 10)

    
    #drawing the 1st road markers
    rectangle = pygame.draw.rect(screen, black, (rectangleX, rectangleY, 15, 80))
    roadmarker_move()

    #drawing the 2nd road markers
    rectangle = pygame.draw.rect(screen, black, (rectangle2_X, rectangle2_Y, 15, 80))
    roadmarker2_move()

    #setting boundries
    if carX <= 170:
        carX = 170
    elif carX >= 547:
        carX = 547




    car1(carX, carY)
    car_2(car2_X, car2_Y)
    tree1(tree1_X, tree1_Y)
    tree2(tree2_X, tree2_Y)
    tree3(tree3_X, tree3_Y)
    tree4(tree4_X, tree4_Y)
    clock.tick(FPS)
    pygame.display.update()

pygame.quit()
导入pygame
随机输入
输入数学
pygame.init()
黑色=(0,0,0)
屏幕宽度=600
屏幕长度=800
screen=pygame.display.set_模式((屏幕长度、屏幕宽度))
clock=pygame.time.clock()
FPS=60
icon=pygame.image.load('car.png')
pygame.display.set_图标(图标)
#游戏说明
pygame.display.set_标题(“汽车游戏”)
#主车
car=pygame.image.load('car.png')
carX=370
卡里=470
carX_change=0
#第二辆车
car2=pygame.image.load('car2.png')
car2_X=random.randint(200600)
car2_Y=random.randint(-50,0)
车辆速度=13
#路边树
tree1Img=pygame.image.load('tree1.png')
树1_X=70
树1_Y=30
tree2Img=pygame.image.load(“tree2.png”)
树2_X=700
树2_Y=300
tree3Img=pygame.image.load(“tree3.png”)
树3_X=70
树3_Y=400
tree4Img=pygame.image.load(“tree4.png”)
树4_X=700
树4_Y=50
#游戏功能
def car1(x,y):
屏幕光点(汽车,(x,y))
def车辆2(x,y):
全球汽车市场
全球car2_X
屏幕光点(car2,(x,y))
car2_Y+=car2Y_速度
如果car2_Y>屏幕长度:
car2_X=random.randint(200545)
car2_Y=random.randint(-50,0)
def tree1(x,y):
全球树
屏幕blit(图1(x,y))
树1_Y+=10
如果树1\u Y>=屏幕宽度:
树1_Y=-50
def tree2(x,y):
全球树2
屏幕。blit(树2图像,(x,y))
树2_Y+=10
如果树2\u Y>=屏幕宽度:
树2_Y=-50
def tree3(x,y):
全球树
屏幕。blit(树2图像,(x,y))
树3_Y+=10
如果tree3\u Y>=屏幕宽度:
树3_Y=-50
def tree4(x,y):
全球树
屏幕blit(树形图(x,y))
树4_Y+=10
如果tree4\u Y>=屏幕宽度:
树4_Y=-50
#第一个路标的移动
矩形X=426
矩形=100
def路标_移动():
全局矩形
如果正在运行==True:
矩形+=10
如果矩形==610:
矩形=-50
#第二个路标的移动
矩形2_X=426
矩形2_Y=410
def道路标记2_移动():
全局矩形2_Y
如果正在运行==True:
矩形2_Y+=10
如果矩形2_Y==610:
矩形2_Y=-50
#主游戏循环
运行=真
运行时:
屏幕填充((119、118、110))
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_RIGHT:
carX_变化=48
如果event.key==pygame.K_左:
carX_变化=-48
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_左或event.key==pygame.K_右:
carX_change=0
carX+=carX_变化
#画道路线
pygame.draw.line(屏幕,黑色,(639,0),(639,600),10)
pygame.draw.line(屏幕,黑色,(200,0),(200,600),10)
#绘制第一个道路标记
矩形=pygame.draw.rect(屏幕,黑色,(矩形,矩形,15,80))
路标移动()
#绘制第二个道路标记
矩形=pygame.draw.rect(屏幕,黑色,(矩形2_X,矩形2_Y,15,80))
道路标记2_移动()
#设置边界
如果carX=547:
carX=547
car1(carX,carY)
汽车2(汽车2×汽车2×汽车2×汽车Y)
树1(树1_X,树1_Y)
树2(树2_X,树2_Y)
树3(树3_X,树3_Y)
树4(树4_X,树4_Y)
时钟滴答声(FPS)
pygame.display.update()
pygame.quit()
最好使用PyGame的类。这使得处理这类碰撞非常简单

为每个对象创建一个
Rect
,并将对象放入列表中:

#road side trees
tree1img  = pygame.image.load('tree1.png')
tree1rect = tree1img.get_rect()
tree1rect.topleft = (  70,  30 )

tree2img = pygame.image.load("tree2.png")
tree2rect = tree2img.get_rect()
tree2rect.topleft = ( 700, 300 )

tree3img = pygame.image.load("tree3.png")
tree3rect = tree3img.get_rect()
tree3rect.topleft = (  70, 400 )

tree4img = pygame.image.load("tree4.png")
tree4rect = tree4img.get_rect()
tree4rect.topleft = ( 700,  50 )

tree_images = [ tree1img, tree2img, tree3img, tree4img ]
tree_rects  = [ tree1rect, tree2rect, tree3rect, tree4rect ]
同样,对于汽车:

car = pygame.image.load('car.png')
car_rect = car.get_rect()
car_rect.topleft = ( 370, 470 )
当需要移动车辆时,调整
car\u rect

car_rect.move_ip( ( carX_change, 0 ) )
要绘制汽车,blit也可以使用rect:

screen.blit( car, car_rect )
要检查冲突,请使用
Rect.colliderect()
Rect.collidelist()


Pygame.Rect()
,您知道您想要它;)

如果您不旋转图像,请使用
pygame.Rect
,它有
Rect.colliderect()
Rect.collidelist()
,等等-请参阅下面的答案。顺便说一句:您可以使用
pygame.Rect
来保持汽车的位置和大小,然后使用它来绘制
pygame.draw.Rect(屏幕,黑色,您的\Rect对象)
我一直收到这个错误:AttributeError:'pygame.Rect'对象没有属性'top_left'@ShokhrukhValiev-啊,对不起,这是一个bug,它应该是
top left
。我会编辑的,一切都好!谢谢你的帮助。我真的很感激!
# did car hit a tree?
for tree_rect in tree_rects:
    if ( tree_rect.colliderect( car_rect ) ):
        print( "car hit tree" )
# did car hit a tree:
if ( car_rect.collidelist( tree_rects ) ):
    print( "car hit tree" )