从玩家射击子弹

时间:2020-05-21 19:42:52

标签: python pygame

所以我想在游戏中添加拍摄选项,但是当我按下空格键时,项目符号会在其中生成播放器是,仅此而已,它就不会移动,它只是坐在那儿,我对pygame特别陌生,所以我不太确定。

请说出您是否需要更多的背景信息

此处代码:

import pygame
import random

from pygame.locals import(
    RLEACCEL,
    K_UP,
    K_DOWN,
    K_LEFT,
    K_RIGHT,
    K_ESCAPE,
    K_w,
    K_a,
    K_s,
    K_d,
    K_0,
    K_9,
    K_SPACE,
    KEYDOWN,
    QUIT
)

pygame.init()
pygame.joystick.init()
pygame.mixer.init()
pygame.display.set_caption("Dodge The Missile (ALPHA 0.11)")

SCREEN_WIDTH = 1600
SCREEN_HEIGHT = 1000

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy, self).__init__()
        self.surf = pygame.image.load("Missiles.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.rect = self.surf.get_rect(
            center=(
                random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100),
                random.randint(0, SCREEN_HEIGHT),
            )
        )
        self.speed = random.randint(Enemy_SPEED_Min, Enemy_SPEED_Max)



    def update(self):
        self.rect.move_ip(-self.speed, 0)
        if self.rect.right < 0:
            self.kill()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.surf = pygame.image.load("Spaceship.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.rect = self.surf.get_rect()
        self.layers = 1
    def update(self, pressed_keys):
            if pressed_keys[K_UP] or pressed_keys[K_w]:
                self.rect.move_ip(0, -5)
            if pressed_keys[K_DOWN] or pressed_keys[K_s]:
                self.rect.move_ip(0, 5)
            if pressed_keys[K_LEFT] or pressed_keys[K_a]:
                self.rect.move_ip(-5, 0)
            if pressed_keys[K_RIGHT] or pressed_keys[K_d]:
                self.rect.move_ip(5, 0)

            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.right > SCREEN_WIDTH:
                self.rect.right = SCREEN_WIDTH
            if self.rect.top <= 0:
                self.rect.top = 0
            if self.rect.bottom >= SCREEN_HEIGHT:
                self.rect.bottom = SCREEN_HEIGHT
    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)



class Cloud(pygame.sprite.Sprite):
    def __init__(self):
        super(Cloud, self).__init__()
        self.surf = pygame.image.load("Cloud.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.layers = 3
        self.rect = self.surf.get_rect(
            center=(
                random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100),
                random.randint(0, SCREEN_HEIGHT)
            )
        )

    def update(self):
        self.rect.move_ip(-5, 0)
        if self.rect.right < 0:
            self.kill()

class Bullet (pygame.sprite.Sprite):
    def __init__ (self, x, y):
        super (Bullet, self).__init__()
        self.surf = pygame.image.load("Bullet.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.rect = self.surf.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedx = 5
    def update(self):
        self.rect.x += self.speedx

        if self.rect.left > SCREEN_WIDTH:
            self.kill()


class AddEnemyTimer():
    def __init__(self, Generate_Enemy_Timer, Generate_Cloud_Timer):
        self.Generate_Enemy_Timer = Generate_Enemy_Timer
        self.Generate_Cloud_Timer = Generate_Cloud_Timer

class Game_Speed_Class():
    def __init__(self, Game_Speed):
        self.Game_Speed = Game_Speed

class Enemy_Speed_Class():
    def __init__(self, First_NEW_ENEMY_SPEED, Second_NEW_ENEMY_SPEED):
        self.First_NEW_ENEMY_SPEED = First_NEW_ENEMY_SPEED
        self.Second_NEW_ENEMY_SPEED = Second_NEW_ENEMY_SPEED
Enemy_SPEED = Enemy_Speed_Class(20, 50)
Enemy_SPEED_Min = Enemy_SPEED.First_NEW_ENEMY_SPEED
Enemy_SPEED_Max = Enemy_SPEED.Second_NEW_ENEMY_SPEED

count = 0
green = (0, 255, 0)
Lives = 99999999999999



Primary_Music = pygame.mixer.music.load("Game.ogg")
pygame.mixer.music.play(loops=-1)



Milestone_Delay = 50

screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) 

First_NEW_ENEMY_Timer = 175
Second_NEW_ENEMY_Timer = 250
First_NEW_CLOUD_Timer = 300
Second_NEW_CLOUD_Timer = 600

Generate_Timer= AddEnemyTimer(random.randint(First_NEW_ENEMY_Timer, Second_NEW_ENEMY_Timer), random.randint(First_NEW_CLOUD_Timer, Second_NEW_CLOUD_Timer))
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY, Generate_Timer.Generate_Enemy_Timer)

More_Enemies = pygame.USEREVENT +2
pygame.time.set_timer(More_Enemies, 3000)

ADDCLOUD = pygame.USEREVENT + 3
pygame.time.set_timer(ADDCLOUD, Generate_Timer.Generate_Cloud_Timer)

New_Progress = pygame.USEREVENT + 4
pygame.time.set_timer(New_Progress, Milestone_Delay)

Game_Framerate = Game_Speed_Class(59.94)
Set_Game_Speed = pygame.USEREVENT + 5
pygame.time.set_timer(Set_Game_Speed, 10000)

player = Player()
health = 0
green = (0, 255, 0)

enemies = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
clouds = pygame.sprite.Group()

clock = pygame.time.Clock()
running = True

Large_Font = 60
Medium_Font = 40
Small_Font = 20
Small_Size = pygame.font.Font("Airstrip Four.ttf", Small_Font)
Medium_Size = pygame.font.Font("Airstrip Four.ttf", Medium_Font)
Large_Size = pygame.font.Font("Airstrip Four.ttf", Large_Font)




while running:
    for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    running = False
                if event.key == K_SPACE:
                    player.shoot()
                if event.key == K_0:
                    pygame.mixer.music.set_volume(0)
                if event.key == K_9:
                    pygame.mixer.music.set_volume(1)
            elif event.type == QUIT:
                running = False

            elif event.type == ADDENEMY:
                new_enemy = Enemy()
                enemies.add(new_enemy)
                all_sprites.add(new_enemy)

            elif event.type == ADDCLOUD:
                new_cloud = Cloud()
                clouds.add(new_cloud)
                all_sprites.add(new_cloud)

            elif event.type == New_Progress:
                count+= 1

            elif event.type == Set_Game_Speed:
                Enemy_SPEED_Min += 10
                Enemy_SPEED_Max += 10


            elif event.type == More_Enemies:
                First_NEW_ENEMY_Timer += 50
                Second_NEW_ENEMY_Timer += 50
                First_NEW_CLOUD_Timer += 50
                Second_NEW_CLOUD_Timer += 50


    if Lives == 0:
        running = False


    screen.fill((135,206,250))
    for entity in all_sprites:
        screen.blit(entity.surf, entity.rect)
    if pygame.sprite.spritecollide(player, enemies, True):
        print("Hit!")
        Lives -= 1



    screen.blit(Medium_Size.render(str(count), True, (0, 0, 0)), (SCREEN_WIDTH // 2, 48))
    screen.blit(Medium_Size.render(("Lives: ") + str(Lives), True, (0,0,0)), (20, 40))

    fps = str(int(clock.get_fps()))
    screen.blit(Small_Size.render(("FPS: ") + str(fps), True, (0,0,0)), (10, 0))



    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)
    enemies.update()
    clouds.update()
    pygame.display.flip()

    clock.tick(62)

2 个答案:

答案 0 :(得分:2)

这里有太多代码需要深入研究,但是我可以看到您没有在while循环中调用Bullet.update()

答案 1 :(得分:1)

为项目符号创建pygame.sprite.Group

bullets = pygame.sprite.Group()

将项目符号添加到组中:

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

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

在主应用程序循环中更新bullets组:

while running:
    # [...]

    player.update(pressed_keys)
    enemies.update()
    clouds.update()
    bullets.update() # <-----
    pygame.display.flip()