axmol/tests/cpp-tests/Classes/MotionStreakTest/MotionStreakTest.cpp

273 lines
8.0 KiB
C++

/****************************************************************************
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
https://axmolengine.github.io/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include "MotionStreakTest.h"
#include "../testResource.h"
USING_NS_AX;
enum
{
kTagLabel = 1,
kTagSprite1 = 2,
kTagSprite2 = 3,
};
MotionStreakTests::MotionStreakTests()
{
ADD_TEST_CASE(MotionStreakTest1);
ADD_TEST_CASE(MotionStreakTest2);
ADD_TEST_CASE(Issue1358);
ADD_TEST_CASE(Issue12226);
}
//------------------------------------------------------------------
//
// MotionStreakTest1
//
//------------------------------------------------------------------
void MotionStreakTest1::onEnter()
{
MotionStreakTest::onEnter();
auto s = Director::getInstance()->getWinSize();
// the root object just rotates around
_root = Sprite::create(s_pathR1);
addChild(_root, 1);
_root->setPosition(Vec2(s.width / 2, s.height / 2));
// the target object is offset from root, and the streak is moved to follow it
_target = Sprite::create(s_pathR1);
_root->addChild(_target);
_target->setPosition(Vec2(s.width / 4, 0.0f));
// create the streak object and add it to the scene
_streak = MotionStreak::create(2, 3, 32, Color3B::GREEN, s_streak);
addChild(_streak);
// schedule an update on each frame so we can synchronize the streak with the target
schedule(AX_SCHEDULE_SELECTOR(MotionStreakTest1::onUpdate));
auto a1 = RotateBy::create(2, 360);
auto action1 = RepeatForever::create(a1);
auto motion = MoveBy::create(2, Vec2(100, 0));
_root->runAction(RepeatForever::create(Sequence::create(motion, motion->reverse(), nullptr)));
_root->runAction(action1);
auto colorAction = RepeatForever::create(Sequence::create(
TintTo::create(0.2f, 255, 0, 0), TintTo::create(0.2f, 0, 255, 0), TintTo::create(0.2f, 0, 0, 255),
TintTo::create(0.2f, 0, 255, 255), TintTo::create(0.2f, 255, 255, 0), TintTo::create(0.2f, 255, 0, 255),
TintTo::create(0.2f, 255, 255, 255), nullptr));
_streak->runAction(colorAction);
}
void MotionStreakTest1::onUpdate(float delta)
{
_streak->setPosition(_target->convertToWorldSpace(Vec2::ZERO));
}
std::string MotionStreakTest1::title() const
{
return "MotionStreak test 1";
}
//------------------------------------------------------------------
//
// MotionStreakTest2
//
//------------------------------------------------------------------
void MotionStreakTest2::onEnter()
{
MotionStreakTest::onEnter();
auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesMoved = AX_CALLBACK_2(MotionStreakTest2::onTouchesMoved, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
auto s = Director::getInstance()->getWinSize();
// create the streak object and add it to the scene
_streak = MotionStreak::create(3, 3, 64, Color3B::WHITE, s_streak);
addChild(_streak);
_streak->setPosition(Vec2(s.width / 2, s.height / 2));
}
void MotionStreakTest2::onTouchesMoved(const std::vector<Touch*>& touches, Event* event)
{
auto touchLocation = touches[0]->getLocation();
_streak->setPosition(touchLocation);
}
std::string MotionStreakTest2::title() const
{
return "MotionStreak test";
}
std::string MotionStreakTest2::subtitle() const
{
return "Need Touch Movement";
}
//------------------------------------------------------------------
//
// Issue1358
//
//------------------------------------------------------------------
void Issue1358::onEnter()
{
MotionStreakTest::onEnter();
// ask director the the window size
auto size = Director::getInstance()->getWinSize();
_streak = MotionStreak::create(2.0f, 1.0f, 50.0f, Color3B(255, 255, 0), "Images/Icon.png");
addChild(_streak);
_center = Vec2(size.width / 2, size.height / 2);
_radius = size.width / 3;
_angle = 0.0f;
schedule(AX_SCHEDULE_SELECTOR(Issue1358::update), 0);
}
void Issue1358::update(float dt)
{
_angle += 1.0f;
_streak->setPosition(
Vec2(_center.x + cosf(_angle / 180 * M_PI) * _radius, _center.y + sinf(_angle / 180 * M_PI) * _radius));
}
std::string Issue1358::title() const
{
return "Issue 1358";
}
std::string Issue1358::subtitle() const
{
return "The tail should use the texture";
}
//------------------------------------------------------------------
//
// Issue12226
//
//------------------------------------------------------------------
void Issue12226::onEnter()
{
MotionStreakTest::onEnter();
// ask director the the window size
auto size = Director::getInstance()->getWinSize();
auto radius = size.width / 3;
auto outer = Sprite::create("Images/grossini.png");
outer->setPosition(size / 2);
addChild(outer);
_streak = MotionStreak::create(1.0f, 3, radius * 1.5f, Color3B(0xA0, 0xA0, 0xA0), "ccb/particle-smoke.png");
// motionStreak->setOpacity(0x70);
_streak->setPosition(outer->getPosition());
this->addChild(_streak, outer->getLocalZOrder() - 1);
outer->setUserData(_streak);
const uint32_t length = (radius * 0.95);
std::function<void(float)> updateMotionStreak = [=](float dt) {
Vec2 position =
Vec2(outer->getPositionX() + length * cosf(-1 * AX_DEGREES_TO_RADIANS(outer->getRotation() + 90.0f)),
outer->getPositionY() + length * sinf(-1 * AX_DEGREES_TO_RADIANS(outer->getRotation() + 90.0f)));
_streak->setPosition(position);
};
outer->schedule(updateMotionStreak, 1 / 240.0f, AX_REPEAT_FOREVER, 0, "motion1scheduler");
auto rot = RotateBy::create(2, 360);
auto forever = RepeatForever::create(rot);
outer->runAction(forever);
}
std::string Issue12226::title() const
{
return "Github Issue 12226";
}
std::string Issue12226::subtitle() const
{
return "Image should look without artifacts";
}
//------------------------------------------------------------------
//
// MotionStreakTest
//
//------------------------------------------------------------------
MotionStreakTest::MotionStreakTest() {}
MotionStreakTest::~MotionStreakTest() {}
std::string MotionStreakTest::title() const
{
return "No title";
}
std::string MotionStreakTest::subtitle() const
{
return "";
}
void MotionStreakTest::onEnter()
{
TestCase::onEnter();
auto s = Director::getInstance()->getWinSize();
auto itemMode = MenuItemToggle::createWithCallback(AX_CALLBACK_1(MotionStreakTest::modeCallback, this),
MenuItemFont::create("Use High Quality Mode"),
MenuItemFont::create("Use Fast Mode"), nullptr);
auto menuMode = Menu::create(itemMode, nullptr);
addChild(menuMode);
menuMode->setPosition(Vec2(s.width / 2, s.height / 4));
}
void MotionStreakTest::modeCallback(Ref* pSender)
{
bool fastMode = _streak->isFastMode();
_streak->setFastMode(!fastMode);
}