python - 在pygame中创建闪电
问题描述
我正在尝试在我的应用程序中创建闪电。到目前为止我做到了
import pygame
import random as rd
import copy
pygame.init()
color = 250,250,250
starting_point =0,0
ending_point = 400,400
a = [[400,0]]
depth = rd.randrange(50,80)
for i in range(depth):
rand1 = rd.randrange(-20,20)
rand2 = rd.randrange(2,15)
a.append([a[i][0]+rand1,a[i][1]+rand2])
screen = pygame.display.set_mode((800,600))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((0,0,0))
for j in range(0,depth):
pygame.draw.aaline(screen, (200-2*j,200-2*j,200-2*j), [ a[j][0] , a[j][1] ], [ a[j+1][0] , a[j+1][1] ],1)
pygame.draw.line(screen, color, a[0], a[1], 1)
pygame.display.update()
这段代码创建了一条随机生成的闪电线,如下所示:
我想做这样的事情:
我希望从最初生成的行中有更多行
我需要的只是最初的想法,我应该使用一个类还是另一个列表?
解决方案
您可以将代码放入函数中,并在生成上一行时使用递归在随机时刻开始下一行。但有时你可以得到一条线,有时你可以得到太多线。
我将它保留在平面列表中,因此它不知道使用什么颜色绘制下一行 - 代码可以为每个点添加颜色或深度,或者它应该为每一行添加深度作为列表中的第一个元素。
import pygame
import random as rd
def generate(x, y, depth):
result = [ [(x,y)] ] # list for many lines
for i in range(depth):
x = result[0][-1][0] + rd.randrange(-20,20)
y = result[0][-1][1] + rd.randrange(2,15)
result[0].append((x, y))
# should I generate next line from here?
if rd.randrange(0,100) < 5:
# add all generated lines to result
result.extend(generate(x, y, depth-i))
return result
# ---
pygame.init()
depth = rd.randrange(50, 80)
result = generate(400, 0, depth)
print(result)
screen = pygame.display.set_mode((800, 600))
screen.fill((0,0,0))
for line in result:
for n, (point1, point2) in enumerate(zip(line, line[1:]), 1):
#x1, y1 = point1
#x2, y2 = point2
c = 200-2*n
pygame.draw.aaline(screen, (c,c,c), point1, point2, 1)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
编辑:我将深度添加为列表中的第一个元素,因此现在它具有更好的颜色。如果我使用line(..., width=)
,则顶部较厚,底部较薄
我正在考虑添加随机值,rd.randrange(-20+R,20+R)
这样一些行会更左或更右。
import pygame
import random as rd
def generate(x, y, depth, c):
result = [[c, (x,y)]]
for i in range(depth):
x = result[0][-1][0] + rd.randrange(-20,20)
y = result[0][-1][1] + rd.randrange(2,15)
result[0].append((x, y))
if rd.randrange(0,100) < 5:
result.extend(generate(x, y, depth-i, c+i))
return result
# ---
pygame.init()
depth = rd.randrange(50, 80)
result = generate(400, 0, depth, 0)
print(result)
screen = pygame.display.set_mode((800, 600))
screen.fill((0,0,0))
for line in result:
depth = line[0]
line = line[1:]
for n, (point1, point2) in enumerate(zip(line, line[1:]), depth):
c = 200-2*n
#pygame.draw.aaline(screen, (c,c,c), point1, point2, 1)
pygame.draw.line(screen, (c,c,c), point1, point2, 12-n//6)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
推荐阅读
- cocoapods - API 和 POD 有什么区别?
- python - 具有复杂背景的 OCR 时间戳提取
- amazon-web-services - AWS SageMaker studio CreateDomain Access error
- android - Flutter Mobile 可滑动动作样式
- javascript - angularjs/font-awesome:如何用感叹号显示一个额外的表格单元格指示错误
- apache-spark - 尝试在 PySpark DataFrame 中创建具有最大时间戳的列
- c - 在 C 中复制数组时出现分段错误错误
- google-earth-engine - 如何找到表示 Google 地球引擎中没有数据的原因的填充值?
- html - 引导轮播的问题
- powershell - 如何使用 New-MgGroupOwnerByRef / Microsoft Graph PowerShell 模块 1.1.0 添加组所有者?