python - pygame中多个对象的随机方向?
问题描述
我正在尝试使用 pygame 从中心随机方向爆发出一些点。我为每个点生成随机角度并将它们转换为一个方向(x 和 y 中的新位置)。
这是公式: pos.x = pos.x + speed * cos(angle) pos.y = pos.y + speed * sin(angle)
当它们到达窗口边界时,它们会在一个新的随机方向上反弹。它一开始似乎效果很好,但是一旦点的数量(n)超过十几个左右,而不是在 n 个不同的方向上爆发,它就会形成模式:
我测试了不同的随机数生成器;没变。不同的窗口大小;没变。这是代码:
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()
解决方案
推荐阅读
- javascript - Javascript:表单提交后的 URL 重定向
- python - 如何在 pywallet 中创建 Tether (USDT) 钱包?
- typescript - 哪个版本更好以及为什么:`fn(a: AType)` 或 fn
(一:T)`? - python - 无论python中的系统日期如何,都获取当前日期
- sql - 根据SQL中的上述两行值计算每列的百分比值
- java - 为什么在 Java 10 的实例和全局变量声明中不能使用 var 关键字
- linkedin - Power AUtomate 桌面选择器问题
- kubernetes - 使用 helm 在 Kubernetes 中扩展 Kafka 流应用程序部署
- python - 虚拟打印机到 python
- python - 将以一个字符开头并以另一个字符结尾的文本提取到python中的新列中