仅当我按住火键时,弹丸才会移动

时间:2018-08-22 12:50:54

标签: python pygame

以前,在我的弹丸模块中,我有一个单独处理各个方向火的类(一个用于向上,向下,向左和向右射击的类),它的工作就是这样。但是,现在我正在尝试将射击速度和其他东西纳入班级,拥有4个单独的班级太混乱了,因此我尝试将其调整为仅对所有发射的射弹使用一个班级。

但是,既然我已经做到了,那么当我发射弹丸时,只有当我按住发射按钮(如果发射时为'a'键)时,弹丸才会移动。另外,如果我向左开火,然后向右开火,则先前向左移动的射弹将开始向右移动。

我的问题是;我该如何处理弹丸,这样当我发射一枚弹丸时,它不再接受更新并且不能直线移动?

这是我的工作代码;

主要游戏模块

import pygame
from constants import *
from player import Player
from Projectile import Projectiles

pygame.init()

screen = pygame.display.set_mode([500, 500])

pygame.display.set_caption('Labyrinth')

# Spawn player

player = Player(50, 50)
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(player)

projectile_list = pygame.sprite.Group()

clock = pygame.time.Clock()

done = False


# ----- Event Loop

while not done:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        elif event.type == pygame.KEYDOWN:
            if event.key == ord('a'):
                player.changespeed(-3, 0)
            elif event.key == ord('d'):
                player.changespeed(3, 0)
            elif event.key == ord('w'):
                player.changespeed(0, -3)
            elif event.key == ord('s'):
                player.changespeed(0, 3)

            elif event.key == pygame.K_LEFT:
                projectile = Projectiles(0, 0)
                projectile.rect.x = player.rect.x
                projectile.rect.y = player.rect.y
            elif event.key == pygame.K_RIGHT:
                projectile = Projectiles(0, 0)
                projectile.rect.x = player.rect.x
                projectile.rect.y = player.rect.y
            elif event.key == pygame.K_UP:
                projectile = Projectiles(0, 0)
                projectile.rect.x = player.rect.x
                projectile.rect.y = player.rect.y
            elif event.key == pygame.K_DOWN:
                projectile = Projectiles(0, 0)
                projectile.rect.x = player.rect.x
                projectile.rect.y = player.rect.y

            try:
                if projectile:
                    projectile_list.add(projectile)

            except:
                pass

        elif event.type == pygame.KEYUP:
            if event.key == ord('a'):
                player.changespeed(3, 0)
            elif event.key == ord('d'):
                player.changespeed(-3, 0)
            elif event.key == ord('w'):
                player.changespeed(0, 3)
            elif event.key == ord('s'):
                player.changespeed(0, -3)


# ----- Game Logic

    all_sprites_list.update()
    projectile_list.update()



    screen.fill(GREEN)

    all_sprites_list.draw(screen)
    projectile_list.draw(screen)


    pygame.display.flip()

    clock.tick(60)

pygame.quit()

播放器模块

from constants import *
import pygame
import time
from datetime import datetime, timedelta

class Player(pygame.sprite.Sprite):


    def __init__(self, x, y):

        super().__init__()

        self.image = pygame.Surface([15, 15])
        self.image.fill(BLACK)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

        self.change_x = 0
        self.change_y = 0

    def changespeed(self, x, y):
        self.change_x += x
        self.change_y += y

    def update(self):
        self.rect.x += self.change_x
        self.rect.y += self.change_y

射弹模块

import pygame
from constants import *

class Projectiles(object):
    def __init__(self, x, y):
        super().__init__()

        self.image = pygame.Surface([4, 4])
        self.image.fill(RED)

        self.rect = self.image.get_rect()



    def update(self):

        key = pygame.key.get_pressed()

        if key[pygame.K_UP]:
            self.rect.y -= 5
        if key[pygame.K_DOWN]:
            self.rect.y += 5
        if key[pygame.K_LEFT]:
            self.rect.x -= 5
        if key[pygame.K_RIGHT]:
            self.rect.x += 5

一如既往,任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

第一个问题是您只能创建一个弹丸。您的班级叫做Projectiles,因为它只是一个对象而不是多个对象,所以具有误导性。这样即使在射击后也能控制弹丸。

此外,仅在按下键时弹丸才移动的原因是,在update()方法中,您仅在以下情况下将x或y坐标添加到弹丸中: key[pygame.K_UP]:是真的。

因此,要解决此问题,您将必须更改游戏处理弹丸的方式。 如果我对您的问题理解正确,那么您希望一次拥有多个弹丸。 实现此目的的方法是使用射弹集合。

游戏

            //nothing changed till here

           elif event.key == pygame.K_LEFT:
                p = Projectile(player.rect.x, player.rect.y, -5, 0)
                projectile_list.add(p)
            elif event.key == pygame.K_RIGHT:
                p = Projectile(player.rect.x, player.rect.y, 5, 0)
                projectile_list.add(p)
            elif event.key == pygame.K_UP:
                p = Projectile(player.rect.x, player.rect.y, 0, -5)
                projectile_list.add(p))
            elif event.key == pygame.K_DOWN:
                p = Projectile(player.rect.x, player.rect.y, 0, 5)
                projectile_list.add(p)

           // moved the part where you append the projectile to in the if statement

# ----- Game Logic

    all_sprites_list.update()
    projectile_list.update()

    screen.fill(GREEN)

    all_sprites_list.draw(screen)
    projectile_list.draw(screen)


    pygame.display.flip()

    clock.tick(60)

pygame.quit()

弹丸:

import pygame
from constants import *
// projectile needs to extend Sprite
class Projectile(pygame.sprite.Sprite):
    def __init__(self, x, y, x_speed, y_speed):
        super().__init__()

        self.image = pygame.Surface([4, 4])
        self.image.fill(RED)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.x_speed = x_speed
        self.y_speed = y_speed


    def update(self):

        self.rect.x += self.x_speed
        self.rect.y += self.y_speed

我对Pygame不太熟悉,但我希望这至少可以对您有所帮助。

答案 1 :(得分:-2)

我从没使用过PyGame,但可以看到update()类中的Projectiles方法取决于按键,而取决于所经过的时间。

您的弹丸每次按键移动5个单位,一旦发射,每个游戏滴答移动5个单位。