mirror of https://github.com/axmolengine/axmol.git
Add terrain in Scene3DTest.
This commit is contained in:
parent
6f50708beb
commit
966f3b6a3f
|
@ -1,16 +1,23 @@
|
||||||
#include "Scene3DTest.h"
|
#include "Scene3DTest.h"
|
||||||
|
|
||||||
#include "../testResource.h"
|
#include "../testResource.h"
|
||||||
|
#include "TerrainTest.h"
|
||||||
|
|
||||||
USING_NS_CC;
|
USING_NS_CC;
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Implements Scene3DTestScene
|
// Implements Scene3DTestScene
|
||||||
|
static Vec3 camera_offset(0, 45, 60);
|
||||||
|
|
||||||
class Scene3DTestScene : public TestCase
|
class Scene3DTestScene : public TestCase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CREATE_FUNC(Scene3DTestScene);
|
CREATE_FUNC(Scene3DTestScene);
|
||||||
|
|
||||||
|
void onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event);
|
||||||
|
void onTouchesBegan(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event);
|
||||||
|
void onTouchesEnd(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event);
|
||||||
private:
|
private:
|
||||||
Scene3DTestScene();
|
Scene3DTestScene();
|
||||||
virtual ~Scene3DTestScene();
|
virtual ~Scene3DTestScene();
|
||||||
|
@ -20,20 +27,41 @@ private:
|
||||||
void createUI();
|
void createUI();
|
||||||
Node* createDialog();
|
Node* createDialog();
|
||||||
|
|
||||||
|
std::vector<Camera *> _gameCameras;
|
||||||
|
|
||||||
|
Terrain *_terrain;
|
||||||
|
Player *_player;
|
||||||
|
|
||||||
static const int DLG_COUNT = 3;
|
static const int DLG_COUNT = 3;
|
||||||
std::vector<Node*> _dlgs;
|
std::vector<Node*> _dlgs;
|
||||||
};
|
};
|
||||||
#define GAME_SCENE_MASK CameraFlag::DEFAULT
|
|
||||||
#define GAME_UI_MASK CameraFlag::USER1
|
|
||||||
#define GAME_ACTOR_MASK CameraFlag::USER2
|
|
||||||
#define GAME_ZOOM_MASK CameraFlag::USER3
|
|
||||||
|
|
||||||
#define SCENE_CAMERA_DEPTH 0
|
enum LAYER_DEPTH {
|
||||||
#define UI_CAMERA_DEPTH 1
|
LAYER_DEPTH_GAME = 0,
|
||||||
#define ACTOR_CAMERA_DEPTH 2
|
LAYER_DEPTH_UI,
|
||||||
#define ZOOM_CAMERA_DEPTH 3
|
LAYER_DEPTH_ACTOR,
|
||||||
|
LAYER_DEPTH_ZOOM,
|
||||||
|
LAYER_DEPTH_COUNT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static CameraFlag s_CF[LAYER_DEPTH_COUNT] = {
|
||||||
|
CameraFlag::DEFAULT,
|
||||||
|
CameraFlag::USER1,
|
||||||
|
CameraFlag::USER2,
|
||||||
|
CameraFlag::USER3,
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned short s_CM[LAYER_DEPTH_COUNT] = {
|
||||||
|
(unsigned short)s_CF[0],
|
||||||
|
(unsigned short)s_CF[1],
|
||||||
|
(unsigned short)s_CF[2],
|
||||||
|
(unsigned short)s_CF[3],
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
Scene3DTestScene::Scene3DTestScene()
|
Scene3DTestScene::Scene3DTestScene()
|
||||||
|
: _terrain(nullptr)
|
||||||
|
, _player(nullptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -54,6 +82,38 @@ bool Scene3DTestScene::init()
|
||||||
|
|
||||||
Director::getInstance()->setDisplayStats(false);
|
Director::getInstance()->setDisplayStats(false);
|
||||||
|
|
||||||
|
// prepare for camera creation, we need create three custom cameras
|
||||||
|
Size visibleSize = Director::getInstance()->getVisibleSize();
|
||||||
|
_gameCameras.resize(LAYER_DEPTH_COUNT);
|
||||||
|
|
||||||
|
// first, create a camera to look the 3d game scene
|
||||||
|
Camera *ca = Camera::createPerspective(60,visibleSize.width/visibleSize.height,0.1,200);
|
||||||
|
ca->setCameraFlag(s_CF[LAYER_DEPTH_GAME]);
|
||||||
|
ca->setDepth(LAYER_DEPTH_GAME);
|
||||||
|
_gameCameras[LAYER_DEPTH_GAME] = ca;
|
||||||
|
this->addChild(ca);
|
||||||
|
|
||||||
|
// second, use the default camera to look 2d base ui layer
|
||||||
|
ca =this->getDefaultCamera();
|
||||||
|
ca->setCameraFlag(s_CF[LAYER_DEPTH_UI]);
|
||||||
|
ca->setDepth(LAYER_DEPTH_UI);
|
||||||
|
_gameCameras[LAYER_DEPTH_UI] = ca;
|
||||||
|
|
||||||
|
// third, create a camera to look the 3d model in dialogs
|
||||||
|
ca = Camera::create();
|
||||||
|
ca->setCameraFlag(s_CF[LAYER_DEPTH_ACTOR]);
|
||||||
|
ca->setDepth(LAYER_DEPTH_ACTOR);
|
||||||
|
_gameCameras[LAYER_DEPTH_ACTOR] = ca;
|
||||||
|
this->addChild(ca);
|
||||||
|
|
||||||
|
// forth, create a camera to kook the ui element over on the 3d models
|
||||||
|
ca = Camera::create();
|
||||||
|
ca->setCameraFlag(s_CF[LAYER_DEPTH_ZOOM]);
|
||||||
|
ca->setDepth(LAYER_DEPTH_ZOOM);
|
||||||
|
_gameCameras[LAYER_DEPTH_ZOOM] = ca;
|
||||||
|
this->addChild(ca);
|
||||||
|
|
||||||
|
// create all object in game
|
||||||
create3DWorld();
|
create3DWorld();
|
||||||
createUI();
|
createUI();
|
||||||
Size step = VisibleRect::getVisibleRect().size;
|
Size step = VisibleRect::getVisibleRect().size;
|
||||||
|
@ -70,7 +130,14 @@ bool Scene3DTestScene::init()
|
||||||
pos.x += step.width;
|
pos.x += step.width;
|
||||||
pos.y += step.height;
|
pos.y += step.height;
|
||||||
}
|
}
|
||||||
createDialog();
|
|
||||||
|
// add touch callback
|
||||||
|
// auto listener = EventListenerTouchAllAtOnce::create();
|
||||||
|
// listener->onTouchesBegan = CC_CALLBACK_2(Scene3DTestScene::onTouchesBegan, this);
|
||||||
|
// listener->onTouchesMoved = CC_CALLBACK_2(Scene3DTestScene::onTouchesMoved, this);
|
||||||
|
// listener->onTouchesEnded = CC_CALLBACK_2(Scene3DTestScene::onTouchesEnd, this);
|
||||||
|
// _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
|
@ -79,25 +146,64 @@ bool Scene3DTestScene::init()
|
||||||
|
|
||||||
void Scene3DTestScene::create3DWorld()
|
void Scene3DTestScene::create3DWorld()
|
||||||
{
|
{
|
||||||
std::string filename = "Sprite3DTest/girl.c3b";
|
// Size visibleSize = Director::getInstance()->getVisibleSize();
|
||||||
auto girl = Sprite3D::create(filename);
|
auto camera = _gameCameras[LAYER_DEPTH_GAME];
|
||||||
girl->setPosition(240, 0);
|
|
||||||
this->addChild(girl);
|
// first, create terrain
|
||||||
|
Terrain::DetailMap r("TerrainTest/dirt.jpg");
|
||||||
|
Terrain::DetailMap g("TerrainTest/Grass2.jpg",10);
|
||||||
|
Terrain::DetailMap b("TerrainTest/road.jpg");
|
||||||
|
Terrain::DetailMap a("TerrainTest/GreenSkin.jpg",20);
|
||||||
|
Terrain::TerrainData data("TerrainTest/heightmap16.jpg",
|
||||||
|
"TerrainTest/alphamap.png",
|
||||||
|
r,g,b,a,Size(32,32),40.0f,2);
|
||||||
|
_terrain = Terrain::create(data,Terrain::CrackFixedType::SKIRT);
|
||||||
|
_terrain->setMaxDetailMapAmount(4);
|
||||||
|
_terrain->setCameraMask(s_CM[LAYER_DEPTH_GAME]);
|
||||||
|
_terrain->setDrawWire(false);
|
||||||
|
_terrain->setSkirtHeightRatio(3);
|
||||||
|
_terrain->setLODDistance(64,128,192);
|
||||||
|
this->addChild(_terrain);
|
||||||
|
|
||||||
|
// second, create actor
|
||||||
|
_player = Player::create("Sprite3DTest/girl.c3b",camera,_terrain);
|
||||||
|
_player->setCameraMask(s_CM[LAYER_DEPTH_GAME]);
|
||||||
|
_player->setScale(0.08);
|
||||||
|
_player->setPositionY(_terrain->getHeight(_player->getPositionX(),_player->getPositionZ()));
|
||||||
|
|
||||||
|
auto animation = Animation3D::create("Sprite3DTest/girl.c3b","Take 001");
|
||||||
|
if (animation)
|
||||||
|
{
|
||||||
|
auto animate = Animate3D::create(animation);
|
||||||
|
_player->runAction(RepeatForever::create(animate));
|
||||||
|
}
|
||||||
|
|
||||||
|
addChild(_player);
|
||||||
|
|
||||||
|
// third, set camera position
|
||||||
|
camera->setPosition3D(_player->getPosition3D()+camera_offset);
|
||||||
|
camera->setRotation3D(Vec3(-45,0,0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene3DTestScene::createUI()
|
void Scene3DTestScene::createUI()
|
||||||
{
|
{
|
||||||
auto uiCamera = Camera::create();
|
auto showLeftDlgItem = MenuItemImage::create(s_pathClose, s_pathClose, [this](Ref* sender){
|
||||||
// uiCamera->setPositionX(uiCamera->getPositionX() + 50);
|
|
||||||
uiCamera->setCameraFlag(GAME_UI_MASK);
|
|
||||||
uiCamera->setDepth(UI_CAMERA_DEPTH);
|
|
||||||
this->addChild(uiCamera);
|
|
||||||
|
|
||||||
auto showDlgItem = MenuItemImage::create(s_pathClose, s_pathClose, [this](Ref* sender){
|
|
||||||
this->_dlgs[0]->setVisible(!this->_dlgs[0]->isVisible());
|
this->_dlgs[0]->setVisible(!this->_dlgs[0]->isVisible());
|
||||||
});
|
});
|
||||||
showDlgItem->setPosition(VisibleRect::right().x - 30, VisibleRect::top().y - 30);
|
showLeftDlgItem->setPosition(VisibleRect::left().x + 30, VisibleRect::top().y - 30);
|
||||||
|
|
||||||
|
auto showMidDlgItem = MenuItemImage::create(s_pathClose, s_pathClose, [this](Ref* sender){
|
||||||
|
this->_dlgs[1]->setVisible(!this->_dlgs[1]->isVisible());
|
||||||
|
});
|
||||||
|
showMidDlgItem->setPosition(VisibleRect::top().x, VisibleRect::top().y - 30);
|
||||||
|
|
||||||
|
auto showRightDlgItem = MenuItemImage::create(s_pathClose, s_pathClose, [this](Ref* sender){
|
||||||
|
this->_dlgs[2]->setVisible(!this->_dlgs[2]->isVisible());
|
||||||
|
});
|
||||||
|
|
||||||
|
showRightDlgItem->setPosition(VisibleRect::right().x - 30, VisibleRect::top().y - 30);
|
||||||
|
|
||||||
|
auto uiCamera = _gameCameras[LAYER_DEPTH_UI];
|
||||||
auto moveCameraLeft = MenuItemImage::create(s_pathClose, s_pathClose, [uiCamera](Ref* sender){
|
auto moveCameraLeft = MenuItemImage::create(s_pathClose, s_pathClose, [uiCamera](Ref* sender){
|
||||||
uiCamera->setPositionX(uiCamera->getPositionX() - 10);
|
uiCamera->setPositionX(uiCamera->getPositionX() - 10);
|
||||||
});
|
});
|
||||||
|
@ -108,9 +214,14 @@ void Scene3DTestScene::createUI()
|
||||||
});
|
});
|
||||||
moveCameraRight->setPosition(VisibleRect::right().x - 30, VisibleRect::right().y);
|
moveCameraRight->setPosition(VisibleRect::right().x - 30, VisibleRect::right().y);
|
||||||
|
|
||||||
auto menu = Menu::create(showDlgItem, moveCameraLeft, moveCameraRight, nullptr);
|
auto menu = Menu::create(showLeftDlgItem,
|
||||||
|
showMidDlgItem,
|
||||||
|
showRightDlgItem,
|
||||||
|
moveCameraLeft,
|
||||||
|
moveCameraRight,
|
||||||
|
nullptr);
|
||||||
menu->setPosition(Vec2::ZERO);
|
menu->setPosition(Vec2::ZERO);
|
||||||
menu->setCameraMask((unsigned short)GAME_UI_MASK, true);
|
menu->setCameraMask(s_CM[LAYER_DEPTH_UI], true);
|
||||||
this->addChild(menu);
|
this->addChild(menu);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -121,12 +232,14 @@ Node* Scene3DTestScene::createDialog()
|
||||||
int layerW = 240;
|
int layerW = 240;
|
||||||
int layerH = 160;
|
int layerH = 160;
|
||||||
int margin = 10;
|
int margin = 10;
|
||||||
auto layer = LayerColor::create(Color4B(166, 166, 166, 255), layerW, layerH);
|
static char clr = 0x3f;
|
||||||
//layer->setPosition(120, 80);
|
auto layer = LayerColor::create(Color4B(clr, clr, clr, 255), layerW, layerH);
|
||||||
|
clr = clr << 1;
|
||||||
layer->setVisible(false);
|
layer->setVisible(false);
|
||||||
|
|
||||||
// add 2d ui element on dialog:
|
// add 2d ui element on dialog:
|
||||||
// actor background
|
// actor background
|
||||||
auto actorBg = LayerColor::create(Color4B(0, 0, 0, 255), layerW / 2 - 2 * margin, layerH - 2 * margin - 16);
|
auto actorBg = LayerColor::create(Color4B(0, 0, 128, 255), layerW / 2 - 2 * margin, layerH - 2 * margin - 16);
|
||||||
actorBg->setPosition(margin, margin);
|
actorBg->setPosition(margin, margin);
|
||||||
layer->addChild(actorBg);
|
layer->addChild(actorBg);
|
||||||
|
|
||||||
|
@ -136,23 +249,18 @@ Node* Scene3DTestScene::createDialog()
|
||||||
layer->addChild(title);
|
layer->addChild(title);
|
||||||
|
|
||||||
// add layer to scene and set camera mask
|
// add layer to scene and set camera mask
|
||||||
layer->setCameraMask((unsigned short)GAME_UI_MASK);
|
layer->setCameraMask(s_CM[LAYER_DEPTH_UI]);
|
||||||
this->addChild(layer);
|
this->addChild(layer);
|
||||||
|
|
||||||
// add actor, which on dialog layer, and specify a camera for it
|
// add actor, which on dialog layer
|
||||||
std::string filename = "Sprite3DTest/girl.c3b";
|
std::string filename = "Sprite3DTest/girl.c3b";
|
||||||
auto girl = Sprite3D::create(filename);
|
auto girl = Sprite3D::create(filename);
|
||||||
girl->setScale(0.5);
|
girl->setScale(0.5);
|
||||||
girl->setPosition(100, -20);
|
girl->setPosition(layerW / 4, margin * 3);
|
||||||
girl->setCameraMask((unsigned short)GAME_ACTOR_MASK);
|
girl->setCameraMask(s_CM[LAYER_DEPTH_ACTOR]);
|
||||||
layer->addChild(girl);
|
layer->addChild(girl);
|
||||||
|
|
||||||
auto actorCamera = Camera::create();
|
// add zoom in/out button, which is 2d ui element and over 3d actor
|
||||||
actorCamera->setCameraFlag(GAME_ACTOR_MASK);
|
|
||||||
actorCamera->setDepth(ACTOR_CAMERA_DEPTH);
|
|
||||||
this->addChild(actorCamera);
|
|
||||||
|
|
||||||
// add zoom in/out button, which is 2d ui element and over 3d actor, and specify a camera for it
|
|
||||||
auto zoomIn = MenuItemImage::create(s_pathClose, s_pathClose, [girl](Ref* sender){
|
auto zoomIn = MenuItemImage::create(s_pathClose, s_pathClose, [girl](Ref* sender){
|
||||||
girl->setScale(girl->getScale() * 2);
|
girl->setScale(girl->getScale() * 2);
|
||||||
});
|
});
|
||||||
|
@ -165,14 +273,9 @@ Node* Scene3DTestScene::createDialog()
|
||||||
|
|
||||||
auto menu = Menu::create(zoomIn, zoomOut, nullptr);
|
auto menu = Menu::create(zoomIn, zoomOut, nullptr);
|
||||||
menu->setPosition(Vec2::ZERO);
|
menu->setPosition(Vec2::ZERO);
|
||||||
menu->setCameraMask((unsigned short)GAME_ZOOM_MASK, true);
|
menu->setCameraMask(s_CM[LAYER_DEPTH_ZOOM]);
|
||||||
layer->addChild(menu);
|
layer->addChild(menu);
|
||||||
|
|
||||||
auto zoomBtnCamera = Camera::create();
|
|
||||||
zoomBtnCamera->setCameraFlag(GAME_ZOOM_MASK);
|
|
||||||
zoomBtnCamera->setDepth(ZOOM_CAMERA_DEPTH);
|
|
||||||
this->addChild(zoomBtnCamera);
|
|
||||||
|
|
||||||
return layer;
|
return layer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue