Python Pygame对象间碰撞检测

Python Pygame对象间碰撞检测,python,pygame,Python,Pygame,嗨,很抱歉问了这么多问题,不过我知道python,但我正在努力学习pygame。在游戏中,我正在使我试图使它这样,当一个块/图像接触到精灵,它会回到屏幕的顶部。我看过很多教程,但似乎不能以一种有效的方式来理解它。有什么建议吗?这是密码谢谢!!!: import pygame import sys from random import randint import os x = 250 y = 30 os.environ["SDL_VIDEO_WINDOW_POS"] =

嗨,很抱歉问了这么多问题,不过我知道python,但我正在努力学习pygame。在游戏中,我正在使我试图使它这样,当一个块/图像接触到精灵,它会回到屏幕的顶部。我看过很多教程,但似乎不能以一种有效的方式来理解它。有什么建议吗?这是密码谢谢!!!:

import pygame
import sys
from random import randint
import os

x = 250
y = 30

os.environ["SDL_VIDEO_WINDOW_POS"] = "%d,%d" % (x, y)

width = 1024
height = 768

icon1 = pygame.image.load("Firstpygamegame/santa-claus.png")
pygame.display.set_icon(icon1)

screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Gift Catcher")
background_image = pygame.image.load("Firstpygamegame/wintervillage.png")

sprite1 = pygame.image.load("Firstpygamegame/santabag2.png")
spriterect = sprite1.get_rect()
speed = 2.5
# 442 or 467
spriterect.x = 442
icon2 = pygame.image.load("Firstpygamegame/present1.png")
icon3 = pygame.image.load("Firstpygamegame/present2.png")
icon4 = pygame.image.load("Firstpygamegame/present3.png")
icon5 = pygame.image.load("Firstpygamegame/present4.png")

cubes = [[
    randint(1, 1000),  # X coordinate
    randint(-1500, -350)]  # Y coordinate, -Y is above screen  (top of screen is zero)
    for x in range(2)]  # 20 cubes

cubes1 = [[
    randint(1, 1000),  # X coordinate
    randint(-1500, -150)]  # Y coordinate, -Y is above screen  (top of screen is zero)
    for x in range(2)]  # 20 cubes

cubes2 = [[
    randint(1, 1000),  # X coordinate
    randint(-1500, -550)]  # Y coordinate, -Y is above screen  (top of screen is zero)
    for x in range(2)]  # 20 cubes

cubes3 = [[
    randint(1, 1000),  # X coordinate
    randint(-1500, -450)]  # Y coordinate, -Y is above screen  (top of screen is zero)
    for x in range(2)]  # 20 cubes

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    spriterect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * speed
    spriterect.y = 600

    screen.blit(background_image, (0, 0))
    screen.blit(sprite1, spriterect)

    for cb in cubes:
        cb[1] += .25  # cube moves down 2 pixels
        screen.blit(icon2, cb)  # draw cube
        if cb[1] > 800:  # if cube passed bottom of screen
            cb[1] = -100  # move to above screen
            cb[0] = randint(1, 1000)

    for cb in cubes1:
        cb[1] += .25  # cube moves down 2 pixels
        screen.blit(icon3, cb)  # draw cube
        if cb[1] > 800:  # if cube passed bottom of screen
            cb[1] = -100  # move to above screen
            cb[0] = randint(1, 1000)  # random X position

    for cb in cubes2:
        cb[1] += .25  # cube moves down 2 pixels
        screen.blit(icon4, cb)  # draw cube
        if cb[1] > 800:  # if cube passed bottom of screen
            cb[1] = -100  # move to above screen
            cb[0] = randint(1, 1000)  # random X position

    for cb in cubes3:
        cb[1] += .25  # cube moves down 2 pixels
        screen.blit(icon5, cb)  # draw cube
        if cb[1] > 800:  # if cube passed bottom of screen
            cb[1] = -100  # move to above screen
            cb[0] = randint(1, 1000)  # random X position

    pygame.display.flip()
使用对象和查找矩形与对象之间的碰撞。
返回一个具有曲面对象大小的矩形,该矩形始终从(0,0)开始,因为曲面对象没有位置。矩形的位置可以通过关键字参数指定:

运行时:
# [...]
对于立方体中的cb:
cb[1]+=.25#立方体向下移动2个像素
屏幕。blit(icon2,cb)#绘制立方体
icon_rect=icon2.get_rect(左上角=cb)
如果cb[1]>800或图标_rect.collide rect(spriterect):
cb[1]=-100#移到屏幕上方
cb[0]=randint(11000)
# [...]
但是,您可以简化代码:

图标列表=[icon2、icon3、icon4、icon5] 多维数据集列表=[[[ randrange(screen.get_width()-icon.get_width()), 兰迪特(-1500,-350)] 对于范围内的x(2)] 用于图标列表中的图标] 运行=真 运行时: 对于pygame.event.get()中的事件: 如果event.type==pygame.QUIT: 运行=错误 keys=pygame.key.get_pressed() spriterect.x+=(键[pygame.K_RIGHT]-键[pygame.K_LEFT])*速度 spriterect.y=600 屏幕。blit(背景图像,(0,0)) 屏幕。blit(sprite1,spriterect) 对于图标,zip中的立方体(图标列表,立方体列表): 对于立方体中的cb: cb[1]+=.25#立方体向下移动2个像素 屏幕。blit(图标,cb)#绘制立方体 icon_rect=icon.get_rect(左上角=cb) 如果cb[1]>screen.get_height()或icon_rect.colliderect(spriterect): cb[:]=randrange(screen.get_width()-icon.get_width()),-800 pygame.display.flip() pygame.quit() sys.exit() 请注意,如果
running
False
,则应用程序循环终止。在事件循环中设置
running=False
和调用
pygame.quit()
sys.exit()
没有意义。让循环运行到底,并在事件循环之后调用
pygame.quit()
sys.exit()

pygame具有
pygame.Rect()
来保持对象的位置和大小,并且它具有检查两个Rect或Rect和点之间冲突的方法。因此,您应该对所有多维数据集使用Rect