大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;)


前一篇我们实现了队伍实现拖尾效果,可是在实际游戏中我们往往须要依据不同的角色能力,角色职业对角色队伍进行排序,并且希望排序后的效果能马上在游戏地图场景中反应出来,所以在本篇博文中我们就来看看怎样实现调整角色顺序并且马上在地图中显示的功能.

能够看到我们在将角色Panda从队列头部移至第3位后,地图上角色队列也马上发生了改变.

首先打开SpriteBuilder,将界面调整例如以下:

注意左側竖排4个button每一个上面都有一个相应的sprite和label对象.

为了实如今游戏界面上任务的拖拽,我们有非常多方法,我这里使用了UIKit中UIButton能够加入手势的特点.在每一个UIButton中加入一个长按手势.可是CCButton默认是不支持手势加入的,所以我们必须动态加入4个UIButtonbutton,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.给该button加入手势识别器和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;
}
}
}

以上代码首先转换坐标类型,然后找到长按相应的button,从而取得相应的sprite.接着在触摸拖动时推断是否移出了当前界面的范围,假设是则sprite归位,否则sprite尾随触摸一起移动.最后当长按完毕时推断是否发生sprite之间的交换,假设是则完毕交换功能,否则sprite相同回到原来的位置.

在交换功能中,我们相同要改动内部的数据结构已完毕数据的改动,就像MVC机制一样.最后在界面层关闭时,我们又一次给游戏队伍在大地图上排序,由于你可能改动了队伍的顺序,所以我们也要改动地图中显示的顺序.

这样一个重排序的功能就完毕了,是不是非常有成就感呢 ;)

Cocos2D实现RPG队伍菜单随意调整角色顺序的效果的更多相关文章

  1. Cocos2D实现RPG队伍菜单任意调整角色顺序的效果

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前一篇我们实现了队伍实现拖尾效果,但是在实际游戏中我们往往需要 ...

  2. iOS UIButton文字和图片间距随意调整

    代码地址如下:http://www.demodashi.com/demo/11606.html 前记 在开发中,我们经常会遇到这么一种情况,就是一个按钮上面有图片也有文字,但是往往设计并不是我们想要的 ...

  3. 剑指Offer面试题:13.调整数组顺序使奇数位于偶数前面

    一.题目:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 例如有以下一个整数数组:12345 ...

  4. DataTable 删除列 调整列顺序 修改列标题名称

    DataTable dt = new DataTable(); //删除列 dt.Columns.Remove("Sex"); dt.Columns.Remove("Ag ...

  5. Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结

    转自:http://www.111cn.net/database/mysql/71648.htm 1.增加一个字段  代码如下 复制代码 //增加一个字段,默认为空 alter table user ...

  6. mysql 添加字段、删除字段、调整字段顺序 转

    ALTER TABLE — 更改表属性添加字段: alter table `user_movement_log`Add column GatewayId int  not null default 0 ...

  7. MySQL 字段常用操作 添加,修改,删除,调整字段顺序

    整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型  默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_sou ...

  8. 转--DataTable 修改列名 删除列 调整列顺序

    DataTable myDt =dt; //删除列 myDt.Columns.Remove("minArea"); myDt.Columns.Remove("maxAre ...

  9. DataTable 修改列名 删除列 调整列顺序

    DataTable myDt =dt;//删除列myDt.Columns.Remove("minArea");myDt.Columns.Remove("maxArea&q ...

随机推荐

  1. Effective JavaScript Item 34 在prototype上保存方法

    本系列作为EffectiveJavaScript的读书笔记. 不使用prototype进行JavaScript的编码是全然可行的,比如: function User(name, passwordHas ...

  2. mysql---左连接、右连接、内连接之间的差别与联系

    现有两张表 第一张表为男生表,记录了男生的姓名和配偶的编号 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXlfbWFv/font/5a6L5L2T/fo ...

  3. sass05 数据类型,数据运算

    /*! 数字类型 */ $n1: 1.2; $n2: 12; $n3: 14px; p{ font-size: $n3; } /*! 字符串类型*/ $s1: container; $s2: 'con ...

  4. BP神经网络模型及梯度下降法

    BP(Back Propagation)网络是1985年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一. B ...

  5. storm集群安装配置

    1.上传解压 2.进入到storm的conf目录 接上图 启动三台节点的zookeeper集群 启动和查看 Storm 在 nimbus.host 所属的机器上启动 nimbus 服务和 logvi ...

  6. 关于ListView的一些不常用到的属性

    1.setCacheColorHint自定义listview的时候,当你不使用Android:cacheColorHint=“#00000000”会出现下面选中一个空间黑色底色的情况,破坏整体美观度 ...

  7. C#共享WIFI能通过代码控制给连接的移动端分配IP么

    用C#创建了一个虚拟WIFI,但是能不能通过代码来给连接上的移动端分配各自的IP.之前都是自动分配的IP.望大神们赐教 C#共享WIFI能通过代码控制给连接的移动端分配IP么 >> csh ...

  8. bzoj1230 开关灯 线段树

    好久没写线段树了..被一道线段树裸题卡了一个上午 对区间进行异或,查询的时候直接用区间长度减去原有是数量就是改变完的数量 #include<bits/stdc++.h> using nam ...

  9. 紫书 例题 10-13 UVa 830(递推)

    首先我们按照这三个U的位置来分类,当前三个U在i,i+1, i+2. 那么先看三个U前面,前面不能有三个U,因为我们不能重复计算 那么就是所有的组合减去有U的情况 为了叙述方便,我们设答案为f(n), ...

  10. json数据转化成实体 存到数据库.

    直接看步骤吧 1.一般我们会调用别人给的webservice获取一个字符串数据.如果为String data="xxxxxxxxxx";  这个data事实上就是样例Enterpr ...