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

上一篇我们建立了机器人物理对象,下面我们来看看对应的逻辑代码.

进入Xcode,新建Robot和Arm类,分别继承于CCNode和CCSprite类.代码全部留空,后面再实现.

我们再看一下这个机器人要如何与玩家交互.当玩家触碰到机器人手臂并且移动时,以关节为中心旋转手臂.因为前面在SpriteBuilder中限制了关节转动的范围,所以不用担心关节旋转到”奇怪”的角度上.

首先在Arm.m的初始化方法中打开用户交互:

self.userInteractionEnabled = YES;

在Arm类中新建实例变量_touchPoint:

@implementation Arm{
    CGPoint _touchPoint;
}

添加触摸回调方法,首先是touchBegan:

-(void)touchBegan:(CCTouch *)touch withEvent:(CCTouchEvent *)event{
    CGPoint location = [[CCDirector sharedDirector] convertTouchToGL:touch];
    _touchPoint = location;
}

这里保持第一次触摸时的位置用来和之后移动时的坐标相比较,从而判断选择的方向.

然后是touchMoved方法:

-(void)touchMoved:(CCTouch *)touch withEvent:(CCTouchEvent *)event{
    CGPoint location = [[CCDirector sharedDirector] convertTouchToGL:touch];
    MoveDirection direction = armMoveDirectionDown;
    if (location.y > _touchPoint.y) {
        direction = armMoveDirectionUp;
    }else if(location.y < _touchPoint.y){
        direction = armMoveDirectionDown;
    }

    [self moveArm:direction];
}

我们简单看看这个方法:取得触摸移动位置,用它和之前保存的位置相比较,只要判断y轴的值即可:如果大于之前的y值则表示向上旋转,否则表示向下旋转.最后根据旋转方向旋转手臂.这里旋转方向是一个枚举值,因为可能在其他类中也会使用,比如后面我们会看到触摸手臂旋转的一个大问题,需要改为触摸屏幕选择手臂.我们这里将其放在一个通用头文件里,新建一个Comm.h头文件,内容如下:

#ifndef ShootBall_Comm_h
#define ShootBall_Comm_h

typedef enum {
    armMoveDirectionUp,
    armMoveDirectionDown
}MoveDirection;

#endif

然后在所有需要使用该枚举定义的类中包含该头文件即可.

在下一篇里,我们将会看到上面代码中还未介绍的moveArm方法是如何实现的 ;)

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

时间: 2024-08-09 02:21:19

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

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

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

(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

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

为什么要将手臂移动的代码单独放在一个方法中? 其实这里是多次重构之后的版本.原来的移动代码是放在touchMoved方法里的.后来发现除了触摸手臂移动方式外,还要实现触摸屏幕移动手臂这第二种方式. 所以将其提取出来放在一个方法中,后面还会在Arm类的接口中做声明.现在我们暂且不管,单单看这个方法: -(void)moveArm:(MoveDirection)direction{ CCPhysicsBody *physicsBody = self.physicsBody; CGPoint velo

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

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