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机制一样.最后在界面层关闭时,我们重新给游戏队伍在大地图上排序,因为你可能修改了队伍的顺序,所以我们也要修改地图中显示的顺序.

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

时间: 2024-10-03 14:05:00

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

如何在Word2007中任意调整图片大小

  Word2007提供了丰富的图片编辑功能,方便用户在不借助Photoshop等图片处理工具的情况下,直接在Word文档中对图片进行编辑.修改,甚至还可以为图片添加倒映.三维效果等.下面就来学习如何在Word2007中任意调整图片大小 . 为了满足编辑需要,插入图片后,通常还需要对图片的大小进行调整. (1)快速调整图片大小选中插入的图片,图片边缘会出现一线框,如图1所示,拖曳线框可以凋整图片的大小.当鼠标指针变成双向箭头时,拖曳鼠标可以让图片保持长宽比(原比例)进行调整. (2)精确调整图片

双系统启动菜单如何调整到win7状态

  双系统启动菜单如何调整到win7状态 相信不少人在安装了win7旗舰版系统与win8双系统后,想回到win7启动菜单样式.小编通过测试了两种安装方式,一种是先安装win7再安装win8,另外一种是先安装win8,在安装win7. 考虑到Win8的稳定性和兼容性,相信很多人都是装的Win7与Win8的双系统,但是大家装了以后就会发现引导菜单会带来很多问题.为了更好的帮助大家,在这里把遇到的情况和大家分享一下,写这篇文章是为了能够帮助更多人少走弯路,文章内方法均以亲测.该方法适用于Win8目前为

PowerPoint2007调整幻灯片顺序方法

  PowerPoint2007调整幻灯片顺序方法          在制作演示文稿时,如果需要重新排列幻灯片的顺序,就需要移动幻灯片.移动幻灯片可以用到"剪切"按钮和"粘贴"按钮,其操作步骤与使用"复制"和"粘贴"按钮相似. PowerPoint2007

ie 7-怎么调整样式才能使效果在IE浏览器7和IE浏览器9的效果一致

问题描述 怎么调整样式才能使效果在IE浏览器7和IE浏览器9的效果一致 我是菜鸟, 对浏览器兼容性的问题不是很明白,望大神指点 解决方案 具体要看你的css怎么写的了.需要针对特定的css不兼容做hack.特别是浮动.盒模型等. 解决方案二: 这是在IE7的效果 解决方案三: html5 的写法,应该在哪里都一样的 解决方案四: 我也不知道写的对不对, 感觉float这块没有做好

剑指Offer之调整数组顺序使奇数位于偶数前面

#include <stdio.h> #include <malloc.h> int *number; void SortOddBeforeEven(int *number,int n){ int left = 0,right = n-1; //下标 int oIndex = 0,eIndex = 0; //二分遍历 while(left < right){ //从左边直到第一个偶数 while(left < right && (number[left]

JS实现选中当前菜单后高亮显示的导航条效果_javascript技巧

本文实例讲述了JS实现选中当前菜单后高亮显示的导航条效果.分享给大家供大家参考.具体如下: 这里演示选中当前菜单后,该菜单高亮显示,也就是说在不改变菜单CSS代码的情况下,用JavaScript去控制菜单的背景,如果该菜单项被点击后,将赋予它一个与众不同的背景颜色或背景图像,这样可以清淅的指引用户下在浏览的网站栏目,本菜单不需要动态语言的加入,简单方便而且效果好. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-cho-nav-gl-sho

Cocos2D实现RPG游戏人物地图行走的跟随效果

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在一些RPG游戏中,人物队列在地图中行走的时候有时需要实现一个跟随效果,比如大家都玩过的FC游戏<<吞食天地>>. 效果为当队列只有一个人时,Ta可以自由在地图中行走,当队列多于一人时,我们让其他角色跟随在游戏主角之后行走,达到一种"萌萌的"拖尾效果. 如上图,可以看到游戏队列中有4位角色,但我们设定只显示后2位,当然后面跟着

任意调整Windows7任务栏预览窗格大小

这里介绍一下如何调整Windows7任务栏预览窗格大小. 操作步骤如下: 1:打开注册表编辑器: 开始,运行-,输入regedit回车;也可以按win键+R键,输入regedit回车; 2:在左边的目录中找到: HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerTaskband 3:右键右侧的空白处,选择新建―DWORD(32位)值,名字为MinThumbSizePx 4:双击刚才新建的MinThumbSizePx键值,

Photoshop调整人物照片淡灰色效果

本教程的效果基本上都是用色相/饱和度来完成.作者为了保留更多的图片细节,都只在同一图层做调整. 本教程的效果基本上都是用色相/饱和度来完成.作者为了保留更多的图片细节,都只在同一图层做调整.先整体调整下颜色,然后用选区选取需要调色的局部调色.方法非常不错. 原图 最终效果 1.首先打开图片.执行:图像-调整-自动色阶.制作图片前自动色阶是个很好的习惯. 然后按Ctrl + U 调整色相/饱和度,选择黄色:饱和度-100,明度+100.当然也可以选择其他自己喜欢的颜色. 2.按Ctrl + U 调