为什么要将手臂移动的代码单独放在一个方法中?

其实这里是多次重构之后的版本.原来的移动代码是放在touchMoved方法里的.后来发现除了触摸手臂移动方式外,还要实现触摸屏幕移动手臂这第二种方式.

所以将其提取出来放在一个方法中,后面还会在Arm类的接口中做声明.现在我们暂且不管,单单看这个方法:

-(void)moveArm:(MoveDirection)direction{
    CCPhysicsBody *physicsBody = self.physicsBody;
    CGPoint velocity;

    switch (direction) {
        case armMoveDirectionUp:
            velocity = ccp(0, 10);
            break;
        case armMoveDirectionDown:
            velocity = ccp(0, -10);
            break;
        default:
            break;
    }
    [physicsBody applyForce:velocity atLocalPoint:ccp(20, 5)];
}

代码比较清晰:首先取得Arm的物理对象,然后根据转动方向的不同设置对应的力矩;向上旋转则给力矩y轴一个正量,反之给y轴一个负量.我这里设置的值为+/-10,这个没什么好说的,是多次试验得出的最佳值.最后将该力矩应用在手臂上.

注意这里我没有用以往的applyForce:方法,而是用了类似的另一个方法,算是重载方法吧.该方法多了一个参数,用来设置该力矩具体作用于手臂上哪一个点.如果不这样做,默认会将力矩作用于手臂的平均点上(具体哪里本猫也不清楚;),会导致很难旋转手臂.

注意该参数为ccp(20,5),该手臂大约长20,高10,这个正好位于手臂的中线与手的焦点上.后面发射子弹也是以这个点为参考点,后面会详述.另外如果要重构的话,如果根据手臂长宽动态计算这个点可能更好点.

编译运行该App,我们发现当触摸手臂不放且移动时,手臂会缓缓像移动方向旋转.这里有一个加速和减速的效果,手臂从静止时移动起来较费劲,当转起来的时候因为有了动能,所以越转越快.这也是和实际物理物体的运动相符的.

通过不停旋转手臂,发现一个小问题,是什么呢?下一篇再揭晓 ;)

(NO.00003)iOS游戏简单的机器人投射游戏成形记(六)的更多相关文章

  1. (NO.00003)iOS游戏简单的机器人投射游戏成形记(一)

    这是一个简单的机器人投射游戏,主要来熟悉物理引擎的一些东西.你可以把它认为是机器人投篮;尽管投出的是抛物线,但不是篮球而是子弹,速度也较快. 游戏玩法是玩家选择机器人,移动机器人手臂瞄准篮框,然后发射 ...

  2. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十八)

    在游戏中制作手臂瞄准线,也就是所谓的辅助延长线.玩台球游戏的童鞋应该可以了解. 按道理来说,延长线是一个物理实体,遇到物理刚体应该会发生反弹行为,这个符合实际游戏逻辑. 但是这里为了简单,只是做一条& ...

  3. (NO.00003)iOS游戏简单的机器人投射游戏成形记(九)

    现在按住手臂可以非常自然和舒服的旋转了,丝般顺滑:移动停止,旋转立即停止,没有什么惯性影响了. 以上一共介绍了2中旋转方式,到底采用哪种方式呢?其实看实际游戏的需求和个人的喜好了.本猫在Level中添 ...

  4. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十三)

    好了,现在在iOS模拟器中编译运行App,一切貌似都很好. 且慢,我们还没有到真机上调试呢?按说在编写App'时,无论如何应该尽快尽早在真机上调试.否则可能会碰到意想不到的问题,这次就是如此. 在真机 ...

  5. (NO.00003)iOS游戏简单的机器人投射游戏成形记(七)

    因为到目前为止我都是在iOS模拟器中测试,但即便如此,也觉得按住手臂旋转时,手臂转动起来比较费劲,很难停止在玩家期望的位置上.因为手臂完全通过物理引擎的计算来移动,它有自身的惯性影响,所以很难控制. ...

  6. (NO.00003)iOS游戏简单的机器人投射游戏成形记(五)

    上一篇我们建立了机器人物理对象,下面我们来看看对应的逻辑代码. 进入Xcode,新建Robot和Arm类,分别继承于CCNode和CCSprite类.代码全部留空,后面再实现. 我们再看一下这个机器人 ...

  7. (NO.00003)iOS游戏简单的机器人投射游戏成形记(四)

    上篇说道要想将手臂固定在机器人身体上,而且手臂还能转动,简单的办法是使用物理关节.但这不是只有这种办法.用关节固定物体有时候不能满足需要,这时必须自己动手写代码处理,后面会介绍另一种固定的方法. 在S ...

  8. (NO.00003)iOS游戏简单的机器人投射游戏成形记(三)

    接下来我们建立机器人对象. 在Sprites文件夹中新建Robot.ccb文件,类型为Node. 打开SpriteBuilder的Tileless View将机器人身体和手臂拖入根节点,调整好相对的位 ...

  9. (NO.00003)iOS游戏简单的机器人投射游戏成形记(二)

    打开Ai按需求依次绘制机器人身体,手臂和篮框: 因为是实验性质的游戏所以没必要在这上面花太多功夫,画出意思即可.虽然是2D游戏,但实际游戏中可以表现出伪3D的图形效果;尽管本猫这次画的游戏元素都是满满 ...

  10. (NO.00003)iOS游戏简单的机器人投射游戏成形记(二十一)

    回到Xcode中,在MainScene.h接口中添加碰撞协议: @interface MainScene : CCNode <CCPhysicsCollisionDelegate> //. ...

随机推荐

  1. 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

    1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...

  2. Angular5 路由传参的3种方法

    一共3种方法. 1.问号后面带的参数,获取参数的方式:ActivatedRoute.queryParams[id] 例如:/product?id=1&name=iphone还可以是: [rou ...

  3. Android查缺补漏(线程篇)-- IntentService的源码浅析

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8975114.html 在Android中有两个比较容易弄混的概念,Servic ...

  4. Node.js 教程

    简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端Ja ...

  5. Docker命令查询

    基本语法 docker [OPTIONS] COMMAND [arg...] 一般来说,Docker 命令可以用来管理 daemon,或者通过 CLI 命令管理镜像和容器.可以通过 man docke ...

  6. Webpack 2 设置为从当前文件夹逐级向上查找模块

    比较实用, 当你在cd到子文件夹运行webpack时,你可能想要require文件夹js里面的一些模块, 但你又想将祖先的js文件夹作为fallback.这样设置即可: module.exports ...

  7. 微信小程序基础之交互操作控件

    好久没有写关于微信小程序的文章了,今天简单的发表一篇,内容比较简单,包括:ActionSheet上拉菜单.AlertAction提示框.SuccessAction完成框.LoadingAction加载 ...

  8. Windows运行GitStats

    Windows运行GitStats(金庆的专栏)GitStats - git history statistics generatorhttp://gitstats.sourceforge.net/G ...

  9. Spring+EhCache缓存实例(详细讲解+源码下载)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  10. 大数据基础知识问答----hadoop篇

    handoop相关知识点 1.Hadoop是什么? Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速 ...