学习从来都不是一个单方面接受知识的过程,重点在于反馈,听到的永远都还是别人的,希望大家在以后的学习生活中都能够懂得反馈,这也是我要努力的。啊哈哈,共勉吧。

学习粒子系统的收获在于我们可以运用这样的粒子来实现一些比较好玩的效果,比如烟花效果,雨滴效果,喷泉效果,像这样子的

有时候也可以运用到游戏当中的特效,比如把敌人打败之后出现的闪光,攻击时发射的子弹等等,小编还没有做过完整的小游戏,目前只运用粒子系统做了一个简单的落花图,像这样的

梅花树是背景图,散落的花瓣就是运用粒子系统实现的效果。

一、先介绍一下粒子系统的概念

粒子系统模拟大量的粒子,并通常用某些方法把粒子渲染。粒子通常有以下特性:

1. 粒子是独立的,粒子之间互不影响(不碰撞、没有力)

2. 粒子有生命周期,生命结束后会消失

3. 粒子可以理解为空间的一个点,有时候也可以设定半径作为球体和环境碰撞

4. 粒子带有运动状态,也有其他外观状态(例如颜色、影像等)

5. 粒子可以只有线性运动,而不考虑旋转运动(也有例外)

粒子系统通常可分为三个周期:

1. 发射粒子

2. 模拟粒子(粒子老化、碰撞、运动学模拟等等)

3. 渲染粒子

在游戏循环(game loop)中,需要对每个粒子系统执行以上的三个步骤。

二、用粒子系统实现落花效果

界面显示类,界面显示之后启动线程,画散落的花瓣

public class MainUI extends JFrame{

private JFrame temf=this;

private Graphics g;

//show函数显示界面

public void showUI(){

this.setsize(800,500);

this.setVisible(ture);

//画笔从JFrame获取时一定要在设置可见之后

g=this.getGraphics();

//启动线程类

Particlecontrol pc = new Particlecontrol(temf);//将窗体对象传入线程类当中

pc.start();

}

//主函数入口

public static void main(String[] args){

MainUI mi = new MainUI();

mi.showUI();

}

}

花瓣粒子类 需要设置粒子的属性,起始点,运动方向,运动速度

为了体现代码的模块化,我们先单独定义一个类来表示这些属性,画粒子时直接调用方法计算粒子运动的路径就可以了

粒子属性类

public class Vec2f{

public double x,y;

public Vec2f(double x,double y){

this.x=x;

this.y=y;}

//路径公式设置时运用到的一些计算

//点的位置加法计算

public void add(Vec2f v){

return new Vec2f(this.x+v.x,this.y+v.y);

}

//乘法计算

public Vec2f multiply(double f){

return new Vec2f(this.x*f,this.y*f)};

}

花瓣粒子类

public class Particle{

//粒子的起点,速度,重力

public Vec2f position,velocity,acceleration;

public double life;

public double age;

public int x,y;

public Particle(){}

//画粒子时的x,y坐标

public int getx(){

return (int)this.position.x;}

public int gety(){

return (int)this.position.y;}

}

我画粒子时运用到了生产消费模型(想要深入了解的可以去搜索一下),这里用到的简单来说为了体现粒子的生命长度和周期性,先生产一批定量的粒子放在数组队列中保存,在这个连续的过程当中,后生产的粒子不断填入,那么先生产的粒子达到了生命长度就要被移出,保证粒子数量的一定。一方面不断生产,另一方面需要用到这些粒子呈现出我们想要的效果。

粒子效果的实现我是用的实现第一张图烟花效果的方法改了一下中间的一些参数

粒子的运动用到高中学的

v=v0+at

s=v0t+1/2at^2

这是一个粒子的路径

随机一下不同粒子出来的角度(用到Random类)同时出来就可以得到烟花效果啦

接下来通过线程画出背景图片和粒子

线程控制类

public class Particlecontrol extends Thread{

//绘制粒子的界面,画粒子时需要从JFrame中获取画笔,以及需要一些跟界面有关的参数

private JFrame jf;

//将图片放在包里面之后从包里面获得图片资源

private ImageIcon im= new ImageIcon(this.getClass().getResource("落花.jpg"));

private ImageIcon im1 = new ImageIcon(this.getClass().getResource("花瓣2.png"));

private Graphics g ;

//保存粒子的队列

private ArrayList ps = new ArrayList();

private Random ran = new Random();

public Particlecontrol(JFrame jf) {

this.jf = jf;

}

//线程启动

public void run(){

// 时间增量

double dt = 0.1d;

while (true) {

// 生成粒子放入队列

Particle tp = new Particle();

tp.position = new Vec2f(0, 0);//粒子发射的起始点

tp.velocity = new Vec2f(-10, -5);// 方向

tp.acceleration = sampleDirection();

tp.life = 400;//400个粒子为一个周期

tp.color = new Color(255, ran.nextInt(255), ran.nextInt(255),ran.nextInt(100));

tp.age = 1;

ps.add(tp);

//双缓冲, 将队列中的粒子画到缓冲区,再画到界面上,可以解决不停重复画图时闪的问题

Image image = jf.createImage(jf.getWidth(), jf.getHeight());

Graphics bg = image.getGraphics();

//画背景,不要将画背景放在画粒子的循环里面

bg.drawImage(im.getImage(), 0, 0,jf.getWidth(), jf.getHeight(),null);

for (int i = 0; i < ps.size(); i++) {

Particle p = ps.get(i);

// 1.判断粒子的生命是否到期,到期后,从队列移出

p.age += dt;

if (p.age >= p.life) {

ps.remove(i);

}

// 2.计算每个粒子的下一位置

int r = p.color.getRGB();

r -= 3000;

p.position = p.position.add(p.velocity.multiply(dt));

p.velocity = p.velocity.add(p.acceleration.multiply(dt));

// 画到缓冲区

//画花瓣

// bg.drawImage(im1.getImage(), p.getX()+50, p.getY()+60,10, 10, null);

bg.drawImage(im1.getImage(), p.getX()+10, p.getY()+10,10, 10, null);

}

jf.getGraphics().drawImage(image, 0, 0, null);

try {

Thread.sleep(20);

} catch (Exception ef) {

}

}

}

// 生成一个随机方向

public static Vec2f sampleDirection() {

double theta = Math.random() * 2 * Math.PI;

return new Vec2f((Math.cos(theta)), (Math.sin(theta)));

}

}

改一下里面的参数可能会实现意想不到的效果呢

到现在只能说敲过一些代码,还是个技术小白,学习之后多总结是学习方法之中很重要的一部分,

拖了很久终于第一次写博客,可能会有很多错误,里面有很多技术点比如有关线程还有之前学过的一些东西后面会慢慢补回来。学习编程一个很重要的方法就是看源代码+打印输出,重要的不是代码本身,而是代码背后逻辑思维的思考,源代码看不懂?那就多看几遍。

java粒子特效_Java学习之粒子系统相关推荐

  1. UE4 粒子特效基础学习 (04-光圈效果制作)

    在上一个博客(UE4 粒子特效基础学习 (03-制作上升光线特效))的基础上继续完成光圈效果的制作 . 效果: 步骤: 1.打开PS软件,新建一个文档,宽高都设为512 2.ctrl+R打开标尺 3. ...

  2. java粒子特效教程_使用particles.js实现网页背景粒子特效

    得知途径 B3log提供了两套博客系统,一个是用Java开发的,叫做Solo,我也是在网上搜索Java博客系统时发现了它,之后才了解了B3log:还有一个是用Go语言开发的,叫做Pipe.其中Solo ...

  3. java粒子特效_程序员20分钟搞定粒子效果, 仅仅200行代码

    原标题:程序员20分钟搞定粒子效果, 仅仅200行代码 这粒子的打造,确实没有布局代码,稍后大家在源码上可以看到,css代码都只有几行,绝大部分代码都是java代码,而且是原生java书写的,现在很多 ...

  4. java helloworld代码_java学习应用篇|逃不掉的HelloWorld

    本文知识点 1.表白不是发起进攻的冲锋号,而是吹响胜利的号角 2.除了爱情不讲道理,公理也不讲道理 3.这世界,离了javac,也是可以运行的! 4.Hello,寺水 写程序并不是写代码 看前面啰啰嗦 ...

  5. java自学难点_java学习重难点

    三人行必有我师,人生是需要不断学习的,在这里我们相遇就是缘分,希望各位可以看完这篇文章,也欢迎大家在下面留言讨论,天冷了,也动动手指转发收藏一下,谢谢大家! 在Java中修饰符总共有一下几种: 1.访 ...

  6. java 内存类_Java学习——类的生命周期和内存

    常识是本能,有足够的常识便是天才.--肖伯纳 一.类的生命周期 类的生命周期:1.加载:将二进制流加载进来.class 2.连接: 验证:确保加载进来的数据不会损害虚拟机 准备:为类变量分配内存,附默 ...

  7. 学习java的步骤_java学习的基本步骤

    Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了.但有一些基本的步骤: 熟悉一种文本编辑器, 比如:Vim, Emacs, Notepad++, TextMate等.知道哪些 ...

  8. java的圆周率_java学习日记,圆周率的打印

    前段时间看到听说学习java每天写技术贴会对自己提升很大,我现在学习java也就2个周,算不上技术贴,就写写学习日记吧. 昨天师傅给我出了一道题,说是试试用java打印圆周率. 刚开始我的思路是,如果 ...

  9. java 位运算_java学习之运算符与表达式(四)

    (6)位运算符 位运算是指对整数按二进制的位进行运算. 位运算用于整数或字符类型. 有7个:~(非).&(与).|(或).^(异或).<>(右移).>>>(无符号 ...

最新文章

  1. 【第三期】如何用Leangoo领歌快速搭建敏捷研发体系分享会
  2. 汇总pandas中dataframe的删除操作
  3. mysql union 优化_mysql 5.7.3 对union all 的优化
  4. maven打包不打lib目录里面的jar包解决办法
  5. 2021牛客多校2 - Girlfriend(球体积交)
  6. Java爬虫搜索原理实现
  7. Linux实验二报告
  8. SAP License:烟草行业ERP选型
  9. python常见的函数和类方法
  10. FineBI使用文档
  11. 将mysql数据库批量导出为word三线表格形式
  12. 网易互娱2020游戏研发实习生笔经面经
  13. 华为员工去面试被淘汰后怒怼HR:华为出来的也能被拒,很无语
  14. matlab实现退化模型,数字图像处理Matlab退化模型示例(example0507).docx
  15. 鸽巢排序Pigeonhole sort
  16. excel 筛选重复项_列表项的Excel筛选器:2011年“鲨鱼周”
  17. 【年终巨献】车联网距离我们还有多远?《5G与车联网技术》给您最专业的解读...
  18. 禁止html5手机端双击页面放大的问题,主要针对苹果手机
  19. caj 获取my documents目录错误,可能“我的文档”目录不存在
  20. 智能电话机器人介绍(AI语音机器人)

热门文章

  1. 完全二叉树的节点个数
  2. Class Test can not access a member of class User with modifiers “private“
  3. python乒乓球比赛规则_python模拟体育竞技分析--采用乒乓球规则
  4. sw安装未成功_Solidworks安装错误问题(四)可执行文件vc_redist未成功安装
  5. 计算机中丢失swr.dll,initpki.dll加载失败找不到指定的模块0x80004005错误代码怎么办win10...
  6. LQ0262 棋盘放麦子【大数+亿进制】
  7. cocos2dx-lua 圆周运动
  8. 在Cadence的PCB工程中直接修改替换元件封装
  9. iOS info.plist访问权限设置
  10. unity 转微信小游戏 资源优化