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

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

其实这里是多次重构之后的版本.原来的移动代码是放在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,我们发现当触摸手臂不放且移动时,手臂会缓缓像移动方向旋转.这里有一个加速和减速的效果,手臂从静止时移动起来较费劲,当转起来的时候因为有了动能,所以越转越快.这也是和实际物理物体的运动相符的.

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 06:33:23

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

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

这是一个简单的机器人投射游戏,主要来熟悉物理引擎的一些东西.你可以把它认为是机器人投篮;尽管投出的是抛物线,但不是篮球而是子弹,速度也较快. 游戏玩法是玩家选择机器人,移动机器人手臂瞄准篮框,然后发射子弹.如果子弹掉入篮框则得分.子弹耗完或时间耗完则游戏结束. 游戏中主要玩法的变化如下: 1.可以通过修改过关条件,比如限制子弹数量,限制剩余时间,要求必须达到一定分数等增加或降低难度. 2.可以通过Level场景的布局以及篮框的移动路线来增加难度,别忘了场景中机器人的位置也是可以变化的,而且谁说场

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

上一篇我们建立了机器人物理对象,下面我们来看看对应的逻辑代码. 进入Xcode,新建Robot和Arm类,分别继承于CCNode和CCSprite类.代码全部留空,后面再实现. 我们再看一下这个机器人要如何与玩家交互.当玩家触碰到机器人手臂并且移动时,以关节为中心旋转手臂.因为前面在SpriteBuilder中限制了关节转动的范围,所以不用担心关节旋转到"奇怪"的角度上. 首先在Arm.m的初始化方法中打开用户交互: self.userInteractionEnabled = YES;

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

打开Ai按需求依次绘制机器人身体,手臂和篮框: 因为是实验性质的游戏所以没必要在这上面花太多功夫,画出意思即可.虽然是2D游戏,但实际游戏中可以表现出伪3D的图形效果;尽管本猫这次画的游戏元素都是满满的2D效果 ;) 还要注意的是各个游戏元素大小的比例需要适中,因为机器人身体和手臂需要在游戏中组合,且手臂需要单独转动,所以分开绘制. 我们还需要子弹元素,就拿NO.00002游戏中的子弹素材吧: SpriteBuilder新建项目,命名为ShootBall. 将之前绘制的游戏素材拖入新建的Imag

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

回到Xcode中,在MainScene.h接口中添加碰撞协议: @interface MainScene : CCNode <CCPhysicsCollisionDelegate> //... @end 然后在MainScene.m初始化方法中打开碰撞代理: _physicWorld = (CCPhysicsNode*)[self getChildByName:@"physicWorld" recursively:YES]; NSAssert(_physicWorld, @

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

打开Arm.h,在其接口中添加一个新方法: -(void)armShoot; 接下来在Arm.m中实现该方法: -(void)armShoot{ CGPoint startPoint = [self convertToWorldSpace:ccp(0, 5)]; CGPoint endPoint = [self convertToWorldSpace:ccp(20, 5)]; [_mainScene shoot:startPoint to:endPoint]; } 该方法最终调用MainScen

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

机器人发射子弹已经完成了,下面看看怎么给玩家设置障碍. 大家从上篇的图可以看到,在机器和篮筐直接有若干障碍物.我们先看如何实现它们. 打开SpriteBuilder,在Sprites文件夹中新建SmallBrick.ccb,类型为Node. 从控件库拖入一个CCNodeColor节点,称为其根节点的子节点.按照喜好装饰外观,同时打开物理对象,物理类型为静态: 新建Levels文件夹,在其中建立Level.ccb文件,类型为Node.首先拖入一个物理节点到其根节点. 然后拖入2个机器人到屏幕左侧,

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

回到Xcode,新建Level1类,继承于CCNode. 打开Level1.m在初始化方法中添加如下方法: -(void)didLoadFromCCB{ [self initBasket]; [self initRestrict]; } 下面分别实现其中2个方法. 首先是initBasket: -(void)initBasket{ CCActionMoveBy *mov1 = [CCActionMoveBy actionWithDuration:5 position:ccp(0, -0.7)];

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

在Xcode中打开Robot.h文件添加如下2个方法: -(void)moveArm:(MoveDirection)direction; -(void)armShoot; 在Robot.m中实现这2个方法: -(void)armShoot{ [_arm armShoot]; } -(void)moveArm:(MoveDirection)direction{ [_arm moveArm:direction]; } 由于玩家点击机器人时需要选中该机器人,所以要添加touchBegan方法: -(v

【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监测EV3端口数据

在前两篇文章中,我们对iOS与EV3混合机器人编程做了一个基本的设想,并且介绍了要完成项目所需的软硬件准备和知识准备. 那么在今天这一篇文章中,我们将直接真正开始项目实践. ==第一个项目: EV3 Port Viewer== 项目目的:在iOS设备上通过WiFi连接EV3并且读取EV3每个端口的数据. 大家可以一周之后在App Store上搜索EV3 Port Viewer,那么我已经做了一个范例App发布了,正在审核中 应用的基本使用要求:将EV3和iPhone同时连接到同一个WiFi网络中