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

工具:

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. Day 14 三元运算符,列表推导式,内置函数

    三目运算符 ```python# 三目(元)运算符:就是 if...else...语法糖# 前提:简化if...else...结构,且两个分支有且只有一条语句# 注:三元运算符的结果不一定要与条件直接 ...

  2. GradleUserGuide中文版 19)Plugins 20)插件规范 21)Java插件

    https://blog.csdn.net/roymuste/article/details/51321881

  3. 《企业IT架构转型之道》读书笔记

    1 出发点:企业IT系统建设普遍面临的问题和处境 很多企业面临的问题和处境: 『烟囱式』系统建设模式. 当业务部门提出业务需求,信息中心部门进行系统集成商的招投标,再进入到需求收集.需求分析.开发.测 ...

  4. 20165312 实验一 Java开发环境的熟悉

    20165312 实验一 Java开发环境的熟悉 一.实验内容及步骤 (一)使用JDK编译.运行简单的Java程序 Ctrl+Shift+T打开终端 输入cd cxgg20165312/test进入目 ...

  5. [编程小技巧]Notepad++中如何实现文本对比功能?

    1.打开Notepad++插件中心   2.安装Compare   3.按提示重启Notepad++     4.点击Compare比较临近的两个文件       5. 取消比较     6 Comp ...

  6. sharepoint环境安装过程中几点需要注意的地方

    写在前面 上篇文章也说明了,在安装sharepoint环境的时候,确实吃了不少苦头,这里纪录一下安装过程中遇到的几个问题. 安装环境 windows server 2012 r2 standard x ...

  7. Java笔试面试题整理第七波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 1.super的作用     在Java中su ...

  8. eShopOnContainers 看微服务 ②:配置 启动

    一.什么是docker Docker 是一个开源项目,通过把应用程序打包为可移植的.自给自足的容器(可以运行在云端或本地)的方式,实现应用程序的自动化部署. 使用 Docker 的时候,需要创建一个应 ...

  9. Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 3

    ▶ 第二章,几个简单的程序 ● 代码,单线程 #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  10. 低级sql语法错误: BadSqlGrammarException

    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) at org.springf ...