Python Pygame对象间碰撞检测
嗨,很抱歉问了这么多问题,不过我知道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"] =
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