在屏幕外产生多个对象并使它们在屏幕上向下移动

时间:2020-08-09 17:26:49

标签: python random pygame

我正在做一个游戏,玩家尝试避免立方体在屏幕上移动。我正在努力在屏幕外创建多维数据集,并让它们在玩家尝试避开时随机掉下屏幕。我也希望这种情况一直发生,直到玩家击中游戏结束的立方体为止(我认为我可以在程序中进行碰撞)。到目前为止,这是我的代码:

import pygame
import random

pygame.init()

screen = pygame.display.set_mode((280, 800))

pygame.display.set_caption("Cube Run")

icon = pygame.image.load("cube.png")
pygame.display.set_icon(icon)

player_icon = pygame.image.load("cursor.png")
player_x = 124
player_y = 750
player_x_change = 0

def player(player_x, player_y):
    screen.blit(player_icon, (player_x, player_y))

running = True
while running:

    screen.fill((255, 255, 255))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                player_x_change += 0.7
            if event.key == pygame.K_LEFT:
                player_x_change -= 0.7
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT or pygame.K_LEFT:
                player_x_change = 0

    player_x += player_x_change
    if player_x < 0:
        player_x = 0
    elif player_x > 280-32:
        player_x = 280-32

    player(player_x, player_y)

    pygame.display.update()

这是我到目前为止所拥有的一切,包括球员运动。 谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

对于敌方立方体,创建一个X / Y坐标数组,每个立方体一个。将Y设置为屏幕上方(负数),将X设置为小于屏幕宽度的随机数。在主循环中,只需在绘制之前增加每个立方体的Y坐标即可。如果立方体掉到屏幕底部,请再次将Y值重置为屏幕上方。根据初始Y值,多维数据集可以呈波浪形进入。我还在循环的底部添加了tick调用,以降低游戏速度。

这是更新的代码:

import pygame
import random
from random import randint

pygame.init()

screen = pygame.display.set_mode((280, 800))

pygame.display.set_caption("Cube Run")

icon = pygame.image.load("cube.png")
pygame.display.set_icon(icon)

player_icon = pygame.image.load("cursor.png")
player_x = 124
player_y = 750
player_x_change = 0

def player(player_x, player_y):
    screen.blit(player_icon, (player_x, player_y))

# create cubes array [[x,y],[x,y],[x,y],....]
cubes = [[
     randint(1,260),   # X coordinate
     randint(-500,-20)]   # Y coordinate, -Y is above screen  (top of screen is zero)
     for x in range(20)]  # 20 cubes

# above syntax is a shortcut for the following loop
#    cubes = []
#    for x in range(20):
#       cubes.append([randint(1,260), randint(-500,-20)])

running = True
while running:

    screen.fill((255, 255, 255))  # clear screen
    
    # render cubes
    for cb in cubes:
       cb[1] += 2  # cube moves down 2 pixels
       screen.blit(icon,cb)  # draw cube
       if cb[1] > 800:  # if cube passed bottom of screen
          cb[1] = -20  # move to above screen
          cb[0] = randint(1,260)  # random X position

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                player_x_change += 0.7
            if event.key == pygame.K_LEFT:
                player_x_change -= 0.7
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT or pygame.K_LEFT:
                player_x_change = 0

    player_x += player_x_change
    if player_x < 0:
        player_x = 0
    elif player_x > 280-32:
        player_x = 280-32

    player(player_x, player_y)

    pygame.display.update()
    pygame.time.Clock().tick(60)  # slow loop - 60 FPS