你是否也想做出下图这么漂亮的动态效果?想的话就跟着我一起做吧=.=

工具:

Python——Pygame

仔细观察上图,你能发现哪些机制呢?再在下面对比一下是否跟你想的一样。

运行机制:

1、随机方向,随机速度,随机初始位置的点,在屏幕上面运动,撞到屏幕边缘会"反向”

2、点与点之间,距离在某一个值内会产生线段,且线段的颜色深浅跟距离有关

3、鼠标也能产生2的效果,说明鼠标也是一个点,只不过这个点看不见

4、看似鼠标能把点给拉动,其实是下面的两个机制组合的效果:

(1)、在鼠标周围某一个环形区域内,锁定点到鼠标之间的距离,也就是说,点在这个环形区域内点是不能动的

(2)、在另一个比较大的环形区域内,点的速度被加快,并且点的方向改为朝着鼠标移动

知道上面的机制,我们就可以开始动手实现了。

流程:

点类:

这个效果是以点为基础的,所以我们可以先描述一下点的特性:

说到点的特性,肯定有横纵坐标、大小对吧 (其实谈到点的大小,你们可能就清楚了,这里的点,其实是很小的圆),而我们这里的点,不仅仅如此,它还能动,所以它应该具有“动”这个方法,对于运动的点,你又该怎么去描述呢?运动肯定就得有方向和速度(这里不考虑加速度),方向又该怎么去描述呢?你可以用坐标去描述方向,但这里我不推荐,因为后面方向要经常变换,用坐标不方便,所以这里用运动方向与x轴顺时针的角度(弧度制)作为点的方向,而这些只是数据处理层面,还没有显示真正的点。所以还应该有“显示点”这个方法

综上

点:

属性:坐标、方向(弧度)、大小

方法:运动(根据方向),显示

  1. import pygame as py
  2. import math
  3. import random
  4. py.init()
  5. mysize = width,height=800,600
  6. screen = py.display.set_mode(mysize)
  7. fullscreen=False #全屏开关
  8. py.display.set_caption("游戏测试")
  9. class Point:
  10. speed=0
  11. upspeed=1;
  12. direction=0
  13. position=[0,0]
  14. size=1
  15. def __init__(self,position,speed,direction,size):
  16. self.position=position
  17. self.speed=speed
  18. self.direction=direction
  19. self.size=size
  20. return #坐标,速度,方向,点大小
  21. def run(self,):
  22. if(self.position[0]<=0 or self.position[0]>=width):
  23. self.direction=-self.direction+math.pi
  24. if(self.position[1]<=0 or self.position[1]>=height):
  25. self.direction=-self.direction
  26. if(self.distance(py.mouse.get_pos())>130 and self.distance(py.mouse.get_pos())<200):
  27. y=(py.mouse.get_pos()[1]-self.position[1])
  28. x=(py.mouse.get_pos()[0]-self.position[0])
  29. if x!=0:
  30. self.mouse_direction=math.atan2(y,x)
  31. self.upspeed=3
  32. x=self.upspeed*self.speed*math.cos(self.mouse_direction)
  33. y=self.upspeed*self.speed*math.sin(self.mouse_direction)
  34. if x!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
  35. self.position[0]+=x/abs(x)*math.ceil(abs(x))
  36. if y!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
  37. self.position[1]+=y/abs(y)*math.ceil(abs(y))
  38. else :
  39. self.upspeed=1
  40. x=self.upspeed*self.speed*math.cos(self.direction)
  41. y=self.upspeed*self.speed*math.sin(self.direction)
  42. if x!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
  43. self.position[0]+=x/abs(x)*math.ceil(abs(x))
  44. if y!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
  45. self.position[1]+=y/abs(y)*math.ceil(abs(y)) #运动
  46. def show(self):
  47. self.position=[int(i+0.5) for i in self.position]
  48. py.draw.circle(screen,(44,67,116),self.position,self.size) #图像变动
  49. def distance(self,other): #求点距
  50. return math.sqrt((self.position[0]-other[0])**2+(self.position[1]-other[1])**2)
  51. class Graph:
  52. pointlist=[] #点列表
  53. def __init__(self,number):
  54. self.pointlist.append(Point([0,0],0,0,0))
  55. for i in range(number):
  56. self.pointlist.append(Point([random.randint(1,width),random.randint(1,height)],random.randint(1,3),i/number*2*math.pi,3)) #根据number创建点个数
  57. def run(self):
  58. for it in self.pointlist:
  59. it.run() #运动
  60. def show(self):
  61. for it in self.pointlist:
  62. it.show()
  63. self.line() #图像变动
  64. def line(self): #画线
  65. color=[0,0,0]
  66. self.pointlist[0].position=py.mouse.get_pos()
  67. for i in self.pointlist:
  68. for j in self.pointlist:
  69. s=i.distance(j.position)
  70. if s<150:
  71. color=[int(s*1.6),int(80+s),int(180+s*0.5)]
  72. py.draw.aaline(screen,color,i.position,j.position,5)
  73. mygraph=Graph(40) #画线
  74. while True:
  75. screen.fill((255,255,255))
  76. for each in py.event.get():
  77. if each.type==py.KEYDOWN:
  78. if each.key==py.K_F11:
  79. fullscreen=not fullscreen
  80. if fullscreen:
  81. mysize=width,height=1920,1080
  82. screen = py.display.set_mode((1920,1080),py.FULLSCREEN|py.HWSURFACE)
  83. else:
  84. mysize = width,height=800,600
  85. screen = py.display.set_mode(mysize)
  86. mygraph.run()
  87. mygraph.show()
  88. py.display.flip()
  89. py.time.Clock().tick(150)

粒子动画——Pygame的更多相关文章

  1. Objective-c粒子动画

    前面贴过几篇关于SpriteKit的案例文章,其中涉及到的动画都是材质类的图片切换或则常规的动画效果,没涉及到今天要说的粒子动画,今天说的粒子动画就是在游戏中实现更佳炫酷的效果必须使用的类,OC中粒子 ...

  2. 7款让人惊叹的HTML5粒子动画特效(转载)

    1.HTML5 Canvas粒子模拟效果 这是一款利用HTML5 Canvas模拟出来的30000个粒子动画,当你用鼠标在canvas画布上移动时,鼠标周围的一些粒子就会跟着你移动,并形成一定的图案, ...

  3. canvas学习之粒子动画

    项目地址:http://pan.baidu.com/s/1ccTptc 粒子动画意思就是把一个图片粒子画,然后使用粒子作出动画效果,主要两个问题:一个图片如何粒子化,这里面我们使用canvas的get ...

  4. 7款让人惊叹的HTML5粒子动画特效

    HTML5的很大一个优势就是可以更加便捷高效地制作网页粒子动画特效,特别是Canvas特性,可以实现在网页上绘制任何图形和动画.本文要分享7款让人惊叹的HTML5粒子动画特效,这些粒子特效都提供源代码 ...

  5. WPF特效-粒子动画

    原文:WPF特效-粒子动画 WPF实现泡泡龙小游戏效果.     /// -Ball to Ball Collision - Detection and Handling    /// http:// ...

  6. 带着canvas去流浪系列之九 粒子动画【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  7. 带着canvas去流浪系列之九 粒子动画

    [摘要] canvas实现粒子动画 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 粒子特效 粒子特效一般指密集点阵效果,它并不是canvas独有 ...

  8. 【带着canvas去流浪(9)】粒子动画

    目录 一. 粒子特效 二. 开发中遇到的问题 2.1 卡顿 2.2 轨迹 2.3 复位 2.4 防护层 2.5 二维向量类 三. 实现讲解 3.1 粒子类的update方法 3.2 粒子群的绘制 3. ...

  9. vue-particles粒子动画插件的使用和爬坑出现垂直滚动条

    1下载==>cnpm install vue-particles --save-dev 2引入 注册-->main.js//插件 import VueParticles from 'vue ...

随机推荐

  1. TSP-UK49687

    Copied From:http://www.math.uwaterloo.ca/tsp/uk/index.html Shortest possible tour to nearly every pu ...

  2. Flask-ORM-数据库的对象关系映射模型-备忘

    ORM对象关系映射模型的特点: 优点 : 只需要面向对象编程, 不需要面向数据库编写代码. 对数据库的操作都转化成对类属性和方法的操作. 不用编写各种数据库的sql语句. 实现了数据模型与数据库的解耦 ...

  3. ylbtech-协议-网络-安全协议:HTTPS

    ylbtech-协议-网络-安全协议:HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext ...

  4. linux git clone 指定分支

    git clone -b develop http://192.168.11.11:8888/scm/git/vrmmo 指定下载develop分支

  5. Java 原子语义同步的底层实现

    原子语义同步的底层实现 volatile volatile只能保证变量对各个线程的可见性,但不能保证原子性.关于 Java语言 volatile 的使用方法就不多说了,我的建议是 除了 配合packa ...

  6. Tesseract-OCR的简单使用与训练

    Tesseract,一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Docu ...

  7. [leetcode]335. Self Crossing

    You are given an array x of n positive numbers. You start at point (,) and moves x[] metres to the n ...

  8. PL2303 USB转串口 com

    PL2303 USB转串口 com PL-2303 XA/HXA chip http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pc ...

  9. lambda group by 的用法

    foreach (DynamicObject lstKSItem in lstKSItems) { var entity = lstKSItem["FEntity"] as Dyn ...

  10. 非virtual函数,用指针进行upcast

    void print_func(A* p) { p -> print(); } int main() { A a(); B b(,); //a.print(); //b.print(); pri ...