Touch Handling in Cocos2D 3.x(五)

实现新英雄的放置功能

首先我们需要一个变量来保持我们当前移动英雄的引用,因此我们将添加一个私有实例变量.修改MainScene.m中的代码.

用:

@implementation MainScene {
    // this is the section to place private instance variables!
    CCSprite *currentHero;
}

替换原来的代码:

@implementation MainScene

现在我们有了一个新的私有变量.该变量将总是持有我们当前拖拽英雄的引用,所以我们可以在屏幕触摸移动时更新它的位置.让我们开始在touchBegan方法中赋值该变量.

将以下代码:

// create a 'hero' sprite
CCSprite *hero = [CCSprite spriteWithImageNamed:@"hero.png"];
[self addChild:hero];
// place the sprite at the touch location
hero.position = touchLocation;

替换为如下代码:

// create a 'hero' sprite
currentHero = [CCSprite spriteWithImageNamed:@"hero.png"];
[self addChild:currentHero];
// place the sprite at the touch location
currentHero.position = touchLocation;

现在当前英创建的同时它的引用也被存储下来.这使得我们可以在整个对象中访问最后创建的英雄并且可以实现其他触摸方法.

当用户在屏幕上移动手指时,我们想要移动刚创建的英雄.因此我们需要实现touchMoved方法,该方法在每次触摸改变位置时被调用.增加该方法到MainScene.m中:

- (void)touchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint touchLocation = [touch locationInNode:self];
    currentHero.position = touchLocation;
}

它到底做了什么?每次触摸移动时我们取得触摸的位置并且移动刚才创建的英雄到新的位置.

我们最后一步是当触摸结束或被取消时去复位英雄的引用,因为我们只想保持当前选择英雄的引用.添加如下2个方法到MainScene.m中去:

- (void)touchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    currentHero = nil;
}
- (void)touchCancelled:(UITouch *)touch withEvent:(UIEvent *)event
{
    currentHero = nil;
}

现在你可以再次build和运行你的项目.游戏的行为应该精确和算法轮廓相匹配,并且你应该看到如下画面:

做的不错!你的下一步将是更仔细的在Cocos2d 3.0中掌控触摸处理.

时间: 2024-10-31 06:54:51

Touch Handling in Cocos2D 3.x(五)的相关文章

Touch Handling in Cocos2D 3.x(六)

使英雄变成可触碰的对象 这是另一个非常有用的特性.很多用户需要捡起已经存在的英雄然后满屏幕移动它们.让我们按以下步骤实现该功能: 如果用户触摸屏幕空白位置,一个新的英雄将被创建 如果用户触摸一个已经存在的英雄,不会有新英雄被创建,相反Ta可以移动已存在的那个英雄 为了实现这些,我们需要创建一个CCSprite的子类.前进去创建一个名为CCDragSprite的类,该类继承自CCSprite: 在CCDragSprite.h中添加以下一行导入Cocos2d的头文件: #import "cocos2

Touch Handling in Cocos2D 3.x(二)

接受触摸 在Cocos2d 3.0中每一个CCNode和每一个CCNode的子类都可以接收触摸.你只需要开启一个选项.让我们在定制的初始化器里完成它.替换MainScene.m中init方法的代码: - (id)init { if (self = [super init]) { // activate touches on this scene self.userInteractionEnabled = TRUE; } return self; } 现在Cocos2d 将会知道我们想要在这个场景

Touch Handling in Cocos2D 3.x(四)

创建触摸生命周期 让我们改善我们的应用程序.如果玩家可以触摸屏幕并且拖放英雄到指定位置不是更好吗? 为了完成这个功能我们必须使用Cocos2d 3.0提供的所有的触摸事件: touchBegan:在用户触摸屏幕时调用 touchMoved:在用户在屏幕上移动手指时调用 touchEnded:在用户停止触摸屏幕时调用 touchCancelled:在用户依然触摸屏幕但是一些其他问题停止你的节点处理触摸事件时调用(e.g. 触摸移动到你节点的边界之外时). 我们新的英雄放置算法将会按如下方式工作:

Touch Handling in Cocos2D 3.x(一)

原帖地址 Cocos2d 3.0 带来经过完全修正后的触摸处理系统.本篇博文将提供所有触摸相关的信息: 接收触摸 取得触摸位置 处理不同个触摸生命周期中的事件 实现一个拖放机制 让我们开始吧 ;) 通过下载开始项目开始我们的旅程: starter project 一旦你下载运行项目,你可以运行App看到如下屏幕: Cocos2D 3.3+ 需要注意的地方 如果你使用Cocos2D 3.3+ (它是SpriteBuilder 1.3+的一部分) 你必须分别使用CCTouch和CCTouchEven

Touch Handling in Cocos2D 3.x(三)

取得触摸位置 最有趣的部分是触摸的位置.接下来我们将使用触摸位置在玩家每次点击的屏幕位置上添加精灵.为了完成这项功能我们需要修改touchBegan的实现,替换旧的代码如下: - (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event { // we want to know the location of our touch in this scene CGPoint touchLocation = [touch locatio

Touch Handling in Cocos2D 3.x(七)

在touchMoved方法中寻找触摸在父节点(CCScene)中的位置并且移动CCDragSprite到其父节点的相应位置中去. 在我们在动作中观赏拖放机制之前,我们需要使用这个新实现的类.打开MainScene.m并且在文件开头增加如下导入语句: #import "CCDragSprite.h" 现在我们将改变创建英雄的代码:用新的类替代CCSprite. 将以下一行: currentHero = [CCSprite spriteWithImageNamed:@"hero.

Cocos2D v2.0至v3.x简洁转换指南(二)

触摸处理 我们在稍后将完成Cocos2d 3.0中触摸处理的完整教程.而现在最重要的是知道如何去启用触摸处理在你的CCNode中: self.userInteractionEnabled = TRUE; 去捕捉一个触摸以及触摸的位置: - (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchLocation = [touch locationInNode:self]; // put your to

Cocos2D-X入门(4)Touch 事件:移动精灵

在.h中声明: virtual void registerWithTouchDispatcher(void); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual voi

对MBProgressHUD进行二次封装并精简使用

对MBProgressHUD进行二次封装并精简使用 https://github.com/jdg/MBProgressHUD 几个效果图: 以下源码是MBProgressHUD支持最新的iOS8的版本,没有任何的警告信息 MBProgressHUD.h 与 MBProgressHUD.m // // MBProgressHUD.h // Version 0.9 // Created by Matej Bukovinski on 2.4.09. // // This code is distrib