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

工具:

Python——Pygame

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

运行机制:

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

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

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

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

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

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

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

流程:

点类:

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

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

综上

点:

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

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

import pygame as py
import math
import random
py.init()
mysize = width,height=800,600
screen = py.display.set_mode(mysize)
fullscreen=False #全屏开关
py.display.set_caption("游戏测试")
class Point:
speed=0
upspeed=1;
direction=0
position=[0,0]
size=1
def __init__(self,position,speed,direction,size):
self.position=position
self.speed=speed
self.direction=direction
self.size=size
return #坐标,速度,方向,点大小
def run(self,):
if(self.position[0]<=0 or self.position[0]>=width):
self.direction=-self.direction+math.pi
if(self.position[1]<=0 or self.position[1]>=height):
self.direction=-self.direction
if(self.distance(py.mouse.get_pos())>130 and self.distance(py.mouse.get_pos())<200):
y=(py.mouse.get_pos()[1]-self.position[1])
x=(py.mouse.get_pos()[0]-self.position[0])
if x!=0:
self.mouse_direction=math.atan2(y,x)
self.upspeed=3
x=self.upspeed*self.speed*math.cos(self.mouse_direction)
y=self.upspeed*self.speed*math.sin(self.mouse_direction)
if x!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
self.position[0]+=x/abs(x)*math.ceil(abs(x))
if y!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
self.position[1]+=y/abs(y)*math.ceil(abs(y))
else :
self.upspeed=1
x=self.upspeed*self.speed*math.cos(self.direction)
y=self.upspeed*self.speed*math.sin(self.direction)
if x!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
self.position[0]+=x/abs(x)*math.ceil(abs(x))
if y!=0 and (self.distance(py.mouse.get_pos())<110 or self.distance(py.mouse.get_pos())>130):
self.position[1]+=y/abs(y)*math.ceil(abs(y)) #运动
def show(self):
self.position=[int(i+0.5) for i in self.position]
py.draw.circle(screen,(44,67,116),self.position,self.size) #图像变动
def distance(self,other): #求点距
return math.sqrt((self.position[0]-other[0])**2+(self.position[1]-other[1])**2)
class Graph:
pointlist=[] #点列表
def __init__(self,number):
self.pointlist.append(Point([0,0],0,0,0))
for i in range(number):
self.pointlist.append(Point([random.randint(1,width),random.randint(1,height)],random.randint(1,3),i/number*2*math.pi,3)) #根据number创建点个数
def run(self):
for it in self.pointlist:
it.run() #运动
def show(self):
for it in self.pointlist:
it.show()
self.line() #图像变动
def line(self): #画线
color=[0,0,0]
self.pointlist[0].position=py.mouse.get_pos()
for i in self.pointlist:
for j in self.pointlist:
s=i.distance(j.position)
if s<150:
color=[int(s*1.6),int(80+s),int(180+s*0.5)]
py.draw.aaline(screen,color,i.position,j.position,5) mygraph=Graph(40) #画线
while True:
screen.fill((255,255,255))
for each in py.event.get():
if each.type==py.KEYDOWN:
if each.key==py.K_F11:
fullscreen=not fullscreen
if fullscreen:
mysize=width,height=1920,1080
screen = py.display.set_mode((1920,1080),py.FULLSCREEN|py.HWSURFACE)
else:
mysize = width,height=800,600
screen = py.display.set_mode(mysize) mygraph.run()
mygraph.show()
py.display.flip()
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. SVN远程管理

    1.使用远程桌面连接工具,分别填写连接地址和用户名进行连接 2.紧接着进行安全登录. 3.打开VisualSVN Server Manager工具进行显示已经拥有的项目和分配好的群组管理. 这样子就可 ...

  2. windows与linux换行规则

    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这 ...

  3. 浅读官方代码--ActionManager

    用于管理节点的动作 { CCDirector* pDirector = CCDirector::sharedDirector(); //获得单例 pDirector->getActionMana ...

  4. OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)

    本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常   在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...

  5. select函数与I/O多路转接

    select函数与I/O多路转接 相作大家都写过读写IO操作的代码,例如从socket中读取数据可以使用如下的代码: while( (n = read(socketfd, buf, BUFSIZE) ...

  6. vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡

    问题描述:vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡. 1.ifconfig 查看网卡状态 lo: flags=<UP,LOOPBACK,RUNNING> mtu i ...

  7. 杂谈c.cpp

    Endl确保程序运行前刷新输出(将其立即显示在屏幕上),而’\n’却不能保证 在c++中,是以分号分割的,所以可以把几条代码放在一行,也可以把一条代码放在几行 编译器负责分配和标记内存的细节 C++可 ...

  8. 204. jetcache:在Spring Boot中怎么玩?

      [视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...

  9. android 开发 Intent使用技巧点

    判断Intent是否为null: if (intent.resolveActivity(getPackageManager())!=null) { //判断Intent是否为null // Inten ...

  10. 推特算法,分布式ID

    package casclient_demo1.util; import java.lang.management.ManagementFactory; import java.net.InetAdd ...