Я делаю игру в 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)
Я пробовал поместить его в цикл 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)
Поскольку вы вызываете
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