敌人不会出现

2024-09-28 05:27:37 发布

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

我正试图创造一个自上而下的射手,但我的敌人不会产生。我试着让敌人以对角线的方式移动,但也能像一个自上而下的弹跳球一样从墙上弹下来。我也试着每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()

Tags: importselffortimedefdtwidthpygame
1条回答
网友
1楼 · 发布于 2024-09-28 05:27:37

我对你的代码进行了黑客攻击,使它看起来像是在做代码描述的事情,什么符合你的问题。这段代码中缺少了很多东西,也许你在发布到之前就把它们删掉了,这样代码就更短了

问题的关键是如何对付敌人的精灵。我不知道它是不是设计出来的,但是最初的代码定义了一个看起来像精灵的东西,但是基于一个精灵

因此,我基于enemies应该是一个全局sprite组的想法修改了代码,并从那里“修复”了一些东西。没有定义Player类,我添加了一个。我无法遵循计时代码,它使用pygame.time.clock()(这是一个对象)作为时间值。好像这段代码保留了一个delta,我得重新编写这段代码才能让它正常工作,我很抱歉

我想做的另一个注释-sprites可以定义一个update()函数。此函数应处理精灵的位置更改和外观。PyGame精灵组将在精灵组update()元调用中自动处理此函数的调用(如果已定义)。这为程序提供了一种干净而简单的方法来处理sprite动画

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

相关问题 更多 >

    热门问题