Processing交互应用——躲避炸弹
Processing交互应用——躲避炸弹
- 融入动画技术的交互应用
- 交互游戏的构思
- 游戏程序结构的介绍
- 截图
融入动画技术的交互应用
这是一个涉及到动画技术的小的交互应用游戏,通过鼠标移动来控制飞机的移动方向和移动速度,躲避炸弹攻击。炸弹无论是相互碰撞还是撞到飞机都会导致爆炸,一旦相互碰撞而爆炸,碰撞到的炸弹就会消失,并产生新的炸弹;如果飞机与炸弹相撞,则游戏结束,左上角显示获得的分数。
交互游戏的构思
经过前一段时间对《代码本色》的学习,了解了许多有意思的内容,我对其中的运动模拟相关的章节比较感兴趣,例如有目标(方向的)地运动(加速,减速,转向)。在这次实践中,我参考了书中所提到的寻向的内容,其中运用到了向量,运动学以及对象组的知识。
游戏程序结构的介绍
本实例运行在processing平台之上。
主要分为4个部分,一个是用户操作的Target类,一个是追踪Target的Vehicle类(参照书中实例),一个是控制爆炸效果的Explosion类,最后就是主程序(setup draw的部分)。
Vehicle:
参照了Agent章节之中的vehicle类,含有炸弹的位置、速度、加速度等控制信息:
Vehicle(float x, float y) {acceleration = new PVector(0,0);velocity = new PVector(0,-2);location = new PVector(x,y);missile = loadImage("missile.png");missile.resize(30, 60);maxspeed = 4;maxforce = 0.1;}
这里假设导弹的质量为1,每次调用Vehicle类的update方法,进行更新控制信息的操作。
void update() {// Update velocityvelocity.add(acceleration);// Limit speedvelocity.limit(maxspeed);location.add(velocity);acceleration.mult(0);}
其中要注意的是每次更新控制信息都要检查速度是否超过最大值,以防止速度无限变大而“脱线”。另外决定速度的加速度的决定因素是力,这里就用到了书中讲的另一个概念“扭向力”,如果直接将当前位置到目标位置作为施加力的方向(desire),那么导弹的转向将会十分奇怪,为了模拟这一现象,定义了一个名为steer的力,他的大小和方向为desire - velocity,这样得到的力永远都是以当前位置为原点逐渐变换方向的。
void seek(PVector target) {PVector desired = PVector.sub(target,location); desired.setMag(maxspeed);// Steering = Desired minus velocityPVector steer = PVector.sub(desired,velocity);steer.limit(maxforce); // Limit to maximum steering forceapplyForce(steer);}
Target
Target与vehicle大致相同,区别在于传入的目标参数是鼠标的当前位置以及控制参数的不同。
Target(float x, float y) {acceleration = new PVector(0,0);velocity = new PVector(0,-4);location = new PVector(x,y);target = loadImage("Target.png");target.resize(100, 100);maxspeed = 10;maxforce = 0.5;}
Explosion
一开始想的是用爆炸的粒子效果,但经过事件之后发现当多个导弹同时爆炸时,整个画面会变得十分卡顿。所以最后我改用爆炸的图片表示爆炸效果。又因为一闪而过的效果很不好,我就又添加了渐变的效果,这样的话一个爆炸的图片就能渐渐消失
void fade(){tint(255, map(fadeCount, 1, 10, 0, 255));pushMatrix();translate(position.x,position.y);image(pow, -30, -30);popMatrix();noTint();fadeCount--;}
主程序部分
这里主要进行碰撞的检测以及输赢的判别
检测导弹碰撞:
这里需要考虑的问题是,如果一遍遍历一遍删除ArrayList的元素的话,这样肯定会产生错乱,就是真正碰撞到的没有爆炸,没有碰到的反而爆炸了,我解决这一问题用了一个temp(IntList)来记录所有应该删除的元素,然后再统一删除。
void score() {for (int i = 0; i < vehicles.size(); i++) {//println(vehicles.get(i).location);for (int j = i + 1; j < vehicles.size(); j++) {if (vehicles.get(i).location.dist(vehicles.get(j).location) < 30) {//println(vehicles.get(i).location.dist(vehicles.get(j).location));if (temp.hasValue(i) == false) {temp.append(i);}if (temp.hasValue(j) == false) {temp.append(j);}}}}//vehicles.clear();for(int i = 0; i < temp.size(); i++){explosions.add(new Explosion(vehicles.get(temp.get(i)).location));if(int(random(2)) == 0){vehicles.set(temp.get(i), new Vehicle(random(5), random(height)));}else{ vehicles.set(temp.get(i), new Vehicle(width - random(5), random(height)));}}score += temp.size(); //println(temp.size());temp.clear();}
注意:这里并不是简单的删除,而是用新的列表元素来替代应该删掉的元素。使用(set,eg: vehicles.set(temp.get(i), new Vehicle(random(5), random(height)));)
判断飞机与导弹碰撞也使用距离的远近来判断。
这里使用state来控制当前的状态,0表示游戏中,1表示阵亡之后的缓冲时间,2表示游戏结束阶段。
截图
本游戏只使用鼠标控制
游戏开始:
导弹相撞:
飞机炸毁:
游戏结束,点击Try it again 重新开始游戏:
Processing交互应用——躲避炸弹相关推荐
- Arduino与Processing交互-超声波测距传感器的读取与显示
公众号:STCode 1-超声波测距传感器简介 超声波测距传感器是利用频率高于20kHz的声波在空气中传播,遇到障碍物反射回来,通过计算发射和接收时间差,可以计算出发射点与障碍物间的距离. 超声波测距 ...
- Processing与Arduino交互-光敏传感器
跟随环境光变化的太阳 公众号:STCode 1-光敏传感器简介 光敏传感器由光敏电阻构成.光敏电阻的阻值会根据光线强度发生变化.环境光线较弱时,阻值增大:环境光强烈时,阻值变小:当环境光线被完全遮时, ...
- 一个用理性设计的搞笑游戏
编者按: <只只大冒险>(biped)于2020年3月27日和4月8日分别上线Steam和PS4.大家普遍关心的Switch版本也将于今夏上线.众所周知,这是一款乐趣满满的搞笑游戏,但它的 ...
- Phaser 3 入门实例教程
Phaser是什么? Phaser是一个HTML5游戏框架,目的是为了快速地制作跨浏览器的HTML5游戏. 这个框架,主要发掘了现代浏览器(兼及桌面和移动两类系统)的优点,所以对浏览器的唯一要求是,就 ...
- AR体感互动产品大合集
什么是体感互动? 体感互动是通过硬件互动设备.体感互动系统软件以及三维数字内容,来感应站在窗口前的观看者,当观看者的动作发生变化时,窗口显示的画面同时发生变化. 体感互动产品: 1)体感拍照 通过动作 ...
- 二战中真实的打酱油船
============================================================================== 主题:二战中真实的打酱油船 http:/ ...
- 怎么用java做全民飞机大战_基于VC++和OpenCV实现的全民飞机大战游戏
摘要 功能:利用C++语言完成了一个小游戏项目-全民飞机大战,该游戏首先能够给用户提供注册,登录功能:提供了菜单栏及两种游戏模式,一种是无尽模式,另一种是一般模式:一般模式中用户通过控制玩家飞机攻击敌 ...
- android 游戏 育碧,育碧《勇敢的心:世界大战》登陆Android平台
Emile负伤 http://img6.cache.netease.com/photo/0031/2014-09-12/600x450_A5V621884UUJ0031.jpg http://img3 ...
- Java-小游戏-炸弹人-课程设计-搜索算法
项目链接:Java小游戏-炸弹人-课程设计-论文-AI-其他文档类资源-CSDN下载Java小游戏-炸弹人-课程设计-论文-AI-其他文档类资源-CSDN下载项目描述:https://blog.csd ...
- 启元世界获 NeurIPS 2018 多智能体竞赛Learning组冠军,决策智能平台价值凸显...
雷锋网(公众号:雷锋网) AI 科技评论按:近日,国际人工智能顶级学术会议 NeurIPS 2018 顺利落幕.八千多位来自全世界的人工智能研究人员齐聚加拿大蒙特利尔,讨论分享过去一年全世界在人工智能 ...
最新文章
- PHP使用imagick扩展来合并图像
- spark sql 查看分区_Spark 3.0 中七个必须知道的 SQL 性能优化
- 复合索引的列顺序判断
- 连接数据库的方法---ODBC
- Github | TensorFlow Extended (TFX) 面向机器学习工具
- python—将自定义函数的路径添加到系统路径中
- 启动dubbo-admin遇到的那些坑
- 泰格至尊版软件加密锁注册机
- 瑞能实业IPO被终止:年营收4.47亿 曾拟募资3.76亿
- Docker真实应用场景案例解析——ASSA ABLOY
- 计算机打印机图标删除吗,打印机图标不见了怎么办 打印机图标消失的解决方法...
- 树莓派4B点亮LED小灯
- 【自然语言处理】【文本风格迁移】基于风格实例的文本风格迁移
- 智慧水利整体解决方案2022(ppt可编辑)
- 163邮箱苹果设置不成功_怎么样才能让自己服务器发出的邮件不被 Gmail、Hotmail、163、QQ 等邮箱放入垃圾箱...
- 如何更好使用markdown输出pdf
- 计算机毕业设计ssm基于ssm流浪宠物领养系统8xg84系统+程序+源码+lw+远程部署
- Qt Symbian 开发环境安装
- 微软MSDN订阅介绍
- python——爬虫示例分析(今日头条图片获取)