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交互应用——躲避炸弹相关推荐

  1. Arduino与Processing交互-超声波测距传感器的读取与显示

    公众号:STCode 1-超声波测距传感器简介 超声波测距传感器是利用频率高于20kHz的声波在空气中传播,遇到障碍物反射回来,通过计算发射和接收时间差,可以计算出发射点与障碍物间的距离. 超声波测距 ...

  2. Processing与Arduino交互-光敏传感器

    跟随环境光变化的太阳 公众号:STCode 1-光敏传感器简介 光敏传感器由光敏电阻构成.光敏电阻的阻值会根据光线强度发生变化.环境光线较弱时,阻值增大:环境光强烈时,阻值变小:当环境光线被完全遮时, ...

  3. 一个用理性设计的搞笑游戏

    编者按: <只只大冒险>(biped)于2020年3月27日和4月8日分别上线Steam和PS4.大家普遍关心的Switch版本也将于今夏上线.众所周知,这是一款乐趣满满的搞笑游戏,但它的 ...

  4. Phaser 3 入门实例教程

    Phaser是什么? Phaser是一个HTML5游戏框架,目的是为了快速地制作跨浏览器的HTML5游戏. 这个框架,主要发掘了现代浏览器(兼及桌面和移动两类系统)的优点,所以对浏览器的唯一要求是,就 ...

  5. AR体感互动产品大合集

    什么是体感互动? 体感互动是通过硬件互动设备.体感互动系统软件以及三维数字内容,来感应站在窗口前的观看者,当观看者的动作发生变化时,窗口显示的画面同时发生变化. 体感互动产品: 1)体感拍照 通过动作 ...

  6. 二战中真实的打酱油船

    ==============================================================================  主题:二战中真实的打酱油船 http:/ ...

  7. 怎么用java做全民飞机大战_基于VC++和OpenCV实现的全民飞机大战游戏

    摘要 功能:利用C++语言完成了一个小游戏项目-全民飞机大战,该游戏首先能够给用户提供注册,登录功能:提供了菜单栏及两种游戏模式,一种是无尽模式,另一种是一般模式:一般模式中用户通过控制玩家飞机攻击敌 ...

  8. android 游戏 育碧,育碧《勇敢的心:世界大战》登陆Android平台

    Emile负伤 http://img6.cache.netease.com/photo/0031/2014-09-12/600x450_A5V621884UUJ0031.jpg http://img3 ...

  9. Java-小游戏-炸弹人-课程设计-搜索算法

    项目链接:Java小游戏-炸弹人-课程设计-论文-AI-其他文档类资源-CSDN下载Java小游戏-炸弹人-课程设计-论文-AI-其他文档类资源-CSDN下载项目描述:https://blog.csd ...

  10. 启元世界获 NeurIPS 2018 多智能体竞赛Learning组冠军,决策智能平台价值凸显...

    雷锋网(公众号:雷锋网) AI 科技评论按:近日,国际人工智能顶级学术会议 NeurIPS 2018 顺利落幕.八千多位来自全世界的人工智能研究人员齐聚加拿大蒙特利尔,讨论分享过去一年全世界在人工智能 ...

最新文章

  1. PHP使用imagick扩展来合并图像
  2. spark sql 查看分区_Spark 3.0 中七个必须知道的 SQL 性能优化
  3. 复合索引的列顺序判断
  4. 连接数据库的方法---ODBC
  5. Github | TensorFlow Extended (TFX) 面向机器学习工具
  6. python—将自定义函数的路径添加到系统路径中
  7. 启动dubbo-admin遇到的那些坑
  8. 泰格至尊版软件加密锁注册机
  9. 瑞能实业IPO被终止:年营收4.47亿 曾拟募资3.76亿
  10. Docker真实应用场景案例解析——ASSA ABLOY
  11. 计算机打印机图标删除吗,打印机图标不见了怎么办 打印机图标消失的解决方法...
  12. 树莓派4B点亮LED小灯
  13. 【自然语言处理】【文本风格迁移】基于风格实例的文本风格迁移
  14. 智慧水利整体解决方案2022(ppt可编辑)
  15. 163邮箱苹果设置不成功_怎么样才能让自己服务器发出的邮件不被 Gmail、Hotmail、163、QQ 等邮箱放入垃圾箱...
  16. 如何更好使用markdown输出pdf
  17. 计算机毕业设计ssm基于ssm流浪宠物领养系统8xg84系统+程序+源码+lw+远程部署
  18. Qt Symbian 开发环境安装
  19. 微软MSDN订阅介绍
  20. python——爬虫示例分析(今日头条图片获取)

热门文章

  1. Mobi格式的书籍整理
  2. 网联V2X测试解决方案
  3. CTGU 2021春-MySQL数据库实验2:基本查询1-2关,共10小题全代码+信息表+通关截图!
  4. 云计算和web服务器应用,基于云计算的Web服务选择及应用研究
  5. 几个国外广告联盟介绍
  6. docker 常用命令合集
  7. 转-Tensorflow之GPU和CPU
  8. jenkins配置360加固脚本(python版)
  9. 电商用户行为分析-大数据
  10. Android平台的音乐资源管理与播放