Cocos2D实现RPG游戏人物地图行走的跟随效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
在一些RPG游戏中,人物队列在地图中行走的时候有时需要实现一个跟随效果,比如大家都玩过的FC游戏<<吞食天地>>.
效果为当队列只有一个人时,Ta可以自由在地图中行走,当队列多于一人时,我们让其他角色跟随在游戏主角之后行走,达到一种”萌萌的”拖尾效果.
如上图,可以看到游戏队列中有4位角色,但我们设定只显示后2位,当然后面跟着100位也是没问题的,前提是你想把RPG变成贪吃蛇的节奏 ;)
打开GameCharacter.h代码,在接口中增加2个属性:
@property (nonatomic,strong) GameCharacter *followedGC;@property (nonatomic,assign) CGPoint lastTilePos;
- 1
- 2
接下来打开GameCharacter.m文件,将popStepAndAnimate方法修改如下:
//按最短路径中每一步用动画的方式移动,使角色沿最短路径最终到达目的地-(void)popStepAndAnimate{ //原角色行走代码... _lastTilePos = [_mh tilePosForPosition:self.position]; //原角色动画代码... if (_followedGC) { _followedGC.lastTilePos = _lastTilePos; [_followedGC moveTowardByAStar:[_mh positionForTilePos:_lastTilePos]]; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
代码功能为设置角色当前位置为上一个位置,然后如果有跟随的角色,则调用其自身的移动方法,目的地为上一个位置.因为上一个位置总和队列头部的角色位置相同,所以第一次调用后面的角色是不会移动的,这也是我们想要的效果(否则,所有角色都会重叠在一起且同时移动)
最后我们添加一个跟随方法:
-(void)follow:(GameCharacter*)gc;
- 1
其实现如下:
-(void)follow:(GameCharacter *)gc{ gc.followedGC = self; self.position = gc.position;}
- 1
- 2
- 3
- 4
可以看到代码很简单,仅仅是将自身加入被跟随角色,然后设置自身位置和被跟随角色位置一致.
好了,短短几行代码,我们的跟随效果就完成了,蛮有意思的,不是吗? ;)
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.****.net/jiangjunshow
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
在一些RPG游戏中,人物队列在地图中行走的时候有时需要实现一个跟随效果,比如大家都玩过的FC游戏<<吞食天地>>.
效果为当队列只有一个人时,Ta可以自由在地图中行走,当队列多于一人时,我们让其他角色跟随在游戏主角之后行走,达到一种”萌萌的”拖尾效果.
如上图,可以看到游戏队列中有4位角色,但我们设定只显示后2位,当然后面跟着100位也是没问题的,前提是你想把RPG变成贪吃蛇的节奏 ;)
打开GameCharacter.h代码,在接口中增加2个属性:
@property (nonatomic,strong) GameCharacter *followedGC;@property (nonatomic,assign) CGPoint lastTilePos;
- 1
- 2
接下来打开GameCharacter.m文件,将popStepAndAnimate方法修改如下:
//按最短路径中每一步用动画的方式移动,使角色沿最短路径最终到达目的地-(void)popStepAndAnimate{ //原角色行走代码... _lastTilePos = [_mh tilePosForPosition:self.position]; //原角色动画代码... if (_followedGC) { _followedGC.lastTilePos = _lastTilePos; [_followedGC moveTowardByAStar:[_mh positionForTilePos:_lastTilePos]]; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
代码功能为设置角色当前位置为上一个位置,然后如果有跟随的角色,则调用其自身的移动方法,目的地为上一个位置.因为上一个位置总和队列头部的角色位置相同,所以第一次调用后面的角色是不会移动的,这也是我们想要的效果(否则,所有角色都会重叠在一起且同时移动)
最后我们添加一个跟随方法:
-(void)follow:(GameCharacter*)gc;
- 1
其实现如下:
-(void)follow:(GameCharacter *)gc{ gc.followedGC = self; self.position = gc.position;}
- 1
- 2
- 3
- 4
可以看到代码很简单,仅仅是将自身加入被跟随角色,然后设置自身位置和被跟随角色位置一致.
好了,短短几行代码,我们的跟随效果就完成了,蛮有意思的,不是吗? ;)