微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pygame中多个对象的随机方向?

如何解决pygame中多个对象的随机方向?

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

这是公式: pos.x = pos.x + 速度 * cos(角度) pos.y = pos.y + 速度 * sin(角度)

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

5 dots2000 dots2000 dots after rebound

我测试了不同的随机生成器;没变化。不同的窗口大小;没变化。代码如下:

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))
    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,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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。