如何使用时间。时间()控制发射物fi

2024-06-16 14:20:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用时间。时间()控制我的射弹的射速,但是在加入时间逻辑之后,我的玩家就不能再发射任何射弹了。我怎样才能让我的玩家每半秒左右只开火一次呢?你知道吗

下面是一个可行的例子

主游戏模块

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

常量模块定义了几种颜色。非常感谢您的帮助!你知道吗


Tags: keyfromrectimportselfeventpygamelist
2条回答

严格来说,答案是在try块中有time.Time(),应该是time.time()(全部小写)。这会引发异常,因此每当time.Time() - last_shot > player.fire_rate求值时,try块都不会运行。如果捕获到异常并抛出错误消息,而不仅仅是pass,则这一点会更明显。你知道吗

可能还有更多的问题,但是更深入地分析代码是困难的,因为我没有看到您在任何地方初始化last_shot,也没有player.fire_rate。“最小完整示例”标准不仅适用于回答者,也适用于提问者。在基本调试中尽量隔离问题。你知道吗

另一个注意事项是,while循环似乎只包含for循环,这使得它变得多余。如果这样做只是为了让程序在循环中反复运行直到合适的时间,那么time.sleep()可能是更好的方法。你知道吗

带有裸excepttry是一种反模式,几乎不应该使用,因为它隐藏了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()

相关问题 更多 >