我正在尝试使用time.Time()来控制我的弹丸的射速,但是在输入了时间逻辑之后,我的玩家再也无法射击任何弹丸了。我如何才能使播放机每半秒左右发射一次?

以下是一个可行的示例;

游戏主模块

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

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(player.rect.x, player.rect.y, -5, 0)
            elif event.key == pygame.K_RIGHT:
                projectile = Projectiles(player.rect.x, player.rect.y, 5, 0)
            elif event.key == pygame.K_UP:
                projectile = Projectiles(player.rect.x, player.rect.y, 0, -5)
            elif event.key == pygame.K_DOWN:
                projectile = Projectiles(player.rect.x, player.rect.y, 0, 5)

            try:
                if projectile:
                    if time.Time() - last_shot > player.fire_rate:
                        projectile_list.add(projectile)
                        last_shot = time.Time()

            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.fire_rate = 1

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


常量模块定义了几种颜色。任何帮助深表感谢!

最佳答案

带有tryexcept是反模式,几乎不应该使用,因为它会隐藏try子句中的所有错误并使代码难以调试。我将其删除并重新排列事件处理代码。

当按下箭头键时,仅根据该键更改速度矢量,而不创建新的射弹实例。然后再次检查是否按下了任何箭头键,以及计时器是否已完成,请创建一个射弹实例并传递当前速度矢量。

import pygame as pg
from pygame.math import Vector2


BULLET_IMG = pg.Surface((9, 9))
BULLET_IMG.fill(pg.Color('aquamarine2'))


class Projectile(pg.sprite.Sprite):

    def __init__(self, pos, vel):
        super().__init__()
        self.image = BULLET_IMG
        self.rect = self.image.get_rect(center=pos)
        self.vel = Vector2(vel)

    def update(self):
        self.rect.move_ip(self.vel)


def main():
    pg.init()
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    projectiles = pg.sprite.Group()
    previous_time = pg.time.get_ticks()
    speed = 12
    vel = Vector2(speed, 0)

    done = False
    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                # Only change the velocity vector.
                if event.key == pg.K_LEFT:
                    vel = Vector2(-speed, 0)
                elif event.key == pg.K_RIGHT:
                    vel = Vector2(speed, 0)
                elif event.key == pg.K_UP:
                    vel = Vector2(0, -speed)
                elif event.key == pg.K_DOWN:
                    vel = Vector2(0, speed)
                # If an arrow keys was pressed, create a new projectile.
                if event.key in (pg.K_LEFT, pg.K_RIGHT, pg.K_UP, pg.K_DOWN):
                    current_time = pg.time.get_ticks()
                    # We're ready to fire when 500 ms have passed.
                    if current_time - previous_time > 500:
                        previous_time = current_time
                        # Now create the projectile instance and pass
                        # the position and the velocity.
                        projectiles.add(Projectile(pg.mouse.get_pos(), vel))

        projectiles.update()

        screen.fill((30, 30, 30))
        projectiles.draw(screen)

        pg.display.update()
        clock.tick(60)


if __name__ == '__main__':
    main()
    pg.quit()

07-26 08:07