我对pygame完全不熟悉,我正在努力在我的游戏中实现'laserblast'和'tarantula'之间的碰撞检测。我在pygame.org以及其他网站(包括堆栈溢出)上阅读过关于曲面和精灵的各种文档,但遗憾的是我无法理解他们的概念。
另外,我想远离课堂,因为我对它们不是很熟悉,我打算在以后的项目中发展我对它们的了解。
我遇到的错误是
Traceback (most recent call last):
File "C:\Python27\jetfighterx.py", line 44, in <module>
if pygame.sprite.collide_rect(laserblast.rect, tarantula.rect):
AttributeError: 'pygame.Surface' object has no attribute 'rect'
当喷气式战斗机向敌人发射激光时;不久之后游戏也崩溃了。
我真的需要帮助开发这个问题的简单解决方案。
这是我的代码:
import pygame, sys, pygame.mixer
from pygame.locals import *
import random
pygame.init()
bif="space.jpg"
jf="spacefightersprite.png"
enemy="TarantulaSpaceFighter.png"
laser=pygame.mixer.Sound("LaserBlast.wav")
screen=pygame.display.set_mode((1000,900),0,32)
caption=pygame.display.set_caption("Jet Fighter X")
background=pygame.image.load(bif).convert()
jetfighterx=pygame.image.load(jf)
jetfighterx=pygame.transform.scale(jetfighterx, (400,400))
tarantula=pygame.image.load(enemy)
tarantula=pygame.transform.scale(tarantula, (100,100))
laserblast=pygame.image.load("C:\Python27\laser.png")
ex,ey=450,0
movex,movey=0,0
clock=pygame.time.Clock()
speed=300
shoot_y=0
while True:
mx,my=pygame.mouse.get_pos()
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type==KEYDOWN:
if event.key==K_ESCAPE or event.key==K_q:
sys.exit()
if event.type==MOUSEBUTTONDOWN:
laser.play()
shoot_y=my-200
shoot_x=mx-16
if shoot_y>0:
screen.blit(laserblast, (shoot_x, shoot_y))
shoot_y-=10
pygame.display.update()
if pygame.sprite.collide_rect(laserblast.rect, tarantula.rect):
print "COLLISION DETECTED!"
screen.blit(background, (0,0))
screen.blit(jetfighterx,(mx-200,my-200))
screen.blit(tarantula, (ex, ey))
milli=clock.tick()
seconds=milli/1000.
dmy=seconds*speed
ey+=dmy
if ey>900:
ey=0
ex=random.randint(50,900)
update=pygame.display.update()
答案 0 :(得分:0)
您应该阅读pygame Surface课程。您可以使用Surface.get_clip()返回可以检查碰撞的矩形。另外,请考虑使用Rect.colliderect()方法而不是Sprite方法。使用它,你的代码将是
if(laserblast.get_clip().colliderect(tarantula.get_clip()))
就像Thedudxo所说,你应该考虑为你的游戏元素使用类。