PuzzleSDK
SpriteTest.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 "SpriteTest.h"
28
29#include <cmath>
30#include <algorithm>
31
32#include "../testResource.h"
33#include "editor-support/cocostudio/CocosStudioExtension.h"
34
36
37enum
38{
45};
46
47enum
48{
57};
58
59SpriteTests::SpriteTests()
60{
93// ADD_TEST_CASE(SpriteZVertex); // TODO shouldn't call OpenGL API directly
94// ADD_TEST_CASE(SpriteBatchNodeZVertex);
140};
141
142//------------------------------------------------------------------
143//
144// Sprite1
145//
146//------------------------------------------------------------------
147
149{
150 auto listener = EventListenerTouchAllAtOnce::create();
151 listener->onTouchesEnded = CC_CALLBACK_2(Sprite1::onTouchesEnded, this);
152 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
153
154 auto s = Director::getInstance()->getWinSize();
155 addNewSpriteWithCoords( Vec2(s.width/2, s.height/2) );
156}
157
159{
160 int idx = (int)(CCRANDOM_0_1() * 1400.0f / 100.0f);
161 int x = (idx%5) * 85;
162 int y = (idx/5) * 121;
163
164
165 auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(x,y,85,121) );
166 addChild( sprite );
167
168 sprite->setPosition( Vec2( p.x, p.y) );
169
170 ActionInterval* action;
171 float random = CCRANDOM_0_1();
172
173 if( random < 0.20 )
174 action = ScaleBy::create(3, 2);
175 else if(random < 0.40)
176 action = RotateBy::create(3, 360);
177 else if( random < 0.60)
178 action = Blink::create(1, 3);
179 else if( random < 0.8 )
180 action = TintBy::create(2, 0, -255, -255);
181 else
182 action = FadeOut::create(2);
183 auto action_back = action->reverse();
184 auto seq = Sequence::create( action, action_back, nullptr );
185
186 sprite->runAction( RepeatForever::create(seq) );
187}
188
189void Sprite1::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
190{
191 for (auto touch: touches)
192 {
193 auto location = touch->getLocation();
194
195 addNewSpriteWithCoords( location );
196 }
197}
198
199std::string Sprite1::title() const
200{
201 return "Testing Sprite";
202}
203
204std::string Sprite1::subtitle() const
205{
206 return "Tap screen to add more sprites";
207}
208
209//------------------------------------------------------------------
210//
211// Sprite1ETC1Alpha
212//
213//------------------------------------------------------------------
214
216{
217 auto listener = EventListenerTouchAllAtOnce::create();
218 listener->onTouchesEnded = CC_CALLBACK_2(Sprite1ETC1Alpha::onTouchesEnded, this);
219 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
220}
221
223{
224 if (!SpriteTestDemo::init())
225 return false;
226
227 _background = Sprite::create("Images/background2.png");
228 auto s = Director::getInstance()->getWinSize();
229 _background->setPosition(Vec2(s.width / 2, s.height / 2));
230 this->addChild(_background);
231
232 addNewSpriteWithCoords(Vec2(s.width / 2, s.height / 2));
233 return true;
234}
235
237{
238 auto sprite = Sprite::create("Images/grossini_dance_08.png");
239 Texture2D *etcTexture = _director->getTextureCache()->addImage("Images/etc1-alpha.pkm");
240 sprite->setTexture(etcTexture);
241
242 _background->addChild(sprite);
243
244 sprite->setPosition(Vec2(p.x, p.y));
245
246 ActionInterval* action;
247 float random = CCRANDOM_0_1();
248
249 if (random < 0.20)
250 action = ScaleBy::create(3, 2);
251 else if (random < 0.40)
252 action = RotateBy::create(3, 360);
253 else if (random < 0.60)
254 action = Blink::create(1, 3);
255 else if (random < 0.8)
256 action = TintBy::create(2, 0, -255, -255);
257 else
258 action = FadeOut::create(2);
259 auto action_back = action->reverse();
260 auto seq = Sequence::create(action, action_back, nullptr);
261
262 sprite->runAction(RepeatForever::create(seq));
263}
264
265void Sprite1ETC1Alpha::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
266{
267 for (auto touch : touches)
268 {
269 auto location = touch->getLocation();
270
271 addNewSpriteWithCoords(location);
272 }
273}
274
275std::string Sprite1ETC1Alpha::title() const
276{
277 return "Testing Sprite ETC1 Alpha support";
278}
279
280std::string Sprite1ETC1Alpha::subtitle() const
281{
282 return "Tap screen to add more sprites";
283}
284
285//------------------------------------------------------------------
286//
287// SpriteBatchNode1
288//
289//------------------------------------------------------------------
290
292{
293 auto listener = EventListenerTouchAllAtOnce::create();
294 listener->onTouchesEnded = CC_CALLBACK_2(SpriteBatchNode1::onTouchesEnded, this);
295 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
296
297 auto BatchNode = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 50);
298 addChild(BatchNode, 0, kTagSpriteBatchNode);
299
300 auto s = Director::getInstance()->getWinSize();
301 addNewSpriteWithCoords( Vec2(s.width/2, s.height/2) );
302}
303
305{
306 auto BatchNode = static_cast<SpriteBatchNode*>( getChildByTag(kTagSpriteBatchNode) );
307
308 int idx = CCRANDOM_0_1() * 1400 / 100;
309 int x = (idx%5) * 85;
310 int y = (idx/5) * 121;
311
312
313 auto sprite = Sprite::createWithTexture(BatchNode->getTexture(), Rect(x,y,85,121));
314 BatchNode->addChild(sprite);
315
316 sprite->setPosition( Vec2( p.x, p.y) );
317
318 ActionInterval* action;
319 float random = CCRANDOM_0_1();
320
321 if( random < 0.20 )
322 action = ScaleBy::create(3, 2);
323 else if(random < 0.40)
324 action = RotateBy::create(3, 360);
325 else if( random < 0.60)
326 action = Blink::create(1, 3);
327 else if( random < 0.8 )
328 action = TintBy::create(2, 0, -255, -255);
329 else
330 action = FadeOut::create(2);
331
332 auto action_back = action->reverse();
333 auto seq = Sequence::create(action, action_back, nullptr);
334
335 sprite->runAction( RepeatForever::create(seq));
336}
337
338void SpriteBatchNode1::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
339{
340 for (auto &touch: touches)
341 {
342 auto location = touch->getLocation();
343
344 addNewSpriteWithCoords( location );
345 }
346
347}
348
349std::string SpriteBatchNode1::title() const
350{
351 return "Testing SpriteBatchNode";
352}
353
354std::string SpriteBatchNode1::subtitle() const
355{
356 return "SpriteBatchNode: Tap screen to add more sprites";
357}
358
359
360//------------------------------------------------------------------
361//
362// SpriteColorOpacity
363//
364//------------------------------------------------------------------
365
367{
368 auto sprite1 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*0, 121*1, 85, 121));
369 auto sprite2 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*1, 85, 121));
370 auto sprite3 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*2, 121*1, 85, 121));
371 auto sprite4 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*3, 121*1, 85, 121));
372
373 auto sprite5 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*0, 121*1, 85, 121));
374 auto sprite6 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*1, 85, 121));
375 auto sprite7 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*2, 121*1, 85, 121));
376 auto sprite8 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*3, 121*1, 85, 121));
377
378 auto s = Director::getInstance()->getWinSize();
379 sprite1->setPosition( Vec2( (s.width/5)*1, (s.height/3)*1) );
380 sprite2->setPosition( Vec2( (s.width/5)*2, (s.height/3)*1) );
381 sprite3->setPosition( Vec2( (s.width/5)*3, (s.height/3)*1) );
382 sprite4->setPosition( Vec2( (s.width/5)*4, (s.height/3)*1) );
383 sprite5->setPosition( Vec2( (s.width/5)*1, (s.height/3)*2) );
384 sprite6->setPosition( Vec2( (s.width/5)*2, (s.height/3)*2) );
385 sprite7->setPosition( Vec2( (s.width/5)*3, (s.height/3)*2) );
386 sprite8->setPosition( Vec2( (s.width/5)*4, (s.height/3)*2) );
387
388 auto action = FadeIn::create(2);
389 auto action_back = action->reverse();
390 auto fade = RepeatForever::create( Sequence::create( action, action_back, nullptr) );
391
392 auto tintred = TintBy::create(2, 0, -255, -255);
393 auto tintred_back = tintred->reverse();
394 auto red = RepeatForever::create( Sequence::create( tintred, tintred_back, nullptr) );
395
396 auto tintgreen = TintBy::create(2, -255, 0, -255);
397 auto tintgreen_back = tintgreen->reverse();
398 auto green = RepeatForever::create( Sequence::create( tintgreen, tintgreen_back, nullptr) );
399
400 auto tintblue = TintBy::create(2, -255, -255, 0);
401 auto tintblue_back = tintblue->reverse();
402 auto blue = RepeatForever::create( Sequence::create( tintblue, tintblue_back, nullptr) );
403
404 sprite5->runAction(red);
405 sprite6->runAction(green);
406 sprite7->runAction(blue);
407 sprite8->runAction(fade);
408
409 // late add: test dirtyColor and dirtyPosition
410 addChild(sprite1, 0, kTagSprite1);
411 addChild(sprite2, 0, kTagSprite2);
412 addChild(sprite3, 0, kTagSprite3);
413 addChild(sprite4, 0, kTagSprite4);
414 addChild(sprite5, 0, kTagSprite5);
415 addChild(sprite6, 0, kTagSprite6);
416 addChild(sprite7, 0, kTagSprite7);
417 addChild(sprite8, 0, kTagSprite8);
418
419 schedule( CC_CALLBACK_1(SpriteColorOpacity::removeAndAddSprite, this), 2, "remove_add_key" );
420}
421
422// this function test if remove and add works as expected:
423// color array and vertex array should be reindexed
425{
426 auto sprite = static_cast<Sprite*>( getChildByTag(kTagSprite5) );
427 sprite->retain();
428
429 removeChild(sprite, false);
430 addChild(sprite, 0, kTagSprite5);
431
432 sprite->release();
433}
434
435std::string SpriteColorOpacity::title() const
436{
437 return "Testing Sprite";
438}
439
441{
442 return "Color & Opacity";
443}
444
445//------------------------------------------------------------------
446//
447// SpriteBatchNodeColorOpacity
448//
449//------------------------------------------------------------------
450
452{
453 // small capacity. Testing resizing.
454 // Don't use capacity=1 in your real game. It is expensive to resize the capacity
455 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 1);
456 addChild(batch, 0, kTagSpriteBatchNode);
457
458 auto sprite1 = Sprite::createWithTexture(batch->getTexture(), Rect(85*0, 121*1, 85, 121));
459 auto sprite2 = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*1, 85, 121));
460 auto sprite3 = Sprite::createWithTexture(batch->getTexture(), Rect(85*2, 121*1, 85, 121));
461 auto sprite4 = Sprite::createWithTexture(batch->getTexture(), Rect(85*3, 121*1, 85, 121));
462
463 auto sprite5 = Sprite::createWithTexture(batch->getTexture(), Rect(85*0, 121*1, 85, 121));
464 auto sprite6 = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*1, 85, 121));
465 auto sprite7 = Sprite::createWithTexture(batch->getTexture(), Rect(85*2, 121*1, 85, 121));
466 auto sprite8 = Sprite::createWithTexture(batch->getTexture(), Rect(85*3, 121*1, 85, 121));
467
468
469 auto s = Director::getInstance()->getWinSize();
470 sprite1->setPosition( Vec2( (s.width/5)*1, (s.height/3)*1) );
471 sprite2->setPosition( Vec2( (s.width/5)*2, (s.height/3)*1) );
472 sprite3->setPosition( Vec2( (s.width/5)*3, (s.height/3)*1) );
473 sprite4->setPosition( Vec2( (s.width/5)*4, (s.height/3)*1) );
474 sprite5->setPosition( Vec2( (s.width/5)*1, (s.height/3)*2) );
475 sprite6->setPosition( Vec2( (s.width/5)*2, (s.height/3)*2) );
476 sprite7->setPosition( Vec2( (s.width/5)*3, (s.height/3)*2) );
477 sprite8->setPosition( Vec2( (s.width/5)*4, (s.height/3)*2) );
478
479 auto action = FadeIn::create(2);
480 auto action_back = action->reverse();
481 auto fade = RepeatForever::create( Sequence::create( action, action_back,nullptr) );
482
483 auto tintred = TintBy::create(2, 0, -255, -255);
484 auto tintred_back = tintred->reverse();
485 auto red = RepeatForever::create( Sequence::create( tintred, tintred_back,nullptr) );
486
487 auto tintgreen = TintBy::create(2, -255, 0, -255);
488 auto tintgreen_back = tintgreen->reverse();
489 auto green = RepeatForever::create( Sequence::create( tintgreen, tintgreen_back,nullptr) );
490
491 auto tintblue = TintBy::create(2, -255, -255, 0);
492 auto tintblue_back = tintblue->reverse();
493 auto blue = RepeatForever::create( Sequence::create( tintblue, tintblue_back,nullptr) );
494
495
496 sprite5->runAction(red);
497 sprite6->runAction(green);
498 sprite7->runAction(blue);
499 sprite8->runAction(fade);
500
501 // late add: test dirtyColor and dirtyPosition
502 batch->addChild(sprite1, 0, kTagSprite1);
503 batch->addChild(sprite2, 0, kTagSprite2);
504 batch->addChild(sprite3, 0, kTagSprite3);
505 batch->addChild(sprite4, 0, kTagSprite4);
506 batch->addChild(sprite5, 0, kTagSprite5);
507 batch->addChild(sprite6, 0, kTagSprite6);
508 batch->addChild(sprite7, 0, kTagSprite7);
509 batch->addChild(sprite8, 0, kTagSprite8);
510
511
512 schedule( CC_CALLBACK_1(SpriteBatchNodeColorOpacity::removeAndAddSprite, this), 2, "remove_add_key");
513}
514
515// this function test if remove and add works as expected:
516// color array and vertex array should be reindexed
518{
519 auto batch= static_cast<SpriteBatchNode*>( getChildByTag(kTagSpriteBatchNode) );
520 auto sprite = static_cast<Sprite*>( batch->getChildByTag(kTagSprite5) );
521
522 sprite->retain();
523
524 batch->removeChild(sprite, false);
525 batch->addChild(sprite, 0, kTagSprite5);
526
527 sprite->release();
528}
529
531{
532 return "Testing SpriteBatchNode";
533}
534
536{
537 return "Color & Opacity";
538}
539
540
541//------------------------------------------------------------------
542//
543// SpriteZOrder
544//
545//------------------------------------------------------------------
546
548{
549 _dir = 1;
550
551 auto s = Director::getInstance()->getWinSize();
552
553 float step = s.width/11;
554 for(int i=0;i<5;i++)
555 {
556 auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*0, 121*1, 85, 121));
557 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
558 addChild(sprite, i);
559 }
560
561 for(int i=5;i<10;i++)
562 {
563 auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*0, 85, 121));
564 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
565 addChild(sprite, 14-i);
566 }
567
568 auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*3, 121*0, 85, 121));
569 addChild(sprite, -1, kTagSprite1);
570 sprite->setPosition( Vec2(s.width/2, s.height/2 - 20) );
571 sprite->setScaleX( 6 );
572 sprite->setColor(Color3B::RED);
573
574 schedule( CC_CALLBACK_1(SpriteZOrder::reorderSprite, this), 1, "reorder_key");
575}
576
578{
579 auto sprite = static_cast<Sprite*>( getChildByTag(kTagSprite1) );
580
581 int z = sprite->getLocalZOrder();
582
583 if( z < -1 )
584 _dir = 1;
585 if( z > 10 )
586 _dir = -1;
587
588 z += _dir * 3;
589
590 reorderChild(sprite, z);
591
592}
593
594std::string SpriteZOrder::title() const
595{
596 return "Testing Sprite";
597}
598
599std::string SpriteZOrder::subtitle() const
600{
601 return "Z order";
602}
603
604//------------------------------------------------------------------
605//
606// SpriteBatchNodeZOrder
607//
608//------------------------------------------------------------------
609
611{
612 _dir = 1;
613
614 // small capacity. Testing resizing.
615 // Don't use capacity=1 in your real game. It is expensive to resize the capacity
616 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 1);
617 addChild(batch, 0, kTagSpriteBatchNode);
618
619 auto s = Director::getInstance()->getWinSize();
620
621 float step = s.width/11;
622 for(int i=0;i<5;i++)
623 {
624 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(85*0, 121*1, 85, 121));
625 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
626 batch->addChild(sprite, i);
627 }
628
629 for(int i=5;i<10;i++)
630 {
631 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*0, 85, 121));
632 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
633 batch->addChild(sprite, 14-i);
634 }
635
636 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(85*3, 121*0, 85, 121));
637 batch->addChild(sprite, -1, kTagSprite1);
638 sprite->setPosition( Vec2(s.width/2, s.height/2 - 20) );
639 sprite->setScaleX( 6 );
640 sprite->setColor(Color3B::RED);
641
642 schedule( CC_CALLBACK_1(SpriteBatchNodeZOrder::reorderSprite, this), 1, "reorder_key");
643}
644
646{
647 auto batch= static_cast<SpriteBatchNode*>( getChildByTag( kTagSpriteBatchNode ));
648 auto sprite = static_cast<Sprite*>(batch->getChildByTag(kTagSprite1));
649
650 int z = sprite->getLocalZOrder();
651
652 if( z < -1 )
653 _dir = 1;
654 if( z > 10 )
655 _dir = -1;
656
657 z += _dir * 3;
658
659 batch->reorderChild(sprite, z);
660}
661
663{
664 return "Testing SpriteBatchNode";
665}
666
668{
669 return "Z order";
670}
671
672
673//------------------------------------------------------------------
674//
675// SpriteBatchNodeReorder
676//
677//------------------------------------------------------------------
678
680{
681 Vector<Sprite*> a;
682 auto asmtest = SpriteBatchNode::create("animations/ghosts.png");
683
684 for(int i=0; i<10; i++)
685 {
686 auto s1 = Sprite::createWithTexture(asmtest->getTexture(), Rect(0.0f, 0.0f, 50.0f, 50.0f));
687 a.pushBack(s1);
688 asmtest->addChild(s1, 10);
689 }
690
691 for(int i=0; i<10; i++)
692 {
693 if(i!=5)
694 {
695 asmtest->reorderChild( static_cast<Node*>(a.at(i)), 9 );
696 }
697 }
698
699 ssize_t CC_UNUSED prev = -1;
700
701 auto& children = asmtest->getChildren();
702
703 for(const auto &obj : children) {
704 auto child = static_cast<Sprite*>(obj);
705
706 ssize_t currentIndex = child->getAtlasIndex();
707 CCASSERT( prev == currentIndex-1, "Child order failed");
709 prev = currentIndex;
710 }
711
712 prev = -1;
713 auto& descendants = asmtest->getDescendants();
714 for(const auto &sprite : descendants) {
715 ssize_t currentIndex = sprite->getAtlasIndex();
716 CCASSERT( prev == currentIndex-1, "Child order failed");
718 prev = currentIndex;
719 }
720}
721
723{
724 return "Testing SpriteBatchNode";
725}
726
728{
729 return "reorder #1. Should not crash";
730}
731
732//------------------------------------------------------------------
733//
734// SpriteBatchNodeReorderIssue744
735//
736//------------------------------------------------------------------
737
739{
740 auto s = Director::getInstance()->getWinSize();
741
742
743 // Testing issue #744
744 // http://code.google.com/p/cocos2d-iphone/issues/detail?id=744
745 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 15);
746 addChild(batch, 0, kTagSpriteBatchNode);
747
748 auto sprite = Sprite::createWithTexture(batch->getTexture(),Rect(0, 0, 85, 121));
749 sprite->setPosition( Vec2(s.width/2, s.height/2) );
750 batch->addChild(sprite, 3);
751 batch->reorderChild(sprite, 1);
752}
753
755{
756 return "Testing SpriteBatchNode";
757}
758
760{
761 return "reorder issue #744. Should not crash";
762}
763
764//------------------------------------------------------------------
765//
766// SpriteBatchNodeReorderIssue766
767//
768//------------------------------------------------------------------
769
771{
772 Rect rcw(128,0,64,64);
773 rcw = CC_RECT_PIXELS_TO_POINTS(rcw);
774 auto sprite = Sprite::createWithTexture(batchNode->getTexture(), rcw);
775 sprite->setScale(CC_CONTENT_SCALE_FACTOR());
776 batchNode->addChild(sprite, aZ+1, 0);
777
778 //children
779 Rect rc1(0,0,64,64);
780 rc1 = CC_RECT_PIXELS_TO_POINTS(rc1);
781 auto spriteShadow = Sprite::createWithTexture(batchNode->getTexture(), rc1);
782 spriteShadow->setOpacity(128);
783 sprite->setScale(CC_CONTENT_SCALE_FACTOR());
784 sprite->addChild(spriteShadow, aZ, 3);
785
786 Rect rc2(64,0,64,64);
787 rc2 = CC_RECT_PIXELS_TO_POINTS(rc2);
788 auto spriteTop = Sprite::createWithTexture(batchNode->getTexture(), rc2);
789 sprite->setScale(CC_CONTENT_SCALE_FACTOR());
790 sprite->addChild(spriteTop, aZ+2, 3);
791
792 return sprite;
793}
794
796{
797 unschedule("issue_766_key");
798
799 batchNode->reorderChild(sprite1, 4);
800}
801
802// on "init" you need to initialize your instance
804{
805 batchNode = SpriteBatchNode::create("Images/piece.png", 15);
806 addChild(batchNode, 1, 0);
807
808 sprite1 = makeSpriteZ(2);
809 sprite1->setPosition(Vec2(200.0f,160.0f));
810
811 sprite2 = makeSpriteZ(3);
812 sprite2->setPosition(Vec2(264.0f,160.0f));
813
814 sprite3 = makeSpriteZ(4);
815 sprite3->setPosition(Vec2(328.0f,160.0f));
816
817 schedule(CC_CALLBACK_1(SpriteBatchNodeReorderIssue766::reorderSprite, this), 2, "issue_766_key");
818}
819
821{
822 return "Testing SpriteBatchNode";
823}
824
826{
827 return "reorder issue #766. In 2 seconds 1 sprite will be reordered";
828}
829
830//------------------------------------------------------------------
831//
832// SpriteBatchNodeReorderIssue767
833//
834//------------------------------------------------------------------
836{
837 auto s = Director::getInstance()->getWinSize();
838
839 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist", "animations/ghosts.png");
840 Node *aParent;
841 Sprite *l1, *l2a, *l2b, *l3a1, *l3a2, *l3b1, *l3b2;
842
843 //
844 // SpriteBatchNode: 3 levels of children
845 //
846 aParent = SpriteBatchNode::create("animations/ghosts.png");
847 addChild(aParent, 0, kTagSprite1);
848
849 // parent
850 l1 = Sprite::createWithSpriteFrameName("father.gif");
851 l1->setPosition(Vec2( s.width/2, s.height/2));
852 aParent->addChild(l1, 0, kTagSprite2);
853 auto l1Size = l1->getContentSize();
854
855 // child left
856 l2a = Sprite::createWithSpriteFrameName("sister1.gif");
857 l2a->setPosition(Vec2( -25 + l1Size.width/2, 0 + l1Size.height/2));
858 l1->addChild(l2a, -1, kTagSpriteLeft);
859 auto l2aSize = l2a->getContentSize();
860
861
862 // child right
863 l2b = Sprite::createWithSpriteFrameName("sister2.gif");
864 l2b->setPosition(Vec2( +25 + l1Size.width/2, 0 + l1Size.height/2));
865 l1->addChild(l2b, 1, kTagSpriteRight);
866 auto l2bSize = l2a->getContentSize();
867
868
869 // child left bottom
870 l3a1 = Sprite::createWithSpriteFrameName("child1.gif");
871 l3a1->setScale(0.65f);
872 l3a1->setPosition(Vec2(0+l2aSize.width/2,-50+l2aSize.height/2));
873 l2a->addChild(l3a1, -1);
874
875 // child left top
876 l3a2 = Sprite::createWithSpriteFrameName("child1.gif");
877 l3a2->setScale(0.65f);
878 l3a2->setPosition(Vec2(0+l2aSize.width/2,+50+l2aSize.height/2));
879 l2a->addChild(l3a2, 1);
880
881 // child right bottom
882 l3b1 = Sprite::createWithSpriteFrameName("child1.gif");
883 l3b1->setScale(0.65f);
884 l3b1->setPosition(Vec2(0+l2bSize.width/2,-50+l2bSize.height/2));
885 l2b->addChild(l3b1, -1);
886
887 // child right top
888 l3b2 = Sprite::createWithSpriteFrameName("child1.gif");
889 l3b2->setScale(0.65f);
890 l3b2->setPosition(Vec2(0+l2bSize.width/2,+50+l2bSize.height/2));
891 l2b->addChild(l3b2, 1);
892
893 schedule(CC_CALLBACK_1(SpriteBatchNodeReorderIssue767::reorderSprites, this), 1, "issue_767_key");
894}
895
897{
898 return "Testing SpriteBatchNode";
899}
900
902{
903 return "reorder issue #767. Should not crash";
904}
905
907{
908 auto spritebatch = static_cast<SpriteBatchNode*>( getChildByTag(kTagSprite1) );
909 auto father = static_cast<Sprite*>( spritebatch->getChildByTag(kTagSprite2) );
910 auto left = static_cast<Sprite*>( father->getChildByTag(kTagSpriteLeft) );
911 auto right = static_cast<Sprite*>( father->getChildByTag(kTagSpriteRight) );
912
913 int newZLeft = 1;
914
915 if( left->getLocalZOrder() == 1 )
916 newZLeft = -1;
917
918 father->reorderChild(left, newZLeft);
919 father->reorderChild(right, -newZLeft);
920}
921
922//------------------------------------------------------------------
923//
924// SpriteZVertex
925//
926//------------------------------------------------------------------
927
929{
931
932 Director::getInstance()->setProjection(Director::Projection::_3D);
933}
934
936{
937 Director::getInstance()->setProjection(Director::Projection::DEFAULT);
938 SpriteTestDemo::onExit();
939}
940
942{
943 //
944 // This test tests z-order
945 // If you are going to use it is better to use a 3D projection
946 //
947 // WARNING:
948 // The developer is responsible for ordering its sprites according to its Z if the sprite has
949 // transparent parts.
950 //
951
952 //
953 // Configure shader to mimic glAlphaTest
954 //
955// auto alphaTestShader = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST);
956// GLint alphaValueLocation = glGetUniformLocation(alphaTestShader->getProgram(), GLProgram::UNIFORM_NAME_ALPHA_TEST_VALUE);
957//
958// // set alpha test value
959// // NOTE: alpha test shader is hard-coded to use the equivalent of a glAlphaFunc(GL_GREATER) comparison
960// if (getGLProgram())
961// {
962// getGLProgram()->setUniformLocationWith1f(alphaValueLocation, 0.0f);
963// }
964
965
966 _dir = 1;
967 _time = 0;
968
969 auto s = Director::getInstance()->getWinSize();
970 float step = s.width/12;
971
972 auto node = Node::create();
973 // camera uses the center of the image as the pivoting point
974 node->setContentSize( Size(s.width,s.height) );
975 node->setAnchorPoint( Vec2::ANCHOR_MIDDLE);
976 node->setPosition( Vec2(s.width/2, s.height/2));
977
978 addChild(node, 0);
979
980 for(int i=0;i<5;i++)
981 {
982 auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*0, 121*1, 85, 121));
983 sprite->setPosition( Vec2((i+1)*step, s.height/2) );
984 sprite->setPositionZ( 10 + i*40 );
985// sprite->setGLProgram(alphaTestShader);
986 node->addChild(sprite, 0);
987
988 }
989
990 for(int i=5;i<11;i++)
991 {
992 auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*0, 85, 121));
993 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
994 sprite->setPositionZ( 10 + (10-i)*40 );
995// sprite->setGLProgram(alphaTestShader);
996 node->addChild(sprite, 0);
997 }
998
999 node->runAction( OrbitCamera::create(10, 1, 0, 0, 360, 0, 0) );
1000}
1001
1002std::string SpriteZVertex::title() const
1003{
1004 return "Testing Sprite";
1005}
1006
1007std::string SpriteZVertex::subtitle() const
1008{
1009 return "openGL Z vertex";
1010}
1011
1012//------------------------------------------------------------------
1013//
1014// SpriteBatchNodeZVertex
1015//
1016//------------------------------------------------------------------
1017
1019{
1021
1022 Director::getInstance()->setProjection(Director::Projection::_3D);
1023}
1024
1026{
1027 Director::getInstance()->setProjection(Director::Projection::DEFAULT);
1028 SpriteTestDemo::onExit();
1029}
1030
1032{
1033 //
1034 // This test tests z-order
1035 // If you are going to use it is better to use a 3D projection
1036 //
1037 // WARNING:
1038 // The developer is responsible for ordering its sprites according to its Z if the sprite has
1039 // transparent parts.
1040 //
1041
1042 //
1043 // Configure shader to mimic glAlphaTest
1044 //
1045// auto alphaTestShader = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST);
1046// GLint alphaValueLocation = glGetUniformLocation(alphaTestShader->getProgram(), GLProgram::UNIFORM_NAME_ALPHA_TEST_VALUE);
1047
1048 // set alpha test value
1049 // NOTE: alpha test shader is hard-coded to use the equivalent of a glAlphaFunc(GL_GREATER) comparison
1050// if (getGLProgram())
1051// {
1052// getGLProgram()->setUniformLocationWith1f(alphaValueLocation, 0.0f);
1053// }
1054
1055 auto s = Director::getInstance()->getWinSize();
1056 float step = s.width/12;
1057
1058 // small capacity. Testing resizing.
1059 // Don't use capacity=1 in your real game. It is expensive to resize the capacity
1060 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 1);
1061 // camera uses the center of the image as the pivoting point
1062 batch->setContentSize( Size(s.width,s.height));
1063 batch->setAnchorPoint( Vec2::ANCHOR_MIDDLE);
1064 batch->setPosition( Vec2(s.width/2, s.height/2));
1065
1066// batch->setGLProgram(alphaTestShader);
1067 addChild(batch, 0, kTagSpriteBatchNode);
1068
1069 for(int i=0;i<5;i++)
1070 {
1071 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(85*0, 121*1, 85, 121));
1072 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
1073 sprite->setPositionZ( 10 + i*40 );
1074 batch->addChild(sprite, 0);
1075
1076 }
1077
1078 for(int i=5;i<11;i++) {
1079 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*0, 85, 121));
1080 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
1081 sprite->setPositionZ( 10 + (10-i)*40 );
1082 batch->addChild(sprite, 0);
1083 }
1084
1085 batch->runAction(OrbitCamera::create(10, 1, 0, 0, 360, 0, 0) );
1086}
1087
1089{
1090 return "Testing SpriteBatchNode";
1091}
1092
1094{
1095 return "openGL Z vertex";
1096}
1097
1098//------------------------------------------------------------------
1099//
1100// SpriteAnchorPoint
1101//
1102//------------------------------------------------------------------
1103
1105{
1106 auto s = Director::getInstance()->getWinSize();
1107
1108
1109 auto rotate = RotateBy::create(10, 360);
1110 auto action = RepeatForever::create(rotate);
1111
1112 for(int i=0;i<3;i++)
1113 {
1114 auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*i, 121*1, 85, 121) );
1115 sprite->setPosition( Vec2( s.width/4*(i+1), s.height/2) );
1116
1117 auto point = Sprite::create("Images/r1.png");
1118 point->setScale( 0.25f );
1119 point->setPosition( sprite->getPosition() );
1120 addChild(point, 10);
1121
1122 switch(i)
1123 {
1124 case 0:
1125 sprite->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
1126 break;
1127 case 1:
1128 sprite->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
1129 break;
1130 case 2:
1131 sprite->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
1132 break;
1133 }
1134
1135 point->setPosition( sprite->getPosition() );
1136
1137 sprite->runAction( action->clone() );
1138 addChild(sprite, i);
1139 }
1140}
1141
1142std::string SpriteAnchorPoint::title() const
1143{
1144 return "Testing Sprite";
1145}
1146
1148{
1149 return "anchor point";
1150}
1151
1152//------------------------------------------------------------------
1153//
1154// SpriteBatchNodeAnchorPoint
1155//
1156//------------------------------------------------------------------
1158{
1159 // small capacity. Testing resizing.
1160 // Don't use capacity=1 in your real game. It is expensive to resize the capacity
1161 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 1);
1162 addChild(batch, 0, kTagSpriteBatchNode);
1163
1164 auto s = Director::getInstance()->getWinSize();
1165
1166
1167 auto rotate = RotateBy::create(10, 360);
1168 auto action = RepeatForever::create(rotate);
1169 for(int i=0;i<3;i++)
1170 {
1171 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(85*i, 121*1, 85, 121));
1172 sprite->setPosition( Vec2( s.width/4*(i+1), s.height/2) );
1173
1174 auto point = Sprite::create("Images/r1.png");
1175 point->setScale( 0.25f );
1176 point->setPosition( sprite->getPosition() );
1177 addChild(point, 1);
1178
1179 switch(i)
1180 {
1181 case 0:
1182 sprite->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
1183 break;
1184 case 1:
1185 sprite->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
1186 break;
1187 case 2:
1188 sprite->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
1189 break;
1190 }
1191
1192 point->setPosition( sprite->getPosition() );
1193
1194 sprite->runAction( action->clone() );
1195 batch->addChild(sprite, i);
1196 }
1197}
1198
1200{
1201 return "Testing SpriteBatchNode";
1202}
1203
1205{
1206 return "anchor point";
1207}
1208
1209//------------------------------------------------------------------
1210//
1211// SpriteAnchorPointFromFile
1212//
1213//------------------------------------------------------------------
1214
1216{
1218 auto screen = Director::getInstance()->getWinSize();
1219
1220 auto rotate = RotateBy::create(10, 360);
1221 auto action = RepeatForever::create(rotate);
1222 char str[100] = {0};
1223
1224 auto cache = SpriteFrameCache::getInstance();
1225 cache->addSpriteFramesWithFile("animations/grossini_anchors.plist");
1226
1227 Sprite *sprite;
1228 for(int i=0;i<10;i++)
1229 {
1230 sprintf(str, "grossini_dance_%02d.png", i+1);
1231 sprite = Sprite::createWithSpriteFrameName(str);
1232
1233 sprite->setPosition(Vec2(screen.width/6*(i%5+1), screen.height*2/3 - screen.height*(i/5)/3));
1234
1235 auto point = Sprite::create("Images/r1.png");
1236 point->setScale( 0.1f );
1237 point->setPosition( sprite->getPosition() );
1238 addChild(point, 10);
1239
1240 sprite->runAction( action->clone() );
1241 addChild(sprite, i);
1242 }
1243
1244 Vector<SpriteFrame*> animFrames(5);
1245 for(int i = 9; i < 14; i++)
1246 {
1247 sprintf(str, "grossini_dance_%02d.png", i+1);
1248 animFrames.pushBack(cache->getSpriteFrameByName(str));
1249 }
1250 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
1251 sprite->runAction(RepeatForever::create(Animate::create(animation)));
1252
1253}
1254
1256{
1257 SpriteFrameCache::getInstance()->removeSpriteFramesFromFile("animations/grossini_anchors.plist");
1258 SpriteTestDemo::onExit();
1259}
1260
1262{
1263 return "Testing SpriteFrame";
1264}
1265
1267{
1268 return "anchor point";
1269}
1270
1271//------------------------------------------------------------------
1272//
1273// Sprite6
1274//
1275//------------------------------------------------------------------
1276
1278{
1279 // small capacity. Testing resizing
1280 // Don't use capacity=1 in your real game. It is expensive to resize the capacity
1281 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 1);
1282 addChild(batch, 0, kTagSpriteBatchNode);
1283 batch->setIgnoreAnchorPointForPosition( true );
1284
1285 auto s = Director::getInstance()->getWinSize();
1286
1287 batch->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
1288 batch->setContentSize( Size(s.width, s.height) );
1289
1290
1291 // SpriteBatchNode actions
1292 auto rotate = RotateBy::create(5, 360);
1293 auto action = RepeatForever::create(rotate);
1294
1295 // SpriteBatchNode actions
1296 auto rotate_back = rotate->reverse();
1297 auto rotate_seq = Sequence::create(rotate, rotate_back, nullptr);
1298 auto rotate_forever = RepeatForever::create(rotate_seq);
1299
1300 auto scale = ScaleBy::create(5, 1.5f);
1301 auto scale_back = scale->reverse();
1302 auto scale_seq = Sequence::create( scale, scale_back, nullptr);
1303 auto scale_forever = RepeatForever::create(scale_seq);
1304
1305 float step = s.width/4;
1306
1307 for(int i=0;i<3;i++)
1308 {
1309 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(85*i, 121*1, 85, 121));
1310 sprite->setPosition( Vec2( (i+1)*step, s.height/2) );
1311
1312 sprite->runAction( action->clone());
1313 batch->addChild(sprite, i);
1314 }
1315
1316 batch->runAction(scale_forever);
1317 batch->runAction(rotate_forever);
1318}
1319
1320std::string Sprite6::title() const
1321{
1322 return "SpriteBatchNode transformation";
1323}
1324
1325//------------------------------------------------------------------
1326//
1327// SpriteFlip
1328//
1329//------------------------------------------------------------------
1331{
1332 auto s = Director::getInstance()->getWinSize();
1333
1334 auto sprite1 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*1, 85, 121));
1335 sprite1->setPosition( Vec2( s.width/2 - 100, s.height/2 ) );
1336 addChild(sprite1, 0, kTagSprite1);
1337
1338 auto sprite2 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*1, 85, 121));
1339 sprite2->setPosition( Vec2( s.width/2 + 100, s.height/2 ) );
1340 addChild(sprite2, 0, kTagSprite2);
1341
1342 schedule( CC_CALLBACK_1(SpriteFlip::flipSprites,this), 1, "sprite_flip_key");
1343}
1344
1346{
1347 auto sprite1 = static_cast<Sprite*>(getChildByTag(kTagSprite1));
1348 auto sprite2 = static_cast<Sprite*>(getChildByTag(kTagSprite2));
1349
1350 bool x = sprite1->isFlippedX();
1351 bool y = sprite2->isFlippedY();
1352
1353 CCLOG("Pre: %g", sprite1->getContentSize().height);
1354 sprite1->setFlippedX(!x);
1355 sprite2->setFlippedY(!y);
1356 CCLOG("Post: %g", sprite1->getContentSize().height);
1357}
1358
1359std::string SpriteFlip::title() const
1360{
1361 return "Testing Sprite";
1362}
1363
1364std::string SpriteFlip::subtitle() const
1365{
1366 return "Flip X & Y";
1367}
1368
1369
1370//------------------------------------------------------------------
1371//
1372// SpriteBatchNodeFlip
1373//
1374//------------------------------------------------------------------
1376{
1377 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 10);
1378 addChild(batch, 0, kTagSpriteBatchNode);
1379
1380 auto s = Director::getInstance()->getWinSize();
1381
1382 auto sprite1 = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*1, 85, 121));
1383 sprite1->setPosition( Vec2( s.width/2 - 100, s.height/2 ) );
1384 batch->addChild(sprite1, 0, kTagSprite1);
1385
1386 auto sprite2 = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*1, 85, 121));
1387 sprite2->setPosition( Vec2( s.width/2 + 100, s.height/2 ) );
1388 batch->addChild(sprite2, 0, kTagSprite2);
1389
1390 schedule(CC_CALLBACK_1(SpriteBatchNodeFlip::flipSprites, this), 1, "flip_sprites_key");
1391}
1392
1394{
1395 auto batch= static_cast<SpriteBatchNode*>(getChildByTag( kTagSpriteBatchNode ));
1396 auto sprite1 = static_cast<Sprite*>(batch->getChildByTag(kTagSprite1));
1397 auto sprite2 = static_cast<Sprite*>(batch->getChildByTag(kTagSprite2));
1398
1399 bool x = sprite1->isFlippedX();
1400 bool y = sprite2->isFlippedY();
1401
1402 CCLOG("Pre: %g", sprite1->getContentSize().height);
1403 sprite1->setFlippedX(!x);
1404 sprite2->setFlippedY(!y);
1405 CCLOG("Post: %g", sprite1->getContentSize().height);
1406}
1407
1409{
1410 return "Testing SpriteBatchNode";
1411}
1412
1414{
1415 return "Flip X & Y";
1416}
1417
1418
1419//------------------------------------------------------------------
1420//
1421// SpriteAliased
1422//
1423//------------------------------------------------------------------
1424
1426{
1427 auto s = Director::getInstance()->getWinSize();
1428
1429 auto sprite1 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*1, 85, 121));
1430 sprite1->setPosition( Vec2( s.width/2 - 100, s.height/2 ) );
1431 addChild(sprite1, 0, kTagSprite1);
1432
1433 auto sprite2 = Sprite::create("Images/grossini_dance_atlas.png", Rect(85*1, 121*1, 85, 121));
1434 sprite2->setPosition( Vec2( s.width/2 + 100, s.height/2 ) );
1435 addChild(sprite2, 0, kTagSprite2);
1436
1437 auto scale = ScaleBy::create(2, 5);
1438 auto scale_back = scale->reverse();
1439 auto seq = Sequence::create( scale, scale_back, nullptr);
1440 auto repeat = RepeatForever::create(seq);
1441
1442 auto repeat2 = repeat->clone();
1443
1444 sprite1->runAction(repeat);
1445 sprite2->runAction(repeat2);
1446
1447}
1448
1450{
1452
1453 //
1454 // IMPORTANT:
1455 // This change will affect every sprite that uses the same texture
1456 // So sprite1 and sprite2 will be affected by this change
1457 //
1458 auto sprite = static_cast<Sprite*>( getChildByTag(kTagSprite1) );
1459 sprite->getTexture()->setAliasTexParameters();
1460}
1461
1463{
1464 // restore the tex parameter to AntiAliased.
1465 auto sprite = static_cast<Sprite*>( getChildByTag(kTagSprite1) );
1466 sprite->getTexture()->setAntiAliasTexParameters();
1467 SpriteTestDemo::onExit();
1468}
1469
1470std::string SpriteAliased::title() const
1471{
1472 return "Testing Sprite";
1473}
1474
1475std::string SpriteAliased::subtitle() const
1476{
1477 return "AliasTexParameters()";
1478}
1479
1480
1481//------------------------------------------------------------------
1482//
1483// SpriteBatchNodeAliased
1484//
1485//------------------------------------------------------------------
1486
1488{
1489 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 10);
1490 addChild(batch, 0, kTagSpriteBatchNode);
1491
1492 auto s = Director::getInstance()->getWinSize();
1493
1494 auto sprite1 = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*1, 85, 121));
1495 sprite1->setPosition( Vec2( s.width/2 - 100, s.height/2 ) );
1496 batch->addChild(sprite1, 0, kTagSprite1);
1497
1498 auto sprite2 = Sprite::createWithTexture(batch->getTexture(), Rect(85*1, 121*1, 85, 121));
1499 sprite2->setPosition( Vec2( s.width/2 + 100, s.height/2 ) );
1500 batch->addChild(sprite2, 0, kTagSprite2);
1501
1502 auto scale = ScaleBy::create(2, 5);
1503 auto scale_back = scale->reverse();
1504 auto seq = Sequence::create( scale, scale_back, nullptr);
1505 auto repeat = RepeatForever::create(seq);
1506
1507 auto repeat2 = repeat->clone();
1508
1509 sprite1->runAction(repeat);
1510 sprite2->runAction(repeat2);
1511
1512}
1514{
1516 auto batch = static_cast<SpriteBatchNode*>( getChildByTag(kTagSpriteBatchNode) );
1517 batch->getTexture()->setAliasTexParameters();
1518}
1519
1521{
1522 // restore the tex parameter to AntiAliased.
1523 auto batch = static_cast<SpriteBatchNode*>( getChildByTag(kTagSpriteBatchNode) );
1524 batch->getTexture()->setAntiAliasTexParameters();
1525 SpriteTestDemo::onExit();
1526}
1527
1529{
1530 return "Testing SpriteBatchNode";
1531}
1532
1534{
1535 return "AliasTexParameters()";
1536}
1537
1538
1539//------------------------------------------------------------------
1540//
1541// SpriteNewTexture
1542//
1543//------------------------------------------------------------------
1544
1546{
1547 auto listener = EventListenerTouchAllAtOnce::create();
1548 listener->onTouchesEnded = CC_CALLBACK_2(SpriteNewTexture::onTouchesEnded, this);
1549 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
1550
1551 auto node = Node::create();
1552 addChild(node, 0, kTagSpriteBatchNode);
1553
1554 _texture1 = Director::getInstance()->getTextureCache()->addImage("Images/grossini_dance_atlas.png");
1555 _texture1->retain();
1556 _texture2 = Director::getInstance()->getTextureCache()->addImage("Images/grossini_dance_atlas-mono.png");
1557 _texture2->retain();
1558
1559 _usingTexture1 = true;
1560
1561 for(int i=0;i<30;i++)
1562 addNewSprite();
1563}
1564
1566{
1567 _texture1->release();
1568 _texture2->release();
1569}
1570
1572{
1573 auto s = Director::getInstance()->getWinSize();
1574
1575 auto p = Vec2( CCRANDOM_0_1() * s.width, CCRANDOM_0_1() * s.height);
1576
1577 int idx = CCRANDOM_0_1() * 1400 / 100;
1578 int x = (idx%5) * 85;
1579 int y = (idx/5) * 121;
1580
1581
1582 auto node = getChildByTag( kTagSpriteBatchNode );
1583 auto sprite = Sprite::createWithTexture(_texture1, Rect(x,y,85,121));
1584 node->addChild(sprite);
1585
1586 sprite->setPosition( Vec2( p.x, p.y) );
1587
1588 ActionInterval* action;
1589 float random = CCRANDOM_0_1();
1590
1591 if( random < 0.20 )
1592 action = ScaleBy::create(3, 2);
1593 else if(random < 0.40)
1594 action = RotateBy::create(3, 360);
1595 else if( random < 0.60)
1596 action = Blink::create(1, 3);
1597 else if( random < 0.8 )
1598 action = TintBy::create(2, 0, -255, -255);
1599 else
1600 action = FadeOut::create(2);
1601
1602 auto action_back = action->reverse();
1603 auto seq = Sequence::create(action, action_back, nullptr);
1604
1605 sprite->runAction( RepeatForever::create(seq) );
1606}
1607
1608void SpriteNewTexture::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
1609{
1610
1611 auto node = getChildByTag( kTagSpriteBatchNode );
1612
1613 auto& children = node->getChildren();
1614 Sprite* sprite;
1615
1616 if( _usingTexture1 ) //--> win32 : Let's it make just simple sentence
1617 {
1618 for(const auto &obj : children) {
1619 sprite = static_cast<Sprite*>( obj );
1620 sprite->setTexture(_texture2);
1621 }
1622
1623 _usingTexture1 = false;
1624 }
1625 else
1626 {
1627 for(const auto &obj : children) {
1628 sprite = static_cast<Sprite*>( obj );
1629 sprite->setTexture(_texture1);
1630 }
1631
1632 _usingTexture1 = true;
1633 }
1634}
1635
1636std::string SpriteNewTexture::title() const
1637{
1638 return "Testing Sprite";
1639}
1640
1642{
1643 return "setTexture() (tap / touch the screen)";
1644}
1645
1646
1647//------------------------------------------------------------------
1648//
1649// SpriteBatchNodeNewTexture
1650//
1651//------------------------------------------------------------------
1652
1654{
1655 auto listener = EventListenerTouchAllAtOnce::create();
1656 listener->onTouchesEnded = CC_CALLBACK_2(SpriteBatchNodeNewTexture::onTouchesEnded, this);
1657 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
1658
1659 auto batch = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 50);
1660 addChild(batch, 0, kTagSpriteBatchNode);
1661
1662 _texture1 = batch->getTexture(); _texture1->retain();
1663 _texture2 = Director::getInstance()->getTextureCache()->addImage("Images/grossini_dance_atlas-mono.png");
1664 _texture2->retain();
1665
1666 for(int i=0;i<30;i++)
1667 addNewSprite();
1668}
1669
1671{
1672 _texture1->release();
1673 _texture2->release();
1674}
1675
1677{
1678 auto s = Director::getInstance()->getWinSize();
1679
1680 auto p = Vec2( CCRANDOM_0_1() * s.width, CCRANDOM_0_1() * s.height);
1681
1682 auto batch = static_cast<SpriteBatchNode*>( getChildByTag( kTagSpriteBatchNode ) );
1683
1684 int idx = CCRANDOM_0_1() * 1400 / 100;
1685 int x = (idx%5) * 85;
1686 int y = (idx/5) * 121;
1687
1688
1689 auto sprite = Sprite::createWithTexture(batch->getTexture(), Rect(x,y,85,121));
1690 batch->addChild(sprite);
1691
1692 sprite->setPosition( Vec2( p.x, p.y) );
1693
1694 ActionInterval* action;
1695 float random = CCRANDOM_0_1();
1696
1697 if( random < 0.20 )
1698 action = ScaleBy::create(3, 2);
1699 else if(random < 0.40)
1700 action = RotateBy::create(3, 360);
1701 else if( random < 0.60)
1702 action = Blink::create(1, 3);
1703 else if( random < 0.8 )
1704 action = TintBy::create(2, 0, -255, -255);
1705 else
1706 action = FadeOut::create(2);
1707 auto action_back = action->reverse();
1708 auto seq = Sequence::create(action, action_back, nullptr);
1709
1710 sprite->runAction( RepeatForever::create(seq) );
1711}
1712
1713void SpriteBatchNodeNewTexture::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
1714{
1715 auto batch = static_cast<SpriteBatchNode*>( getChildByTag( kTagSpriteBatchNode) );
1716
1717 if( batch->getTexture() == _texture1 )
1718 batch->setTexture(_texture2);
1719 else
1720 batch->setTexture(_texture1);
1721}
1722
1724{
1725 return "Testing SpriteBatchNode";
1726}
1727
1729{
1730 return "setTexture() (tap / touch the screen)";
1731}
1732
1733
1734//------------------------------------------------------------------
1735//
1736// SpriteFrameTest
1737//
1738//------------------------------------------------------------------
1739
1741{
1743 auto s = Director::getInstance()->getWinSize();
1744
1745 // IMPORTANT:
1746 // The sprite frames will be cached AND RETAINED, and they won't be released unless you call
1747 // SpriteFrameCache::getInstance()->removeUnusedSpriteFrames);
1748 auto cache = SpriteFrameCache::getInstance();
1749 cache->addSpriteFramesWithFile("animations/grossini.plist");
1750 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
1751 cache->addSpriteFramesWithFile("animations/grossini_blue.plist", "animations/grossini_blue.png");
1752
1753 //
1754 // Animation using Sprite BatchNode
1755 //
1756 _sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
1757 _sprite1->setPosition( Vec2( s.width/2-80, s.height/2) );
1758
1759 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
1760 spritebatch->addChild(_sprite1);
1761 addChild(spritebatch);
1762
1763 Vector<SpriteFrame*> animFrames(15);
1764
1765 char str[100] = {0};
1766 for(int i = 1; i < 15; i++)
1767 {
1768 sprintf(str, "grossini_dance_%02d.png", i);
1769 auto frame = cache->getSpriteFrameByName( str );
1770 animFrames.pushBack(frame);
1771 }
1772
1773 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
1774 _sprite1->runAction( RepeatForever::create( Animate::create(animation) ) );
1775
1776 // to test issue #732, uncomment the following line
1777 _sprite1->setFlippedX(false);
1778 _sprite1->setFlippedY(false);
1779
1780 //
1781 // Animation using standard Sprite
1782 //
1783 _sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
1784 _sprite2->setPosition( Vec2( s.width/2 + 80, s.height/2) );
1785 addChild(_sprite2);
1786
1787
1788 Vector<SpriteFrame*> moreFrames(20);
1789 for(int i = 1; i < 15; i++)
1790 {
1791 sprintf(str, "grossini_dance_gray_%02d.png",i);
1792 auto frame = cache->getSpriteFrameByName(str);
1793 moreFrames.pushBack(frame);
1794 }
1795
1796
1797 for( int i = 1; i < 5; i++) {
1798 sprintf(str, "grossini_blue_%02d.png",i);
1799 auto frame = cache->getSpriteFrameByName(str);
1800 moreFrames.pushBack(frame);
1801 }
1802
1803 // append frames from another batch
1804 moreFrames.pushBack(animFrames);
1805 auto animMixed = Animation::createWithSpriteFrames(moreFrames, 0.3f);
1806
1807
1808 _sprite2->runAction(RepeatForever::create( Animate::create(animMixed) ) );
1809
1810
1811 // to test issue #732, uncomment the following line
1812 _sprite2->setFlippedX(false);
1813 _sprite2->setFlippedY(false);
1814
1815 schedule(CC_CALLBACK_1(SpriteFrameTest::startIn05Secs, this), 0.5f, "in_05_secs_key");
1816 _counter = 0;
1817}
1818
1820{
1821 SpriteTestDemo::onExit();
1822 auto cache = SpriteFrameCache::getInstance();
1823 cache->removeSpriteFramesFromFile("animations/grossini.plist");
1824 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
1825 cache->removeSpriteFramesFromFile("animations/grossini_blue.plist");
1826}
1827
1828std::string SpriteFrameTest::title() const
1829{
1830 return "Sprite vs. SpriteBatchNode";
1831}
1832
1833std::string SpriteFrameTest::subtitle() const
1834{
1835 return "Animation. Testing issue #792";
1836}
1837
1839{
1840 unschedule("in_05_secs_key");
1841 schedule(CC_CALLBACK_1(SpriteFrameTest::flipSprites, this), 1.0f, "flip_sprites_key");
1842}
1843
1845{
1846 _counter++;
1847
1848 bool fx = false;
1849 bool fy = false;
1850 int i = _counter % 4;
1851
1852 switch ( i ) {
1853 case 0:
1854 fx = false;
1855 fy = false;
1856 break;
1857 case 1:
1858 fx = true;
1859 fy = false;
1860 break;
1861 case 2:
1862 fx = false;
1863 fy = true;
1864 break;
1865 case 3:
1866 fx = true;
1867 fy = true;
1868 break;
1869 }
1870
1871 _sprite1->setFlippedX(fx);
1872 _sprite1->setFlippedY(fy);
1873 _sprite2->setFlippedX(fx);
1874 _sprite2->setFlippedY(fy);
1875 //NSLog(@"flipX:%d, flipY:%d", fx, fy);
1876}
1877
1878//------------------------------------------------------------------
1879//
1880// SpriteFrameAliasNameTest
1881//
1882//------------------------------------------------------------------
1884{
1886 auto s = Director::getInstance()->getWinSize();
1887
1888 // IMPORTANT:
1889 // The sprite frames will be cached AND RETAINED, and they won't be released unless you call
1890 // SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
1891 //
1892 // SpriteFrameCache is a cache of SpriteFrames
1893 // SpriteFrames each contain a texture id and a rect (frame).
1894
1895 auto cache = SpriteFrameCache::getInstance();
1896 cache->addSpriteFramesWithFile("animations/grossini-aliases.plist", "animations/grossini-aliases.png");
1897
1898 //
1899 // Animation using Sprite batch
1900 //
1901 // A SpriteBatchNode can reference one and only one texture (one .png file)
1902 // Sprites that are contained in that texture can be instantiated as Sprites and then added to the SpriteBatchNode
1903 // All Sprites added to a SpriteBatchNode are drawn in one OpenGL ES draw call
1904 // If the Sprites are not added to a SpriteBatchNode then an OpenGL ES draw call will be needed for each one, which is less efficient
1905 //
1906 // When you animate a sprite, Animation changes the frame of the sprite using setDisplayFrame: (this is why the animation must be in the same texture)
1907 // When setDisplayFrame: is used in the Animation it changes the frame to one specified by the SpriteFrames that were added to the animation,
1908 // but texture id is still the same and so the sprite is still a child of the SpriteBatchNode,
1909 // and therefore all the animation sprites are also drawn as part of the SpriteBatchNode
1910 //
1911
1912 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
1913 sprite->setPosition(Vec2(s.width * 0.5f, s.height * 0.5f));
1914
1915 auto spriteBatch = SpriteBatchNode::create("animations/grossini-aliases.png");
1916 spriteBatch->addChild(sprite);
1917 addChild(spriteBatch);
1918
1919 Vector<SpriteFrame*> animFrames(15);
1920 char str[100] = {0};
1921 for(int i = 1; i < 15; i++)
1922 {
1923 // Obtain frames by alias name
1924 sprintf(str, "dance_%02d", i);
1925 auto frame = cache->getSpriteFrameByName(str);
1926 animFrames.pushBack(frame);
1927 }
1928
1929 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
1930 // 14 frames * 1sec = 14 seconds
1931 sprite->runAction(RepeatForever::create(Animate::create(animation)));
1932
1933 cache->reloadTexture("animations/grossini-aliases.plist");
1934}
1935
1937{
1938 SpriteTestDemo::onExit();
1939 SpriteFrameCache::getInstance()->removeSpriteFramesFromFile("animations/grossini-aliases.plist");
1940}
1941
1943{
1944 return "SpriteFrame Alias Name";
1945}
1946
1948{
1949 return "SpriteFrames are obtained using the alias name";
1950}
1951
1952//------------------------------------------------------------------
1953//
1954// SpriteFramesFromFileContent
1955//
1956//------------------------------------------------------------------
1958{
1960 auto s = Director::getInstance()->getWinSize();
1961
1962 std::string plist_content = FileUtils::getInstance()->getStringFromFile(sheetName() + ".plist");
1963 Data image_content = FileUtils::getInstance()->getDataFromFile(sheetName() + ".png");
1964
1965 Image* image = new (std::nothrow) Image();
1966 image->initWithImageData((const uint8_t*)image_content.getBytes(), image_content.getSize());
1967 Texture2D* texture = new (std::nothrow) Texture2D();
1968 texture->initWithImage(image);
1969 texture->autorelease();
1970
1971 CC_SAFE_RELEASE(image);
1972
1973 auto cache = SpriteFrameCache::getInstance();
1974 cache->addSpriteFramesWithFileContent(plist_content, texture);
1975
1976 //
1977 // Animation using Sprite BatchNode
1978 //
1979 Sprite * sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
1980 sprite->setPosition( Vec2( s.width/2, s.height/2) );
1981 addChild(sprite);
1982
1983 Vector<SpriteFrame*> animFrames(15);
1984
1985 char str[100] = {0};
1986 for(int i = 1; i < 15; i++)
1987 {
1988 sprintf(str, "grossini_dance_%02d.png", i);
1989 auto frame = cache->getSpriteFrameByName( str );
1990 animFrames.pushBack(frame);
1991 }
1992
1993 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
1994 sprite->runAction( RepeatForever::create( Animate::create(animation) ) );
1995}
1996
1998{
1999 SpriteTestDemo::onExit();
2000
2001 std::string plist_content = FileUtils::getInstance()->getStringFromFile("animations/grossini.plist");
2002
2003 SpriteFrameCache::getInstance()->removeSpriteFramesFromFileContent(plist_content);
2004}
2005
2007{
2008 return "SpriteFrameCache load form file content";
2009}
2010
2012{
2013 return "SpriteFrameCache load from plist file content";
2014}
2015
2017{
2018 return "animations/grossini";
2019}
2020
2021//------------------------------------------------------------------
2022//
2023// SpritePolygonFromFileContent
2024//
2025//------------------------------------------------------------------
2026
2028{
2029 return "SpriteFrameCache load polygon info from plist file";
2030}
2031
2033{
2034 return "animations/grossini_polygon";
2035}
2036
2037//------------------------------------------------------------------
2038//
2039// SpriteOffsetAnchorRotation
2040//
2041//------------------------------------------------------------------
2043{
2045
2046 auto s = Director::getInstance()->getWinSize();
2047 auto cache = SpriteFrameCache::getInstance();
2048 cache->addSpriteFramesWithFile("animations/grossini.plist");
2049 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
2050
2051 for(int i=0;i<3;i++)
2052 {
2053 //
2054 // Animation using Sprite batch
2055 //
2056 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2057 sprite->setPosition(Vec2( s.width/4*(i+1), s.height/2));
2058
2059 auto point = Sprite::create("Images/r1.png");
2060 point->setScale( 0.25f );
2061 point->setPosition( sprite->getPosition() );
2062 addChild(point, 1);
2063
2064 switch(i)
2065 {
2066 case 0:
2067 sprite->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
2068 break;
2069 case 1:
2070 sprite->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
2071 break;
2072 case 2:
2073 sprite->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
2074 break;
2075 }
2076
2077 point->setPosition( sprite->getPosition() );
2078
2079 Vector<SpriteFrame*> animFrames(14);
2080 char str[100] = {0};
2081 for(int i = 0; i < 14; i++)
2082 {
2083 sprintf(str, "grossini_dance_%02d.png",(i+1));
2084 auto frame = cache->getSpriteFrameByName(str);
2085 animFrames.pushBack(frame);
2086 }
2087
2088 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
2089 sprite->runAction(RepeatForever::create( Animate::create(animation) ) );
2090 sprite->runAction(RepeatForever::create(RotateBy::create(10, 360) ) );
2091
2092 addChild(sprite, 0);
2093
2094 }
2095}
2096
2097
2099{
2100 SpriteTestDemo::onExit();
2101 auto cache = SpriteFrameCache::getInstance();
2102 cache->removeSpriteFramesFromFile("animations/grossini.plist");
2103 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
2104}
2105
2107{
2108 return "Testing Sprite";
2109}
2110
2112{
2113 return "offset + anchor + rotation";
2114}
2115
2116//------------------------------------------------------------------
2117//
2118// SpriteBatchNodeOffsetAnchorRotation
2119//
2120//------------------------------------------------------------------
2121
2123{
2124 auto s = Director::getInstance()->getWinSize();
2125
2126 auto cache = SpriteFrameCache::getInstance();
2127 cache->addSpriteFramesWithFile("animations/grossini.plist");
2128 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
2129
2130 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
2131 addChild(spritebatch);
2132
2133 for(int i=0;i<3;i++)
2134 {
2135 //
2136 // Animation using Sprite BatchNode
2137 //
2138 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2139 sprite->setPosition( Vec2( s.width/4*(i+1), s.height/2));
2140
2141 auto point = Sprite::create("Images/r1.png");
2142 point->setScale( 0.25f );
2143 point->setPosition( sprite->getPosition() );
2144 addChild(point, 200);
2145
2146 switch(i)
2147 {
2148 case 0:
2149 sprite->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
2150 break;
2151 case 1:
2152 sprite->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
2153 break;
2154 case 2:
2155 sprite->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
2156 break;
2157 }
2158
2159 point->setPosition( sprite->getPosition() );
2160
2161 Vector<SpriteFrame*> animFrames(14);
2162 char str[100] = {0};
2163 for(int k = 0; k < 14; k++)
2164 {
2165 sprintf(str, "grossini_dance_%02d.png",(k+1));
2166 auto frame = cache->getSpriteFrameByName(str);
2167 animFrames.pushBack(frame);
2168 }
2169
2170 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
2171 sprite->runAction(RepeatForever::create( Animate::create(animation) ));
2172 sprite->runAction(RepeatForever::create(RotateBy::create(10, 360) ));
2173
2174 spritebatch->addChild(sprite, i);
2175 }
2176}
2177
2178
2180{
2181 SpriteTestDemo::onExit();
2182 auto cache = SpriteFrameCache::getInstance();
2183 cache->removeSpriteFramesFromFile("animations/grossini.plist");
2184 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
2185}
2186
2188{
2189 return "Testing SpriteBatchNode";
2190}
2191
2193{
2194 return "offset + anchor + rotation";
2195}
2196
2197//------------------------------------------------------------------
2198//
2199// SpriteOffsetAnchorScale
2200//
2201//------------------------------------------------------------------
2202
2203
2205{
2206 auto s = Director::getInstance()->getWinSize();
2207
2208 auto cache = SpriteFrameCache::getInstance();
2209 cache->addSpriteFramesWithFile("animations/grossini.plist");
2210 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
2211
2212 for(int i=0;i<3;i++)
2213 {
2214 //
2215 // Animation using Sprite BatchNode
2216 //
2217 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2218 sprite->setPosition( Vec2( s.width/4*(i+1), s.height/2) );
2219
2220 auto point = Sprite::create("Images/r1.png");
2221 point->setScale( 0.25f );
2222 point->setPosition( sprite->getPosition() );
2223 addChild(point, 1);
2224
2225 switch(i)
2226 {
2227 case 0:
2228 sprite->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
2229 break;
2230 case 1:
2231 sprite->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
2232 break;
2233 case 2:
2234 sprite->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
2235 break;
2236 }
2237
2238 point->setPosition( sprite->getPosition() );
2239
2240 Vector<SpriteFrame*> animFrames(14);
2241 char str[100] = {0};
2242 for(int i = 0; i < 14; i++)
2243 {
2244 sprintf(str, "grossini_dance_%02d.png",(i+1));
2245 auto frame = cache->getSpriteFrameByName(str);
2246 animFrames.pushBack(frame);
2247 }
2248
2249 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
2250 sprite->runAction(RepeatForever::create( Animate::create(animation) ));
2251
2252 auto scale = ScaleBy::create(2, 2);
2253 auto scale_back = scale->reverse();
2254 auto seq_scale = Sequence::create(scale, scale_back, nullptr);
2255 sprite->runAction(RepeatForever::create(seq_scale));
2256
2257 addChild(sprite, 0);
2258 }
2259}
2260
2262{
2263 SpriteTestDemo::onExit();
2264 auto cache = SpriteFrameCache::getInstance();
2265 cache->removeSpriteFramesFromFile("animations/grossini.plist");
2266 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
2267}
2268
2270{
2271 return "Testing Sprite";
2272}
2273
2275{
2276 return "offset + anchor + scale";
2277}
2278
2279//------------------------------------------------------------------
2280//
2281// SpriteBatchNodeOffsetAnchorScale
2282//
2283//------------------------------------------------------------------
2285{
2286 auto s = Director::getInstance()->getWinSize();
2287
2288 auto cache = SpriteFrameCache::getInstance();
2289 cache->addSpriteFramesWithFile("animations/grossini.plist");
2290 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
2291
2292 auto spritesheet = SpriteBatchNode::create("animations/grossini.png");
2293 addChild(spritesheet);
2294
2295 for(int i=0;i<3;i++)
2296 {
2297 //
2298 // Animation using Sprite BatchNode
2299 //
2300 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2301 sprite->setPosition( Vec2( s.width/4*(i+1), s.height/2) );
2302
2303 auto point = Sprite::create("Images/r1.png");
2304 point->setScale( 0.25f );
2305 point->setPosition( sprite->getPosition() );
2306 addChild(point, 200);
2307
2308 switch(i) {
2309 case 0:
2310 sprite->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
2311 break;
2312 case 1:
2313 sprite->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
2314 break;
2315 case 2:
2316 sprite->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
2317 break;
2318 }
2319
2320 point->setPosition( sprite->getPosition() );
2321
2322 Vector<SpriteFrame*> animFrames(14);
2323 char str[100] = {0};
2324 for(int k = 0; k < 14; k++)
2325 {
2326 sprintf(str, "grossini_dance_%02d.png",(k+1));
2327 auto frame = cache->getSpriteFrameByName(str);
2328 animFrames.pushBack(frame);
2329 }
2330
2331 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
2332 sprite->runAction(RepeatForever::create( Animate::create(animation) ) );
2333
2334 auto scale = ScaleBy::create(2, 2);
2335 auto scale_back = scale->reverse();
2336 auto seq_scale = Sequence::create(scale, scale_back, nullptr);
2337 sprite->runAction(RepeatForever::create(seq_scale) );
2338
2339 spritesheet->addChild(sprite, i);
2340 }
2341}
2342
2344{
2345 SpriteTestDemo::onExit();
2346 auto cache = SpriteFrameCache::getInstance();
2347 cache->removeSpriteFramesFromFile("animations/grossini.plist");
2348 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
2349}
2350
2352{
2353 return "Testing SpriteBatchNode";
2354}
2355
2357{
2358 return "offset + anchor + scale";
2359}
2360
2361
2362//------------------------------------------------------------------
2363//
2364// SpriteAnimationSplit
2365//
2366//------------------------------------------------------------------
2367
2369{
2370 auto s = Director::getInstance()->getWinSize();
2371
2372 auto texture = Director::getInstance()->getTextureCache()->addImage("animations/dragon_animation.png");
2373
2374 // manually add frames to the frame cache
2375 auto frame0 = SpriteFrame::createWithTexture(texture, Rect(132*0, 132*0, 132, 132));
2376 auto frame1 = SpriteFrame::createWithTexture(texture, Rect(132*1, 132*0, 132, 132));
2377 auto frame2 = SpriteFrame::createWithTexture(texture, Rect(132*2, 132*0, 132, 132));
2378 auto frame3 = SpriteFrame::createWithTexture(texture, Rect(132*3, 132*0, 132, 132));
2379 auto frame4 = SpriteFrame::createWithTexture(texture, Rect(132*0, 132*1, 132, 132));
2380 auto frame5 = SpriteFrame::createWithTexture(texture, Rect(132*1, 132*1, 132, 132));
2381
2382
2383 //
2384 // Animation using Sprite BatchNode
2385 //
2386 auto sprite = Sprite::createWithSpriteFrame(frame0);
2387 sprite->setPosition( Vec2( s.width/2-80, s.height/2) );
2388 addChild(sprite);
2389
2390 Vector<SpriteFrame*> animFrames(6);
2391 animFrames.pushBack(frame0);
2392 animFrames.pushBack(frame1);
2393 animFrames.pushBack(frame2);
2394 animFrames.pushBack(frame3);
2395 animFrames.pushBack(frame4);
2396 animFrames.pushBack(frame5);
2397
2398 auto animation = Animation::createWithSpriteFrames(animFrames, 0.2f);
2399 auto animate = Animate::create(animation);
2400 auto seq = Sequence::create(animate,
2401 FlipX::create(true),
2402 animate->clone(),
2403 FlipX::create(false),
2404 nullptr);
2405
2406 sprite->runAction(RepeatForever::create( seq ) );
2407}
2408
2410{
2411 SpriteTestDemo::onExit();
2412 SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
2413}
2414
2416{
2417 return "Sprite: Animation + flip";
2418}
2419
2420//------------------------------------------------------------------
2421//
2422// SpriteHybrid
2423//
2424//------------------------------------------------------------------
2426{
2427 auto s = Director::getInstance()->getWinSize();
2428
2429 // parents
2430 auto parent1 = Node::create();
2431 auto parent2 = SpriteBatchNode::create("animations/grossini.png", 50);
2432
2433 addChild(parent1, 0, kTagNode);
2434 addChild(parent2, 0, kTagSpriteBatchNode);
2435
2436
2437 // IMPORTANT:
2438 // The sprite frames will be cached AND RETAINED, and they won't be released unless you call
2439 // SpriteFrameCache::getInstance()->removeUnusedSpriteFrames);
2440 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
2441
2442
2443 // create 250 sprites
2444 // only show 80% of them
2445 for(int i = 0; i < 250; i++)
2446 {
2447 int spriteIdx = CCRANDOM_0_1() * 14;
2448 char str[25] = {0};
2449 sprintf(str, "grossini_dance_%02d.png", (spriteIdx+1));
2450 auto frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
2451 auto sprite = Sprite::createWithSpriteFrame(frame);
2452 parent1->addChild(sprite, i, i);
2453
2454 float x=-1000;
2455 float y=-1000;
2456 if( CCRANDOM_0_1() < 0.2f )
2457 {
2458 x = CCRANDOM_0_1() * s.width;
2459 y = CCRANDOM_0_1() * s.height;
2460 }
2461 sprite->setPosition( Vec2(x,y) );
2462
2463 auto action = RotateBy::create(4, 360);
2464 sprite->runAction( RepeatForever::create(action) );
2465 }
2466
2467 _usingSpriteBatchNode = false;
2468
2469 schedule(CC_CALLBACK_1(SpriteHybrid::reparentSprite, this), 2, "reparent_sprite_key");
2470}
2471
2473{
2474 auto p1 = getChildByTag(kTagNode);
2475 auto p2 = getChildByTag( kTagSpriteBatchNode );
2476
2477 Vector<Node*> retArray(250);
2478
2480 std::swap(p1, p2);
2481
2483
2484 auto& p1Children = p1->getChildren();
2485 for(const auto &node : p1Children) {
2486 retArray.pushBack(node);
2487 }
2488
2489 int i=0;
2490 p1->removeAllChildrenWithCleanup(false);
2491
2492 for(const auto &node : retArray) {
2493 p2->addChild(node, i, i);
2494 i++;
2495 }
2496
2498}
2499
2501{
2502 SpriteTestDemo::onExit();
2503 SpriteFrameCache::getInstance()->removeSpriteFramesFromFile("animations/grossini.plist");
2504}
2505
2506std::string SpriteHybrid::title() const
2507{
2508 return "HybridSprite* sprite Test";
2509}
2510
2511//------------------------------------------------------------------
2512//
2513// SpriteBatchNodeChildren
2514//
2515//------------------------------------------------------------------
2516
2518{
2519 auto s = Director::getInstance()->getWinSize();
2520
2521 // parents
2522 auto batch = SpriteBatchNode::create("animations/grossini.png", 50);
2523
2524 addChild(batch, 0, kTagSpriteBatchNode);
2525
2526 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
2527
2528 auto sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2529 sprite1->setPosition(Vec2( s.width/3, s.height/2));
2530
2531 auto sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2532 sprite2->setPosition(Vec2(50.0f,50.0f));
2533
2534 auto sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2535 sprite3->setPosition(Vec2(-50.0f,-50.0f));
2536
2537 batch->addChild(sprite1);
2538 sprite1->addChild(sprite2);
2539 sprite1->addChild(sprite3);
2540
2541 // BEGIN NEW CODE
2542 Vector<SpriteFrame*> animFrames(14);
2543 char str[100] = {0};
2544 for(int i = 1; i < 15; i++)
2545 {
2546 sprintf(str, "grossini_dance_%02d.png",i);
2547 auto frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
2548 animFrames.pushBack(frame);
2549 }
2550
2551 auto animation = Animation::createWithSpriteFrames(animFrames, 0.2f);
2552 sprite1->runAction(RepeatForever::create( Animate::create(animation) ) );
2553 // END NEW CODE
2554
2555 auto action = MoveBy::create(2, Vec2(200.0f,0.0f));
2556 auto action_back = action->reverse();
2557 auto action_rot = RotateBy::create(2.0f, 360.0f);
2558 auto action_s = ScaleBy::create(2.0f, 2.0f);
2559 auto action_s_back = action_s->reverse();
2560
2561 auto seq2 = action_rot->reverse();
2562 sprite2->runAction( RepeatForever::create(seq2) );
2563
2564 sprite1->runAction( RepeatForever::create(action_rot));
2565 sprite1->runAction( RepeatForever::create(Sequence::create(action, action_back,nullptr)) );
2566 sprite1->runAction( RepeatForever::create(Sequence::create(action_s, action_s_back,nullptr)) );
2567
2568}
2569
2571{
2572 SpriteTestDemo::onExit();
2573 SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
2574}
2575
2577{
2578 return "SpriteBatchNode Grand Children";
2579}
2580
2581//------------------------------------------------------------------
2582//
2583// SpriteBatchNodeChildrenZ
2584//
2585//------------------------------------------------------------------
2587{
2588 auto s = Director::getInstance()->getWinSize();
2589
2590 // parents
2591 SpriteBatchNode* batch;
2592 Sprite* sprite1, *sprite2, *sprite3;
2593
2594
2595 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
2596
2597 // test 1
2598 batch = SpriteBatchNode::create("animations/grossini.png", 50);
2599 addChild(batch, 0, kTagSpriteBatchNode);
2600
2601 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2602 sprite1->setPosition(Vec2( s.width/3, s.height/2));
2603
2604 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2605 sprite2->setPosition(Vec2(20.0f,30.0f));
2606
2607 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2608 sprite3->setPosition(Vec2(-20.0f,30.0f));
2609
2610 batch->addChild(sprite1);
2611 sprite1->addChild(sprite2, 2);
2612 sprite1->addChild(sprite3, -2);
2613
2614 // test 2
2615 batch = SpriteBatchNode::create("animations/grossini.png", 50);
2616 addChild(batch, 0, kTagSpriteBatchNode);
2617
2618 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2619 sprite1->setPosition(Vec2( 2*s.width/3, s.height/2));
2620
2621 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2622 sprite2->setPosition(Vec2(20.0f,30.0f));
2623
2624 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2625 sprite3->setPosition(Vec2(-20.0f,30.0f));
2626
2627 batch->addChild(sprite1);
2628 sprite1->addChild(sprite2, -2);
2629 sprite1->addChild(sprite3, 2);
2630
2631 // test 3
2632 batch = SpriteBatchNode::create("animations/grossini.png", 50);
2633 addChild(batch, 0, kTagSpriteBatchNode);
2634
2635 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2636 sprite1->setPosition(Vec2( s.width/2 - 90, s.height/4));
2637
2638 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2639 sprite2->setPosition(Vec2( s.width/2 - 60,s.height/4));
2640
2641 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2642 sprite3->setPosition(Vec2( s.width/2 - 30, s.height/4));
2643
2644 batch->addChild(sprite1, 10);
2645 batch->addChild(sprite2, -10);
2646 batch->addChild(sprite3, -5);
2647
2648 // test 4
2649 batch = SpriteBatchNode::create("animations/grossini.png", 50);
2650 addChild(batch, 0, kTagSpriteBatchNode);
2651
2652 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2653 sprite1->setPosition(Vec2( s.width/2 +30, s.height/4));
2654
2655 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2656 sprite2->setPosition(Vec2( s.width/2 +60,s.height/4));
2657
2658 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2659 sprite3->setPosition(Vec2( s.width/2 +90, s.height/4));
2660
2661 batch->addChild(sprite1, -10);
2662 batch->addChild(sprite2, -5);
2663 batch->addChild(sprite3, -2);
2664}
2665
2667{
2668 SpriteTestDemo::onExit();
2669 SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
2670}
2671
2673{
2674 return "SpriteBatchNode Children Z";
2675}
2676
2677//------------------------------------------------------------------
2678//
2679// SpriteChildrenVisibility
2680//
2681//------------------------------------------------------------------
2682
2684{
2685 auto s = Director::getInstance()->getWinSize();
2686
2687 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
2688
2689 Node *aParent;
2690 Sprite* sprite1, *sprite2, *sprite3;
2691 //
2692 // SpriteBatchNode
2693 //
2694 // parents
2695 aParent = SpriteBatchNode::create("animations/grossini.png", 50);
2696 aParent->setPosition( Vec2(s.width/3, s.height/2) );
2697 addChild(aParent, 0);
2698
2699
2700
2701 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2702 sprite1->setPosition(Vec2(0.0f,0.0f));
2703
2704 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2705 sprite2->setPosition(Vec2(20.0f,30.0f));
2706
2707 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2708 sprite3->setPosition(Vec2(-20.0f,30.0f));
2709
2710 aParent->addChild(sprite1);
2711 sprite1->addChild(sprite2, -2);
2712 sprite1->addChild(sprite3, 2);
2713
2714 sprite1->runAction(Blink::create(5.0f, 10.0f));
2715
2716 //
2717 // Sprite
2718 //
2719 aParent = Node::create();
2720 aParent->setPosition( Vec2(2*s.width/3, s.height/2) );
2721 addChild(aParent, 0);
2722
2723 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2724 sprite1->setPosition(Vec2(0.0f,0.0f));
2725
2726 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2727 sprite2->setPosition(Vec2(20.0f,30.0f));
2728
2729 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2730 sprite3->setPosition(Vec2(-20.0f,30.0f));
2731
2732 aParent->addChild(sprite1);
2733 sprite1->addChild(sprite2, -2);
2734 sprite1->addChild(sprite3, 2);
2735
2736 sprite1->runAction(Blink::create(5.0f, 10.0f));
2737}
2738
2740{
2741 SpriteTestDemo::onExit();
2742 SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
2743}
2744
2746{
2747 return "Sprite & SpriteBatchNode Visibility";
2748}
2749
2750//------------------------------------------------------------------
2751//
2752// SpriteChildrenVisibilityIssue665
2753//
2754//------------------------------------------------------------------
2756{
2757 auto s = Director::getInstance()->getWinSize();
2758
2759 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
2760
2761 Node *aParent;
2762 Sprite *sprite1, *sprite2, *sprite3;
2763 //
2764 // SpriteBatchNode
2765 //
2766 // parents
2767 aParent = SpriteBatchNode::create("animations/grossini.png", 50);
2768 aParent->setPosition(Vec2(s.width/3, s.height/2));
2769 addChild(aParent, 0);
2770
2771 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2772 sprite1->setPosition(Vec2(0.0f,0.0f));
2773
2774 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2775 sprite2->setPosition(Vec2(20.0f,30.0f));
2776
2777 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2778 sprite3->setPosition(Vec2(-20.0f,30.0f));
2779
2780 // test issue #665
2781 sprite1->setVisible(false);
2782
2783 aParent->addChild(sprite1);
2784 sprite1->addChild(sprite2, -2);
2785 sprite1->addChild(sprite3, 2);
2786
2787 //
2788 // Sprite
2789 //
2790 aParent = Node::create();
2791 aParent->setPosition(Vec2(2*s.width/3, s.height/2));
2792 addChild(aParent, 0);
2793
2794 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
2795 sprite1->setPosition(Vec2(0.0f,0.0f));
2796
2797 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2798 sprite2->setPosition(Vec2(20.0f,30.0f));
2799
2800 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2801 sprite3->setPosition(Vec2(-20.0f,30.0f));
2802
2803 // test issue #665
2804 sprite1->setVisible(false);
2805
2806 aParent->addChild(sprite1);
2807 sprite1->addChild(sprite2, -2);
2808 sprite1->addChild(sprite3, 2);
2809}
2810
2812{
2813 SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
2814}
2815
2817{
2818 return "Sprite & SpriteBatchNode Visibility";
2819}
2820
2822{
2823 return "No sprites should be visible";
2824}
2825
2826//------------------------------------------------------------------
2827//
2828// SpriteChildrenAnchorPoint
2829//
2830//------------------------------------------------------------------
2832{
2833 auto s = Director::getInstance()->getWinSize();
2834
2835 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
2836
2837 Node *aParent;
2838 Sprite* sprite1, *sprite2, *sprite3, *sprite4, *point;
2839 //
2840 // SpriteBatchNode
2841 //
2842 // parents
2843
2844 aParent = Node::create();
2845 addChild(aParent, 0);
2846
2847 // anchor (0,0)
2848 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_08.png");
2849 sprite1->setPosition(Vec2(s.width/4,s.height/2));
2850 sprite1->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
2851
2852
2853 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2854 sprite2->setPosition(Vec2(20.0f,30.0f));
2855
2856 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2857 sprite3->setPosition(Vec2(-20.0f,30.0f));
2858
2859 sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png");
2860 sprite4->setPosition(Vec2(0.0f,0.0f));
2861 sprite4->setScale( 0.5f );
2862
2863
2864 aParent->addChild(sprite1);
2865 sprite1->addChild(sprite2, -2);
2866 sprite1->addChild(sprite3, -2);
2867 sprite1->addChild(sprite4, 3);
2868
2869 point = Sprite::create("Images/r1.png");
2870 point->setScale( 0.25f );
2871 point->setPosition( sprite1->getPosition() );
2872 addChild(point, 10);
2873
2874
2875 // anchor (0.5, 0.5)
2876 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_08.png");
2877 sprite1->setPosition(Vec2(s.width/2,s.height/2));
2878 sprite1->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
2879
2880 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2881 sprite2->setPosition(Vec2(20.0f,30.0f));
2882
2883 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2884 sprite3->setPosition(Vec2(-20.0f,30.0f));
2885
2886 sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png");
2887 sprite4->setPosition(Vec2(0.0f,0.0f));
2888 sprite4->setScale( 0.5f );
2889
2890 aParent->addChild(sprite1);
2891 sprite1->addChild(sprite2, -2);
2892 sprite1->addChild(sprite3, -2);
2893 sprite1->addChild(sprite4, 3);
2894
2895 point = Sprite::create("Images/r1.png");
2896 point->setScale( 0.25f );
2897 point->setPosition( sprite1->getPosition() );
2898 addChild(point, 10);
2899
2900
2901 // anchor (1,1)
2902 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_08.png");
2903 sprite1->setPosition(Vec2(s.width/2+s.width/4,s.height/2));
2904 sprite1->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
2905
2906
2907 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2908 sprite2->setPosition(Vec2(20.0f,30.0f));
2909
2910 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2911 sprite3->setPosition(Vec2(-20.0f,30.0f));
2912
2913 sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png");
2914 sprite4->setPosition(Vec2(0.0f,0.0f));
2915 sprite4->setScale( 0.5f );
2916
2917 aParent->addChild(sprite1);
2918 sprite1->addChild(sprite2, -2);
2919 sprite1->addChild(sprite3, -2);
2920 sprite1->addChild(sprite4, 3);
2921
2922 point = Sprite::create("Images/r1.png");
2923 point->setScale( 0.25f );
2924 point->setPosition( sprite1->getPosition() );
2925 addChild(point, 10);
2926}
2927
2929{
2930 SpriteTestDemo::onExit();
2931 SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
2932}
2933
2935{
2936 return "Testing Sprite";
2937}
2938
2940{
2941 return "children + anchor point";
2942}
2943
2944//------------------------------------------------------------------
2945//
2946// SpriteBatchNodeChildrenAnchorPoint
2947//
2948//------------------------------------------------------------------
2950{
2951 auto s = Director::getInstance()->getWinSize();
2952
2953 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
2954
2955 Node *aParent;
2956 Sprite* sprite1, *sprite2, *sprite3, *sprite4, *point;
2957 //
2958 // SpriteBatchNode
2959 //
2960 // parents
2961
2962 aParent = SpriteBatchNode::create("animations/grossini.png", 50);
2963 addChild(aParent, 0);
2964
2965 // anchor (0,0)
2966 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_08.png");
2967 sprite1->setPosition(Vec2(s.width/4,s.height/2));
2968 sprite1->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT );
2969
2970 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2971 sprite2->setPosition(Vec2(20.0f,30.0f));
2972
2973 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
2974 sprite3->setPosition(Vec2(-20.0f,30.0f));
2975
2976 sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png");
2977 sprite4->setPosition(Vec2(0.0f,0.0f));
2978 sprite4->setScale( 0.5f );
2979
2980 aParent->addChild(sprite1);
2981 sprite1->addChild(sprite2, -2);
2982 sprite1->addChild(sprite3, -2);
2983 sprite1->addChild(sprite4, 3);
2984
2985 point = Sprite::create("Images/r1.png");
2986 point->setScale( 0.25f );
2987 point->setPosition( sprite1->getPosition() );
2988 addChild(point, 10);
2989
2990
2991 // anchor (0.5, 0.5)
2992 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_08.png");
2993 sprite1->setPosition(Vec2(s.width/2,s.height/2));
2994 sprite1->setAnchorPoint( Vec2::ANCHOR_MIDDLE );
2995
2996 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
2997 sprite2->setPosition(Vec2(20.0f,30.0f));
2998
2999 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
3000 sprite3->setPosition(Vec2(-20.0f,30.0f));
3001
3002 sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png");
3003 sprite4->setPosition(Vec2(0.0f,0.0f));
3004 sprite4->setScale( 0.5f );
3005
3006 aParent->addChild(sprite1);
3007 sprite1->addChild(sprite2, -2);
3008 sprite1->addChild(sprite3, -2);
3009 sprite1->addChild(sprite4, 3);
3010
3011 point = Sprite::create("Images/r1.png");
3012 point->setScale( 0.25f );
3013 point->setPosition( sprite1->getPosition() );
3014 addChild(point, 10);
3015
3016
3017 // anchor (1,1)
3018 sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_08.png");
3019 sprite1->setPosition(Vec2(s.width/2+s.width/4,s.height/2));
3020 sprite1->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT );
3021
3022 sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png");
3023 sprite2->setPosition(Vec2(20.0f,30.0f));
3024
3025 sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png");
3026 sprite3->setPosition(Vec2(-20.0f,30.0f));
3027
3028 sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png");
3029 sprite4->setPosition(Vec2(0.0f,0.0f));
3030 sprite4->setScale( 0.5f );
3031
3032 aParent->addChild(sprite1);
3033 sprite1->addChild(sprite2, -2);
3034 sprite1->addChild(sprite3, -2);
3035 sprite1->addChild(sprite4, 3);
3036
3037 point = Sprite::create("Images/r1.png");
3038 point->setScale( 0.25f );
3039 point->setPosition( sprite1->getPosition() );
3040 addChild(point, 10);
3041}
3042
3044{
3045 SpriteTestDemo::onExit();
3046 SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
3047}
3048
3050{
3051 return "Testing SpriteBatchNode";
3052}
3053
3055{
3056 return "children + anchor point";
3057}
3058
3059
3060//------------------------------------------------------------------
3061//
3062// SpriteBatchNodeChildrenScale
3063//
3064//------------------------------------------------------------------
3066{
3067 auto s = Director::getInstance()->getWinSize();
3068
3069 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
3070
3071 Node *aParent;
3072 Sprite* sprite1, *sprite2;
3073 auto rot = RotateBy::create(10, 360);
3074 auto seq = RepeatForever::create(rot);
3075
3076 //
3077 // Children + Scale using Sprite
3078 // Test 1
3079 //
3080 aParent = Node::create();
3081 sprite1 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
3082 sprite1->setPosition( Vec2( s.width/4, s.height/4) );
3083 sprite1->setScaleX( -0.5f );
3084 sprite1->setScaleY( 2.0f );
3085 sprite1->runAction(seq);
3086
3087
3088 sprite2 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
3089 sprite2->setPosition( Vec2( 50,0) );
3090
3091 addChild(aParent);
3092 aParent->addChild(sprite1);
3093 sprite1->addChild(sprite2);
3094
3095
3096 //
3097 // Children + Scale using SpriteBatchNode
3098 // Test 2
3099 //
3100
3101 aParent = SpriteBatchNode::create("animations/grossini_family.png");
3102 sprite1 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
3103 sprite1->setPosition( Vec2( 3*s.width/4, s.height/4) );
3104 sprite1->setScaleX( -0.5f );
3105 sprite1->setScaleY( 2.0f );
3106 sprite1->runAction( seq->clone() );
3107
3108 sprite2 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
3109 sprite2->setPosition( Vec2( 50,0) );
3110
3111 addChild(aParent);
3112 aParent->addChild(sprite1);
3113 sprite1->addChild(sprite2);
3114
3115
3116 //
3117 // Children + Scale using Sprite
3118 // Test 3
3119 //
3120
3121 aParent = Node::create();
3122 sprite1 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
3123 sprite1->setPosition( Vec2( s.width/4, 2*s.height/3) );
3124 sprite1->setScaleX( 1.5f );
3125 sprite1->setScaleY( -0.5f );
3126 sprite1->runAction( seq->clone() );
3127
3128 sprite2 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
3129 sprite2->setPosition( Vec2( 50,0) );
3130
3131 addChild(aParent);
3132 aParent->addChild(sprite1);
3133 sprite1->addChild(sprite2);
3134
3135 //
3136 // Children + Scale using Sprite
3137 // Test 4
3138 //
3139
3140 aParent = SpriteBatchNode::create("animations/grossini_family.png");
3141 sprite1 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
3142 sprite1->setPosition( Vec2( 3*s.width/4, 2*s.height/3) );
3143 sprite1->setScaleX( 1.5f );
3144 sprite1->setScaleY( -0.5f);
3145 sprite1->runAction( seq->clone() );
3146
3147 sprite2 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
3148 sprite2->setPosition( Vec2( 50,0) );
3149
3150 addChild(aParent);
3151 aParent->addChild(sprite1);
3152 sprite1->addChild(sprite2);
3153
3154}
3155
3157{
3158 return "Testing Sprite / SpriteBatchNode";
3159}
3160
3162{
3163 return "child + scale + rot";
3164}
3165
3166//------------------------------------------------------------------
3167//
3168// SpriteChildrenChildren
3169//
3170//------------------------------------------------------------------
3172{
3173 auto s = Director::getInstance()->getWinSize();
3174
3175 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist");
3176
3177 Node *aParent;
3178 Sprite *l1, *l2a, *l2b, *l3a1, *l3a2, *l3b1, *l3b2;
3179 auto rot = RotateBy::create(10, 360);
3180 auto seq = RepeatForever::create(rot);
3181
3182 auto rot_back = rot->reverse();
3183 auto rot_back_fe = RepeatForever::create(rot_back);
3184
3185 //
3186 // SpriteBatchNode: 3 levels of children
3187 //
3188
3189 aParent = Node::create();
3190 addChild(aParent);
3191
3192 // parent
3193 l1 = Sprite::createWithSpriteFrameName("father.gif");
3194 l1->setPosition( Vec2( s.width/2, s.height/2) );
3195 l1->runAction( seq->clone() );
3196 aParent->addChild(l1);
3197 auto l1Size = l1->getContentSize();
3198
3199 // child left
3200 l2a = Sprite::createWithSpriteFrameName("sister1.gif");
3201 l2a->setPosition( Vec2( -50 + l1Size.width/2, 0 + l1Size.height/2) );
3202 l2a->runAction( rot_back_fe->clone() );
3203 l1->addChild(l2a);
3204 auto l2aSize = l2a->getContentSize();
3205
3206
3207 // child right
3208 l2b = Sprite::createWithSpriteFrameName("sister2.gif");
3209 l2b->setPosition( Vec2( +50 + l1Size.width/2, 0 + l1Size.height/2) );
3210 l2b->runAction( rot_back_fe->clone() );
3211 l1->addChild(l2b);
3212 auto l2bSize = l2a->getContentSize();
3213
3214
3215 // child left bottom
3216 l3a1 = Sprite::createWithSpriteFrameName("child1.gif");
3217 l3a1->setScale( 0.45f );
3218 l3a1->setPosition( Vec2(0+l2aSize.width/2,-100+l2aSize.height/2) );
3219 l2a->addChild(l3a1);
3220
3221 // child left top
3222 l3a2 = Sprite::createWithSpriteFrameName("child1.gif");
3223 l3a2->setScale( 0.45f );
3224 l3a1->setPosition( Vec2(0+l2aSize.width/2,+100+l2aSize.height/2) );
3225 l2a->addChild(l3a2);
3226
3227 // child right bottom
3228 l3b1 = Sprite::createWithSpriteFrameName("child1.gif");
3229 l3b1->setScale( 0.45f);
3230 l3b1->setFlippedY( true );
3231 l3b1->setPosition( Vec2(0+l2bSize.width/2,-100+l2bSize.height/2) );
3232 l2b->addChild(l3b1);
3233
3234 // child right top
3235 l3b2 = Sprite::createWithSpriteFrameName("child1.gif");
3236 l3b2->setScale( 0.45f );
3237 l3b2->setFlippedY( true );
3238 l3b1->setPosition( Vec2(0+l2bSize.width/2,+100+l2bSize.height/2) );
3239 l2b->addChild(l3b2);
3240}
3241
3243{
3244 return "Testing Sprite";
3245}
3246
3248{
3249 return "multiple levels of children";
3250}
3251
3252
3253//------------------------------------------------------------------
3254//
3255// SpriteBatchNodeChildrenChildren
3256//
3257//------------------------------------------------------------------
3258
3260{
3261 auto s = Director::getInstance()->getWinSize();
3262
3263 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist");
3264
3265 SpriteBatchNode *aParent;
3266 Sprite *l1, *l2a, *l2b, *l3a1, *l3a2, *l3b1, *l3b2;
3267 auto rot = RotateBy::create(10, 360);
3268 auto seq = RepeatForever::create(rot);
3269
3270 auto rot_back = rot->reverse();
3271 auto rot_back_fe = RepeatForever::create(rot_back);
3272
3273 //
3274 // SpriteBatchNode: 3 levels of children
3275 //
3276
3277 aParent = SpriteBatchNode::create("animations/ghosts.png");
3278 //TODO: minggo
3279// aParent->getTexture()->generateMipmap();
3280 addChild(aParent);
3281
3282 // parent
3283 l1 = Sprite::createWithSpriteFrameName("father.gif");
3284 l1->setPosition( Vec2( s.width/2, s.height/2) );
3285 l1->runAction( seq->clone() );
3286 aParent->addChild(l1);
3287 auto l1Size = l1->getContentSize();
3288
3289 // child left
3290 l2a = Sprite::createWithSpriteFrameName("sister1.gif");
3291 l2a->setPosition( Vec2( -50 + l1Size.width/2, 0 + l1Size.height/2) );
3292 l2a->runAction( rot_back_fe->clone() );
3293 l1->addChild(l2a);
3294 auto l2aSize = l2a->getContentSize();
3295
3296
3297 // child right
3298 l2b = Sprite::createWithSpriteFrameName("sister2.gif");
3299 l2b->setPosition( Vec2( +50 + l1Size.width/2, 0 + l1Size.height/2) );
3300 l2b->runAction( rot_back_fe->clone() );
3301 l1->addChild(l2b);
3302 auto l2bSize = l2a->getContentSize();
3303
3304
3305 // child left bottom
3306 l3a1 = Sprite::createWithSpriteFrameName("child1.gif");
3307 l3a1->setScale( 0.45f );
3308 l3a1->setPosition( Vec2(0+l2aSize.width/2,-100+l2aSize.height/2) );
3309 l2a->addChild(l3a1);
3310
3311 // child left top
3312 l3a2 = Sprite::createWithSpriteFrameName("child1.gif");
3313 l3a2->setScale( 0.45f );
3314 l3a1->setPosition( Vec2(0+l2aSize.width/2,+100+l2aSize.height/2) );
3315 l2a->addChild(l3a2);
3316
3317 // child right bottom
3318 l3b1 = Sprite::createWithSpriteFrameName("child1.gif");
3319 l3b1->setScale( 0.45f );
3320 l3b1->setFlippedY( true );
3321 l3b1->setPosition( Vec2(0+l2bSize.width/2,-100+l2bSize.height/2) );
3322 l2b->addChild(l3b1);
3323
3324 // child right top
3325 l3b2 = Sprite::createWithSpriteFrameName("child1.gif");
3326 l3b2->setScale( 0.45f );
3327 l3b2->setFlippedY( true );
3328 l3b1->setPosition( Vec2(0+l2bSize.width/2,+100+l2bSize.height/2) );
3329 l2b->addChild(l3b2);
3330
3331}
3332
3334{
3335 return "Testing SpriteBatchNode";
3336}
3337
3339{
3340 return "multiple levels of children";
3341}
3342
3343//------------------------------------------------------------------
3344//
3345// SpriteBatchNodeSkewNegativeScaleChildren
3346//
3347//------------------------------------------------------------------
3348
3350{
3351 auto s = Director::getInstance()->getWinSize();
3352
3353 auto cache = SpriteFrameCache::getInstance();
3354 cache->addSpriteFramesWithFile("animations/grossini.plist");
3355 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
3356
3357 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
3358 addChild(spritebatch);
3359
3360 for(int i=0;i<2;i++) {
3361 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
3362 sprite->setPosition(Vec2( s.width/4*(i+1), s.height/2));
3363
3364 // Skew
3365 auto skewX = SkewBy::create(2, 45, 0);
3366 auto skewX_back = skewX->reverse();
3367 auto skewY = SkewBy::create(2, 0, 45);
3368 auto skewY_back = skewY->reverse();
3369
3370 if(i == 1)
3371 {
3372 sprite->setScale(-1.0f);
3373 }
3374
3375 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
3376 sprite->runAction(RepeatForever::create(seq_skew));
3377
3378 auto child1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
3379 child1->setPosition(Vec2(sprite->getContentSize().width / 2.0f, sprite->getContentSize().height / 2.0f));
3380
3381 child1->setScale(0.8f);
3382
3383 sprite->addChild(child1);
3384
3385 spritebatch->addChild(sprite, i);
3386 }
3387}
3388
3390{
3391 auto cache = SpriteFrameCache::getInstance();
3392 cache->removeSpriteFramesFromFile("animations/grossini.plist");
3393 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
3394}
3395
3397{
3398 return "Testing SpriteBatchNode";
3399}
3400
3402{
3403 return "skew + negative scale with children";
3404}
3405
3406// SpriteSkewNegativeScaleChildren
3407
3409{
3410 auto s = Director::getInstance()->getWinSize();
3411
3412 auto cache = SpriteFrameCache::getInstance();
3413 cache->addSpriteFramesWithFile("animations/grossini.plist");
3414 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
3415
3416 auto parent = Node::create();
3417 addChild(parent);
3418
3419 for(int i=0;i<2;i++) {
3420 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
3421 sprite->setPosition(Vec2( s.width/4*(i+1), s.height/2));
3422
3423 // Skew
3424 auto skewX = SkewBy::create(2, 45, 0);
3425 auto skewX_back = skewX->reverse();
3426 auto skewY = SkewBy::create(2, 0, 45);
3427 auto skewY_back = skewY->reverse();
3428
3429 if(i == 1)
3430 {
3431 sprite->setScale(-1.0f);
3432 }
3433
3434 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
3435 sprite->runAction(RepeatForever::create(seq_skew));
3436
3437 auto child1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
3438 child1->setPosition(Vec2(sprite->getContentSize().width / 2.0f, sprite->getContentSize().height / 2.0f));
3439
3440 sprite->addChild(child1);
3441
3442 child1->setScale(0.8f);
3443
3444 parent->addChild(sprite, i);
3445 }
3446}
3447
3449{
3450 auto cache = SpriteFrameCache::getInstance();
3451 cache->removeSpriteFramesFromFile("animations/grossini.plist");
3452 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
3453}
3454
3456{
3457 return "Testing Sprite";
3458}
3459
3461{
3462 return "skew + negative scale with children";
3463}
3464
3465//------------------------------------------------------------------
3466//
3467// SpriteNilTexture
3468//
3469//------------------------------------------------------------------
3470
3472{
3473 auto s = Director::getInstance()->getWinSize();
3474
3475 Sprite* sprite = nullptr;
3476
3477 // TEST: If no texture is given, then Opacity + Color should work.
3478
3479 sprite = Sprite::create();
3480 sprite->setTextureRect( Rect(0, 0, 300,300) );
3481 sprite->setColor(Color3B::RED);
3482 sprite->setOpacity(128);
3483 sprite->setPosition(Vec2(3*s.width/4, s.height/2));
3484 addChild(sprite, 100);
3485
3486 sprite = Sprite::create();
3487 sprite->setTextureRect(Rect(0.0f, 0.0f, 300.0f,300.0f));
3488 sprite->setColor(Color3B::BLUE);
3489 sprite->setOpacity(128);
3490 sprite->setPosition(Vec2(1*s.width/4, s.height/2));
3491 addChild(sprite, 100);
3492}
3493
3494std::string SpriteNilTexture::title() const
3495{
3496 return "Sprite without texture";
3497}
3498
3500{
3501 return "opacity and color should work";
3502}
3503
3504class MySprite1 : public Sprite
3505{
3506public:
3509 static MySprite1* createWithSpriteFrameName(const std::string& spriteFrameName)
3510 {
3511 auto sprite = MySprite1::create();
3512 sprite->setSpriteFrame(spriteFrameName);
3513 return sprite;
3514 }
3515};
3516
3517class MySprite2 : public Sprite
3518{
3519public:
3522 static MySprite2* create(const std::string& name)
3523 {
3524 auto sprite = MySprite2::create();
3525 sprite ->setTexture(name);
3526 return sprite;
3527 }
3528};
3529
3530//------------------------------------------------------------------
3531//
3532// SpriteSubclass
3533//
3534//------------------------------------------------------------------
3536{
3537 auto s = Director::getInstance()->getWinSize();
3538
3539 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist");
3540 auto aParent = SpriteBatchNode::create("animations/ghosts.png");
3541
3542 // MySprite1
3543 MySprite1 *sprite = MySprite1::createWithSpriteFrameName("father.gif");
3544 sprite->setPosition(Vec2( s.width/4*1, s.height/2));
3545 aParent->addChild(sprite);
3546 addChild(aParent);
3547
3548 // MySprite2
3549 MySprite2 *sprite2 = MySprite2::create("Images/grossini.png");
3550 addChild(sprite2);
3551 sprite2->setPosition(Vec2(s.width/4*3, s.height/2));
3552}
3553
3554std::string SpriteSubclass::title() const
3555{
3556 return "Sprite subclass";
3557}
3558
3559std::string SpriteSubclass::subtitle() const
3560{
3561 return "Testing initWithTexture:rect method";
3562}
3563
3564//------------------------------------------------------------------
3565//
3566// AnimationCache
3567//
3568//------------------------------------------------------------------
3570{
3571 auto frameCache = SpriteFrameCache::getInstance();
3572 frameCache->addSpriteFramesWithFile("animations/grossini.plist");
3573 frameCache->addSpriteFramesWithFile("animations/grossini_gray.plist");
3574 frameCache->addSpriteFramesWithFile("animations/grossini_blue.plist");
3575
3576 //
3577 // create animation "dance"
3578 //
3579 Vector<SpriteFrame*> animFrames(15);
3580 char str[100] = {0};
3581 for(int i = 1; i < 15; i++)
3582 {
3583 sprintf(str, "grossini_dance_%02d.png",i);
3584 auto frame = frameCache->getSpriteFrameByName(str);
3585 animFrames.pushBack(frame);
3586 }
3587
3588 auto animation = Animation::createWithSpriteFrames(animFrames, 0.2f);
3589
3590 // Add an animation to the Cache
3591 AnimationCache::getInstance()->addAnimation(animation, "dance");
3592
3593 //
3594 // create animation "dance gray"
3595 //
3596 animFrames.clear();
3597
3598 for(int i = 1; i < 15; i++)
3599 {
3600 sprintf(str, "grossini_dance_gray_%02d.png",i);
3601 auto frame = frameCache->getSpriteFrameByName(str);
3602 animFrames.pushBack(frame);
3603 }
3604
3605 animation = Animation::createWithSpriteFrames(animFrames, 0.2f);
3606
3607 // Add an animation to the Cache
3608 AnimationCache::getInstance()->addAnimation(animation, "dance_gray");
3609
3610 //
3611 // create animation "dance blue"
3612 //
3613 animFrames.clear();
3614
3615 for(int i = 1; i < 4; i++)
3616 {
3617 sprintf(str, "grossini_blue_%02d.png",i);
3618 auto frame = frameCache->getSpriteFrameByName(str);
3619 animFrames.pushBack(frame);
3620 }
3621
3622 animation = Animation::createWithSpriteFrames(animFrames, 0.2f);
3623
3624 // Add an animation to the Cache
3625 AnimationCache::getInstance()->addAnimation(animation, "dance_blue");
3626
3627
3628 auto animCache = AnimationCache::getInstance();
3629
3630 auto normal = animCache->getAnimation("dance");
3631 normal->setRestoreOriginalFrame(true);
3632 auto dance_grey = animCache->getAnimation("dance_gray");
3633 dance_grey->setRestoreOriginalFrame(true);
3634 auto dance_blue = animCache->getAnimation("dance_blue");
3635 dance_blue->setRestoreOriginalFrame(true);
3636
3637 auto animN = Animate::create(normal);
3638 auto animG = Animate::create(dance_grey);
3639 auto animB = Animate::create(dance_blue);
3640
3641 auto seq = Sequence::create(animN, animG, animB, nullptr);
3642
3643 // create an sprite without texture
3644 auto grossini = Sprite::create();
3645 auto frame = frameCache->getSpriteFrameByName("grossini_dance_01.png");
3646 grossini->setSpriteFrame(frame);
3647
3648 auto winSize = Director::getInstance()->getWinSize();
3649 grossini->setPosition(Vec2(winSize.width/2, winSize.height/2));
3650 addChild(grossini);
3651
3652 // run the animation
3653 grossini->runAction(seq);
3654}
3655
3657{
3658 auto frameCache = SpriteFrameCache::getInstance();
3659 frameCache->removeSpriteFramesFromFile("animations/grossini.plist");
3660 frameCache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
3661 frameCache->removeSpriteFramesFromFile("animations/grossini_blue.plist");
3662}
3663
3664std::string AnimationCacheTest::title() const
3665{
3666 return "AnimationCache";
3667}
3668
3670{
3671 return "Sprite should be animated";
3672}
3673
3674// AnimationCacheFile
3675
3676
3678{
3679 auto frameCache = SpriteFrameCache::getInstance();
3680 frameCache->addSpriteFramesWithFile("animations/grossini.plist");
3681 frameCache->addSpriteFramesWithFile("animations/grossini_gray.plist");
3682 frameCache->addSpriteFramesWithFile("animations/grossini_blue.plist");
3683
3684
3685 // Purge previously loaded animation
3686 AnimationCache::destroyInstance();
3687
3688 auto animCache = AnimationCache::getInstance();
3689
3690 // Add an animation to the Cache
3691 animCache->addAnimationsWithFile("animations/animations.plist");
3692
3693
3694 auto normal = animCache->getAnimation("dance_1");
3695 normal->setRestoreOriginalFrame(true);
3696 auto dance_grey = animCache->getAnimation("dance_2");
3697 dance_grey->setRestoreOriginalFrame(true);
3698 auto dance_blue = animCache->getAnimation("dance_3");
3699 dance_blue->setRestoreOriginalFrame(true);
3700
3701 auto animN = Animate::create(normal);
3702 auto animG = Animate::create(dance_grey);
3703 auto animB = Animate::create(dance_blue);
3704
3705 auto seq = Sequence::create(animN, animG, animB, nullptr);
3706
3707 // create an sprite without texture
3708 auto grossini = Sprite::create();
3709
3710 auto frame = frameCache->getSpriteFrameByName("grossini_dance_01.png");
3711 grossini->setSpriteFrame(frame);
3712
3713 auto winSize = Director::getInstance()->getWinSize();
3714
3715 grossini->setPosition(Vec2(winSize.width/2, winSize.height/2));
3716
3717 addChild(grossini);
3718
3719
3720 // run the animation
3721 grossini->runAction(seq);
3722}
3723
3725{
3726 auto frameCache = SpriteFrameCache::getInstance();
3727 frameCache->removeSpriteFramesFromFile("animations/grossini.plist");
3728 frameCache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
3729 frameCache->removeSpriteFramesFromFile("animations/grossini_blue.plist");
3730}
3731
3732std::string AnimationCacheFile::title() const
3733{
3734 return "AnimationCache - Load file";
3735}
3736
3738{
3739 return "Sprite should be animated";
3740}
3741
3742// SpriteBatchBug1217
3743
3745{
3746 auto bn = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 15);
3747
3748 auto s1 = Sprite::createWithTexture(bn->getTexture(), Rect(0.0f, 0.0f, 57.0f, 57.0f));
3749 auto s2 = Sprite::createWithTexture(bn->getTexture(), Rect(0.0f, 0.0f, 57.0f, 57.0f));
3750 auto s3 = Sprite::createWithTexture(bn->getTexture(), Rect(0.0f, 0.0f, 57.0f, 57.0f));
3751
3752 s1->setColor(Color3B(255, 0, 0));
3753 s2->setColor(Color3B(0, 255, 0));
3754 s3->setColor(Color3B(0, 0, 255));
3755
3756 s1->setPosition(Vec2(20.0f,200.0f));
3757 s2->setPosition(Vec2(100.0f,0.0f));
3758 s3->setPosition(Vec2(100.0f,0.0f));
3759
3760 bn->setPosition(Vec2(0.0f,0.0f));
3761
3763 s1->addChild(s2);
3764 s2->addChild(s3);
3765 bn->addChild(s1);
3766
3767 addChild(bn);
3768}
3769
3770std::string SpriteBatchBug1217::title() const
3771{
3772 return "SpriteBatch - Bug 1217";
3773}
3774
3776{
3777 return "Adding big family to spritebatch. You shall see 3 heads";
3778}
3779
3780//
3781// SpriteOffsetAnchorSkew
3782//
3784{
3785 auto s = Director::getInstance()->getWinSize();
3786
3787 auto cache = SpriteFrameCache::getInstance();
3788 cache->addSpriteFramesWithFile("animations/grossini.plist");
3789 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
3790
3791 for (int i = 0; i < 3; i++)
3792 {
3793 //
3794 // Animation using Sprite batch
3795 //
3796 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
3797 sprite->setPosition(Vec2(s.width / 4 * (i + 1), s.height / 2));
3798
3799 auto point = Sprite::create("Images/r1.png");
3800 point->setScale(0.25f);
3801 point->setPosition(sprite->getPosition());
3802 addChild(point, 1);
3803
3804 switch (i)
3805 {
3806 case 0:
3807 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
3808 break;
3809 case 1:
3810 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
3811 break;
3812 case 2:
3813 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
3814 break;
3815 }
3816
3817 point->setPosition(sprite->getPosition());
3818
3819 Vector<SpriteFrame*> animFrames(14);
3820 char tmp[50];
3821 for (int j = 0; j < 14; j++)
3822 {
3823 sprintf(tmp, "grossini_dance_%02d.png", j + 1);
3824 auto frame = cache->getSpriteFrameByName(tmp);
3825 animFrames.pushBack(frame);
3826 }
3827
3828 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
3829 sprite->runAction(RepeatForever::create(Animate::create(animation)));
3830
3831 auto skewX = SkewBy::create(2, 45, 0);
3832 auto skewX_back = skewX->reverse();
3833 auto skewY = SkewBy::create(2, 0, 45);
3834 auto skewY_back = skewY->reverse();
3835
3836 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
3837 sprite->runAction(RepeatForever::create(seq_skew));
3838
3839 addChild(sprite, 0);
3840 }
3841}
3842
3844{
3845 auto cache = SpriteFrameCache::getInstance();
3846 cache->removeSpriteFramesFromFile("animations/grossini.plist");
3847 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
3848}
3849
3851{
3852 return "Testing Sprite";
3853}
3854
3856{
3857 return "offset + anchor + skew";
3858}
3859
3860//
3861// SpriteBatchNodeOffsetAnchorSkew
3862//
3864{
3865 auto s = Director::getInstance()->getWinSize();
3866
3867 auto cache = SpriteFrameCache::getInstance();
3868 cache->addSpriteFramesWithFile("animations/grossini.plist");
3869 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
3870
3871 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
3872 addChild(spritebatch);
3873
3874 for (int i = 0; i < 3; i++)
3875 {
3876 //
3877 // Animation using Sprite batch
3878 //
3879 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
3880 sprite->setPosition(Vec2(s.width / 4 * (i + 1), s.height / 2));
3881
3882 auto point = Sprite::create("Images/r1.png");
3883 point->setScale(0.25f);
3884 point->setPosition(sprite->getPosition());
3885 addChild(point, 200);
3886
3887 switch (i)
3888 {
3889 case 0:
3890 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
3891 break;
3892 case 1:
3893 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
3894 break;
3895 case 2:
3896 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT );
3897 break;
3898 }
3899
3900 point->setPosition(sprite->getPosition());
3901
3902 Vector<SpriteFrame*> animFrames(14);
3903 char tmp[50];
3904 for (int j = 0; j < 14; j++)
3905 {
3906 sprintf(tmp, "grossini_dance_%02d.png", j + 1);
3907 auto frame = cache->getSpriteFrameByName(tmp);
3908 animFrames.pushBack(frame);
3909 }
3910
3911 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
3912 sprite->runAction(RepeatForever::create(Animate::create(animation)));
3913
3914 auto skewX = SkewBy::create(2, 45, 0);
3915 auto skewX_back = skewX->reverse();
3916 auto skewY = SkewBy::create(2, 0, 45);
3917 auto skewY_back = skewY->reverse();
3918
3919 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
3920 sprite->runAction(RepeatForever::create(seq_skew));
3921
3922 spritebatch->addChild(sprite, i);
3923 }
3924}
3925
3927{
3928 auto cache = SpriteFrameCache::getInstance();
3929 cache->removeSpriteFramesFromFile("animations/grossini.plist");
3930 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
3931}
3932
3934{
3935 return "Testing SpriteBatchNode";
3936}
3937
3939{
3940 return "offset + anchor + skew";
3941}
3942
3943//
3944// SpriteOffsetAnchorSkewScale
3945//
3947{
3948 auto s = Director::getInstance()->getWinSize();
3949
3950 auto cache = SpriteFrameCache::getInstance();
3951 cache->addSpriteFramesWithFile("animations/grossini.plist");
3952 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
3953
3954 for (int i = 0; i < 3; i++)
3955 {
3956 //
3957 // Animation using Sprite batch
3958 //
3959 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
3960 sprite->setPosition(Vec2(s.width / 4 * (i + 1), s.height / 2));
3961
3962 auto point = Sprite::create("Images/r1.png");
3963 point->setScale(0.25f);
3964 point->setPosition(sprite->getPosition());
3965 addChild(point, 1);
3966
3967 switch (i)
3968 {
3969 case 0:
3970 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
3971 break;
3972 case 1:
3973 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
3974 break;
3975 case 2:
3976 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT );
3977 break;
3978 }
3979
3980 point->setPosition(sprite->getPosition());
3981
3982 Vector<SpriteFrame*> animFrames(14);
3983 char tmp[50];
3984 for (int j = 0; j < 14; j++)
3985 {
3986 sprintf(tmp, "grossini_dance_%02d.png", j + 1);
3987 auto frame = cache->getSpriteFrameByName(tmp);
3988 animFrames.pushBack(frame);
3989 }
3990
3991 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
3992 sprite->runAction(RepeatForever::create(Animate::create(animation)));
3993
3994 // Skew
3995 auto skewX = SkewBy::create(2, 45, 0);
3996 auto skewX_back = skewX->reverse();
3997 auto skewY = SkewBy::create(2, 0, 45);
3998 auto skewY_back = skewY->reverse();
3999
4000 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4001 sprite->runAction(RepeatForever::create(seq_skew));
4002
4003 // Scale
4004 auto scale = ScaleBy::create(2, 2);
4005 auto scale_back = scale->reverse();
4006 auto seq_scale = Sequence::create(scale, scale_back, nullptr);
4007 sprite->runAction(RepeatForever::create(seq_scale));
4008
4009 addChild(sprite, 0);
4010 }
4011}
4012
4014{
4015 auto cache = SpriteFrameCache::getInstance();
4016 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4017 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4018}
4019
4021{
4022 return "Testing Sprite";
4023}
4024
4026{
4027 return "anchor + skew + scale";
4028}
4029
4031
4033{
4034 auto s = Director::getInstance()->getWinSize();
4035
4036 auto cache = SpriteFrameCache::getInstance();
4037 cache->addSpriteFramesWithFile("animations/grossini.plist");
4038 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4039
4040 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
4041 addChild(spritebatch);
4042
4043 for (int i = 0; i < 3; i++)
4044 {
4045 //
4046 // Animation using Sprite batch
4047 //
4048 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4049 sprite->setPosition(Vec2(s.width / 4 * (i + 1), s.height / 2));
4050
4051 auto point = Sprite::create("Images/r1.png");
4052 point->setScale(0.25f);
4053 point->setPosition(sprite->getPosition());
4054 addChild(point, 200);
4055
4056 switch (i)
4057 {
4058 case 0:
4059 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
4060 break;
4061 case 1:
4062 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
4063 break;
4064 case 2:
4065 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT );
4066 break;
4067 }
4068
4069 point->setPosition(sprite->getPosition());
4070
4071 Vector<SpriteFrame*> animFrames(14);
4072 char tmp[50];
4073 for (int j = 0; j < 14; j++)
4074 {
4075 sprintf(tmp, "grossini_dance_%02d.png", j + 1);
4076 auto frame = cache->getSpriteFrameByName(tmp);
4077 animFrames.pushBack(frame);
4078 }
4079
4080 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
4081 sprite->runAction(RepeatForever::create(Animate::create(animation)));
4082
4083 // skew
4084 auto skewX = SkewBy::create(2, 45, 0);
4085 auto skewX_back = skewX->reverse();
4086 auto skewY = SkewBy::create(2, 0, 45);
4087 auto skewY_back = skewY->reverse();
4088
4089 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4090 sprite->runAction(RepeatForever::create(seq_skew));
4091
4092 // scale
4093 auto scale = ScaleBy::create(2, 2);
4094 auto scale_back = scale->reverse();
4095 auto seq_scale = Sequence::create(scale, scale_back, nullptr);
4096 sprite->runAction(RepeatForever::create(seq_scale));
4097
4098 spritebatch->addChild(sprite, i);
4099 }
4100}
4101
4103{
4104 auto cache = SpriteFrameCache::getInstance();
4105 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4106 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4107}
4108
4110{
4111 return "Testing SpriteBatchNode";
4112}
4113
4115{
4116 return "anchor + skew + scale";
4117}
4118
4119
4120//
4121// SpriteOffsetAnchorFlip
4122//
4124{
4125 auto s = Director::getInstance()->getWinSize();
4126
4127 auto cache = SpriteFrameCache::getInstance();
4128 cache->addSpriteFramesWithFile("animations/grossini.plist");
4129 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4130
4131 for (int i = 0; i < 3; i++)
4132 {
4133 //
4134 // Animation using Sprite batch
4135 //
4136 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4137 sprite->setPosition(Vec2(s.width / 4 * (i + 1), s.height / 2));
4138
4139 auto point = Sprite::create("Images/r1.png");
4140 point->setScale(0.25f);
4141 point->setPosition(sprite->getPosition());
4142 addChild(point, 1);
4143
4144 switch (i)
4145 {
4146 case 0:
4147 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
4148 break;
4149 case 1:
4150 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
4151 break;
4152 case 2:
4153 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT );
4154 break;
4155 }
4156
4157 point->setPosition(sprite->getPosition());
4158
4159 Vector<SpriteFrame*> animFrames(14);
4160 char tmp[50];
4161 for (int j = 0; j < 14; j++)
4162 {
4163 sprintf(tmp, "grossini_dance_%02d.png", i + 1);
4164 auto frame = cache->getSpriteFrameByName(tmp);
4165 animFrames.pushBack(frame);
4166 }
4167
4168 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
4169 sprite->runAction(RepeatForever::create(Animate::create(animation)));
4170
4171 auto flip = FlipY::create(true);
4172 auto flip_back = FlipY::create(false);
4173 auto delay = DelayTime::create(1);
4174 auto seq = Sequence::create(delay, flip, delay->clone(), flip_back, nullptr);
4175 sprite->runAction(RepeatForever::create(seq));
4176
4177 addChild(sprite, 0);
4178 }
4179}
4180
4182{
4183 auto cache = SpriteFrameCache::getInstance();
4184 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4185 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4186}
4187
4189{
4190 return "Testing Sprite";
4191}
4192
4194{
4195 return "issue #1078: offset + anchor + flip";
4196}
4197
4198//
4199// SpriteBatchNodeOffsetAnchorFlip
4200//
4201
4203{
4204 auto s = Director::getInstance()->getWinSize();
4205
4206 auto cache = SpriteFrameCache::getInstance();
4207 cache->addSpriteFramesWithFile("animations/grossini.plist");
4208 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4209
4210 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
4211 addChild(spritebatch);
4212
4213 for (int i = 0; i < 3; i++)
4214 {
4215 //
4216 // Animation using Sprite batch
4217 //
4218 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4219 sprite->setPosition(Vec2(s.width / 4 * (i + 1), s.height / 2));
4220
4221 auto point = Sprite::create("Images/r1.png");
4222 point->setScale(0.25f);
4223 point->setPosition(sprite->getPosition());
4224 addChild(point, 200);
4225
4226 switch (i)
4227 {
4228 case 0:
4229 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
4230 break;
4231 case 1:
4232 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
4233 break;
4234 case 2:
4235 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT );
4236 break;
4237 }
4238
4239 point->setPosition(sprite->getPosition());
4240
4241 Vector<SpriteFrame*> animFrames(14);
4242 char tmp[50];
4243 for (int j = 0; j < 14; j++)
4244 {
4245 sprintf(tmp, "grossini_dance_%02d.png", i + 1);
4246 auto frame = cache->getSpriteFrameByName(tmp);
4247 animFrames.pushBack(frame);
4248 }
4249
4250 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
4251 sprite->runAction(RepeatForever::create(Animate::create(animation)));
4252
4253 auto flip = FlipY::create(true);
4254 auto flip_back = FlipY::create(false);
4255 auto delay = DelayTime::create(1);
4256 auto seq = Sequence::create(delay, flip, delay->clone(), flip_back, nullptr);
4257 sprite->runAction(RepeatForever::create(seq));
4258
4259 spritebatch->addChild(sprite, i);
4260 }
4261}
4262
4264{
4265 auto cache = SpriteFrameCache::getInstance();
4266 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4267 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4268}
4269
4271{
4272 return "Testing SpriteBatchNode";
4273}
4274
4276{
4277 return "issue #1078: offset + anchor + flip";
4278}
4279
4280
4282
4284{
4285 _node = Node::create();
4286 addChild(_node, 0, 0);
4287
4288 _sprite1 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f));
4289 _sprite1->setPosition(Vec2(100.0f, 160.0f));
4290 _node->addChild(_sprite1, -6, 1);
4291
4292 _sprite2 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f));
4293 _sprite2->setPosition(Vec2(164.0f, 160.0f));
4294 _node->addChild(_sprite2, -6, 2);
4295
4296 _sprite4 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f));
4297 _sprite4->setPosition(Vec2(292.0f, 160.0f));
4298 _node->addChild(_sprite4, -3, 4);
4299
4300 _sprite3 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f));
4301 _sprite3->setPosition(Vec2(228.0f, 160.0f));
4302 _node->addChild(_sprite3, -4, 3);
4303
4304 _sprite5 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f));
4305 _sprite5->setPosition(Vec2(356.0f, 160.0f));
4306 _node->addChild(_sprite5, -3, 5);
4307
4308 schedule(CC_CALLBACK_1(NodeSort::reorderSprite, this), "reorder_sprite_key");
4309}
4310
4311std::string NodeSort::title() const
4312{
4313 return "node sort same index";
4314}
4315
4316std::string NodeSort::subtitle() const
4317{
4318 return "tag order in console should be 2,1,3,4,5";
4319}
4320
4322{
4323 unschedule("reorder_sprite_key");
4324
4325 log("Before reorder--");
4326
4327 auto& children = _node->getChildren();
4328
4329 for(const auto &child : children) {
4330 log("tag %i z %i",(int)child->getTag(),(int)child->getLocalZOrder());
4331 }
4332 //z-4
4333 _node->reorderChild( _node->getChildren().at(0), -6);
4334
4335 _node->sortAllChildren();
4336
4337 log("After reorder--");
4338 for(const auto &child : children) {
4339 log("tag %i z %i",(int)child->getTag(),(int)child->getLocalZOrder());
4340 }
4341}
4342
4345{
4346 _batchNode = SpriteBatchNode::create("Images/piece.png", 15);
4347 addChild(_batchNode, 1, 0);
4348
4349 _sprite1 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f));
4350 _sprite1->setPosition(Vec2(100.0f,160.0f));
4351 _batchNode->addChild(_sprite1, 3, 1);
4352
4353 _sprite2= Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f));
4354 _sprite2->setPosition(Vec2(164.0f,160.0f));
4355 _batchNode->addChild(_sprite2, 4, 2);
4356
4357 _sprite3 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f));
4358 _sprite3->setPosition(Vec2(228.0f,160.0f));
4359 _batchNode->addChild(_sprite3, 4, 3);
4360
4361 _sprite4 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f));
4362 _sprite4->setPosition(Vec2(292.0f,160.0f));
4363 _batchNode->addChild(_sprite4, 5, 4);
4364
4365 _sprite5 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f));
4366 _sprite5->setPosition(Vec2(356.0f,160.0f));
4367 _batchNode->addChild(_sprite5, 6, 5);
4368
4369
4370 scheduleOnce(CC_CALLBACK_1(SpriteBatchNodeReorderSameIndex::reorderSprite, this), 2, "reorder_sprite_key");
4371}
4372
4374{
4375 return "SpriteBatchNodeReorder same index";
4376}
4377
4379{
4380 return "tag order in console should be 2,3,4,5,1";
4381}
4382
4384{
4385 _batchNode->reorderChild(_sprite4, 4);
4386 _batchNode->reorderChild(_sprite5, 4);
4387 _batchNode->reorderChild(_sprite1, 4);
4388
4389 _batchNode->sortAllChildren();
4390
4391 for(const auto &sprite : _batchNode->getDescendants()) {
4392 log("tag %i", sprite->getTag() );
4393 }
4394}
4395
4398{
4399 auto s = Director::getInstance()->getWinSize();
4400
4401 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist");
4402
4403 SpriteBatchNode *aParent;
4404 Sprite *l1, *l2a, *l2b, *l3a1, *l3a2, *l3b1, *l3b2;
4405
4406 //
4407 // SpriteBatchNode: 3 levels of children
4408 //
4409
4410 aParent = SpriteBatchNode::create("animations/ghosts.png");
4411
4412 _batchNode = aParent;
4413 //[[aParent texture] generateMipmap];
4414 addChild(aParent);
4415
4416 // parent
4417 l1 = Sprite::createWithSpriteFrameName("father.gif");
4418 l1->setPosition(Vec2( s.width/2, s.height/2));
4419
4420 aParent->addChild(l1);
4421 auto l1Size = l1->getContentSize();
4422
4423 // child left
4424 l2a = Sprite::createWithSpriteFrameName("sister1.gif");
4425 l2a->setPosition(Vec2( -10 + l1Size.width/2, 0 + l1Size.height/2));
4426
4427 l1->addChild(l2a, 1);
4428 auto l2aSize = l2a->getContentSize();
4429
4430
4431 // child right
4432 l2b = Sprite::createWithSpriteFrameName("sister2.gif");
4433 l2b->setPosition(Vec2( +50 + l1Size.width/2, 0 + l1Size.height/2));
4434
4435 l1->addChild(l2b, 2);
4436 auto l2bSize = l2a->getContentSize();
4437
4438
4439 // child left bottom
4440 l3a1 = Sprite::createWithSpriteFrameName("child1.gif");
4441 l3a1->setScale(0.45f);
4442 l3a1->setPosition(Vec2(0+l2aSize.width/2,-50+l2aSize.height/2));
4443 l2a->addChild(l3a1, 1);
4444
4445 // child left top
4446 l3a2 = Sprite::createWithSpriteFrameName("child1.gif");
4447 l3a2->setScale(0.45f);
4448 l3a2->setPosition(Vec2(0+l2aSize.width/2,+50+l2aSize.height/2));
4449 l2a->addChild(l3a2, 2);
4450
4451 _reorderSprite = l2a;
4452
4453 // child right bottom
4454 l3b1 = Sprite::createWithSpriteFrameName("child1.gif");
4455 l3b1->setScale(0.45f);
4456 l3b1->setFlippedY(true);
4457 l3b1->setPosition(Vec2(0+l2bSize.width/2,-50+l2bSize.height/2));
4458 l2b->addChild(l3b1);
4459
4460 // child right top
4461 l3b2 = Sprite::createWithSpriteFrameName("child1.gif");
4462 l3b2->setScale(0.45f);
4463 l3b2->setFlippedY(true);
4464 l3b2->setPosition(Vec2(0+l2bSize.width/2,+50+l2bSize.height/2));
4465 l2b->addChild(l3b2);
4466
4467 scheduleOnce(CC_CALLBACK_1(SpriteBatchNodeReorderOneChild::reorderSprite, this), 2.0f, "reorder_sprite_key");
4468}
4469
4471{
4472 _reorderSprite->getParent()->reorderChild(_reorderSprite, -1);
4473
4474 _batchNode->sortAllChildren();
4475 //CCSprite* child;
4476 //CCARRAY_FOREACH(batchNode.descendants,child) NSLog(@"tag %i",child.tag);
4477}
4478
4480{
4481 return "SpriteBatchNode reorder 1 child";
4482}
4483
4484//
4485// SpriteOffsetAnchorRotationalSkew
4486//
4488{
4489 auto s = Director::getInstance()->getWinSize();
4490
4491 auto cache = SpriteFrameCache::getInstance();
4492 cache->addSpriteFramesWithFile("animations/grossini.plist");
4493 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4494
4495 for(int i=0;i<3;i++)
4496 {
4497 //
4498 // Animation using Sprite batch
4499 //
4500 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4501 sprite->setPosition(Vec2(s.width/4*(i+1), s.height/2));
4502
4503 auto point = Sprite::create("Images/r1.png");
4504
4505 point->setScale(0.25f);
4506 point->setPosition(sprite->getPosition());
4507 addChild(point, 1);
4508
4509 switch(i)
4510 {
4511 case 0:
4512 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
4513 break;
4514 case 1:
4515 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
4516 break;
4517 case 2:
4518 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
4519 break;
4520 }
4521
4522 point->setPosition(sprite->getPosition());
4523
4524 Vector<SpriteFrame*> animFrames(14);
4525 for(int i = 0; i < 14; i++)
4526 {
4527 char pngName[30];
4528 snprintf(pngName, 30, "grossini_dance_%02d.png", (i+1));
4529 auto frame = cache->getSpriteFrameByName(pngName);
4530 animFrames.pushBack(frame);
4531 }
4532 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
4533 sprite->runAction(RepeatForever::create(Animate::create(animation)));
4534
4535 auto skewX = RotateBy::create(2, 45, 0);
4536 auto skewX_back = skewX->reverse();
4537 auto skewY = RotateBy::create(2, 0, 45);
4538 auto skewY_back = skewY->reverse();
4539
4540 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4541 sprite->runAction(RepeatForever::create(seq_skew));
4542
4543 addChild(sprite, 0);
4544 }
4545}
4546
4548{
4549 auto cache = SpriteFrameCache::getInstance();
4550 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4551 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4552}
4553
4555{
4556 return "Testing Sprite";
4557}
4558
4560{
4561 return "offset + anchor + rotational skew";
4562}
4563
4564//
4565// SpriteBatchNodeOffsetAnchorRotationalSkew
4566//
4568{
4569 auto s = Director::getInstance()->getWinSize();
4570
4571 auto cache = SpriteFrameCache::getInstance();
4572 cache->addSpriteFramesWithFile("animations/grossini.plist");
4573 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4574
4575 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
4576 addChild(spritebatch);
4577
4578 for(int i=0;i<3;i++)
4579 {
4580 //
4581 // Animation using Sprite batch
4582 //
4583 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4584 sprite->setPosition(Vec2(s.width/4*(i+1), s.height/2));
4585
4586 auto point = Sprite::create("Images/r1.png");
4587
4588 point->setScale(0.25f);
4589 point->setPosition(sprite->getPosition());
4590 addChild(point, 1);
4591
4592 switch(i)
4593 {
4594 case 0:
4595 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
4596 break;
4597 case 1:
4598 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
4599 break;
4600 case 2:
4601 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
4602 break;
4603 }
4604
4605 point->setPosition(sprite->getPosition());
4606
4607 Vector<SpriteFrame*> animFrames(14);
4608 for(int j = 0; j < 14; j++)
4609 {
4610 char pngName[30];
4611 snprintf(pngName, 30, "grossini_dance_%02d.png", (j+1));
4612 auto frame = cache->getSpriteFrameByName(pngName);
4613 animFrames.pushBack(frame);
4614 }
4615 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
4616 sprite->runAction(RepeatForever::create(Animate::create(animation)));
4617
4618 auto skewX = RotateBy::create(2, 45, 0);
4619 auto skewX_back = skewX->reverse();
4620 auto skewY = RotateBy::create(2, 0, 45);
4621 auto skewY_back = skewY->reverse();
4622
4623 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4624 sprite->runAction(RepeatForever::create(seq_skew));
4625
4626 spritebatch->addChild(sprite, 0);
4627 }
4628}
4629
4631{
4632 auto cache = SpriteFrameCache::getInstance();
4633 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4634 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4635}
4636
4638{
4639 return "Testing SpriteBatchNode";
4640}
4641
4643{
4644 return "offset + anchor + rotational skew";
4645}
4646
4647//
4648// SpriteOffsetAnchorRotationalSkewScale
4649//
4651{
4652 auto s = Director::getInstance()->getWinSize();
4653
4654 auto cache = SpriteFrameCache::getInstance();
4655 cache->addSpriteFramesWithFile("animations/grossini.plist");
4656 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4657
4658 for(int i=0;i<3;i++)
4659 {
4660 //
4661 // Animation using Sprite batch
4662 //
4663 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4664 sprite->setPosition(Vec2(s.width/4*(i+1), s.height/2));
4665
4666 auto point = Sprite::create("Images/r1.png");
4667
4668 point->setScale(0.25f);
4669 point->setPosition(sprite->getPosition());
4670 addChild(point, 1);
4671
4672 switch(i)
4673 {
4674 case 0:
4675 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
4676 break;
4677 case 1:
4678 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
4679 break;
4680 case 2:
4681 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
4682 break;
4683 }
4684
4685 point->setPosition(sprite->getPosition());
4686
4687 Vector<SpriteFrame*> animFrames(14);
4688 for(int j = 0; j < 14; j++)
4689 {
4690 char pngName[30];
4691 snprintf(pngName, 30, "grossini_dance_%02d.png", (j+1));
4692 auto frame = cache->getSpriteFrameByName(pngName);
4693 animFrames.pushBack(frame);
4694 }
4695 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
4696 sprite->runAction(RepeatForever::create(Animate::create(animation)));
4697
4698 // Skew
4699 auto skewX = RotateBy::create(2, 45, 0);
4700 auto skewX_back = skewX->reverse();
4701 auto skewY = RotateBy::create(2, 0, 45);
4702 auto skewY_back = skewY->reverse();
4703
4704 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4705 sprite->runAction(RepeatForever::create(seq_skew));
4706
4707 // Scale
4708 auto scale = ScaleBy::create(2, 2);
4709 auto scale_back = scale->reverse();
4710 auto seq_scale = Sequence::create(scale, scale_back, nullptr);
4711 sprite->runAction(RepeatForever::create(seq_scale));
4712
4713 addChild(sprite, 0);
4714 }
4715}
4716
4718{
4719 auto cache = SpriteFrameCache::getInstance();
4720 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4721 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4722}
4723
4725{
4726 return "Testing Sprite";
4727}
4728
4730{
4731 return "anchor + rot skew + scale";
4732}
4733
4734// SpriteBatchNodeOffsetAnchorRotationalSkewScale
4736{
4737 auto s = Director::getInstance()->getWinSize();
4738
4739 auto cache = SpriteFrameCache::getInstance();
4740 cache->addSpriteFramesWithFile("animations/grossini.plist");
4741 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4742
4743 auto spritebatch = SpriteBatchNode::create("animations/grossini.png");
4744 addChild(spritebatch);
4745
4746 for(int i=0;i<3;i++)
4747 {
4748 //
4749 // Animation using Sprite batch
4750 //
4751 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4752 sprite->setPosition(Vec2(s.width/4*(i+1), s.height/2));
4753
4754 auto point = Sprite::create("Images/r1.png");
4755
4756 point->setScale(0.25f);
4757 point->setPosition(sprite->getPosition());
4758 addChild(point, 1);
4759
4760 switch(i)
4761 {
4762 case 0:
4763 sprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
4764 break;
4765 case 1:
4766 sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
4767 break;
4768 case 2:
4769 sprite->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
4770 break;
4771 }
4772
4773 point->setPosition(sprite->getPosition());
4774
4775 Vector<SpriteFrame*> animFrames(14);
4776 for(int j = 0; j < 14; j++)
4777 {
4778 char pngName[30];
4779 snprintf(pngName, 30, "grossini_dance_%02d.png", (j+1));
4780 auto frame = cache->getSpriteFrameByName(pngName);
4781 animFrames.pushBack(frame);
4782 }
4783 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
4784 sprite->runAction(RepeatForever::create(Animate::create(animation)));
4785
4786 // Skew
4787 auto skewX = RotateBy::create(2, 45, 0);
4788 auto skewX_back = skewX->reverse();
4789 auto skewY = RotateBy::create(2, 0, 45);
4790 auto skewY_back = skewY->reverse();
4791
4792 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4793 sprite->runAction(RepeatForever::create(seq_skew));
4794
4795 // Scale
4796 auto scale = ScaleBy::create(2, 2);
4797 auto scale_back = scale->reverse();
4798 auto seq_scale = Sequence::create(scale, scale_back, nullptr);
4799 sprite->runAction(RepeatForever::create(seq_scale));
4800
4801 spritebatch->addChild(sprite, 0);
4802 }
4803}
4804
4806{
4807 auto cache = SpriteFrameCache::getInstance();
4808 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4809 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4810}
4811
4813{
4814 return "Testing SpriteBatchNode";
4815}
4816
4818{
4819 return "anchor + rot skew + scale";
4820}
4821
4822//
4823// SpriteRotationalSkewNegativeScaleChildren
4824//
4826{
4827 auto s = Director::getInstance()->getWinSize();
4828
4829 auto cache = SpriteFrameCache::getInstance();
4830 cache->addSpriteFramesWithFile("animations/grossini.plist");
4831 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4832
4833 auto parent = Node::create();
4834 addChild(parent);
4835
4836 for(int i=0;i<2;i++)
4837 {
4838 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4839 sprite->setPosition(Vec2(s.width/4*(i+1), s.height/2));
4840
4841 auto point = Sprite::create("Images/r1.png");
4842
4843 point->setScale(0.25f);
4844 point->setPosition(sprite->getPosition());
4845 addChild(point, 1);
4846
4847 // Skew
4848 auto skewX = RotateBy::create(2, 45, 0);
4849 auto skewX_back = skewX->reverse();
4850 auto skewY = RotateBy::create(2, 0, 45);
4851 auto skewY_back = skewY->reverse();
4852
4853 if (1 == 1)
4854 {
4855 sprite->setScale(-1.0f);
4856 }
4857
4858 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4859 sprite->runAction(RepeatForever::create(seq_skew));
4860
4861 auto child1 = Sprite::create("Images/grossini_dance_01.png");
4862 child1->setPosition(Vec2(sprite->getContentSize().width/2.0f, sprite->getContentSize().height/2.0f));
4863
4864 sprite->addChild(child1);
4865
4866 child1->setScale(0.8f);
4867
4868 parent->addChild(sprite, 0);
4869 }
4870}
4871
4873{
4874 auto cache = SpriteFrameCache::getInstance();
4875 cache->removeSpriteFramesFromFile("animations/grossini.plist");
4876 cache->removeSpriteFramesFromFile("animations/grossini_gray.plist");
4877}
4878
4880{
4881 return "Testing Sprite";
4882}
4883
4885{
4886 return "rot skew + negative scale with children";
4887}
4888
4889//
4890// SpriteBatchNodeRotationalSkewNegativeScaleChildren
4891//
4893{
4894 auto s = Director::getInstance()->getWinSize();
4895
4896 auto cache = SpriteFrameCache::getInstance();
4897 cache->addSpriteFramesWithFile("animations/grossini.plist");
4898 cache->addSpriteFramesWithFile("animations/grossini_gray.plist", "animations/grossini_gray.png");
4899
4900 auto parent = SpriteBatchNode::create("animations/grossini.png");
4901 addChild(parent);
4902
4903 for(int i=0;i<2;i++)
4904 {
4905 auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
4906 sprite->setPosition(Vec2(s.width/4*(i+1), s.height/2));
4907
4908 auto point = Sprite::create("Images/r1.png");
4909
4910 point->setScale(0.25f);
4911 point->setPosition(sprite->getPosition());
4912 addChild(point, 1);
4913
4914 // Skew
4915 auto skewX = RotateBy::create(2, 45, 0);
4916 auto skewX_back = skewX->reverse();
4917 auto skewY = RotateBy::create(2, 0, 45);
4918 auto skewY_back = skewY->reverse();
4919
4920 if (1 == 1)
4921 {
4922 sprite->setScale(-1.0f);
4923 }
4924
4925 auto seq_skew = Sequence::create(skewX, skewX_back, skewY, skewY_back, nullptr);
4926 sprite->runAction(RepeatForever::create(seq_skew));
4927
4928 auto child1 = Sprite::create("Images/grossini_dance_01.png");
4929 child1->setPosition(Vec2(sprite->getContentSize().width/2.0f, sprite->getContentSize().height/2.0f));
4930
4931 sprite->addChild(child1);
4932
4933 child1->setScale(0.8f);
4934
4935 parent->addChild(sprite, 0);
4936 }
4937}
4938
4940{
4941
4942}
4943
4945{
4946 return "Testing SpriteBatchNode";
4947}
4948
4950{
4951 return "rot skew + negative scale with children";
4952}
4953
4954
4955//------------------------------------------------------------------
4956//
4957// SpriteCullTest1
4958//
4959//------------------------------------------------------------------
4960
4962{
4963 Size s = Director::getInstance()->getWinSize();
4964 auto grossini = Sprite::create("Images/grossini.png");
4965
4966 grossini->setPosition(s.width/2, s.height/2);
4967
4968 auto right = MoveBy::create(3, Vec2(s.width*2,0.0f));
4969 auto back1 = right->reverse();
4970 auto left = MoveBy::create(3, Vec2(-s.width*2,0.0f));
4971 auto back2 = left->reverse();
4972 auto up = MoveBy::create(3, Vec2(0.0f,s.height*2));
4973 auto back3 = up->reverse();
4974 auto down = MoveBy::create(3, Vec2(0.0f,-s.height*2));
4975 auto back4 = down->reverse();
4976
4977 auto seq = Sequence::create(right, back1, left, back2, up, back3, down, back4, nullptr);
4978 grossini->runAction(seq);
4979 this->addChild(grossini);
4980}
4981
4982
4983std::string SpriteCullTest1::title() const
4984{
4985 return "Testing Culling: No Scale, No Rotation";
4986}
4987
4988std::string SpriteCullTest1::subtitle() const
4989{
4990 return "Look at the GL calls";
4991}
4992
4993
4994//------------------------------------------------------------------
4995//
4996// SpriteCullTest2
4997//
4998//------------------------------------------------------------------
4999
5001{
5002 Size s = Director::getInstance()->getWinSize();
5003 auto grossini = Sprite::create("Images/grossini.png");
5004
5005 grossini->setPosition(s.width/2, s.height/2);
5006
5007 auto right = MoveBy::create(3, Vec2(s.width*2,0.0f));
5008 auto back1 = right->reverse();
5009 auto left = MoveBy::create(3, Vec2(-s.width*2,0.0f));
5010 auto back2 = left->reverse();
5011 auto up = MoveBy::create(3, Vec2(0.0f,s.height*2));
5012 auto back3 = up->reverse();
5013 auto down = MoveBy::create(3, Vec2(0.0f,-s.height*2));
5014 auto back4 = down->reverse();
5015
5016 grossini->setScale(0.1f);
5017
5018 auto seq = Sequence::create(right, back1, left, back2, up, back3, down, back4, nullptr);
5019 grossini->runAction(seq);
5020 this->addChild(grossini);
5021}
5022
5023
5024std::string SpriteCullTest2::title() const
5025{
5026 return "Testing Culling: Scale, No Rotation";
5027}
5028
5029std::string SpriteCullTest2::subtitle() const
5030{
5031 return "Look at the GL calls";
5032}
5033
5034//------------------------------------------------------------------
5035//
5036// Sprite 3D rotation test
5037//
5038//------------------------------------------------------------------
5040{
5041 Size s = Director::getInstance()->getWinSize();
5042
5043 //Create reference sprite that's rotating based on there anchor point
5044 auto s1 = Sprite::create("Images/grossini.png");
5045 s1->setPosition(s.width/4, s.height/4 * 3);
5046 s1->setAnchorPoint(Vec2(0.0f, 0.0f));
5047 s1->runAction(RepeatForever::create(RotateBy::create(6.0f, 360.0f)));
5048 addChild(s1);
5049
5050 auto s2 = Sprite::create("Images/grossini.png");
5051 s2->setPosition(s.width/4 * 3, s.height/4 * 3);
5052 s2->runAction(RepeatForever::create(RotateBy::create(6.0f, 360.0f)));
5053 addChild(s2);
5054
5055 sprite1 = Sprite::create("Images/grossini.png");
5056 sprite1->setPosition(s.width/4, s.height/4);
5057 sprite1->setAnchorPoint(Vec2(0.0f,0.0f));
5058
5059 addChild(sprite1);
5060
5061 sprite2 = Sprite::create("Images/grossini.png");
5062 sprite2->setPosition(s.width/4 * 3, s.height/4);
5063
5064 addChild(sprite2);
5065
5066 schedule([&](float dt) {
5067 rotation.y += 1;
5068 sprite1->setRotation3D(rotation);
5069 sprite2->setRotation3D(rotation);
5070 }, "update_key");
5071}
5072
5073//------------------------------------------------------------------
5074//
5075// Sprite::getSpriteFrame() test
5076//
5077//------------------------------------------------------------------
5079{
5080 Size s = Director::getInstance()->getVisibleSize();
5081
5082 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5083 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5084
5085
5086 //Create reference sprite that's rotating based on there anchor point
5087 auto s1 = Sprite::createWithSpriteFrameName("grossini.png");
5088 addChild(s1);
5089 s1->getTexture()->setAliasTexParameters();
5090 s1->setPosition(s.width/2-s.width/3, s.height/2);
5091 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5092 s1->setContentSize(s1->getContentSize()*2);
5093 s1->setSpriteFrame(s1->getSpriteFrame());
5094
5095 //Create reference sprite that's rotating based on there anchor point
5096 auto s2 = Sprite::createWithSpriteFrameName("grossini.png");
5097 addChild(s2);
5098 s2->setPosition(s.width*2/4, s.height/2);
5099 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5100
5101 //Create reference sprite that's rotating based on there anchor point
5102 auto s3 = Sprite::createWithSpriteFrameName("grossini.png");
5103 addChild(s3);
5104 s3->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(128,0,64,128)));
5105 s3->setPosition(s.width/2+s.width/3, s.height/2);
5106 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5107 s3->setSpriteFrame(s3->getSpriteFrame());
5108}
5109
5110//------------------------------------------------------------------
5111//
5112// Slice9 Test #1
5113//
5114//------------------------------------------------------------------
5116{
5117 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5118 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5119
5120 Size s = Director::getInstance()->getWinSize();
5121
5122 for (int i=2; i>0; --i)
5123 {
5124 auto s1 = Sprite::create("Images/grossinis_sister1.png");
5125 addChild(s1);
5126 s1->setPosition(s.width*1/4, s.height*i/3);
5127 s1->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
5128 s1->setContentSize(Size(s1->getContentSize().width, 200.0f));
5129 auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5130 s1->runAction(action1);
5131
5132 //Create reference sprite that's rotating based on there anchor point
5133 auto s2 = Sprite::create("Images/grossinis_sister1.png");
5134 addChild(s2);
5135 s2->setPosition(s.width*2/4, s.height*i/3);
5136 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5137 s2->setContentSize(Size(s2->getContentSize().width, 200.0f));
5138 auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5139 s2->runAction(action2);
5140
5141 //Create reference sprite that's rotating based on there anchor point
5142 auto s3 = Sprite::create("Images/grossinis_sister1.png");
5143 addChild(s3);
5144 s3->setPosition(s.width*3/4, s.height*i/3);
5145 s3->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
5146 s3->setContentSize(Size(s3->getContentSize().width, 200.0f));
5147 auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5148 s3->runAction(action3);
5149
5150 if (i==2) {
5151 s3->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f));
5152 s2->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f));
5153 s1->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f));
5154 }
5155
5156 // "anchor points"
5157 auto point = Sprite::create("Images/r1.png");
5158 point->setScale(0.25f);
5159 point->setPosition( s1->getPosition() );
5160 addChild(point, 10);
5161
5162 auto point2 = Sprite::create("Images/r1.png");
5163 point2->setScale(0.25f);
5164 point2->setPosition(s2->getPosition());
5165 addChild(point2, 10);
5166
5167 auto point3 = Sprite::create("Images/r1.png");
5168 point3->setScale(0.25f);
5169 point3->setPosition(s3->getPosition());
5170 addChild(point3, 10);
5171 }
5172}
5173
5174//------------------------------------------------------------------
5175//
5176// Slice9 Test #2
5177//
5178//------------------------------------------------------------------
5180{
5181 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5182 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5183
5184 Size s = Director::getInstance()->getWinSize();
5185
5186 for (int i=2; i>0; i--)
5187 {
5188 //Create reference sprite that's rotating based on there anchor point
5189 auto s1 = Sprite::createWithSpriteFrameName("grossini.png");
5190 addChild(s1);
5191 s1->setPosition(s.width*1/4, s.height*i/3);
5192 s1->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
5193 s1->setContentSize(Size(80.0f, s1->getContentSize().height));
5194 auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5195 s1->runAction(action1);
5196
5197 //Create reference sprite that's rotating based on there anchor point
5198 auto s2 = Sprite::createWithSpriteFrameName("grossini.png");
5199 addChild(s2);
5200 s2->setPosition(s.width*2/4, s.height*i/3);
5201 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5202 s2->setContentSize(Size(80.0f, s2->getContentSize().height));
5203 auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5204 s2->runAction(action2);
5205
5206 //Create reference sprite that's rotating based on there anchor point
5207 auto s3 = Sprite::createWithSpriteFrameName("grossini.png");
5208 addChild(s3);
5209 s3->setPosition(s.width*3/4, s.height*i/3);
5210 s3->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
5211 s3->setContentSize(Size(80.0f, s3->getContentSize().height));
5212 auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5213 s3->runAction(action3);
5214
5215 if (i==2) {
5216 s3->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f));
5217 s2->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f));
5218 s1->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f));
5219 }
5220
5221 // "anchor points"
5222 auto point = Sprite::create("Images/r1.png");
5223 point->setScale(0.25f);
5224 point->setPosition( s1->getPosition() );
5225 addChild(point, 10);
5226
5227 auto point2 = Sprite::create("Images/r1.png");
5228 point2->setScale(0.25f);
5229 point2->setPosition(s2->getPosition());
5230 addChild(point2, 10);
5231
5232 auto point3 = Sprite::create("Images/r1.png");
5233 point3->setScale(0.25f);
5234 point3->setPosition(s3->getPosition());
5235 addChild(point3, 10);
5236 }
5237}
5238
5239//------------------------------------------------------------------
5240//
5241// Slice9 Test #3
5242//
5243//------------------------------------------------------------------
5245{
5246 Size s = Director::getInstance()->getWinSize();
5247
5248
5249 for (int i=2; i>0; --i)
5250 {
5251 //Create reference sprite that's rotating based on there anchor point
5252 auto s1 = Sprite::create("ccb/scale-9-demo.png");
5253 addChild(s1);
5254 s1->setPosition(s.width*1/4, s.height*i/3);
5255 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5256 s1->setContentSize(s1->getContentSize());
5257 auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5258 s1->runAction(action1);
5259
5260 //Create reference sprite that's rotating based on there anchor point
5261 auto s2 = Sprite::create("ccb/scale-9-demo.png");
5262 addChild(s2);
5263 s2->setPosition(s.width*2/4, s.height*i/3);
5264 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5265 s2->setContentSize(s2->getContentSize() * 2);
5266 auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5267 s2->runAction(action2);
5268
5269 //Create reference sprite that's rotating based on there anchor point
5270 auto s3 = Sprite::create("ccb/scale-9-demo.png");
5271 addChild(s3);
5272 s3->setPosition(s.width*3/4, s.height*i/3);
5273 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5274 s3->setContentSize(s3->getContentSize() * 3);
5275 auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5276 s3->runAction(action3);
5277
5278 // enable slice 9, only in the first row
5279 if (i==2) {
5280 s1->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2));
5281 s2->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2));
5282 s3->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2));
5283 }
5284
5285
5286 // "anchor points"
5287 auto point = Sprite::create("Images/r1.png");
5288 point->setScale(0.25f);
5289 point->setPosition( s1->getPosition() );
5290 addChild(point, 10);
5291
5292 auto point2 = Sprite::create("Images/r1.png");
5293 point2->setScale(0.25f);
5294 point2->setPosition(s2->getPosition());
5295 addChild(point2, 10);
5296
5297 auto point3 = Sprite::create("Images/r1.png");
5298 point3->setScale(0.25f);
5299 point3->setPosition(s3->getPosition());
5300 addChild(point3, 10);
5301 }
5302}
5303
5304//------------------------------------------------------------------
5305//
5306// Slice9 Test #4
5307//
5308//------------------------------------------------------------------
5310{
5311 Size s = Director::getInstance()->getWinSize();
5312
5313
5314 for (int i=2; i>0; --i)
5315 {
5316 //Create reference sprite that's rotating based on there anchor point
5317 auto s1 = Sprite::create("ccs-res/cocosui/button.png");
5318 addChild(s1);
5319 s1->setPosition(s.width*1/4, s.height*i/3);
5320 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5321 s1->setContentSize(s1->getContentSize() * 2);
5322 auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5323 s1->runAction(action1);
5324
5325 //Create reference sprite that's rotating based on there anchor point
5326 auto s2 = Sprite::create("ccs-res/cocosui/button.png");
5327 addChild(s2);
5328 s2->setPosition(s.width*2/4, s.height*i/3);
5329 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5330 s2->setContentSize(s2->getContentSize() * 3);
5331 auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5332 s2->runAction(action2);
5333
5334 //Create reference sprite that's rotating based on there anchor point
5335 auto s3 = Sprite::create("ccs-res/cocosui/button.png");
5336 addChild(s3);
5337 s3->setPosition(s.width*3/4, s.height*i/3);
5338 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5339 s3->setContentSize(s3->getContentSize() * 4);
5340 auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f));
5341 s3->runAction(action3);
5342
5343 // enable slice 9, only in the first row
5344 if (i==2) {
5345 s1->setCenterRect(CC_RECT_PIXELS_TO_POINTS(Rect(6, 14, 2, 4)));
5346 s2->setCenterRect(CC_RECT_PIXELS_TO_POINTS(Rect(6, 14, 2, 4)));
5347 s3->setCenterRect(CC_RECT_PIXELS_TO_POINTS(Rect(6, 14, 2, 4)));
5348 }
5349
5350 // "anchor points"
5351 auto point = Sprite::create("Images/r1.png");
5352 point->setScale(0.1f);
5353 point->setPosition( s1->getPosition() );
5354 addChild(point, 10);
5355
5356 auto point2 = Sprite::create("Images/r1.png");
5357 point2->setScale(0.1f);
5358 point2->setPosition(s2->getPosition());
5359 addChild(point2, 10);
5360
5361 auto point3 = Sprite::create("Images/r1.png");
5362 point3->setScale(0.1f);
5363 point3->setPosition(s3->getPosition());
5364 addChild(point3, 10);
5365 }
5366}
5367
5368//------------------------------------------------------------------
5369//
5370// Slice9 Test #5
5371//
5372//------------------------------------------------------------------
5374{
5375 Size s = Director::getInstance()->getVisibleSize();
5376
5377 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5378 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5379
5380
5381 //Create reference sprite that's rotating based on there anchor point
5382 auto s1 = Sprite::create("Images/grossinis_heads.png");
5383 addChild(s1);
5384 s1->getTexture()->setAliasTexParameters();
5385 s1->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(0,0,64,128)));
5386 s1->setPosition(s.width/2-s.width/3, s.height/2);
5387 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5388 s1->setContentSize(Size(s.width/3, s.height));
5389 s1->setCenterRectNormalized(Rect(0,0,1,1));
5390 _sprites[0] = s1;
5391
5392 //Create reference sprite that's rotating based on there anchor point
5393 auto s2 = Sprite::create("Images/grossinis_heads.png");
5394 addChild(s2);
5395 s2->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(64,0,64,128)));
5396 s2->setPosition(s.width*2/4, s.height/2);
5397 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5398 s2->setContentSize(Size(s.width/3, s.height));
5399 s2->setCenterRectNormalized(Rect(0,0,1,1));
5400 _sprites[1] = s2;
5401
5402 //Create reference sprite that's rotating based on there anchor point
5403 auto s3 = Sprite::create("Images/grossinis_heads.png");
5404 addChild(s3);
5405 s3->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(128,0,64,128)));
5406 s3->setPosition(s.width/2+s.width/3, s.height/2);
5407 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5408 s3->setContentSize(Size(s.width/3, s.height));
5409 s3->setCenterRectNormalized(Rect(0,0,1,1));
5410 _sprites[2] = s3;
5411
5412 scheduleUpdate();
5413
5414 _elapsed = 0;
5415}
5416
5418{
5419 _elapsed += dt;
5420
5421 float angle = _elapsed;
5422
5423 // cap the value between 0 and 0.8
5424 float x = ((cos(angle) + sin(angle*3)) + 2) / 5.0f;
5425 float y1 = (sin(angle) + 1) / 2.5;
5426 float y2 = (sin(angle+M_PI_2) + 1) / 2.5;
5427 float y = y1;
5428 for (int i=0; i<3; ++i) {
5429 if (i==1) {
5430 x = 0.8 - x;
5431 y = y2;
5432 } else if (i==2) {
5433 y = 0.8 - y;
5434 }
5435
5436 Rect rect(x,y,0.2, 0.2);
5437 _sprites[i]->setCenterRectNormalized(rect);
5438 }
5439}
5440
5441//------------------------------------------------------------------
5442//
5443// Slice9 Test #6
5444//
5445//------------------------------------------------------------------
5447{
5448 Size s = Director::getInstance()->getVisibleSize();
5449
5450 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5451 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5452
5453
5454 //Create reference sprite that's rotating based on there anchor point
5455 auto s1 = Sprite::create("Images/grossinis_heads.png");
5456 addChild(s1);
5457 s1->getTexture()->setAliasTexParameters();
5458 s1->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(0,0,64,128)));
5459 s1->setPosition(s.width/2-s.width/3, s.height/2);
5460 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5461 s1->setContentSize(Size(s.width/3, s.height));
5462 s1->setCenterRectNormalized(Rect(0,0,1,1));
5463 _sprites[0] = s1;
5464
5465 //Create reference sprite that's rotating based on there anchor point
5466 auto s2 = Sprite::create("Images/grossinis_heads.png");
5467 addChild(s2);
5468 s2->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(64,0,64,128)));
5469 s2->setPosition(s.width*2/4, s.height/2);
5470 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5471 s2->setContentSize(Size(s.width/3, s.height));
5472 s2->setCenterRectNormalized(Rect(0,0,1,1));
5473 _sprites[1] = s2;
5474
5475 //Create reference sprite that's rotating based on there anchor point
5476 auto s3 = Sprite::create("Images/grossinis_heads.png");
5477 addChild(s3);
5478 s3->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(128,0,64,128)));
5479 s3->setPosition(s.width/2+s.width/3, s.height/2);
5480 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5481 s3->setContentSize(Size(s.width/3, s.height));
5482 s3->setCenterRectNormalized(Rect(0,0,1,1));
5483 _sprites[2] = s3;
5484
5485 scheduleUpdate();
5486
5487 _elapsed = 0;
5488}
5489
5491{
5492 _elapsed += dt;
5493
5494 float angle = _elapsed;
5495
5496 // cap the value between 0 and 1
5497 float x = ((cos(angle*2) - sin(angle/2)) + 2) / 4;
5498 float y1 = (sin(angle) + 1) / 2;
5499 float y2 = (sin(angle+M_PI_2) + 1) / 2;
5500 float y = y1;
5501 for (int i=0; i<3; ++i) {
5502 if (i==1) {
5503 x = 1 - x;
5504 y = y2;
5505 } else if (i==2) {
5506 y = 1 - y;
5507 }
5508
5509 Rect rect((1-x)/2, (1-y)/2, x, y);
5510 _sprites[i]->setCenterRectNormalized(rect);
5511 }
5512}
5513
5514//------------------------------------------------------------------
5515//
5516// Slice9 Test #7
5517//
5518//------------------------------------------------------------------
5520{
5521 Size s = Director::getInstance()->getVisibleSize();
5522
5523 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5524 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5525
5526
5527 //Create reference sprite that's rotating based on there anchor point
5528 auto s1 = Sprite::create("Images/grossinis_heads.png");
5529 addChild(s1);
5530 s1->getTexture()->setAliasTexParameters();
5531 s1->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(0,0,64,128)));
5532 s1->setPosition(s.width/2-s.width/3, s.height/2);
5533 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5534 s1->setContentSize(Size(s.width/3, s.height));
5535 s1->setCenterRectNormalized(Rect(0,0,0.5,0.5));
5536
5537 //Create reference sprite that's rotating based on there anchor point
5538 auto s2 = Sprite::create("Images/grossinis_heads.png");
5539 addChild(s2);
5540 s2->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(64,0,64,128)));
5541 s2->setPosition(s.width*2/4, s.height/2);
5542 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5543 s2->setContentSize(Size(s.width/3, s.height));
5544 s2->setCenterRectNormalized(Rect(0.25,0.25,0.5,0.5));
5545
5546 //Create reference sprite that's rotating based on there anchor point
5547 auto s3 = Sprite::create("Images/grossinis_heads.png");
5548 addChild(s3);
5549 s3->setTextureRect(CC_RECT_PIXELS_TO_POINTS(Rect(128,0,64,128)));
5550 s3->setPosition(s.width/2+s.width/3, s.height/2);
5551 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5552 s3->setContentSize(Size(s.width/3, s.height));
5553 s3->setCenterRectNormalized(Rect(0.5,0.5,0.5,0.5));
5554}
5555
5556//------------------------------------------------------------------
5557//
5558// Slice9 Test #8
5559//
5560//------------------------------------------------------------------
5562{
5563 Size s = Director::getInstance()->getVisibleSize();
5564
5565 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5566 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5567
5568
5569 //
5570 // flip BEFORE contentSize
5571 //
5572 auto s1 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
5573 addChild(s1);
5574 s1->setPosition(s.width/2-s.width/3, s.height*2/3);
5575 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5576 s1->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5577 s1->setFlippedX(true);
5578 s1->setContentSize(s1->getContentSize()*2);
5579
5580 auto s2 = Sprite::createWithSpriteFrameName("grossini.png");
5581 addChild(s2);
5582 s2->setPosition(s.width*2/4, s.height*2/3);
5583 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5584 s2->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5585 s2->setFlippedX(true);
5586 s2->setFlippedY(true);
5587 s2->setContentSize(s2->getContentSize()*2);
5588
5589 //Create reference sprite that's rotating based on there anchor point
5590 auto s3 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
5591 addChild(s3);
5592 s3->setPosition(s.width/2+s.width/3, s.height*2/3);
5593 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5594 s3->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5595 s3->setFlippedY(true);
5596 s3->setContentSize(s3->getContentSize()*2);
5597
5598 //
5599 // flip AFTER contentSize
5600 //
5601 auto s4 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
5602 addChild(s4);
5603 s4->setPosition(s.width/2-s.width/3, s.height*1/3);
5604 s4->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5605 s4->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5606 s4->setFlippedX(true);
5607 s4->setContentSize(s4->getContentSize()*2);
5608
5609 auto s5 = Sprite::createWithSpriteFrameName("grossini.png");
5610 addChild(s5);
5611 s5->setPosition(s.width*2/4, s.height*1/3);
5612 s5->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5613 s5->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5614 s5->setFlippedX(true);
5615 s5->setFlippedY(true);
5616 s5->setContentSize(s5->getContentSize()*2);
5617
5618 //Create reference sprite that's rotating based on there anchor point
5619 auto s6 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
5620 addChild(s6);
5621 s6->setPosition(s.width/2+s.width/3, s.height*1/3);
5622 s6->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5623 s6->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5624 s6->setFlippedY(true);
5625 s6->setContentSize(s6->getContentSize()*2);
5626}
5627
5628//------------------------------------------------------------------
5629//
5630// Slice9 Test #9
5631//
5632//------------------------------------------------------------------
5634{
5635 Size s = Director::getInstance()->getVisibleSize();
5636
5637 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini_family.plist");
5638 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist");
5639
5640
5641 // flipped BEFORE content size
5642 auto s1 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
5643 addChild(s1);
5644 s1->setPosition(s.width/2-s.width/3, s.height*2/3);
5645 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5646 s1->setCenterRectNormalized(Rect(2/3.f, 2/3.f, 1/3.f, 1/3.f));
5647 s1->setFlippedX(true);
5648 s1->setContentSize(s1->getContentSize()*2);
5649
5650 auto s2 = Sprite::createWithSpriteFrameName("grossini.png");
5651 addChild(s2);
5652 s2->setPosition(s.width*2/4, s.height*2/3);
5653 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5654 s2->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 2/3.f, 2/3.f));
5655 s2->setFlippedX(true);
5656 s2->setFlippedY(true);
5657 s2->setContentSize(s2->getContentSize()*2);
5658
5659 auto s3 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
5660 addChild(s3);
5661 s3->setPosition(s.width/2+s.width/3, s.height*2/3);
5662 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5663 s3->setCenterRectNormalized(Rect(0.1f, 0.1f, 0.8f, 0.8f));
5664 s3->setFlippedY(true);
5665 s3->setContentSize(s3->getContentSize()*2);
5666
5667
5668 // flipped AFTER content size
5669 auto s4 = Sprite::createWithSpriteFrameName("grossinis_sister1.png");
5670 addChild(s4);
5671 s4->setPosition(s.width/2-s.width/3, s.height*1/3);
5672 s4->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5673 s4->setCenterRectNormalized(Rect(2/3.f, 2/3.f, 1/3.f, 1/3.f));
5674 s4->setContentSize(s4->getContentSize()*2);
5675 s4->setFlippedX(true);
5676
5677 auto s5 = Sprite::createWithSpriteFrameName("grossini.png");
5678 addChild(s5);
5679 s5->setPosition(s.width*2/4, s.height*1/3);
5680 s5->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5681 s5->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 2/3.f, 2/3.f));
5682 s5->setContentSize(s5->getContentSize()*2);
5683 s5->setFlippedX(true);
5684 s5->setFlippedY(true);
5685
5686 auto s6 = Sprite::createWithSpriteFrameName("grossinis_sister2.png");
5687 addChild(s6);
5688 s6->setPosition(s.width/2+s.width/3, s.height*1/3);
5689 s6->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5690 s6->setCenterRectNormalized(Rect(0.1f, 0.1f, 0.8f, 0.8f));
5691 s6->setContentSize(s6->getContentSize()*2);
5692 s6->setFlippedY(true);
5693}
5694
5695//------------------------------------------------------------------
5696//
5697// Slice9 Test #10
5698//
5699//------------------------------------------------------------------
5701{
5702 Size s = Director::getInstance()->getVisibleSize();
5703
5704 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Images/blocks9ss.plist");
5705
5706
5707 auto s1 = Sprite::createWithSpriteFrameName("blocks9r.png");
5708 addChild(s1);
5709 s1->setPosition(s.width/2-s.width/3, s.height/2);
5710 s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5711 s1->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5712 s1->setContentSize(s1->getContentSize()*1.5);
5713 s1->setFlippedX(true);
5714
5715 auto s2 = Sprite::createWithSpriteFrameName("blocks9r.png");
5716 addChild(s2);
5717 s2->setPosition(s.width*2/4, s.height/2);
5718 s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5719 s2->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5720 s2->setContentSize(s2->getContentSize()*1.5);
5721
5722 //Create reference sprite that's rotating based on there anchor point
5723 auto s3 = Sprite::createWithSpriteFrameName("blocks9r.png");
5724 addChild(s3);
5725 s3->setPosition(s.width/2+s.width/3, s.height/2);
5726 s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5727 s3->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5728 s3->setContentSize(s3->getContentSize()*1.5);
5729 s3->setFlippedY(true);
5730}
5731
5732//------------------------------------------------------------------
5733//
5734// Issue 17119
5735//
5736//------------------------------------------------------------------
5738: _accum(0)
5739{
5740 Size s = Director::getInstance()->getVisibleSize();
5741
5742 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Images/issue_17119.plist");
5743 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Images/blocks9ss.plist");
5744
5745
5746 auto s1 = Sprite::createWithSpriteFrameName("firstPic.png");
5747 addChild(s1);
5748 s1->setPosition(s.width/2-s.width/3, s.height/2);
5749 s1->setScale(0.25f);
5750 auto p1 = Sprite::create("Images/r1.png");
5751 p1->setScale(0.25f);
5752 p1->setPosition(s1->getPosition());
5753 addChild(p1, 10);
5754
5755 auto s2 = Sprite::createWithSpriteFrameName("blocks9r.png");
5756 addChild(s2);
5757 s2->setPosition(s.width/2, s.height/2);
5758 s2->setCenterRectNormalized(Rect(1/3.f, 1/3.f, 1/3.f, 1/3.f));
5759 s2->setContentSize(s2->getContentSize()*1.5);
5760 auto p2 = Sprite::create("Images/r1.png");
5761 p2->setScale(0.25f);
5762 p2->setPosition(s2->getPosition());
5763 addChild(p2, 10);
5764
5765 auto s3 = Sprite::create("Images/grossini.png");
5766 addChild(s3);
5767 s3->setPosition(s.width/2+s.width/3, s.height/2+s.height/3);
5768 s3->setContentSize(s3->getContentSize()*1.5);
5769 auto p3 = Sprite::create("Images/r1.png");
5770 p3->setScale(0.25f);
5771 p3->setPosition(s3->getPosition());
5772 addChild(p3, 10);
5773
5774 auto s4 = Sprite::create("Images/grossini.png");
5775 addChild(s4);
5776 s4->setPosition(s.width/2+s.width/3, s.height/2-s.height/3);
5777 s4->setContentSize(s2->getContentSize()*1.5);
5778 s4->setStretchEnabled(false);
5779 auto p4 = Sprite::create("Images/r1.png");
5780 p4->setScale(0.25f);
5781 p4->setPosition(s3->getPosition());
5782 addChild(p4, 10);
5783
5784 _s1 = s1;
5785 _s2 = s2;
5786 _s3 = s3;
5787 _s4 = s4;
5788 scheduleUpdate();
5789}
5790
5792{
5793 _accum += dt;
5794 if (_accum > 0.5) {
5795 _accum = 0;
5796 auto flipped = _s1->isFlippedX();
5797 _s1->setFlippedX(!flipped);
5798 _s2->setFlippedX(!flipped);
5799 _s3->setFlippedX(!flipped);
5800 _s4->setFlippedX(!flipped);
5801 }
5802}
5803
5804
#define ADD_TEST_CASE(__className__)
Definition: BaseTest.h:211
@ kTagSprite5
Definition: SpriteTest.cpp:53
@ kTagSprite2
Definition: SpriteTest.cpp:50
@ kTagSprite8
Definition: SpriteTest.cpp:56
@ kTagSprite6
Definition: SpriteTest.cpp:54
@ kTagSprite7
Definition: SpriteTest.cpp:55
@ kTagSprite4
Definition: SpriteTest.cpp:52
@ kTagSprite1
Definition: SpriteTest.cpp:49
@ kTagSprite3
Definition: SpriteTest.cpp:51
@ kTagSpriteRight
Definition: SpriteTest.cpp:44
@ kTagTileMap
Definition: SpriteTest.cpp:39
@ kTagSpriteLeft
Definition: SpriteTest.cpp:43
@ kTagSpriteBatchNode
Definition: SpriteTest.cpp:40
@ kTagAnimation1
Definition: SpriteTest.cpp:42
@ kTagNode
Definition: SpriteTest.cpp:41
USING_NS_CC
Definition: SpriteTest.cpp:35
virtual ~AnimationCacheFile()
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual ~AnimationCacheTest()
cocos2d::Sprite * _s3
Definition: SpriteTest.h:932
cocos2d::Sprite * _s2
Definition: SpriteTest.h:931
float _accum
Definition: SpriteTest.h:929
cocos2d::Sprite * _s1
Definition: SpriteTest.h:930
cocos2d::Sprite * _s4
Definition: SpriteTest.h:933
virtual void update(float dt) override
CREATE_FUNC(MySprite1)
static MySprite1 * createWithSpriteFrameName(const std::string &spriteFrameName)
static MySprite2 * create(const std::string &name)
CREATE_FUNC(MySprite2)
cocos2d::Node * _node
Definition: SpriteTest.h:665
virtual std::string subtitle() const override
cocos2d::Sprite * _sprite2
Definition: SpriteTest.h:667
NodeSort()
NodeSort
void reorderSprite(float dt)
cocos2d::Sprite * _sprite5
Definition: SpriteTest.h:670
cocos2d::Sprite * _sprite4
Definition: SpriteTest.h:669
virtual std::string title() const override
cocos2d::Sprite * _sprite3
Definition: SpriteTest.h:668
cocos2d::Sprite * _sprite1
Definition: SpriteTest.h:666
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
Definition: SpriteTest.cpp:265
bool init() override
Definition: SpriteTest.cpp:222
void addNewSpriteWithCoords(cocos2d::Vec2 p)
Definition: SpriteTest.cpp:236
cocos2d::Sprite * _background
Definition: SpriteTest.h:67
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:280
virtual std::string title() const override
Definition: SpriteTest.cpp:275
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
Definition: SpriteTest.cpp:189
virtual std::string title() const override
Definition: SpriteTest.cpp:199
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:204
void addNewSpriteWithCoords(cocos2d::Vec2 p)
Definition: SpriteTest.cpp:158
cocos2d::Sprite * sprite2
Definition: SpriteTest.h:801
cocos2d::Sprite * sprite1
Definition: SpriteTest.h:797
cocos2d::Vec3 rotation
Definition: SpriteTest.h:803
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onExit() override
virtual std::string title() const override
virtual void onExit() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual std::string title() const override
virtual std::string subtitle() const override
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
Definition: SpriteTest.cpp:338
void addNewSpriteWithCoords(cocos2d::Vec2 p)
Definition: SpriteTest.cpp:304
virtual std::string title() const override
Definition: SpriteTest.cpp:349
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:354
virtual std::string subtitle() const override
virtual void onExit() override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual void onExit() override
virtual std::string title() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual std::string title() const override
void removeAndAddSprite(float dt)
Definition: SpriteTest.cpp:517
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:535
virtual std::string title() const override
Definition: SpriteTest.cpp:530
void flipSprites(float dt)
virtual std::string subtitle() const override
virtual std::string title() const override
cocos2d::Texture2D * _texture2
Definition: SpriteTest.h:325
virtual std::string title() const override
virtual ~SpriteBatchNodeNewTexture()
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
cocos2d::Texture2D * _texture1
Definition: SpriteTest.h:324
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:727
virtual std::string title() const override
Definition: SpriteTest.cpp:722
virtual std::string title() const override
Definition: SpriteTest.cpp:754
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:759
cocos2d::Sprite * sprite1
Definition: SpriteTest.h:164
cocos2d::Sprite * makeSpriteZ(int aZ)
Definition: SpriteTest.cpp:770
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:825
cocos2d::Sprite * sprite3
Definition: SpriteTest.h:166
virtual std::string title() const override
Definition: SpriteTest.cpp:820
cocos2d::Sprite * sprite2
Definition: SpriteTest.h:165
cocos2d::SpriteBatchNode * batchNode
Definition: SpriteTest.h:163
virtual std::string title() const override
Definition: SpriteTest.cpp:896
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:901
virtual std::string title() const override
cocos2d::SpriteBatchNode * _batchNode
Definition: SpriteTest.h:700
SpriteBatchNodeReorderOneChild()
SpriteBatchNodeReorderOneChild
cocos2d::Sprite * _reorderSprite
Definition: SpriteTest.h:701
cocos2d::Sprite * _sprite5
Definition: SpriteTest.h:689
cocos2d::SpriteBatchNode * _batchNode
Definition: SpriteTest.h:684
cocos2d::Sprite * _sprite3
Definition: SpriteTest.h:687
cocos2d::Sprite * _sprite1
Definition: SpriteTest.h:685
cocos2d::Sprite * _sprite4
Definition: SpriteTest.h:688
virtual std::string title() const override
cocos2d::Sprite * _sprite2
Definition: SpriteTest.h:686
SpriteBatchNodeReorderSameIndex()
SpriteBatchNodeReorderSameIndex
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
Definition: SpriteTest.cpp:662
void reorderSprite(float dt)
Definition: SpriteTest.cpp:645
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:667
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual void onExit() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
void removeAndAddSprite(float dt)
Definition: SpriteTest.cpp:424
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:440
virtual std::string title() const override
Definition: SpriteTest.cpp:435
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
void flipSprites(float dt)
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onExit() override
virtual void onExit() override
cocos2d::Sprite * _sprite2
Definition: SpriteTest.h:342
virtual std::string title() const override
void flipSprites(float dt)
virtual void onEnter() override
virtual std::string subtitle() const override
void startIn05Secs(float dt)
cocos2d::Sprite * _sprite1
Definition: SpriteTest.h:341
virtual std::string subtitle() const override
virtual std::string sheetName() const
virtual void onEnter() override
virtual void onExit() override
virtual std::string title() const override
virtual std::string title() const override
virtual void onExit() override
void reparentSprite(float dt)
bool _usingSpriteBatchNode
Definition: SpriteTest.h:538
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
virtual std::string subtitle() const override
cocos2d::Texture2D * _texture2
Definition: SpriteTest.h:309
virtual ~SpriteNewTexture()
cocos2d::Texture2D * _texture1
Definition: SpriteTest.h:308
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual ~SpriteOffsetAnchorFlip()
virtual void onEnter() override
virtual void onExit() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
virtual void onExit() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual ~SpriteOffsetAnchorSkew()
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string sheetName() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
cocos2d::Sprite * _sprites[3]
Definition: SpriteTest.h:853
virtual void update(float dt) override
cocos2d::Sprite * _sprites[3]
Definition: SpriteTest.h:868
virtual void update(float dt) override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
Definition: SpriteTest.cpp:599
void reorderSprite(float dt)
Definition: SpriteTest.cpp:577
virtual std::string title() const override
Definition: SpriteTest.cpp:594
virtual void onEnter() override
Definition: SpriteTest.cpp:928
virtual void onExit() override
Definition: SpriteTest.cpp:935
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
Definition: BaseTest.cpp:430