zoukankan      html  css  js  c++  java
  • cocos2d-x V3.0 呼叫加速度计 Acceleration

    今天克服了一个问题,我觉得非常酷 哈哈。

    今天得到解决cocos2d-x 3.0 呼叫重力加速器问题,上网查了很多资料 发现是不够,不解决这个问题,我不知道如果我使用3.0 这一问题的版本号,但是,这也有一些在线教程3.0 版本号啊。是beta有那么大区别么?坑爹啊,

    就说这个重写的方法吧:网上搜索的到好多都是重写父类的 didAccelerate(CCAcceleration* pAccelerationValue);方法,可是我用的3.0 根本就没有了这种方法,搜索的3.0 还是有说这个,蛋疼。

    最后在看官方的testCpp样例的时候发现了如今调用重力加速器的方法;样例的位置:X:你的cocos2d-x estscpp-testsClassesAccelerometerTest
    当中要重写的方法为:onAcceleration(Acceleration* acc, Event* event)。 TMD区别好大有么有啊。

    cocos2d-x每一个版本号都有变化有么有啊。坑爹……

    只是坑爹归坑爹。引擎还是不错的。仅仅能说咱学的不好吧;

    OK 废话太多了,開始说正事。


    既然找到了正确的方法,那就好攻克了,首先是在.h头文件里定义好方法
    #include "cocos2d.h"
    
    class GameScene : public cocos2d::Layer
    {
    public:
        static cocos2d::Scene* createScene();
    
    
        virtual bool init();   
        //重写的父类的方法,用来处理重力加速器方法     
        void onAcceleration(cocos2d::Acceleration* acc, cocos2d::Event* event);
        CREATE_FUNC(GameScene);
    };


    接着就是在cpp文件里去实现这种方法就OK了
    //重写重力加速器方法
    void GameScene::onAcceleration(Acceleration* acc, Event* event){
    auto director = Director::getInstance();
    if(img == NULL){
    return;
    }
    
    
    auto imgSize = img->getContentSize();
    auto imgPosition = img->getPosition();
    auto imgX = img->getPositionX();
    auto imgY = img->getPositionY();
    
    
    imgX += acc->x * gravityValue;
    //imgY += acc->y * gravityValue;
    //auto imgTemp = director->convertToUI(imgPosition);
     
    //imgTemp.x += acc->x * gravityValue;
    //imgTemp.y -= acc->y * gravityValue;
    //auto imgNext = director->convertToGL(imgTemp);
    
    
    FIX_POS(imgX, (origin.x + imgSize.width/2), (origin.x + visibleSize.width - imgSize.width/2));
    FIX_POS(imgY, (origin.y + + imgSize.height/2), (origin.y + visibleSize.height - imgSize.height/2));
    img->setPosition(Point(imgX, imgY));
    
    
    log("onAcceleration: acc->x: %f, acc->y: %f, acc->z: %f, imgX: %f, imgY: %f", 
    acc->x, acc->y, acc->z, imgX, imgY);
    }




    能够看到当中有我凝视掉的一部分代码,这是本来官方演示样例文件里的依据“屏幕坐标系”以及“OpenGL坐标系”互相转换的方法,将样例中精灵的坐标互相转换,然后进行设置精灵坐标


    事实上后来依据输出log測试。我发现cocos2d-x的默认的getPosition()获取的坐标是和OpenGL的坐标是一直的,所以最后我就凝视掉了样例中的转化方式,直接依据坐标点来设置精灵位置。这样是和经过转化的一样的效果的;


    下边我画了几张图来简单的说明一下OpenGL坐标系,屏幕UI坐标系(仅仅是我自己觉得,假设有不正确的地方。望朋友们指正)

    首先这个立方的 是我绘制的OpenGL的重力加速器的三维空间坐标系,旁边的蓝色表示一个手机平放时与坐标系的相应情况;依据图中箭头的方向。x、y、z三个坐标轴的值都是趋向于-1的;




    以下这两个是平面的UI坐标系和GL坐标系

    UI坐标系的坐标原点是在左上角,Y轴向下延伸。当中精灵A位置为(10,10)



    GL坐标系的原点是在左下角。Y轴向上延伸。精灵B(相当于UI坐标戏中的精灵A)位置为(10, 1280)(屏幕分辨率为720*1280时)
    这就是在官方Test样例中UI坐标系和GL坐标系为什么要进行转换


    cocos2d-x中的默认坐标系是和OpenGL的坐标是相同的,所以我直接依据getPosition()方式来获得位置的精神。这少了复杂的转换,由于只有官方的兑换可能有他们的意图权。现在不深究。

    该博客的内容和个人原创博客同步更新:Melove 我爱
    OK继续垒码
  • 相关阅读:
    Spring 自动装配;方法注入
    Spring 依赖注入(二、注入参数)
    Spring 依赖注入(一、注入方式)
    Spring IOC(控制反转)示例解析
    PowerDesigner最基础的使用方法入门学习
    Struts2 文件上传和下载
    Struts2 转换器
    ResultSet相关ResultSetMetaData详细(转)
    hibernate缓存详解
    hibernate缓存机制【转】
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5032861.html
Copyright © 2011-2022 走看看