首页 > 解决方案 > pygame中多个对象的随机方向?

问题描述

我正在尝试使用 pygame 从中心随机方向爆发出一些点。我为每个点生成随机角度并将它们转换为一个方向(x 和 y 中的新位置)。

这是公式: pos.x = pos.x + speed * cos(angle) pos.y = pos.y + speed * sin(angle)

当它们到达窗口边界时,它们会在一个新的随机方向上反弹。它一开始似乎效果很好,但是一旦点的数量(n)超过十几个左右,而不是在 n 个不同的方向上爆发,它就会形成模式:

5点2000点反弹后2000点

我测试了不同的随机数生成器;没变。不同的窗口大小;没变。这是代码:

import pygame
import os
import math
import random
import time

#create window
WIDTH, HEIGHT = 900, 500 #1680, 990
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Sim')
#set fps
FPS = 60
#load image, set scale, set position (at centre)
DOT_IMAGE = pygame.image.load(os.path.join('Assets', 'dot.png'))
DOT_WIDTH, DOT_HEIGHT = 5, 5
DOT = pygame.transform.scale(DOT_IMAGE, (DOT_WIDTH, DOT_HEIGHT))
#create copies of image, with centre position and random angle
n = 2000
dots = []
for i in range(n):
    dots.append({'position': pygame.Rect(WIDTH/2, HEIGHT/2, DOT_WIDTH, DOT_HEIGHT), 
                    'angle': round(random.uniform(0, 360), 2)})
print(dots)
#draws black background and dots
def draw_window(dots):
    WIN.fill((0, 0, 0))
    for i in range(n):
        WIN.blit(DOT, (dots[i]['position'].x, dots[i]['position'].y))
    pygame.display.update()
#update position of images according to their set random angle at given speed
def update_pos(pos, speed):
    for i in range(n):
        pos[i]['position'].x = pos[i]['position'].x + round(speed*math.cos(math.radians(pos[i]['angle'])))
        pos[i]['position'].y = pos[i]['position'].y + round(speed*math.sin(math.radians(pos[i]['angle'])))
        if pos[i]['position'].x >= WIDTH:
            pos[i]['angle'] = round(random.uniform(90, 270), 2)
        elif pos[i]['position'].x <= 0:
            pos[i]['angle'] = round(random.uniform(270, 450), 2)
        elif pos[i]['position'].y >= HEIGHT:
            pos[i]['angle'] = round(random.uniform(180, 360), 2)
        elif pos[i]['position'].y <= 0:
            pos[i]['angle'] = round(random.uniform(0, 180), 2)
#draws trails behind images            
def draw_trails():
    pass
#run game
def main():
    #every frame:
    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        ########################################################################
        update_pos(dots, 4)

        draw_window(dots)
        ########################################################################
    pygame.quit()

if __name__ == '__main__':
    main()

标签: pythonpygame

解决方案


推荐阅读