【问题标题】:I am trying to create an instance of a class every time 5 seconds pass in pygame, but instead it creates a ton of instances instead of 1 [duplicate]我试图在 pygame 中每次通过 5 秒时创建一个类的实例,但它会创建大量实例而不是 1 [重复]
【发布时间】:2020-05-21 16:05:04
【问题描述】:
import pygame as pg
import random
from player import Player

pg.init()
pg.font.init()


#screen settings
(width, height) = (800, 600)
bg = (128, 128, 128)
screen = pg.display.set_mode((width, height))
pg.display.set_caption("2D game")


#speed of the game and color rgb values
speed = 1

red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
yellow = (255,255,0)
cyan = (0,255,255)
colors = [red, green, blue, yellow, cyan]


#player
player = Player((255, 0, 127), 50, 50, 1)
player.rect.x = 380
player.rect.y = 500

#enemy
enemy1 = Player(random.choice(colors), 30, 30, random.randint(50, 100))
enemy1.rect.x = 50
enemy1.rect.y = -50


#adds the player and enemies to their respective lists
all_sprites_list = pg.sprite.Group()
all_sprites_list.add(player)
all_sprites_list.add(enemy1)

all_enemies = pg.sprite.Group()
all_enemies.add(enemy1)

#clock
clock = pg.time.Clock()
passed_time = 0

def make_enemy(name, color, width, height, speed):
    name = Player(color, width, height, speed)
    name.add(all_sprites_list)
    name.add(all_enemies)

def textboard(font ,text, color, x, y):
    font = pg.font.SysFont(font, 50)
    textsurf = font.render(text, False, color)
    screen.blit(textsurf, (x,y))


#game loop
running = True
while running:

    passed_time = round(pg.time.get_ticks()/1000)
    if passed_time%5 == 0:
        variable_name = 0
        variable_name += 1
        speed += 0.01
        make_enemy('enemy' + str(variable_name), random.choice(colors), 30, 30, random.randint(50, 100))

    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False
        elif event.type == pg.KEYDOWN:
            if event.key == pg.K_x:
                running = False

    keys = pg.key.get_pressed()
    if keys[pg.K_RIGHT]:
        player.moveRight(5)
    if keys[pg.K_LEFT]:
        player.moveLeft(5)

    for enemy in all_enemies:
        enemy.enemyFall(speed)
        if enemy.rect.y > height:
            enemy.changeSpeed(random.randint(50, 100))
            enemy.rect.y = random.randint(50, 100) * -1
            enemy.changePosition()
            enemy.randColor(random.choice(colors))

    collisions = pg.sprite.spritecollide(player, all_enemies, False)
    for enemy in collisions:
        running = False

    all_sprites_list.update()

    screen.fill(bg)

    textboard('ComicSans', 'timer: ' + str(passed_time), cyan, 100, 400)

    all_sprites_list.draw(screen)

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

pg.quit()
pg.font.quit()

这就是游戏本身。我在使用 make_enemy() 函数制作数十个实例而不是我想要的 一个实例 时遇到问题。我认为它与蜱有关,但我无法弄清楚。

基本上,当我运行它时,5 秒后它会创建 10-30 个敌人,这些敌人会在屏幕上过度填充,我希望它每 5 秒只创建一个。

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    " 我认为这与蜱虫有关,"

    当然可以。条件if passed_time%5 == 0: 满足一秒钟。

    设置第一个敌人生成的时间点。如果超过时间点,则生成一个敌人并设置下一个时间点:

    variable_name = 0
    next_enemy_time = 0  
    
    running = True
    while running:
    
        if pg.time.get_ticks() > next_enemy_time:
            next_enemy_time += 5000
    
            variable_name += 1
            speed += 0.01
            make_enemy('enemy' + str(variable_name), random.choice(colors), 30, 30, random.randint(50, 100)) 
    

    您也可以使用计时器事件。使用pygame.time.set_timer() 重复创建USEREVENT。例如:

    milliseconds_delay = 5000 # 0.5 seconds
    enemy_event = pygame.USEREVENT + 1
    pygame.time.set_timer(enemy_event, milliseconds_delay)
    

    注意,在 pygame 中可以定义客户事件。每个事件都需要一个唯一的 ID。用户事件的 ID 必须介于 pygame.USEREVENT (24) 和 pygame.NUMEVENTS (32) 之间。在这种情况下,pygame.USEREVENT+1 是生成敌人的计时器事件的事件 ID。

    在事件循环中发生事件时创建一个新敌人:

    milliseconds_delay = 5000 # 0.5 seconds
    enemy_event = pygame.USEREVENT + 1
    pygame.time.set_timer(enemy_event, milliseconds_delay)
    variable_name = 0
    
    running = True
    while running:
    
        clock.tick(FPS)
    
        for event in pygame.event.get():
            if event.type == pg.QUIT:
                running = False
    
            elif event.type == enemy_event:
                variable_name += 1
                speed += 0.01
                make_enemy('enemy' + str(variable_name), random.choice(colors), 30, 30, random.randint(50, 100)) 
    
            # [...]
    

    【讨论】:

      【解决方案2】:

      你需要检查一下你是否已经创建了新实例,否则它将在每个游戏循环从 5 秒到 6 秒过去时创建它们。

      例如在 10000 滴答时,passed_time=10,在 10200 滴答时,passed_time=10 ...

      所以也许只计算你上次创建了多少次,如果 (pg.time.get_ticks() - create_time-pg) > 5000 创建一个实例并设置 create_time=pg.time.get_ticks()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多