如何设置两个对象在Pygame中使用碰撞检测?

时间:2013-11-12 09:36:55

标签: python object pygame sprite collision

我正在制作一个游戏,其中一个物体是一艘船而另一个是敌舰,我设置我的敌舰跟随船。我想让敌舰与船相撞,然后使用碰撞探测器结束游戏;

这是我的代码。

from pygame import *

size_x = 1200
size_y = 700

class Object:
    def disp(self, screen):
        screen.blit(self.sprite, self.rect)

class Bad (Object):
    def __init__(self):
        self.sprite = image.load("bad guys.bmp")
        self.rect = self.sprite.get_rect()
        self.rect.centerx = size_x / 2
        self.rect.centery = size_y / 2

    def chase(self, mouse):
        if self.rect.centerx > S.rect.centerx:
            self.rect.centerx-=10
        if self.rect.centerx< S.rect.centerx:
            self.rect.centerx+= 10
        if self.rect.centery > S.rect.centery:
            self.rect.centery-= 10
        if self.rect.centery< S.rect.centery:
            self.rect.centery+= 10

class gameover (Object):
    def __init__(self):
        self.sprite= image.load("game over.bmp")
        self.rect= self.sprite.get_rect()
        self.rect.centerx=500
        self.rect.centery=500

class Ship(Object):
    def __init__(self):
        self.sprite = image.load("ship.bmp")
        self.rect = self.sprite.get_rect()
        self.rect.centerx = 100
        self.rect.centery = 100

    def cycle (self):
        self.rect.centerx, self.rect.centery=mouse.get_pos()

class shot(Object):
    def __init__(self):

        self.sprite = image.load("shot.bmp")
        self.rect = self.sprite.get_rect()
        self.rect.centerx=100
        self.rect.centery=100
    def cycle (self):
        self.rect.centerx = S.rect.centerx
        self.rect.centery = S.rect.centery-(S.sprite.get_width()/2)
        for e in event.get():
           if e.type==KEYDOWN:
               if e.key==K_SPACE:
                   self.rect.centery-=10   

init()
screen = display.set_mode((size_x, size_y))
B = Bad()
S = Ship()
g= gameover()
shot=shot()
clock = time.Clock()

while True:
    for e in event.get():
        if e.type == QUIT:
            quit()

    B.chase(S)
    S.cycle()
    shot.cycle()
    screen.fill((255,255,255))
    screen=display.set_mode((size_x,size_y))
    screen=display.set_mode((size_x,size_y))
    background=image.load("space.bmp")
    background=transform.scale(background,(size_x,size_y))
    screen.blit(background,(0,0))
    S.disp(screen)
    B.disp(screen)
    shot.disp(screen)

    display.flip()
    clock.tick(60)

2 个答案:

答案 0 :(得分:1)

Pygame rect对象有很多碰撞检测方法。更多http://www.pygame.org/docs/ref/rect.html

import pygame
ship1 = (left_pos1, right_pos1, width1, height1)
ship2 = (left_pos2, right_pos2, width2, height2)
if ship1.colliderect(ship2): # ships collide
    # do something

答案 1 :(得分:0)

因为您在所有对象中都有self.rect,所以您可以使用Sprite碰撞检测

B = Bad()
S = Ship()

pygame.sprite.collide_rect(B, S) # return True or False

使用精灵,你可以使用rectanglecirclemask来检测碰撞。

顺便说一下:

您的Object课程和其他课程与Sprite非常相似,因此您可以使用更多精灵功能。

Sprite和其他类&lt; =&gt;使用的一些属性/函数你的财产/职能

  • 绘制(屏幕)&lt; =&gt; DISP(屏幕)
  • update()&lt; =&gt; chase(),cycle()
  • self.rect&lt; =&gt; self.rect
  • self.image&lt; =&gt; self.sprite