Враги не будут отображаться - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь создать стрелка сверху вниз, но мои враги не появятся. Я пытаюсь заставить врага двигаться по диагонали, но также могу отскочить от стены вроде как сверху вниз прыгающий мяч. Я также пытаюсь вызывать нового противника каждые 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 голосов
/ 21 января 2019

Я взломал ваш код до такой степени, что он, кажется, делает то, что описывает код, и что соответствует вашему вопросу.В этом коде пропало много вещей, возможно, вы вырезали их перед публикацией в SO, чтобы сделать код короче.

Суть проблемы - обработка вражеских спрайтов.Я не знаю, было ли это по замыслу, но оригинальный код определял то, что казалось спрайтом, но основывалось на спрайте group .

Так что я изменил код на основеИдея, что enemies должна быть глобальной группой спрайтов, и пошла оттуда "исправление" вещей.Класс Player не определен, я его добавил.Я не мог следовать временному коду, он использовал pygame.time.clock() (который является объектом) в качестве значения времени. казалось , будто этот код держал дельту и считал время, чтобы возродить нового врага, мне пришлось переписать этот бит, чтобы заставить его работать - мои извинения.

Другойкомментарий, который я хочу сделать - спрайты могут определять функцию update().Эта функция должна обрабатывать изменения положения и внешний вид спрайта.Группы спрайтов PyGame будут обрабатывать вызов этой функции автоматически (если она определена) в мета-вызове группы спрайтов 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...