微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我在pygame游戏中的子弹不会删除,只会穿过敌人

如何解决我在pygame游戏中的子弹不会删除,只会穿过敌人

我正在创建一个简单的游戏,您可以在其中射击敌人/友军。每当我向敌人射击时,它都会弹出/消失,但是子弹不会消失(Python没有给我任何追溯错误)。另外,当我尝试使用碰撞点时,似乎什么也没有发生,但是当我使用碰撞点时,它起作用了。

顺便说一下,这是完整的代码

import pygame,sys,random
from pygame.locals import *
from pygame import mixer

pygame.init()

WINDOWWIDTH  = 800 # Width of the screen
WINDOWHEIGHT = 550 # Height of the screen
FPS          = 20
WHITE        = (255,255,255)


class Player(pygame.sprite.Sprite):
    """
    This is the class for the player and the other functions for the program.
    """
    def __init__(self,disPLAYSURF):
        pygame.sprite.Sprite.__init__(self)
        self.PLAYER      = pygame.image.load('SpaceRocket.png').convert_alpha() #SpaceShip by dawnydawny from Pixabay
        self.XPLAYER     = WINDOWWIDTH / 2
        self.YPLAYER     = WINDOWHEIGHT - 75
        self.FONT        = pygame.font.Font('freesansbold.ttf',15)
        self.PBox        = self.PLAYER.get_rect()
        self.PBox.center = (self.XPLAYER,self.YPLAYER)
        self.disPLAYSURF = disPLAYSURF
        self.color       = WHITE
    
    def makePLAYER(self):
        self.disPLAYSURF.blit(self.PLAYER,self.PBox)
    
    def spaceMessage(self,message):
        self.message = message
        self.mesg    = self.FONT.render(self.message,True,self.color)
        self.MBox    = self.mesg.get_rect()
        self.MBox.x  = (50)
        self.MBox.y  = (WINDOWHEIGHT - 500)
        self.disPLAYSURF.blit(self.mesg,self.MBox )
    
    def showscore(self,score):
        self.score = score
        self.spaceMessage("score: %s" % score)
    
    def terminate(self):
        pygame.quit()
        sys.exit()
    
    
class UFO(pygame.sprite.Sprite):
    """
    This is the class for the UFO.
    """
    def __init__(self,XUFO,YUFO):
        pygame.sprite.Sprite.__init__(self)
        self.XUFO        = XUFO
        self.YUFO        = WINDOWHEIGHT - 570
        self.UFO         = pygame.image.load('SpaceUFO.png').convert_alpha() #Image by Mostafa Elturkey from Pixabay
        self.UBox        = self.UFO.get_rect()
        self.UBox.center = (self.XUFO,self.YUFO)
    
    def makeUFO(self,disPLAYSURF):
        self.disPLAYSURF = disPLAYSURF
        self.disPLAYSURF.blit(self.UFO,[self.XUFO,self.YUFO])
    
    
class Bullet(pygame.sprite.Sprite):
    """
    This is the class for bullets.
    """
    def __init__(self,bulletx,bullety):
        pygame.sprite.Sprite.__init__(self)
        self.bulletx        = bulletx
        self.bullety        = bullety
        self.SpaceBulletIMG = pygame.image.load("SpaceBulletIMG.png").convert_alpha() #Image by Clker-Free-Vector-Images from Pixabay
        self.BBox           = self.SpaceBulletIMG.get_rect()
        self.BBox.center    = (self.bulletx,self.bullety)
    
    def makeBullet(self,disPLAYSURF):
        self.disPLAYSURF = disPLAYSURF
        self.disPLAYSURF.blit(self.SpaceBulletIMG,self.BBox)
    
SpaceUFO    = []
SpaceBullet = []
def runGame(Player):
    global FPSCLOCK,BACKGROUNDIMG,disPLAYSURF,SpaceUFO

    disPLAYSURF   = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
    BACKGROUNDIMG = pygame.image.load('SpaceBackground.jpg') # Image by Free-Photos from Pixabay 
    FPSCLOCK      = pygame.time.Clock()
    Player        = Player(disPLAYSURF)
    SpaceKill     = 0
    score         = 0
    BulletSound   = mixer.sound('BulletSound.wav') # From https://www.freesoundeffects.com/
    pygame.display.set_caption('Space fight by MadCoderErrr')
    mixer.music.load('SpaceSound.mp3') # Music: https://www.bensound.com
    mixer.music.play(-1)

    if SpaceKill > 0:
        SpaceKill += 1
    if SpaceKill > 10:
        SpaceKill = 0

    while True:
        disPLAYSURF.blit(BACKGROUNDIMG,[0,0])
    
        for event in pygame.event.get():
            if event.type == QUIT:
                Player.terminate()
            
        if len(SpaceUFO) < 5:
            SpaceUFO.append(UFO(round(random.randrange(0,WINDOWWIDTH - 20.0 ** 2) * 20.0) / 20.0,WINDOWHEIGHT - 570))
            print('making new aliens')
            continue
        
        for ufo in SpaceUFO.copy():
            ufo.makeUFO(disPLAYSURF)
            ufo.YUFO += FPS / 4
            continue
        
        for ufo in SpaceUFO:
            if ufo.YUFO >= WINDOWHEIGHT:
                SpaceUFO.pop(SpaceUFO.index(ufo))
                print('Alien is gone')
            
        for bullet in SpaceBullet.copy():
            disPLAYSURF.blit(bullet.SpaceBulletIMG,[bullet.bulletx,bullet.bullety])
            if bullet.bullety > 0:
                bullet.bullety -= FPS
            if bullet.bullety < 0:
                SpaceBullet.pop()
                print('Bullet is Now gone!')
            continue
            
        if SpaceBullet:
            for bullet in SpaceBullet.copy():
                for ufo in SpaceUFO.copy():
                    if ufo.UBox.colliderect(bullet.BBox):
                        SpaceBullet.pop(SpaceBullet.index(bullet))
                        SpaceUFO.pop(SpaceUFO.index(ufo))
                        print('hit')
                        score += 1
                        break
    

        if SpaceBullet:
            for bullet in SpaceBullet.copy():
                for ufo in SpaceUFO.copy():
                    if ufo.UBox.collidepoint(bullet.bulletx,bullet.bullety):
                        SpaceBullet.pop(SpaceBullet.index(bullet))
                        SpaceUFO.pop(SpaceUFO.index(ufo))
                        print('hit')
                        score += 1
                        break
                    if ufo.UBox.collidepoint(bullet.bulletx - 10,bullet.bullety):
                        SpaceBullet.pop(SpaceBullet.index(bullet))
                        SpaceUFO.pop(SpaceUFO.index(ufo))
                        print('hit')
                        score += 1
                        break
                    
        if event.type == KEYDOWN:
            if event.key == K_LEFT and not Player.XPLAYER <= 0:
                Player.XPLAYER -= FPS
            if event.key == K_RIGHT and Player.XPLAYER < WINDOWWIDTH - (FPS * 3):
                Player.XPLAYER += FPS
            if event.key == K_SPACE and SpaceKill < 10:
                if len(SpaceBullet) < 10:
                    SpaceBullet.append(Bullet(Player.XPLAYER,Player.YPLAYER))
                SpaceKill = 1
                BulletSound.play()
            
        Player.showscore(score)
        disPLAYSURF.blit(Player.PLAYER,[Player.XPLAYER,Player.YPLAYER])
        FPSCLOCK.tick(FPS)
        pygame.display.flip()
        pygame.display.update()
    
    if __name__ == '__main__':
    runGame(Player)

解决方法

更改 ufo 的位置后,您必须更新属性UBOX

def runGame(Player):
    # [...]

    while True:
        # [...]

        for ufo in SpaceUFO.copy():
            ufo.makeUFO(DISPLAYSURF)
            ufo.YUFO += FPS / 4
            ufo.UBOX.center = (ufo.XUFO,ufo.YUFO) # <---- ADD

当您UBOX ufo 而不是blitXUFO时使用YUFO

class UFO(pygame.sprite.Sprite):
    # [...]

    def makeUFO(self,DISPLAYSURF):
        self.DISPLAYSURF = DISPLAYSURF
        self.DISPLAYSURF.blit(self.UFO,self.UBOX)

此外,您没有正确生成项目符号,有时会生成多个项目符号。您必须在事件循环中处理事件KEYDOW事件。实际上,您可以在循环外处理事件:

def runGame(Player):
    # [...]

    while True:
        # [...]

        DISPLAYSURF.blit(BACKGROUNDIMG,[0,0])
    
        for event in pygame.event.get():
            if event.type == QUIT:
                Player.terminate()
            if event.type == KEYDOWN:
                if event.key == K_LEFT and not Player.XPLAYER <= 0:
                    Player.XPLAYER -= FPS
                if event.key == K_RIGHT and Player.XPLAYER < WINDOWWIDTH - (FPS * 3):
                    Player.XPLAYER += FPS
                if event.key == K_SPACE and SpaceKill < 10:
                    if len(SpaceBullet) < 10:
                        SpaceBullet.append(Bullet(Player.XPLAYER,Player.YPLAYER))
                    SpaceKill = 1
                    BulletSound.play()  

此外,运动的计算是错误的。您必须计算每次的方式。这意味着您必须除以FPS。例如:

FPS          = 60

# [...]

def runGame(Player):
    # [...]

    while True:
        # [...]

        for ufo in SpaceUFO.copy():
            ufo.makeUFO(DISPLAYSURF)

            ufo.YUFO += 60 / FPS # <----
           
            ufo.UBOX.center = (ufo.XUFO,ufo.YUFO)
  
        # [...]

        for bullet in SpaceBullet.copy():
            DISPLAYSURF.blit(bullet.SpaceBulletIMG,[bullet.bulletx,bullet.bullety])
            if bullet.bullety > 0:

                bullet.bullety -= 240 / FPS # <----
  
            # [...]

在随机位置生成UFO,但是如果UFO与任何其他UFO相交,则将其跳过。不明飞行物将自动尝试在下一帧中生成不明飞行物。使用pygame.Rect.colliderect进行碰撞测试:

def runGame(Player):
    # [...]

    while True: 
        # [...]

        for i in range(len(SpaceUFO),5):
            
            x,y = round(random.randrange(0,WINDOWWIDTH - 20.0 ** 2) * 20.0) / 20.0,WINDOWHEIGHT - 570
            new_ufo = UFO(x,y)
            if not any(ufo for ufo in SpaceUFO if ufo.UBOX.colliderect(new_ufo.UBOX)):
                SpaceUFO.append(new_ufo)
                print('making new aliens')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。