Robię grę w Pigame (Nadal jestem nowy w Pythonie i Pigame, znam podstawy, ale to prawie to), ale kiedy próbuję spawać wrogom, które pojawiają się w różnych czasach (mają się pojawić w linia i zejdź w dół w tym samym czasie)

To jest część, która daje mi kłopoty:

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)

To są zdjęcia tego, co się dzieje

Como See Deberia de Ver

Próbowałem umieścić go w pętli, aby sprawdzić, czy wydaje się wszystko jednocześnie.

Pełny kod:

#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)
    

    
1
Angel Joshua Cantú Hernández 7 październik 2020, 21:14

1 odpowiedź

Najlepsza odpowiedź

Odkąd nazywasz dropper(blocks_list) Każda iteracja pętli, stale dodaje wrogów do ekranu. Jeśli dodasz trochę w jednej iteracji, a następnie upadku trochę, a następnie dodajesz więcej wrogów kolejną pętlą iteracji, będą wyższe niż te utworzone w poprzedniej iteracji. if len(blocks_list) <= random.randint(5,10) oznacza, że wszyscy wrogowie niekoniecznie zostaną dodani w pierwszej iteracji; Losowa kwota zostaje dodana na iterację.

Tak więc, aby wszyscy wrogom były w tym samym czasie, jedna opcja jest dodanie ich wszystkich przed rozpoczęciem pętli. na przykład przesuń dropper(blocks_list) do powyżej {x1}}.

0
Random Davis 7 październik 2020, 18:34