Enemy类在Enemy.js中,类Enemy类继承自PhysicsSprite,以便于可以使用物理引擎中的一些特性。

原版的Enemy.js:

 var Enemy = cc.PhysicsSprite.extend({//PhysicsSprite
enemyType: 0, //敌人类型
initialHitPoints: 0, //初始的生命值
hitPoints: 0, //当前的生命值
velocity: null, //速度
space: null, //所在物理空间
ctor: function (enemyType, space) {
//精灵帧
var enemyFramName = EnemyName.Enemy_Stone;
//得分值
var hitPointsTemp = 0;
//速度
var velocityTemp = cc.p(0, 0);
switch (enemyType) {
case EnemyTypes.Enemy_Stone:
enemyFramName = EnemyName.Enemy_Stone;
hitPointsTemp = Enemy_initialHitPoints.Enemy_Stone;
velocityTemp = Sprite_Velocity.Enemy_Stone;
break;
case EnemyTypes.Enemy_1:
enemyFramName = EnemyName.Enemy_1;
hitPointsTemp = Enemy_initialHitPoints.Enemy_1;
velocityTemp = Sprite_Velocity.Enemy_1;
break;
case EnemyTypes.Enemy_2:
enemyFramName = EnemyName.Enemy_2;
hitPointsTemp = Enemy_initialHitPoints.Enemy_2;
velocityTemp = Sprite_Velocity.Enemy_2;
break;
case EnemyTypes.Enemy_Planet:
enemyFramName = EnemyName.Enemy_Planet;
hitPointsTemp = Enemy_initialHitPoints.Enemy_Planet;
velocityTemp = Sprite_Velocity.Enemy_Planet;
break;
} this._super("#" + enemyFramName);
this.setVisible(false); this.initialHitPoints = hitPointsTemp;
this.velocity = velocityTemp;
this.enemyType = enemyType; this.space = space; var shape; if (enemyType == EnemyTypes.Enemy_Stone || enemyType == EnemyTypes.Enemy_Planet) {
this.body = new cp.Body(10, cp.momentForCircle(1, 0, this.getContentSize().width / 2 - 5, cp.v(0, 0)));
shape = new cp.CircleShape(this.body, this.getContentSize().width / 2 - 5, cp.v(0, 0));
} else if (enemyType == EnemyTypes.Enemy_1) {
var verts = [
-5, -91.5,
-59, -54.5,
-106, -0.5,
-68, 86.5,
56, 88.5,
110, -4.5
];
this.body = new cp.Body(1, cp.momentForPoly(1, verts, cp.vzero));
shape = new cp.PolyShape(this.body, verts, cp.vzero);
} else if (enemyType == EnemyTypes.Enemy_2) {
var verts = [
2.5, 64.5,
73.5, -9.5,
5.5, -63.5,
-71.5, -6.5
];
this.body = new cp.Body(1, cp.momentForPoly(1, verts, cp.vzero));
shape = new cp.PolyShape(this.body, verts, cp.vzero);
} this.space.addBody(this.body); shape.setElasticity(0.5);
shape.setFriction(0.5);
shape.setCollisionType(Collision_Type.Enemy);
this.space.addShape(shape);
//this.setBody(this.body);
this.body.data = this; this.scheduleUpdate();
}, update: function (dt) {
//设置陨石和行星旋转.
switch (this.enemyType) {
case EnemyTypes.Enemy_Stone:
this.setRotation(this.getRotation() - 0.5);
break;
case EnemyTypes.Enemy_Planet:
this.setRotation(this.getRotation() + 1);
break;
}
//计算移动位置
var newX = this.body.getPos().x + this.velocity.x * dt;
var newY = this.body.getPos().y + this.velocity.y * dt; this.body.setPos(cc.p(newX, newY)); //超出屏幕重新生成敌人
if (this.body.getPos().y + this.getContentSize().height / 2 < 0) {
this.spawn();
}
},
spawn: function () {
var yPos = winSize.height + this.getContentSize().height / 2;
var xPos = cc.random0To1() * (winSize.width - this.getContentSize().width) + this.getContentSize().width / 2;
this.body.setPos(cc.p(xPos, yPos));
this.hitPoints = this.initialHitPoints;
this.setVisible(true);
}
});

第44行:初始化敌人所在的物理空间,使用物理空间引入物理引擎,进行碰撞检测。
第49~80行:将敌人对象添加物理引擎支持,使之能够利用物理引擎精确检测碰撞。
(当然不适用物理引擎,也可以检测碰撞,一般情况下只能检测简单的矩形碰撞,不够精准)
第49行:是在敌人类型是陨石和行星情况下创建物理对象,cp.momentForCircle函数是创建圆形物理惯性力矩,其中第一个参数是质量,1是经验值;第二个参数是圆形内径;第三个参数是圆形外径;第四个参数是偏移量。
第50行:为物体添加圆形形状,其中this.getContentSize().width/2是半径,-5是修正值。
第52行:使用verts坐标数组创建物体。
第61行:为物体添加多边形形状,这是针对飞机形状的敌人。
提示:由于底层封装了Chipmunk引擎,Chipmunk要求多边形定点数据必须是按照顺时针,必须是凸多边形。如果遇到凹多边形,则可以把它分割成为几个凸多边形。另外,顶点坐标的原点在图形的中心,OpenGL坐标。
第73行:this.space.addBody(this.body)是将上面定义好的物体对象添加到物理空间中。
第75行:shape.setElasticity(0.5)是为形状设置弹性系数。
第76行:shape.setFriction(0.5)是为形状设置摩擦系数。
第77行:通过shape.setCollisionType(Collision_Type.Enemy)语句为形状设置碰撞检测类型。
第78行:this.space.addShape(shape)语句将形状添加到物理空间中。
第80行:this.body.data=this是把精灵放到物体的data数据成员中,这样在碰撞发生的时候可以通过下面的语句从物体取出精灵对象。

LostRoutes项目日志——敌人精灵Enemy解析的更多相关文章

  1. LostRoutes项目日志——玩家飞机精灵Fighter解析

    Fighter类的定义在Fighter.js中,Fighter类继承与PhysicsSprite. 原版的Fighter.js: var Fighter = cc.PhysicsSprite.exte ...

  2. LostRoutes项目日志——在main.js中添加多分辨率适配

    初始的Cocos2d-JS项目中的main.js代码的内容为: /** * A brief explanation for "project.json": * Here is th ...

  3. LostRoutes项目日志——编辑project.json

    第一个Scene编译后运行会报错: Uncaught TypeError: Cannot read property 'style' of null 这是因为没有在project.json中包含已经编 ...

  4. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  5. 大数据学习day39----数据仓库02------1. log4j 2. 父子maven工程(子spring项目的创建)3.项目开发(埋点日志预处理-json数据解析、清洗过滤、数据集成实现、uid回补)

    1. log4j(具体见log4j文档) log4j是一个java系统中用于输出日志信息的工具.log4j可以将日志定义成多种级别:ERROR  /  WARN  /  INFO  /  DEBUG ...

  6. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  7. 学习Coding-iOS开源项目日志(五)

    继续,接着前面第四篇<学习Coding-iOS开源项目日志(四)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目 ...

  8. 学习Coding-iOS开源项目日志(一)

    前言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了 ...

  9. 学习Coding-iOS开源项目日志(三)

    继续前两篇,接着本第三篇<学习Coding-iOS开源项目日志(三)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的 ...

随机推荐

  1. godaddy如何联系客服帮助的技巧和方法

    众所周知,Godaddy是世界最大的域名商和空间商,很多人喜欢在那里买域名或者空间,可是,当我们的域名空间出了问题要怎么办呢?今天闪电博客就给大家介绍一些Godaddy客服联系技巧,减少大家等待的时间 ...

  2. extern字符串常量,宏定义字符串常量,怎么选

    在使用常量的时候,我看到主要有两种写法: #define RKLICURegexEnumerationOptionsErrorKey @"RKLICURegexEnumerationOpti ...

  3. selenium+python自动化78-autoit参数化与批量上传

    前言 前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片. 这样每次调用的时候,在命令行里面加一个文件路径的参数就行. 一.命令行参数 ...

  4. Convolutional Neural Networks: Step by Step

    Andrew Ng deeplearning courese-4:Convolutional Neural Network Convolutional Neural Networks: Step by ...

  5. GeoHash原理和可视化显示

    最近在做附近定位功能的产品,geohash是一个非常不错的实现方式.查询资料,发现阿里的这篇文章讲解的很好.但文中并没有给出geohash显示的工具.无奈,也没有查到类似的.只好自己简单显示一下,方便 ...

  6. org.springframework.web.util.WebUtils.isSameOrigin(WebUtils.java:816)

    Nginx反向代理WebSocket时报这个错,普通的http请求没问题,ws请求报错 可能原因: 1.你用了4.2.5.RELEASE版本或者4.2.6.RELEASE,升级到4.2.7.RELEA ...

  7. Javascript框架的自定义事件(转)

    很多 javascript 框架都提供了自定义事件(custom events),例如 jquery.yui 以及 dojo 都支持“document ready”事件.而部分自定义事件是源自回调(c ...

  8. CentOS 6.5系统上安装SVN服务器端的方法及目录访问权限配置(转总结)

    SVN其实就是Subversion,分为服务器端和客户端.之前在网上搜了很多方法,都有各种问题,经过自己搜集整理以及实际尝试,总算有个比较靠谱的方法.本文主要介绍CentOS 6.5系统上安装SVN服 ...

  9. Data Structure Visualizations

    https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  10. 【SqlServer】SqlServer中的更新锁(UPDLOCK)

    UPDLOCK.UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改.当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加 ...