PuzzleSDK
BillBoardTest.cpp
浏览该文件的文档.
1/****************************************************************************
2 Copyright (c) 2012 cocos2d-x.org
3 Copyright (c) 2013-2016 Chukong Technologies Inc.
4 Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
5
6 http://www.cocos2d-x.org
7
8 Permission is hereby granted, free of charge, to any person obtaining a copy
9 of this software and associated documentation files (the "Software"), to deal
10 in the Software without restriction, including without limitation the rights
11 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 copies of the Software, and to permit persons to whom the Software is
13 furnished to do so, subject to the following conditions:
14
15 The above copyright notice and this permission notice shall be included in
16 all copies or substantial portions of the Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 THE SOFTWARE.
25 ****************************************************************************/
26
27#include "BillBoardTest.h"
28#include "3d/CCBillBoard.h"
29
30#include <algorithm>
31#include "../testResource.h"
32
35using namespace cocos2d::ui;
36
37
38BillBoardTests::BillBoardTests()
39{
42}
43
44//------------------------------------------------------------------
45//
46// Billboard Rotation Test
47//
48//------------------------------------------------------------------
50{
51 auto root = Sprite3D::create();
52 root->setPositionNormalized(Vec2(0.5f,0.25f));
53 addChild(root);
54
55 auto model = Sprite3D::create("Sprite3DTest/orc.c3b");
56 model->setScale(5);
57 model->setRotation3D(Vec3(0.0f,180.0f,0.0f));
58 root->addChild(model);
59
60 auto bill = BillBoard::create();
61 bill->setPosition(0, 120);
62 root->addChild(bill);
63
64 auto sp = Sprite::create("Images/SpookyPeas.png");
65 sp->setScale(2);
66 bill->addChild(sp);
67
68 auto lbl = Label::create();
69 lbl->setPosition(0.0f, 30.0f);
70 lbl->setString("+100");
71 bill->addChild(lbl);
72
73 auto r = RotateBy::create(10, Vec3(0.0f,360.0f,0.0f));
74 auto rp = RepeatForever::create(r);
75 root->runAction(rp);
76
77 auto jump = JumpBy::create(1, Vec2(0.0f, 0.0f), 30, 1);
78 auto scale = ScaleBy::create(2.f, 2.f, 2.f, 0.1f);
79 auto seq = Sequence::create(jump,scale, NULL);
80
81 auto rot = RotateBy::create(2, Vec3(-90.0f, 0.0f, 0.0f));
82 auto act = Spawn::create(seq, rot,NULL);
83
84 auto scale2 = scale->reverse();
85 auto rot2 = rot->reverse();
86 auto act2 = Spawn::create(scale2, rot2, NULL);
87
88 auto seq2 = Sequence::create(act, act2, NULL);
89 auto repeat = RepeatForever::create(seq2);
90 model->runAction(repeat);
91}
92
94{
95
96}
97
99{
100 return "Rotation Test";
101}
102
104{
105 return "All the sprites should still facing camera";
106}
107
108//------------------------------------------------------------------
109//
110// Billboard Rendering Test
111//
112//------------------------------------------------------------------
114: _camera(nullptr)
115{
116 //Create touch listener
117 auto listener = EventListenerTouchAllAtOnce::create();
118 listener->onTouchesMoved = CC_CALLBACK_2(BillBoardTest::onTouchesMoved, this);
119 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
120
121 auto layer3D=Layer::create();
122 addChild(layer3D,0);
123 _layerBillBoard = layer3D;
124 auto s = Director::getInstance()->getWinSize();
125 if (_camera == nullptr)
126 {
127 _camera=Camera::createPerspective(60, (float)s.width/s.height, 1, 500);
128 _camera->setCameraFlag(CameraFlag::USER1);
129 _layerBillBoard->addChild(_camera);
130 }
131
132 //Create rotating billboards
133 std::string imgs[3] = {"Images/Icon.png", "Images/r2.png"};
134 for (unsigned int i = 0; i < 4; ++i)
135 {
136 Layer *layer = Layer::create();
137 auto billboard = BillBoard::create(imgs[(unsigned int)(CCRANDOM_0_1() * 1 + 0.5f)]);
138 billboard->setScale(0.5f);
139 billboard->setPosition3D(Vec3(0.0f, 0.0f, CCRANDOM_MINUS1_1() * 150.0f));
140 billboard->setOpacity(static_cast<uint8_t>(CCRANDOM_0_1() * 128 + 128));
141 _billboards.push_back(billboard);
142 layer->addChild(billboard);
143 _layerBillBoard->addChild(layer);
144 layer->runAction( RepeatForever::create( RotateBy::create( CCRANDOM_0_1() * 10, Vec3(0.0f, 45.0f, 0.0f) ) ) );
145 }
146
147 {
148 auto billboard = BillBoard::create("Images/Icon.png");
149 billboard->setScale(0.2f);
150 billboard->setPosition3D(Vec3(0.0f, 30.0f, 0.0f));
151
152 auto billboard2 = BillBoard::create("Images/r2.png");
153 billboard2->setPosition3D(Vec3(0.0f, 0.0f, 100.0f));
154 billboard->addChild(billboard2);
155 _billboards.push_back(billboard);
156 _billboards.push_back(billboard2);
157
158 auto sprite3d = Sprite3D::create("Sprite3DTest/orc.c3t");
159 sprite3d->setScale(2.0f);
160 sprite3d->addChild(billboard);
161 sprite3d->runAction( RepeatForever::create( RotateBy::create( 10.0f, Vec3(0.0f, 360.0f, 0.0f) ) ) );
162 _layerBillBoard->addChild(sprite3d);
163 }
164
165 addNewBillBoardWithCoords(Vec3(20.0f,5.0f,0.0f));
166 addNewBillBoardWithCoords(Vec3(60.0f,5.0f,0.0f));
167 addNewBillBoardWithCoords(Vec3(100.0f,5.0f,0.0f));
168 addNewBillBoardWithCoords(Vec3(140.0f,5.0f,0.0f));
169 addNewBillBoardWithCoords(Vec3(180.0f,5.0f,0.0f));
170
171 addNewAniBillBoardWithCoords(Vec3(-20.0f,0.0f,0.0f));
172 addNewAniBillBoardWithCoords(Vec3(-60.0f,0.0f,0.0f));
173 addNewAniBillBoardWithCoords(Vec3(-100.0f,0.0f,0.0f));
174 addNewAniBillBoardWithCoords(Vec3(-140.0f,0.0f,0.0f));
175 addNewAniBillBoardWithCoords(Vec3(-180.0f,0.0f,0.0f));
176
177 _camera->setPosition3D(Vec3(0.0f, 100.0f, 230.0f));
178 _camera->lookAt(Vec3(0,0,0), Vec3(0.0f,1.0f,0.0f));
179
180 TTFConfig ttfConfig("fonts/arial.ttf", 16);
181 auto label1 = Label::createWithTTF(ttfConfig,"rotate+");
182 auto menuItem1 = MenuItemLabel::create(label1, CC_CALLBACK_1(BillBoardTest::rotateCameraCallback,this,10));
183 auto label2 = Label::createWithTTF(ttfConfig,"rotate-");
184 auto menuItem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(BillBoardTest::rotateCameraCallback,this,-10));
185 auto menu = Menu::create(menuItem1, menuItem2, nullptr);
186 menu->setPosition(Vec2::ZERO);
187 menuItem1->setPosition( Vec2( s.width-80, VisibleRect::top().y-160) );
188 menuItem2->setPosition( Vec2( s.width-80, VisibleRect::top().y-190) );
189 addChild(menu, 0);
190 _layerBillBoard->setCameraMask(2);
191
192 label1 = Label::createWithTTF(ttfConfig,"Point Oriented");
193 menuItem1 = MenuItemLabel::create(label1,CC_CALLBACK_1(BillBoardTest::menuCallback_orientedPoint,this) );
194 label2 = Label::createWithTTF(ttfConfig,"Plane Oriented");
195 menuItem2 = MenuItemLabel::create(label2,CC_CALLBACK_1(BillBoardTest::menuCallback_orientedPlane,this) );
196 menuItem1->setPosition( Vec2( s.width-80, VisibleRect::top().y-100) );
197 menuItem2->setPosition( Vec2( s.width-80, VisibleRect::top().y-130) );
198
199 menu = Menu::create(menuItem1, menuItem2, nullptr);
200 menu->setPosition(Vec2(0,0));
201 this->addChild(menu, 10);
203
204 schedule(CC_SCHEDULE_SELECTOR(BillBoardTest::update));
205}
206
208{
209 for (auto& billboard : _billboards) {
210 billboard->setMode(BillBoard::Mode::VIEW_POINT_ORIENTED);
211 }
212}
213
215{
216 for (auto& billboard : _billboards) {
217 billboard->setMode(BillBoard::Mode::VIEW_PLANE_ORIENTED);
218 }
219}
220
222{
223 if (_camera)
224 {
225 _camera = nullptr;
226 }
227}
228std::string BillBoardTest::title() const
229{
230 return "BillBoard Test";
231}
232std::string BillBoardTest::subtitle() const
233{
234 return "";
235}
237{
238 std::string imgs[3] = {"Images/Icon.png", "Images/r2.png"};
239 for (unsigned int i = 0; i < 10; ++i)
240 {
241 auto billboard = BillBoard::create(imgs[(unsigned int)(CCRANDOM_0_1() * 1 + 0.5f)]);
242 billboard->setScale(0.5f);
243 billboard->setPosition3D(Vec3(p.x, p.y, -150.0f + 30 * i));
244 billboard->setOpacity(static_cast<uint8_t>(CCRANDOM_0_1() * 128 + 128));
245
246 _layerBillBoard->addChild(billboard);
247 _billboards.push_back(billboard);
248 }
249}
251{
252 for (unsigned int i = 0; i < 10; ++i)
253 {
254 auto billboardAni = BillBoard::create("Images/grossini.png");
255 billboardAni->setScale(0.5f);
256 billboardAni->setPosition3D(Vec3(p.x, p.y, -150.0f + 30 * i));
257 _layerBillBoard->addChild(billboardAni);
258
259 auto animation = Animation::create();
260 for( int i=1;i<15;i++)
261 {
262 char szName1[100] = {0};
263 sprintf(szName1, "Images/grossini_dance_%02d.png", i);
264 animation->addSpriteFrameWithFile(szName1);
265 }
266 // should last 2.8 seconds. And there are 14 frames.
267 animation->setDelayPerUnit(2.8f / 14.0f);
268 animation->setRestoreOriginalFrame(true);
269
270 auto action = Animate::create(animation);
271 billboardAni->runAction(RepeatForever::create(action));
272 billboardAni->setOpacity(static_cast<uint8_t>(CCRANDOM_0_1() * 128 + 128));
273 _billboards.push_back(billboardAni);
274 }
275}
277{
278}
279
280void BillBoardTest::onTouchesMoved(const std::vector<Touch*>& touches, Event* event)
281{
282 if(touches.size()==1)
283 {
284 auto touch = touches[0];
285 auto location = touch->getLocation();
286 auto PreviousLocation = touch->getPreviousLocation();
287 Point newPos = PreviousLocation - location;
288
289 Vec3 cameraDir;
290 Vec3 cameraRightDir;
291 _camera->getNodeToWorldTransform().getForwardVector(&cameraDir);
292 cameraDir.normalize();
293 cameraDir.y=0;
294 _camera->getNodeToWorldTransform().getRightVector(&cameraRightDir);
295 cameraRightDir.normalize();
296 cameraRightDir.y=0;
297 Vec3 cameraPos= _camera->getPosition3D();
298 cameraPos+=cameraDir*newPos.y*0.5;
299 cameraPos+=cameraRightDir*newPos.x*0.5;
300 _camera->setPosition3D(cameraPos);
301 }
302}
303
304void BillBoardTest::rotateCameraCallback(Ref* sender,float value)
305{
306 Vec3 rotation3D= _camera->getRotation3D();
307 rotation3D.y+= value;
308 _camera->setRotation3D(rotation3D);
309}
#define ADD_TEST_CASE(__className__)
Definition: BaseTest.h:211
USING_NS_CC_EXT
USING_NS_CC
virtual std::string subtitle() const override
virtual ~BillBoardRotationTest()
virtual std::string title() const override
virtual void update(float dt) override
void menuCallback_orientedPlane(cocos2d::Ref *sender)
virtual ~BillBoardTest()
cocos2d::Camera * _camera
Definition: BillBoardTest.h:67
cocos2d::Layer * _layerBillBoard
Definition: BillBoardTest.h:68
virtual std::string subtitle() const override
void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
virtual std::string title() const override
void addNewBillBoardWithCoords(cocos2d::Vec3 p)
std::vector< cocos2d::BillBoard * > _billboards
Definition: BillBoardTest.h:70
void addNewAniBillBoardWithCoords(cocos2d::Vec3 p)
void menuCallback_orientedPoint(cocos2d::Ref *sender)
void rotateCameraCallback(cocos2d::Ref *sender, float value)
static cocos2d::Vec2 top()
Definition: VisibleRect.cpp:57