• cocos2dx打飞机项目笔记三:HeroLayer类和坐标系


    HeroLayer类主要是处理hero的一些相关东西,以及调用bulletLayer的一些方法,因为子弹是附属于hero的~~

    HeroLayer 类的成员如下:

     1 class HeroLayer : public CCLayer
     2 {
     3 public:
     4 
     5     static HeroLayer* create();
     6     virtual bool init();
     7 
     8     virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);//触摸事件
     9     void moveHero(CCPoint toPoint);//移动hero
    10 
    11     void heroBomb(float dt);//hero爆炸处理
    12     void newLifeInit(float dt);//hero爆炸后初始化新的开始
    13 
    14 
    15     CC_SYNTHESIZE(CCSprite*, m_Hero, Hero);
    16     CC_SYNTHESIZE(bool, m_IsHeroLive, IsHeroLive);
    17     CC_SYNTHESIZE(BulletLayer*, m_Bullets, Bullets);
    18     CC_SYNTHESIZE(int, m_HeroLifes, HeroLifes);
    19 
    20 private:
    21 
    22     cocos2d::CCSize designResolutionSize;
    23 
    24 };

    重点一:touchesMoveed 移动hero

    这里主要是设计到坐标转换问题,cocos2dx里有几种坐标系:UI坐标系、GL坐标系、本地坐标系和世界坐标系:

    UI坐标系:以屏幕的左上角为原点,X坐标向左为正,Y坐标向下为正,一些touch事件获取到的坐标就是以这个坐标系为标准的。

    GL坐标系:也就是openGL坐标系,以屏幕的左下角为原点,X坐标向左为正,Y坐标向上为正,cocos2dx引擎底层是openGL,也用这个坐标系,一些控件的添加或设置是以这个坐标系为准的。

    本地坐标系:子节点的左下角相对于父节点左下角的坐标,也就是以父节点的左下角为坐标原点,X坐标向左为正,Y坐标向上为正。boundingBox 方法获取到的节点的rect的坐标就是这个坐标。

    cocos2dx提供了一些方法来实现不同坐标系的转换,其实cocos2dx也提供了直接从触摸点的参数里获取GL坐标。

    ccTouchesMoveed方法实现如下:

     1 void HeroLayer::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
     2 {
     3     /*
     4      *    坐标系统
     5      *  cocos2dx坐标系统(opengl坐标系统):以左下角为原点
     6      *  UI坐标系统(绘图坐标系统、纹理坐标系统):以左上角为原点
     7      */
     8 
     9     //hero是否还活着  
    10     if(this->m_IsHeroLive)
    11     {  
    12         /*
    13          *    触摸事件获取坐标的几个方法
    14          *
    15          *  getLocation:获取触摸时第一点的cocos2dx 坐标
    16          *  getPreviousLocation 获取触摸时最后一点 cocos2dx 坐标
    17          *  getLocationInView 获取触摸时第一点的UI坐标
    18          *  getPreviousLocationInView 获取触摸时的最后一点 UI坐标
    19          */
    20         
    21         CCTouch *touches = (CCTouch*)pTouches->anyObject();
    22  
    23         CCPoint beginPoint = touches->getLocation();//获取触摸坐标(cocos2dx坐标系统的)
    24 
    25         CCRect planeRect = this->m_Hero->boundingBox();//获取飞机当前位置形状位置  
    26     
    27         //允许稍微加大一点触摸位置,游戏实际需要  
    28         //planeRect.origin.x -= 15;  
    29         //planeRect.origin.y -= 15;  
    30         //planeRect.size.width += 30;  
    31         //planeRect.size.height += 30;
    32 
    33         if(planeRect.containsPoint(beginPoint))
    34         {   
    35             CCPoint endPoint = touches->getPreviousLocation();//获取触摸的前一个位置  
    36             HeroLayer::moveHero(endPoint); //移动飞机  
    37         }   
    38     }  
    39 }
  • 相关阅读:
    mac搭建mamp环境
    iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建)
    iOS开发UI篇—UITabBarController简单介绍
    OS开发UI篇—ios应用数据存储方式(归档)
    iOS开发UI篇—ios应用数据存储方式(偏好设置)
    IOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
    iOS开发UI篇—控制器的View的创建
    iOS开发UI篇—UIWindow简单介绍
    iOS开发UI篇—使用storyboard创建导航控制器以及控制器的生命周期
    IOS开发UI篇—导航控制器属性和基本使用
  • 原文地址:https://www.cnblogs.com/zouzf/p/3490337.html
Copyright © 2020-2023  润新知