敌人不会显示

时间:2019-01-20 16:40:30

标签: python python-3.x pygame

我正在尝试创建一个自上而下的射击游戏,但我的敌人不会生成。我正在尝试使敌人以对角线的方式移动,但也能够像弹幕一样从墙上反弹自上而下的弹跳球。我还试图每10秒产生一个新的敌人,但是当我运行该程序时,什么也没有显示,也没有错误。有人可以帮忙吗。

import pygame
pygame.init()

import random
import time


inPlay = True
width=900
height=700
screen = pygame.display.set_mode((width, height))

#enemy
enemyFrequency=10
enemyPause=enemyFrequency
killEnemy=True

#------------------------------#
#   classes                    #
#------------------------------#



######################################################

class Enemy(pygame.sprite.Group):
    def __init__(self,ballX,ballY,ballSpeed,picture2=None):
        pygame.sprite.Group.__init__(self)
        self.ballX=ballX
        self.ballY=ballY
        self.ballSpeed=ballSpeed
        self.image2=pygame.image.load(picture2)


    def move(self):
        for enemys in self:
            self.ballX+=self.ballSpeed
            self.ballY+=self.ballSpeed


    def decay(self):
       for enemys in self:
           if enemys.y > height:
              self.remove(enemys)        

#------------------------------#
#   functions                  #
#------------------------------#

def redraw_game_window():
    screen.fill((30, 30, 30))
    enemys.draw(screen)
    pygame.display.update()

#------------------------------#
#   main program               #
#------------------------------#


RB=width-player.rect.width
CEILING = 3*player.rect.height            # for ship movement
FLOOR = height - player.rect.height       #

#enemy
enemies=pygame.sprite.Group()
enemySpeed=3
eX=random.randint(0,RB)
eY=random.randint(-height,0)
enemys=Enemy (eX,eY,enemySpeed,'asteroid.png')
t0 = pygame.time.clock()
dt = 0
enemyCount = 0

clock = pygame.time.Clock()

while inPlay:

    redraw_game_window()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            inPlay=False


    #enemies spawning     
    if dt < nSeconds:
        t1 = time.process_time()
        dt = t1 - t0
        enemies.add(enemys)
    else:
        enemyInstance = Enemy()
        enemyCount += 1
        t0 = time.clock()
        dt = 0
    enemys.move()            


    enemys.decay()


    clock.tick(30)

pygame.quit()

1 个答案:

答案 0 :(得分:1)

我修改了您的代码,使其似乎在执行代码所描述的内容以及与您的问题相匹配的内容。这段代码中遗漏了很多东西,也许您在发布到SO之前将其删除以使代码更短。

问题的症结在于如何处理敌方精灵。我不知道这是否是设计使然,但是原始代码定义了一个看起来像精灵的对象,但是基于一个精灵 group

因此,我基于enemies应该是一个全局sprite组的想法修改了代码,然后从那里“修复”了东西。没有定义Player类,我添加了一个。我无法遵循时序代码,它使用pygame.time.clock()(是一个对象)作为时间值。 似乎就像这段代码保持了增量,并计算了重新生成新敌人的时间,我不得不重新编写此代码才能使其生效-抱歉。

我要发表的其他评论-精灵可以定义update()函数。此功能应处理精灵的位置变化和外观。 PyGame Sprite组将在Sprite组update()元调用中自动处理此函数的调用(如果已定义)。这为程序提供了一种简单而又简单的方式来处理精灵动画。

import pygame
pygame.init()

import random
import time


inPlay = True
width=900
height=700
screen = pygame.display.set_mode((width, height))

#enemy
enemies        = pygame.sprite.Group()  # Holds all enemy sprites
enemyFrequency = 1000  # milliseconds between enemy spawn
killEnemy      = True
enemyCount     = 0

#------------------------------#
#   classes                    #
#------------------------------#

######################################################

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load('player.png').convert_alpha()
        self.rect  = self.image.get_rect()
        self.rect.center = (100,100)  # TODO  - position properly

    def update(self):
        # TODO
        pass


class Enemy(pygame.sprite.Sprite):
    def __init__(self, ballX, ballY, ballSpeed, picture2=None):
        pygame.sprite.Sprite.__init__(self)
        self.ballSpeed = ballSpeed
        self.image     = pygame.image.load(picture2).convert_alpha()
        self.rect      = self.image.get_rect()
        self.rect.center = ( ballX, ballY )

    def update(self):
        global enemies    # group of all enemy sprites (to which this sprite belongs)
        global height     # window height
        self.rect.x += self.ballSpeed
        self.rect.y += self.ballSpeed

        # decay the enemy
        if ( self.rect.y > height ):
            enemies.remove(self)        # went off screen, delete it

#------------------------------#
#   functions                  #
#------------------------------#

def redraw_game_window():
    screen.fill((30, 30, 30))
    enemies.draw(screen)
    pygame.display.update()

#------------------------------#
#   main program               #
#------------------------------#

player = Player()
RB=width-player.rect.width
CEILING = 3*player.rect.height            # for ship movement
FLOOR = height - player.rect.height       #

# start with 3 enemies
for i in range( 3 ):
    enemySpeed = 3
    eX=random.randint(0,RB)
    eY=random.randint(-height,0)
    enemies.add( Enemy(eX,eY,enemySpeed,'asteroid.png') )

clock = pygame.time.Clock()
last_enemy_spawn_time = 0

while inPlay:
    time_now = pygame.time.get_ticks()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            inPlay=False

    # is it time to spawn a new enemy?
    if ( time_now - last_enemy_spawn_time > enemyFrequency ):
        last_enemy_spawn_time = time_now  # reset timer

        #enemies spawning     
        eX=random.randint(0,RB)
        eY=random.randint(-height,0)
        enemies.add( Enemy(eX,eY,enemySpeed,'asteroid.png') )
        enemyCount += 1

    enemies.update()         # call the update() of every sprite   
    redraw_game_window()
    #enemies.decay() -- MOVED INTO Enemy.update()
    clock.tick(30)

pygame.quit()