需要帮助实现简单的碰撞检测(PYGAME)

时间:2014-10-31 19:17:28

标签: python windows pygame 2d collision

我对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()

1 个答案:

答案 0 :(得分:0)

您应该阅读pygame Surface课程。您可以使用Surface.get_clip()返回可以检查碰撞的矩形。另外,请考虑使用Rect.colliderect()方法而不是Sprite方法。使用它,你的代码将是

if(laserblast.get_clip().colliderect(tarantula.get_clip()))

就像Thedudxo所说,你应该考虑为你的游戏元素使用类。