Cocos2D实现RPG队伍菜单任意调整角色顺序的效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
前一篇我们实现了队伍实现拖尾效果,但是在实际游戏中我们往往需要根据不同的角色能力,角色职业对角色队伍进行排序,而且希望排序后的效果能立即在游戏地图场景中反应出来,所以在本篇博文中我们就来看看如何实现调整角色顺序并且立即在地图中显示的功能.
可以看到我们在将角色Panda从队列头部移至第3位后,地图上角色队列也立即发生了改变.
首先打开SpriteBuilder,将界面调整如下:
注意左侧竖排4个按钮每个上面都有一个对应的sprite和label对象.
为了实现在游戏界面上任务的拖拽,我们有很多方法,我这里使用了UIKit中UIButton可以添加手势的特点.在每个UIButton中添加一个长按手势.但是CCButton默认是不支持手势添加的,所以我们必须动态添加4个UIButton按钮,So,Let’s Do it!!!
在Xcode中添加initUIBtns方法:
-(void)initUIBtns{
UIButton *uiBtn;
CCButton *btn;
for (int i = 0; i < _btns.count; i++) {
uiBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn = _btns[i];
CGRect rect = btn.boundingBox;
CGPoint pos = [_peopleLayoutBox convertToWindowSpace:rect.origin];
pos.y -= btn.boundingBox.size.height;
rect.origin = pos;
uiBtn.frame = rect;
[[CCDirector sharedDirector].view addSubview:uiBtn];
[_uiBtns addObject:uiBtn];
[uiBtn addTarget:self action:@selector(uiBtnCallback:) forControlEvents:UIControlEventTouchDown];
uiBtn.tag = i;
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(btnLongPress:)];
longPress.minimumPressDuration = 0.8;
[uiBtn addGestureRecognizer:longPress];
}
}
代码主要功能如下:
1.依次读取每个CCButton的位置
2.在该位置处新建一个”透明”的UIButton
3.给该按钮添加手势识别器和press回调方法
在press回调方法中手动调用原CCButton的回调方法,这个比较简单,然后在手势识别器长按的回调中处理角色sprite的拖拽功能:
-(void)btnLongPress:(UILongPressGestureRecognizer*)gr{
CGPoint location = [gr locationInView:[CCDirector sharedDirector].view];
UIButton *uiBtn = (UIButton*)gr.view;
NSInteger idx = uiBtn.tag;
CCSprite *bg = _bgs[idx];
CCSprite *bgNode = [bg children][0];
bgNode.opacity = 0.5;
if (gr.state == UIGestureRecognizerStateBegan) {
CCLOG(@"%@ began!!!",NSStringFromSelector(_cmd));
}else if (gr.state == UIGestureRecognizerStateEnded) {
CCLOG(@"%@ ended!!!",NSStringFromSelector(_cmd));
NSValue *v = _bgPositions[idx];
NSInteger otherIdx = [self getBgInside2:bg.position];
if (otherIdx == 0 || otherIdx == idx + 1) {
bg.position = v.CGPointValue;
}else{
CCLOG(@"otherIdx is %ld",(long)otherIdx);
CCSprite *otherBg = _bgs[otherIdx-1];
GameCharacter *otherGC = [otherBg children][0];
GameCharacter *gc = [bg children][0];
[otherGC removeFromParentAndCleanup:NO];
[gc removeFromParentAndCleanup:NO];
[otherBg addChild:gc];
[bg addChild:otherGC];
bg.position = v.CGPointValue;
GameData *gd = [GameData sharedInstance];
[gd switchPlayerAtIndex:idx andAtIndex:otherIdx-1];
[self switchLabelStringAtIndex:idx andIndex:otherIdx-1];
}
bgNode.opacity = 1.0f;
}else{
location = [[CCDirector sharedDirector] convertToGL:location];
location = [self convertToNodeSpace:location];
CGRect boundary = self.boundingBox;
if (CGRectContainsPoint(boundary, location)) {
bg.position = location;
}else{
NSValue *v = _bgPositions[idx];
bg.position = v.CGPointValue;
bgNode.opacity = 1.0f;
}
}
}
以上代码首先转换坐标类型,然后找到长按对应的按钮,从而取得对应的sprite.接着在触摸拖动时判断是否移出了当前界面的范围,如果是则sprite归位,否则sprite跟随触摸一起移动.最后当长按完成时判断是否发生sprite之间的交换,如果是则完成交换功能,否则sprite同样回到原来的位置.
在交换功能中,我们同样要修改内部的数据结构已完成数据的修改,就像MVC机制一样.最后在界面层关闭时,我们重新给游戏队伍在大地图上排序,因为你可能修改了队伍的顺序,所以我们也要修改地图中显示的顺序.
这样一个重排序的功能就完成了,是不是很有成就感呢 ;)
Cocos2D实现RPG队伍菜单任意调整角色顺序的效果的更多相关文章
- Cocos2D实现RPG队伍菜单随意调整角色顺序的效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 前一篇我们实现了队伍实现拖尾效果,可是在实际游戏中我们往往须要 ...
- 剑指offer:调整数组顺序使奇数位于偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...
- 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...
- 剑指Offer面试题:13.调整数组顺序使奇数位于偶数前面
一.题目:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 例如有以下一个整数数组:12345 ...
- DataTable 删除列 调整列顺序 修改列标题名称
DataTable dt = new DataTable(); //删除列 dt.Columns.Remove("Sex"); dt.Columns.Remove("Ag ...
- Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结
转自:http://www.111cn.net/database/mysql/71648.htm 1.增加一个字段 代码如下 复制代码 //增加一个字段,默认为空 alter table user ...
- Progress.js – 为页面上的任意对象创建进度条效果
Progress.js 是一个 JavaScript 和 CSS3 的库,它帮助开发人员为网页上的每个对象创建和管理进度条效果.你可以设计自己的模板,进度条或者干脆定制. 您可以使用 Progress ...
- mysql 添加字段、删除字段、调整字段顺序 转
ALTER TABLE — 更改表属性添加字段: alter table `user_movement_log`Add column GatewayId int not null default 0 ...
- MySQL 字段常用操作 添加,修改,删除,调整字段顺序
整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型 默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_sou ...
随机推荐
- bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp
1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1826 Solved: 405[Submit][S ...
- [ Java学习基础 ] Java构造函数
构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只 ...
- python中的缩进问题
python中没有{}来表示代码块,而是用缩进来表示,刚开始写python代码,没有注意缩进,结果各种报错(( ╯□╰ )). 在python中的原则就是同一层次的代码一定要有相同的缩进!!! 从上图 ...
- js延迟函数
正确写法: setTimeout(function (){ alert("delay!"); },5000); 错误写法: setTimeout( alert("dela ...
- Tomcat常用参数的配置
1.修改端口号 Tomcat端口配置在server.xml文件的Connector标签中,默认为8080,可根据实际情况修改. 修改端口号 2.解决URL中文参数乱码 在server.xml文件的Co ...
- 项目管理软件系列-Linux一键安装禅道
linux用一键安装包 简介:本文介绍如何在linux下面使用禅道一键安装包搭建禅道的运行环境. linux一键安装包内置了apache, php, mysql这些应用程序,只需要下载解压缩即可运行禅 ...
- git 学习笔记(常用命令)
1.新建一个文件,如果没有使用git add 命令将它提交到暂存区,那么这个文件就还没有被跟踪. 2.通过配置.gitignore文件可以指定要忽略的文件,被忽略的文件夹是不会被提交到暂存区的.所以这 ...
- jQuery 遍历 – 后代
后代是子.孙.曾孙等等. 通过 jQuery,您能够向下遍历 DOM 树,以查找元素的后代. 向下遍历 DOM 树 下面是两个用于向下遍历 DOM 树的 jQuery 方法: children() f ...
- PHP While 循环
PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...
- 解决ASP.NET MVC 检测到有潜在危险的 Request.Form 值
提交使用html编辑器编辑后的数据,由于Request时出现有HTML或JavaScript等字符串时,系统会认为是危险性值.立马报错. "从客户端 ... 中检测到有潜在危险的 Reque ...