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

2024-05-15 21:30:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个游戏,我的一个目标是一艘船,另一个是一艘敌舰,我让我的敌舰跟随飞船。我想让敌舰与飞船相撞,然后用碰撞探测器结束游戏

这是我的密码。在

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)

Tags: rectimageselfsizegetifobjectinit
2条回答

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

B = Bad()
S = Ship()

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

使用sprite,可以使用:rectanglecirclemask来检测冲突。在

对了:

您的Object类和其他类与Sprite非常相似,因此可以使用更多的sprite函数。在

Sprite和其他类使用的某些属性/函数<;=>;您的属性/函数

  • 绘图(屏幕)<;=>;显示(屏幕)
  • update()<;=>;chase(),cycle()
  • 在自校正<;=>;自校正在
  • 在自我形象<;=>;自我精灵在

Pygamerect对象有大量的冲突检测方法。更多信息请访问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

相关问题 更多 >