Python (Pygame) нерестится во времени

Я делаю игру в Pygame (я все еще новичок в python и Pygame, я знаю основы, но это почти все), но когда я пытаюсь порождать врагов, они появляются в разное время (они должны появляться в линия и спускаться одновременно)

Это та часть, которая доставляет мне неприятности:

blocks_list = [enemy_pos]
block_speed = 10
gameover = False

def dropper(blocks_list):
    if len(blocks_list) <= random.randint(5,10):
        dropper.x_pos = (random.randint(1,13) * p_size) + 10
        dropper.y_pos = 0
        blocks_list.append([dropper.x_pos,dropper.y_pos])

def move_blocks():
    for enemy_pos in blocks_list:
        enemy_pos[1] = enemy_pos[1] + block_speed

def draw_blocks(blocks_list):
    long = len(blocks_list)
    print(long)
    
    for enemy_pos in blocks_list:
        pygame.draw.rect(screen,RED,(enemy_pos[0],enemy_pos[1],p_size,p_size))


def drawing(blocks_list):
    screen.fill(BLACK)

    draw_blocks(blocks_list)

    move_blocks()

While not gameover:
    drawing(blocks_list)

ЭТО фотографии происходящего

см. deberia de ver

Я пробовал поместить его в цикл while, чтобы увидеть, появляется ли оно сразу.

Полный код:

#IMPORT THE IMPORTANT
import pygame
import sys
import random

pygame.init()



#screen size
SW = 320
SH = 600

#colors
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
BLACK = (0,0,0)
WHITE = (255,255,255)

#Barier vars
barrier1x = SH/20
barrier1y = SH
barrier2x = SW
barrier2y = SH/20

#player vars
p_size = 20
p_x = (SW/2)-(p_size/2)
p_y = (SH/20 * 17)
p_speed = 20
screen = pygame.display.set_mode((SW,SH))

#falling? blocks vars
enemy_pos = [-30,0]
blocks_list = [enemy_pos]
block_speed = 10

gameover = False
clock = pygame.time.Clock()



#functions  
def draw_player():
    pygame.draw.rect(screen,GREEN,(p_x,p_y,p_size,p_size))

def dropper(blocks_list):
    if len(blocks_list) <= random.randint(5,10):
        dropper.x_pos = (random.randint(1,13) * p_size) + 10
        dropper.y_pos = 0
        blocks_list.append([dropper.x_pos,dropper.y_pos])

def move_blocks():
    for enemy_pos in blocks_list:
        enemy_pos[1] = enemy_pos[1] + block_speed

def draw_blocks(blocks_list):
    long = len(blocks_list)
    a=1
    print(long)
    
    for enemy_pos in blocks_list:
        pygame.draw.rect(screen,RED,(enemy_pos[0],enemy_pos[1],p_size,p_size))
    
def barrier():
    pygame.draw.rect(screen,BLUE,(0,0,barrier1x,barrier1y))
    pygame.draw.rect(screen,BLUE,(0,0,barrier2x,barrier2y))
    pygame.draw.rect(screen,BLUE,(SW-barrier1x,0,barrier1x,barrier1y))
    pygame.draw.rect(screen,RED,(0,SH-barrier2y,barrier2x,barrier2y))

def collision_always():
    global p_x
    global p_y
    global gameover
    if p_x <= SW/20:
        p_x = p_x + p_speed
    if p_x >= SW-barrier1x:
        p_x = p_x - p_speed
    if p_y <= SW/20:
        p_y = p_y + p_speed
    if p_y >= SH - (SH/20):
        gameover = True;
        print("u ded");

def drawing(blocks_list):
    screen.fill(BLACK)

    barrier()
    
    draw_player()
    
    draw_blocks(blocks_list)

    move_blocks()

    pygame.display.update()

def controls():
    global p_y
    global p_x
    global p_speed
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                p_x = p_x - p_speed
            elif event.key == pygame.K_RIGHT:
                p_x = p_x + p_speed
            elif event.key == pygame.K_UP:
                p_y = p_y - p_speed
            elif event.key == pygame.K_DOWN:
                p_y = p_y + p_speed



#main loop
while not gameover:

    dropper(blocks_list)

    controls()

    collision_always()

    drawing(blocks_list)
    
    clock.tick(30)
    

    

См. также:  Как преобразовать миллисекунды в минуты: секунды на выходе?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Angel Joshua Cantú Hernández

    Поскольку вы вызываете dropper(blocks_list) на каждой итерации цикла, он постоянно добавляет врагов на экран. Если вы добавите некоторые из них в одной итерации, они немного уменьшатся, а затем вы добавите больше врагов на следующей итерации цикла, они будут выше, чем те, которые были созданы в предыдущей итерации. if len(blocks_list) <= random.randint(5,10) означает, что все враги не обязательно будут добавлены в первой итерации; случайная сумма добавляется за итерацию.

    Итак, чтобы все враги падали одновременно, один из вариантов — добавить их всех сразу, прежде чем начинать цикл. например переместите dropper(blocks_list) вверх while not gameover:.

    я попробую это brb person Angel Joshua Cantú Hernández; 07.10.2020

    хорошо, я только что понял, что моя ошибка заключалась в том, что у меня было если вместо времени, большое спасибо Рэндом Дэвис person Angel Joshua Cantú Hernández; 07.10.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: