Pygame, икра второй ракеты или инопланетянин не сработали - PullRequest
0 голосов
/ 06 октября 2018

Я студент университета, и у меня есть игровой проект (мы можем выбрать любой предмет, который захотим), который сначала прошел гладко, но затем я столкнулся с некоторыми неожиданными проблемами.Я решил создать простую версию raiden 2 (шутер от космического корабля), но когда он пришел, чтобы запустить ракеты и инопланетян, это не сработало, как ожидалось.Прежде всего, когда я нажимаю кнопку «пробел», ракета будет создана и будет двигаться снизу вверх, но когда я нажму на нее снова, это не создаст ни секунды, или, может быть, это произойдет, но все, что я вижу, - это перемещение ракеты прямо сверхукосмического корабля плюс скорость увеличивается (не собирался), вместо этого я хотел создать секунду, пока первая движется.Та же проблема возникает с инопланетным космическим кораблем, экземпляр создан и перемещается нормально, но когда пришло время для появления второго, тогда первый просто переместился в новые координаты, и его скорость увеличилась. Затем для инопланетянина я решил создать больше сдля цикла, а затем переместить их, но снова скорость была увеличена, и я мог видеть только один.У меня есть еще 4 разных класса пришельцев, которые должны появиться, но если я не могу решить эти проблемы, я не могу продолжить.Я также проверил некоторые учебники и другие вопросы здесь, но когда я попробовал решения, которые не работали, я продолжу поиск, но если кто-то найдет ошибку и может дать мне пример, я был бы признателен.Наконец, просто чтобы сообщить вам, что я использую изображения для спрайтов и т. Д. Вот код:

Иностранцы:

class aliens(pygame.sprite.Sprite):
def __init__(self, dw, dh, w, h):
    self.display_width = dw
    self.display_height = dh
    self.width = w
    self.height = h

    super().__init__()

Первый Иностранец:

class alienPrivate(aliens):
def __init__(self, dw, dh, w, h):
    super().__init__(dw, dh, w, h)

    self.image = alienPrivateImg
    self.rect = privateRect
    self.rect.x = random.randrange(0, display_width - w)
    self.rect.y = random.randrange(2*(-h), -h)
    self.weapon = 1
    self.damage = 5
    self.health = 10
    self.speed = 4

# Private moves top -> bottom    
def update(self):
    self.rect.y += self.speed

Ракеты:

class Missiles(pygame.sprite.Sprite):
def __init__(self, dw, dh, wpn, pwlvl):
    super().__init__()

    self.weapon = wpn
    self.powerLevel = pwlvl
    self.setFire()

def setFire(self):
    if self.weapon == 1:
        if self.powerLevel == 1:
            self.image = bullets
            self.rect = bullet
    elif self.weapon == 2:
        if self.powerLevel == 1:
            self.image = frostLaserL1
            self.rect = frLaserL1
        elif self.powerLevel == 2:
            self.image = frostLaserL2
            self.rect = frLaserL2
        else:
            self.image = frostLaserL3
            self.rect = frLaserL3
    else:
        if self.powerLevel == 1:
            self.image = fireLaserL1
            self.rect = fLaserL1
        elif self.powerLevel == 2:
            self.image = fireLaserL2
            self.rect = fLaserL2
        else:
            self.image = fireLaserL3
            self.rect = fLaserL3

def update(self):
    self.rect.y -= 1

Ракетный спавн:

missile = Missiles(display_width,display_height,weapon, powerLevel)
                missile.rect.x = hero.rect.x + 35
                missile.rect.y = hero.rect.y - 20
                all_sprites_list.add(missile)
                fire_list.add(missile)

Инопланетный спавн:

for spawn in range(5):
                private = alienPrivate(display_width, display_height, 50, 88)
                all_sprites_list.add(private)
                alien_list.add(private)

Класс игрока:

class player(pygame.sprite.Sprite):
def __init__(self, dw, dh, w, h):
    super().__init__()

    self.health = 100
    self.stamina = 100
    self.width = w
    self.height = h
    self.image = spaceshipImgBee
    self.rect = spaceshipRect
    self.rect.x = (dw / 2) - (self.width / 2)
    self.rect.y = dh - h
    self.weapon = 1
    self.powerLevel = 1


# Methods
def setPosx(self, x):
    self.rect.x = x

def setPosy(self, y):
    self.rect.y = y

def moveRigth(self, x):
    self.rect.x += x

def moveLeft(self, y):
    self.rect.y += y

def setWeapon(self, x):
    if self.weapon == x:
        if self.weapon == 1 and self.powerLevel == 1:
            self.damage += 10
            self.powerLevel += 1
        elif self.weapon == 1 and (self.powerLevel > 1 and self.powerLevel < 3):
            self.powerLevel += 1
        elif self.weapon == 2 and self.powerlevel < 3:
            self.damage += 15
            self.powerLevel += 1
        elif self.weapon == 3 and self.powerLevel < 3:
            self.damage += 25
            self.powerLevel += 1
    else:
        if x == 1:
            self.weapon = x
            self.damage = 10
            self.powerLevel = 1
        elif x == 2:
            self.weapon = x
            self.damage = 20
            self.powerLevel = 1
        elif x == 3:
            self.weapon = x
            self.damage = 50
            self.powerLevel +=1

И остальныеигры (часть ее), включая цикл while:

import pygame
import random
import time

# Colors
BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)

# Start Pygame
pygame.init()

# Window Size and Name
display_width = 700
display_height = 600
gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Star Protector")

# Window refresh rate
fps = 60
clock = pygame.time.Clock()

#Images
spaceshipImgBee = pygame.image.load('Hero_Spaceship_Bee_80x79.png')
spaceshipRect = spaceshipImgBee.get_rect()

alienPrivateImg = pygame.image.load('Alien_Private_50x88.png')
privateRect = alienPrivateImg.get_rect()

bullets = pygame.image.load('Bullets_10x20.png')
bullet = bullets.get_rect()

all_sprites_list = pygame.sprite.Group()
alien_list = pygame.sprite.Group()
fire_list = pygame.sprite.Group()

hero = player(display_width,display_height, 80, 79)
all_sprites_list.add(hero)
killed = False

x = 0
y = 0
i = 0
l = 0
score = 0
while not killed:
weapon = hero.weapon
powerLevel = hero.powerLevel
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        killed = True

    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            x = -10
            i = 1
        elif event.key == pygame.K_RIGHT:
            x = 10
            i = 1
        elif event.key == pygame.K_UP:
            y = -10
            i = 2
        elif event.key == pygame.K_DOWN:
            y = 10
            i = 2
        elif event.key == pygame.K_SPACE:
            if weapon == 1:
                missile = Missiles(display_width,display_height,weapon, powerLevel)
                missile.rect.x = hero.rect.x + 35
                missile.rect.y = hero.rect.y - 20
                all_sprites_list.add(missile)
                fire_list.add(missile)
            elif weapon == 2:
                if powerLevel == 1:
                    frlaser = Missiles(display_width, display_height, weapon, powerLevel)
                    frlaser.rect.x = (hero.rect.x / 2) - 7
                    all_sprites_list.add(frlaser)
                    fire_list.add(frlaser)

                elif powerLevel == 2:
                    frlaser = Missiles(display_width, display_height, weapon, powerLevel)
                    frlaser.rect.x = (hero.rect.x / 2) - 20
                    all_sprites_list.add(frlaser)
                    fire_list.add(frlaser)

                else: 
                    frlaser = Missiles(display_width, display_height, weapon, powerLevel)
                    frlaser.rect.x = (hero.rect.x / 2) - 40
                    all_sprites_list.add(frlaser)
                    fire_list.add(frlaser)
            else:
                if powerLevel == 1:
                    flaser = Missiles(display_width, display_height, weapon, powerLevel)
                    flaser.rect.x = (hero.rect.x / 2) -7
                    all_sprites_list.add(flaser)
                    fire_list.add(flaser)
                elif powerLevel == 2:
                    flaser = Missiles(display_width, display_height, weapon, powerLevel)
                    flaser.rect.x = (hero.rect.x / 2) -20
                    all_sprites_list.add(flaser)
                    fire_list.add(flaser)
                else:
                    flaser = Missiles(display_width, display_height, weapon, powerLevel)
                    flaser.rect.x = (hero.rect.x / 2) - 40
                    all_sprites_list.add(flaser)
                    fire_list.add(flaser)

    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
            x = 0
            i = 1
        elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
            y = 0
            i = 2

#Move the spaceship with boundaries
if i == 1:
    hero.moveRigth(x)
elif i == 2:
    hero.moveLeft(y)

if hero.rect.x > display_width - hero.width:
    hero.setPosx(display_width - hero.width)
elif hero.rect.x < 0:
    hero.setPosx(0)
elif hero.rect.y < 0:
    hero.setPosy(0)
elif hero.rect.y > display_height - hero.height:
    hero.setPosy(display_height - hero.height)


#Background Color - Image
gameDisplay.blit(backgCosmos, (0 ,l))
#gameDisplay.fill(WHITE)

if score == 100:
    for spawn in range(5):
        private = alienPrivate(display_width, display_height, 50, 88)
        all_sprites_list.add(private)
        alien_list.add(private)

if l + 600 > 600:
    gameDisplay.blit(backgRepublic, (0 ,l -600))

l += 1

all_sprites_list.update()

#Print player - start the battle
all_sprites_list.draw(gameDisplay)

score += 1

pygame.display.update()
clock.tick(fps)

pygame.quit()
quit()

Что касается изображений, я не могу их загрузить (не знаю почему), но вы можете быстро изменить размер случайного числа и проверить его.Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Эту ошибку было довольно интересно исправить, потому что похоже, что вы создаете и правильно добавляете missile s в группы (вы можете увидеть это, печатая спрайт и группы), но проблема в том, что вы назначаетета же глобальная переменная bullet, что и self.rect, приписывает ракетам, и это означает, что все ракеты размещены в одной позиции.Поэтому, когда вы обновляете координаты прямоугольника (missile.rect.y = hero.rect.y - 20), вы воздействуете на все ракетные спрайты, потому что они имеют один и тот же прямоугольник.

Вы должны удалить прямоугольник bullet и просто создать self.rect в __init__ метод, так что каждая ракета получает свой прямоугольник (изображения все еще могут быть переданы).

Кроме того, лучше передать координаты x и y непосредственно методу __init__ при создании экземпляра:

missile = Missiles(
    hero.rect.x+35, hero.rect.y-20,
    display_width,display_height,weapon, powerLevel)

class Missiles(pygame.sprite.Sprite):
    def __init__(self, x, y, dw, dh, wpn, pwlvl):
        super().__init__()
        self.weapon = wpn
        self.powerLevel = pwlvl
        self.setFire()
        # You can pass the `x, y` coordinates as the `topleft`,
        # `center` or another argument.
        self.rect = self.image.get_rect(center=(x, y))
        # Or set the coordinates afterwards.
        # self.rect.center = (x, y)

    def setFire(self):
        if self.weapon == 1:
            if self.powerLevel == 1:
                self.image = bullets
        elif self.weapon == 2:
            if self.powerLevel == 1:
                self.image = frostLaserL1
            elif self.powerLevel == 2:
                self.image = frostLaserL2
            else:
                self.image = frostLaserL3
        else:
            if self.powerLevel == 1:
                self.image = fireLaserL1
            elif self.powerLevel == 2:
                self.image = fireLaserL2
            else:
                self.image = fireLaserL3

    def update(self):
        self.rect.y -= 1

Вы должны сделать то же самое для пришельцакорабли:

class AlienPrivate(aliens):  # Use uppercase names for classes.
    def __init__(self, dw, dh, w, h):
        super().__init__(dw, dh, w, h)
        self.image = alienPrivateImg
        x = random.randrange(display_width-w)
        y = random.randrange(2*(-h), -h)
        self.rect = self.image.get_rect(center=(x, y))
0 голосов
/ 07 октября 2018

Вы породили рядовых инопланетян правильно в разных случаях, но вам нужно сделать то же самое с Ракетами.for i in range(number) даст отдельные экземпляры.В противном случае pygames sprite .add () будет предполагать, что вы ссылаетесь на экземпляр, который уже существует в группе.

Не могли бы вы указать здесь код игрового цикла while True:?

ВТем временем проверьте, увеличивает ли скорость .update () на отдельные спрайты.Наконец, если ракета исчезнет с экрана, вы можете просто .remove () ее.

...