• 天空盒和相机01


    .h文件:

    #ifndef __HELLOWORLD_SCENE_H__
    #define __HELLOWORLD_SCENE_H__
    
    #include "cocos2d.h"
    
    class HelloWorld : public cocos2d::Layer
    {
    public:
        static cocos2d::Scene* createScene();
    
        virtual bool init();
    	void onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event);
        // a selector callback
        void menuCloseCallback(cocos2d::Ref* pSender);
    protected:
    	cocos2d::Camera*  _camera;
    	cocos2d::Terrain* _terrain;
        // implement the "static create()" method manually
        CREATE_FUNC(HelloWorld);
    };
    
    #endif // __HELLOWORLD_SCENE_H__
    

    .cpp文件:

    #include "HelloWorldScene.h"
    
    USING_NS_CC;
    
    Scene* HelloWorld::createScene()
    {
        // 'scene' is an autorelease object
        auto scene = Scene::create();
        
        // 'layer' is an autorelease object
        auto layer = HelloWorld::create();
    
        // add layer as a child to scene
        scene->addChild(layer);
    
        // return the scene
        return scene;
    }
    
    // on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        //////////////////////////////
        // 1. super init first
        if ( !Layer::init() )
        {
            return false;
        }
        
        Size visibleSize = Director::getInstance()->getVisibleSize();
        Vec2 origin = Director::getInstance()->getVisibleOrigin();
    
        /////////////////////////////
        // 2. add a menu item with "X" image, which is clicked to quit the program
        //    you may modify it.
    
        // add a "close" icon to exit the progress. it's an autorelease object
        auto closeItem = MenuItemImage::create(
                                               "CloseNormal.png",
                                               "CloseSelected.png",
                                               CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
        
    	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                    origin.y + closeItem->getContentSize().height/2));
    
        // create menu, it's an autorelease object
        auto menu = Menu::create(closeItem, NULL);
        menu->setPosition(Vec2::ZERO);
        this->addChild(menu, 1);
    
        /////////////////////////////
        // 3. add your codes below...
    
        // add a label shows "Hello World"
        // create and initialize a label
        
        auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);
        
        // position the label on the center of the screen
        label->setPosition(Vec2(origin.x + visibleSize.width/2,
                                origin.y + visibleSize.height - label->getContentSize().height));
    
        // add the label as a child to this layer
        this->addChild(label, 1);
    
        // add "HelloWorld" splash screen"
       // auto sprite = Sprite::create("HelloWorld.png");
    
        // position the sprite on the center of the screen
       // sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    
        // add the sprite as a child to this layer
       // this->addChild(sprite, 0);
    	//Size visibleSize = Director::getInstance()->getVisibleSize();
    
    	//use custom camera
    	_camera = Camera::createPerspective(60, visibleSize.width / visibleSize.height, 0.1f, 800);
    	_camera->setCameraFlag(CameraFlag::USER1);
    	_camera->setPosition3D(Vec3(-1, 1.6f, 4));
    	addChild(_camera);
    
    	Terrain::DetailMap r("TerrainTest/dirt.jpg"), g("TerrainTest/Grass2.jpg"), b("TerrainTest/GreenSkin.jpg"), a("TerrainTest/road.jpg");//TerrainTest/GreenSkin.jpg
    
    	Terrain::TerrainData data("TerrainTest/heightmap16.jpg", "TerrainTest/alphamap.png", r, g, b, a);
    
    	_terrain = Terrain::create(data, Terrain::CrackFixedType::SKIRT);
    	_terrain->setLODDistance(3.2f, 6.4f, 9.6f);
    	_terrain->setMaxDetailMapAmount(4);
    	addChild(_terrain);
    	_terrain->setCameraMask(2);
    	_terrain->setDrawWire(false);
    	_terrain->setLightMap("TerrainTest/Lightmap.png");
    	auto listener = EventListenerTouchAllAtOnce::create();
    	listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this);
    	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
    
        return true;
    }
    
    void HelloWorld::onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event)
    {
    	float delta = Director::getInstance()->getDeltaTime();
    	auto touch = touches[0];
    	auto location = touch->getLocation();
    	auto PreviousLocation = touch->getPreviousLocation();
    	Point newPos = PreviousLocation - location;
    
    	Vec3 cameraDir;
    	Vec3 cameraRightDir;
    	_camera->getNodeToWorldTransform().getForwardVector(&cameraDir);
    	cameraDir.normalize();
    	cameraDir.y = 0;
    	_camera->getNodeToWorldTransform().getRightVector(&cameraRightDir);
    	cameraRightDir.normalize();
    	cameraRightDir.y = 0;
    	Vec3 cameraPos = _camera->getPosition3D();
    	cameraPos += cameraDir*newPos.y*0.5*delta;
    	cameraPos += cameraRightDir*newPos.x*0.5*delta;
    	_camera->setPosition3D(cameraPos);
    }
    
    
    
    void HelloWorld::menuCloseCallback(Ref* pSender)
    {
        Director::getInstance()->end();
    
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        exit(0);
    #endif
    }
    

    效果:


  • 相关阅读:
    mybatis typeAlias (别名)说明
    jsp路径
    Jutil 单元测试
    SpringMVC数据绑定
    EL表达式(Exprission language)
    JSTL (标准标签库)
    Introduce Null Object
    Replace Type Code With Class和Replace Type Code With Subclass和Replace Type Code With State/Strategy
    利用QBuffer和QLinkedList做数据块存储队列
    Duplicate Observed Data
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6091896.html
Copyright © 2020-2023  润新知