@implementation InputLayer
    
    - (id)init
    {
        if(self = [super init])
        {
            winSize = [[CCDirector sharedDirector] winSize];
            [self addJoystick];
            [self addFireButton];
            [self scheduleUpdate];
        }
        return  self;
    }
    
    //添加一个按钮
    - (void)addFireButton
    {
        fireButton = [SneakyButton button];
        fireButton.isHoldable = YES; // 按住按钮持续触发
        
        //按钮添加皮肤
        SneakyButtonSkinnedBase *skinFireButton = [SneakyButtonSkinnedBase skinButton];
        skinFireButton.defaultSprite = [CCSprite spriteWithSpriteFrameName:@"button-default.png"];
        skinFireButton.pressSprite = [CCSprite spriteWithSpriteFrameName:@"button-pressed.png"];
        skinFireButton.button = fireButton;
        skinFireButton.position = CGPointMake(winSize.width - skinFireButton.contentSize.width,
                                              skinFireButton.contentSize.height);
        
        [self addChild:skinFireButton];
        
    }
    
    //添加一个摇杆
    - (void)addJoystick
    {
        joystick = [SneakyJoystick joystick:CGRectMake(0, 0, 0, 0 )];
        
        joystick.autoCenter = YES; //是否自动回到中心
        
        //360度
        joystick.hasDeadzone = YES; //是否支持死亡区域,该区域不会触发
        joystick.deadRadius = 20;//死亡区域的半径
        
        //限制可移动的方向数量
    //    joystick.isDPad = YES;
    //    joystick.numberOfDirections = 8; //方向数量
        
        
        //给摇杆添加皮肤
        SneakyJoystickSkinnedBase *skinJoystick = [SneakyJoystickSkinnedBase skinJoystick];
        skinJoystick.backgroundSprite = [CCSprite spriteWithSpriteFrameName:@"button-disabled.png"];
        skinJoystick.thumbSprite = [CCSprite spriteWithSpriteFrameName:@"button-disabled.png"];
        skinJoystick.thumbSprite.scale = 0.5f;
        skinJoystick.joystick = joystick;
        skinJoystick.position = CGPointMake(skinJoystick.contentSize.width ,
                                            skinJoystick.contentSize.height);
        
        [self addChild:skinJoystick];
    }
    
    - (void)update:(ccTime)delta
    {
        GameScene *scene = [GameScene sharedGameScene];
        Ship *ship = (Ship *)[scene ship];
        totalTime += delta;
        
        //点击按钮触发
        if(fireButton.active && totalTime > nextShootTime)
        {
            nextShootTime = totalTime + 0.5f;
            [scene shootBullet:ship];
        }
        
        if (fireButton.active == NO)
        {
            nextShootTime = 0;
        }
        
        //joystick.velocity 这个值非常小需要将其放大(根据实际情况调值)
        CGPoint velocity = ccpMult(joystick.velocity, 200);
        if(velocity.x != 0 && velocity.y != 0)
        {
            ship.position = CGPointMake(ship.position.x + velocity.x * delta,
                                        ship.position.y + velocity.y *delta);
        }
    }
    运行图如下:
    

二、CCJoystick类(最新版的已经支持搓招了哦,下载链接http://code.google.com/p/ccjoystick/downloads/list

CCJoyStick 是一个基于 Cocos2d 的摇杆类,简单几行代码即可为您的游戏增加一个强大的模拟摇杆。而且最新版本已经支持摇杆搓招儿,满足格斗类游戏开发者的需求。

基于该类可自主扩展诸多摇杆效果,比如 360 度模式、8 向模式。使用方法如下:

// 创建摇杆

myjoystick=[CCJoyStick initWithBallRadius:25 MoveAreaRadius:65 isFollowTouch:NO isCanVisible:YES isAutoHide:NO hasAnimation:YES];//BallRadius即模拟摇杆球的半径,MoveAreaRadius即摇杆球可移动的范围半径,isFollowTouch即是否将摇杆基准位置 跟随touch坐标,isCanVisible即是否可见,isAutoHide即是否自动隐藏(touchend即隐藏),hasAnimation即 是否显示摇杆复位动画

//添加皮肤

[myjoystick setBallTexture:@"Ball.png"];//可选,不设置即看不见摇杆球
[myjoystick setDockTexture:@"Dock.png"];//可选,不设置即看不见底座
[myjoystick setStickTexture:@"Stick.jpg"];//可选,不设置即看不见连动杆
[myjoystick setHitAreaWithRadius:100];//摇杆激活区域为基准坐标半径,默认为另一个方法,设置屏幕矩形区域为激活区域setHitAreaWithRect

myjoystick.position=ccp(100,100);
myjoystick.delegate=self;
[self addChild:myjoystick];

该摇杆类包含3个事件:

1、- (void) onCCJoyStickUpdate:(CCNode*)sender Angle:(float)angle  Direction:(CGPoint)direction Power:(float)power;//angle用来控制角色朝向,direction用来设置移动坐标,power为力度用于控制速度快慢
2 、- (void) onCCJoyStickActivated:(CCNode*)sender;
3、- (void) onCCJoyStickDeactivated:(CCNode*)sender;

实现代码如下:

 1 @implementation OperateLayer
 2 
 3 - (id)init
 4 {
 5     if(self = [super init])
 6     {
 7         winSize = [[CCDirector sharedDirector] winSize];
 8         joystick = [CCJoyStick initWithBallRadius:25
 9                                    MoveAreaRadius:65
10                                     isFollowTouch:NO
11                                      isCanVisible:YES
12                                        isAutoHide:NO
13                                      hasAnimation:YES];
14         [joystick setBallTexture:@"Ball.png"];
15         [joystick setDockTexture:@"Dock.png"];
16         [joystick setStickTexture:@"Stick.jpg"];
17         [joystick setHitAreaWithRadius:100];
18         
19         joystick.position = CGPointMake(100, 100);
20         [joystick setDelegate:self];
21         joystick.opacity = 150;
22         [self addChild:joystick];
23         
24         CCLabelTTF *label= [CCLabelTTF labelWithString:@"shoot" fontName:@"Arial" fontSize:30];
25         CCMenuItemLabel *shoot = [CCMenuItemLabel itemWithLabel:label 
26                                                          target:self 
27                                                        selector:@selector(shoot:)];
28         CCMenu *shootMenu = [CCMenu menuWithItems:shoot, nil];
29         shootMenu.position =CGPointMake( 380, 80);
30         [self addChild:shootMenu];
31     }
32     return self;
33 }
34 
35 - (void)shoot:(CCMenuItem  *) menuItem{
36     GameScene *scene = [GameScene sharedGameScene];
37 
38     [scene shootBullet:scene.ship];
39 }
40 - (void) onCCJoyStickUpdate:(CCNode*)sender Angle:(float)angle Direction:(CGPoint)direction Power:(float)power
41 {
42     if (sender==joystick) {
43         NSLog(@"angle:%f power:%f direction:%f,%f",angle,power,direction.x,direction.y);
44         
45         GameScene *scene = [GameScene sharedGameScene];
46         
47         float nextx=scene.ship.position.x;
48         float nexty=scene.ship.position.y;
49         
50         nextx+=direction.x * (power*8);
51         nexty+=direction.y * (power*8);
52         
53         scene.ship.position=ccp(nextx,nexty);
54     }
55 }
56 
57 - (void) onCCJoyStickActivated:(CCNode*)sender
58 {
59     if (sender==joystick) {
60         [joystick setBallTexture:@"Ball_hl.png"];
61         [joystick setDockTexture:@"Dock_hl.png"];
62         joystick.opacity = 255;
63     }
64 }
65 - (void) onCCJoyStickDeactivated:(CCNode*)sender
66 {
67     if (sender==joystick) {
68         [joystick setBallTexture:@"Ball.png"];
69         [joystick setDockTexture:@"Dock.png"];
70         joystick.opacity = 150;
71     }
72 }
73 @end
 
运行效果图:

以下是两个类库的下载链接,有需要的可以下载看看哦 ~

/Files/xuling/CCJoystick.rar

/Files/xuling/SneakyInput.rar

ps:咱新手们注意了哈,用最新的cocos2d时,看看AppDelegate.m 中的

[glView setMultipleTouchEnabled:YES];设置为YES了没有。 我刚开始做的时候就没设置还查了好久,嘿嘿,有点菜 ...

cocos2D 虚拟摇杆Joystick功能实现的更多相关文章

  1. Unity3d项目入门之虚拟摇杆

    Unity本身不提供摇杆的组件,开发者可以使用牛逼的EasyTouch插件或者应用NGUI实现相关的需求,下面本文通过Unity自身的UGUI属性,实现虚拟摇杆的功能. 主参考 <Unity:使 ...

  2. [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动

    大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei.今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动.虽然Un ...

  3. 【转】简单的虚拟摇杆控制移动(NGUI)

    http://www.cnblogs.com/zhangbaochong/p/4928688.html 一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个B ...

  4. 【转】NGUI版虚拟摇杆

    http://blog.csdn.net/anyuanlzh/article/details/40107577 下面是我用nui实现的一个虚拟摇杆. 1,示图 2.代码如下,都有比较详细的注释,就不说 ...

  5. 简单的虚拟摇杆控制移动(NGUI)

    一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个BoxCollider,再创建一个sprite child作为虚拟摇杆中间的按钮,叫做button 二.通 ...

  6. unity零基础开始学习做游戏(三)鼠标输入,来个虚拟摇杆怎么样?

    -------小基原创,转载请给我一个面子 现在移动游戏越来越火,大家都拿手机平板玩游戏,没有键盘和手柄输入,所以就不得不看看虚拟摇杆怎么搞?(小基对于没有实体反馈不是很喜欢呢) 首先要清楚,鼠标操作 ...

  7. Unity3D学习笔记(二十三):事件接口、虚拟摇杆、层级管理和背包系统

    事件接口 IDragHandler(常用):鼠标按下拖动时执行(只要鼠标在拖动就一直执行) IDropHandler:对象拖动结束时,如果鼠标在物体的范围内,执行一次(依赖于IDragHandler存 ...

  8. Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆

    Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆 效果如图所示 摇杆的UI组成 如图所示 简单的可以认为摇杆由1.2.3贴图组成 为摇杆的底座 为摇杆的杆 为摇杆的指向 可以理解这就是街机上的 ...

  9. 【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机

    http://blog.csdn.net/begonia__z/article/details/51178907 前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控 ...

随机推荐

  1. uva 11584 Partitioning by Palindromes 线性dp

    // uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...

  2. 倍福TwinCAT(贝福Beckhoff)应用教程11.1 TwinCAT应用小程序1 贝福IO模块介绍

    EL1002,EL1004,EL1008都是数字输入模块(2个点,4个点,8个点),输入高的范围是15V到30V,低的范围是-3V到5V         EL2002,EL2004,EL2008都是数 ...

  3. 模板:什么是Traits

    Traits不是一种语法特性,而是一种模板编程技巧.Traits在C++标准库,尤其是STL中,有着不可替代的作用.   如何在编译期间区分类型   下面我们看一个实例,有四个类,Farm.Worke ...

  4. AutoResponder及正则表达式

    使用AutoResponder选项卡,你可以创建一个匹配规则和一个响应字符串,如果请求的URL地址跟你的匹配规则相匹配,Fiddler就会自动执行这个对应的响应字符串. 小提示: 匹配规则会按照它在规 ...

  5. iOS活体人脸识别的Demo和一些思路

    代码地址如下:http://www.demodashi.com/demo/12011.html 之前公司项目需要,研究了一下人脸识别和活体识别,并运用免费的讯飞人脸识别,在其基础上做了二次开发,添加了 ...

  6. .bat批处理基础

    批处理(Batch),也称为批处理脚本.顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中.批处理文件的扩展名为bat .目前比较常见的批 ...

  7. C#实现的根据日期得到今天是星期几

    算法如下:   基姆拉尔森计算公式: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7  在公式中d表示日期中的日数,m表示月份数,y表示年数.注意:在公式中有 ...

  8. javascript 中对象的拷贝

    http://blog.csdn.net/i10630226/article/details/52431562 在javascript中,对象都是值引用,也就是说,如果你常规的使用 "=&q ...

  9. Windows GDI 映射模式(出自:Windows程序设计第5版-珍藏版)

    GDI映射模式(mapping mode):和映射模式紧密相关的还有4个其它的设备环境属性:1.窗口原点(window origin)2.视口原点(viewport origin)3.窗口范围(win ...

  10. 迁移TFS 2012服务至新的电脑硬件

    迁移TFS 2012的时候碰到一些问题, 中文记录很少, 英文的记录也比较零散. 这里记录最直接和简单的方法. 环境: 1. 公司域环境, 所有TFS用户都是公司域帐户. 2. TFS从一台服务器转移 ...