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

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

假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! 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机制一样.最后在界面层关闭时,我们又一次给游戏队伍在大地图上排序,由于你可能改动了队伍的顺序,所以我们也要改动地图中显示的顺序.

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

时间: 2024-11-06 12:49:37

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

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输

mysql更改表结构:添加、删除、修改字段、调整字段顺序

添加字段: alter table `user_movement_log`Add column GatewayId int not null default 0 AFTER `Regionid` (在哪个字段后面添加) 删除字段: alter table `user_movement_log` drop column Gatewayid 调整字段顺序: ALTER TABLE `user_movement_log` CHANGE `GatewayId` `GatewayId` int not n

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

整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型  默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_souapp_app_androidmarket Add column getPriceCurrency varchar(50) default null AFTER getPrice 修改字段:alter table表名change 字段名 新字段名 字段类型 默认值 例子: alter table a

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初始化时候指向数组尾部,第一个指针指向的数字总是偶数,第二个指针指向的数字总是奇数,如果第一个指针在第二个指针之前,则交换两指针指向的元素. 1 package Solution; 2 3 /** 4 * 剑指offer面试题14:调整数组顺序是奇数位于偶数前面 5 * 题目:输入一个整数数组,实现一

【数组】调整数组顺序使奇数位于偶数前面

1. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分. 1 /** 2 * 调整数组顺序使奇数位于偶数前面 3 * 4 * @author 5 * 6 */ 7 public class Solution { 8 9 public static void order(int[] array) { 10 11 if (null == array || array.length == 0 || array.length ==

面试题14:调整数组顺序使奇数位于偶数前面

// 面试题14_调整数组顺序使奇数位于偶数前面.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void swap(int *begin,int *end) { int temp; temp=*begin; *begin=*end; *end=temp; } void ReorderOddEven(int *pData,unsigned int len

《剑指Offer》题目:调整数组顺序使奇数位于偶数前面

题目描述:调整数组顺序使奇数位于偶数前 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 题目分析: 题目的关键在于在移位以后,奇数和奇数以及偶数和偶数之间的相对位置保持不变. Java代码: public class ReOrderArray { //这种方法不能保证奇数和奇数,偶数和偶数之间的相对位置不变 public static void reOrderArray(

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

用过MySQL的朋友,可能都在使用phpMyAdmin,我从2003年开始使用,感觉那东西适合远程mysql管理,并 不适合单机.单数据库的管理操作,特别是开发使用. 给家推荐一个软件管理mysql数据库:SQLyog SQLyog - [ 翻译此页 ] Manage, Monitor MySQL servers using our popular MySQL GUI Tools. 好了,正文开始,我们以www.souapp.com(搜应用网)的数据库表appstore_souapp_app_a