X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fblocks%2Fblocks-example.cpp;h=fcdc2c0a7bff24302106a8ba4a60252e9ec2960c;hb=1b19fd140ff139b5854a1a62447faf31b175d8f6;hp=20a3e9383d4f31c4de988b8dd81e6d5cdaa91821;hpb=a1ecdd9dc7348be0dccf85345ddb4c339f9bb93f;p=platform%2Fcore%2Fuifw%2Fdali-demo.git diff --git a/examples/blocks/blocks-example.cpp b/examples/blocks/blocks-example.cpp index 20a3e93..fcdc2c0 100644 --- a/examples/blocks/blocks-example.cpp +++ b/examples/blocks/blocks-example.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,14 +15,15 @@ * */ -#include +#include #include -#include #include -#include +#include +#include -#include #include +#include +#include #include "shared/view.h" using namespace Dali; @@ -31,44 +32,44 @@ using namespace DemoHelper; namespace { -const char* BACKGROUND_IMAGE( DALI_IMAGE_DIR "background-blocks.jpg" ); -const char* TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" ); -const char* APPLICATION_TITLE( "DALi Blocks" ); -const char* BALL_IMAGE = DALI_IMAGE_DIR "blocks-ball.png"; -const char* PADDLE_IMAGE = DALI_IMAGE_DIR "blocks-paddle.png"; -const char* PADDLE_HANDLE_IMAGE = DALI_IMAGE_DIR "blocks-paddle-handle.png"; - -const char* BRICK_IMAGE_PATH[] = { DALI_IMAGE_DIR "blocks-brick-1.png", - DALI_IMAGE_DIR "blocks-brick-2.png", - DALI_IMAGE_DIR "blocks-brick-3.png", - DALI_IMAGE_DIR "blocks-brick-4.png" }; - -const int TOTAL_BRICKS(4); ///< Total bricks in game. +const char* BACKGROUND_IMAGE(DEMO_IMAGE_DIR "background-blocks.jpg"); +const char* TOOLBAR_IMAGE(DEMO_IMAGE_DIR "top-bar.png"); +const char* APPLICATION_TITLE("DALi Blocks"); +const char* BALL_IMAGE = DEMO_IMAGE_DIR "blocks-ball.png"; +const char* PADDLE_IMAGE = DEMO_IMAGE_DIR "blocks-paddle.png"; +const char* PADDLE_HANDLE_IMAGE = DEMO_IMAGE_DIR "blocks-paddle-handle.png"; + +const char* BRICK_IMAGE_PATH[] = {DEMO_IMAGE_DIR "blocks-brick-1.png", + DEMO_IMAGE_DIR "blocks-brick-2.png", + DEMO_IMAGE_DIR "blocks-brick-3.png", + DEMO_IMAGE_DIR "blocks-brick-4.png"}; + +const int TOTAL_BRICKS(4); ///< Total bricks in game. const Vector3 ICON_SIZE(100.0f, 100.0f, 0.0f); -const float SCREEN_MARGIN = 10.0f; ///< Margin indentation around screen -const Vector3 MENU_BUTTON_SIZE = Vector3(0.15f, 0.05f, 1.0f); ///< Standard Menu Buttons. +const float SCREEN_MARGIN = 10.0f; ///< Margin indentation around screen +const Vector3 MENU_BUTTON_SIZE = Vector3(0.15f, 0.05f, 1.0f); ///< Standard Menu Buttons. -const float MAX_ANIMATION_DURATION = 60.0f; ///< 60 seconds animations. Long enough for ball to hit an obstacle. -const float BALL_VELOCITY = 300.0f; ///< Ball velocity in pixels/second. -const float MAX_VELOCITY = 500.0f; ///< Max. velocity in pixels/second. -const Vector3 PADDLE_COLLISION_MARGIN(0.0f, 0.0f, 0.0f); ///< Collision margin for ball-paddle detection. -const Vector3 BRICK_COLLISION_MARGIN(0.0f, 0.0f, 0.0f); ///< Collision margin for ball-brick detection. -const Vector3 INITIAL_BALL_DIRECTION(1.0f, 1.0f, 0.0f); ///< Initial ball direction. +const float MAX_ANIMATION_DURATION = 60.0f; ///< 60 seconds animations. Long enough for ball to hit an obstacle. +const float BALL_VELOCITY = 300.0f; ///< Ball velocity in pixels/second. +const float MAX_VELOCITY = 500.0f; ///< Max. velocity in pixels/second. +const Vector3 PADDLE_COLLISION_MARGIN(0.0f, 0.0f, 0.0f); ///< Collision margin for ball-paddle detection. +const Vector3 BRICK_COLLISION_MARGIN(0.0f, 0.0f, 0.0f); ///< Collision margin for ball-brick detection. +const Vector3 INITIAL_BALL_DIRECTION(1.0f, 1.0f, 0.0f); ///< Initial ball direction. -const std::string WOBBLE_PROPERTY_NAME("wobble-property"); ///< Wobble property name. -const std::string COLLISION_PROPERTY_NAME("collision-property"); ///< Collision property name. +const std::string WOBBLE_PROPERTY_NAME("wobbleProperty"); ///< Wobble property name. +const std::string COLLISION_PROPERTY_NAME("collisionProperty"); ///< Collision property name. -const Vector2 BRICK_SIZE(0.1f, 0.05f ); ///< Brick size relative to width of stage. -const Vector2 BALL_SIZE( 0.05f, 0.05f ); ///< Ball size relative to width of stage. -const Vector2 PADDLE_SIZE( 0.2f, 0.05f ); ///< Paddle size relative to width of stage. -const Vector2 PADDLE_HANDLE_SIZE( 0.3f, 0.3f ); ///< Paddle handle size relative to width of stage. -const Vector2 BALL_START_POSITION(0.5f, 0.8f); ///< Ball start position relative to stage size. -const Vector2 PADDLE_START_POSITION(0.5f, 0.9f); ///< Paddler start position relative to stage size. -const Vector2 PADDLE_HIT_MARGIN( 0.1, 0.15f ); ///< Extra hit Area for Paddle when touching. +const Vector2 BRICK_SIZE(0.1f, 0.05f); ///< Brick size relative to width of window. +const Vector2 BALL_SIZE(0.05f, 0.05f); ///< Ball size relative to width of window. +const Vector2 PADDLE_SIZE(0.2f, 0.05f); ///< Paddle size relative to width of window. +const Vector2 PADDLE_HANDLE_SIZE(0.3f, 0.3f); ///< Paddle handle size relative to width of window. +const Vector2 BALL_START_POSITION(0.5f, 0.8f); ///< Ball start position relative to window size. +const Vector2 PADDLE_START_POSITION(0.5f, 0.9f); ///< Paddler start position relative to window size. +const Vector2 PADDLE_HIT_MARGIN(0.1, 0.15f); ///< Extra hit Area for Paddle when touching. -const int TOTAL_LIVES(3); ///< Total lives in game before it's game over! -const int TOTAL_LEVELS(3); ///< 3 Levels total, then repeats. +const int TOTAL_LIVES(3); ///< Total lives in game before it's game over! +const int TOTAL_LEVELS(3); ///< 3 Levels total, then repeats. // constraints //////////////////////////////////////////////////////////////// @@ -88,7 +89,7 @@ struct CollisionCircleRectangleConstraint * @param[in] adjustSize (optional) Adjusts the rectangular size of detection */ CollisionCircleRectangleConstraint(Vector3 adjustPosition = Vector3::ZERO, - Vector3 adjustSize = Vector3::ZERO) + Vector3 adjustSize = Vector3::ZERO) : mAdjustPosition(adjustPosition), mAdjustSize(adjustSize) { @@ -106,24 +107,24 @@ struct CollisionCircleRectangleConstraint * Actor B's Size property. * @return The collision vector is returned. */ - void operator()( Vector3& current, const PropertyInputContainer& inputs ) + void operator()(Vector3& current, const PropertyInputContainer& inputs) { - const Vector3& a = inputs[0]->GetVector3(); - const Vector3 b = inputs[1]->GetVector3() + mAdjustPosition; - const Vector3& sizeA = inputs[2]->GetVector3(); - const Vector3& sizeB = inputs[3]->GetVector3(); - const Vector3 sizeA2 = sizeA * 0.5f; // circle radius - const Vector3 sizeB2 = (sizeB + mAdjustSize) * 0.5f; // rectangle half rectangle. + const Vector3& a = inputs[0]->GetVector3(); + const Vector3 b = inputs[1]->GetVector3() + mAdjustPosition; + const Vector3& sizeA = inputs[2]->GetVector3(); + const Vector3& sizeB = inputs[3]->GetVector3(); + const Vector3 sizeA2 = sizeA * 0.5f; // circle radius + const Vector3 sizeB2 = (sizeB + mAdjustSize) * 0.5f; // rectangle half rectangle. // get collision relative to a (rectangle). Vector3 delta = a - b; // reduce rectangle to 0. - if (delta.x > sizeB2.x) + if(delta.x > sizeB2.x) { delta.x -= sizeB2.x; } - else if (delta.x < -sizeB2.x) + else if(delta.x < -sizeB2.x) { delta.x += sizeB2.x; } @@ -132,11 +133,11 @@ struct CollisionCircleRectangleConstraint delta.x = 0; } - if (delta.y > sizeB2.y) + if(delta.y > sizeB2.y) { delta.y -= sizeB2.y; } - else if (delta.y < -sizeB2.y) + else if(delta.y < -sizeB2.y) { delta.y += sizeB2.y; } @@ -157,8 +158,8 @@ struct CollisionCircleRectangleConstraint } } - const Vector3 mAdjustPosition; ///< Position Adjustment value - const Vector3 mAdjustSize; ///< Size Adjustment value + const Vector3 mAdjustPosition; ///< Position Adjustment value + const Vector3 mAdjustSize; ///< Size Adjustment value }; /** @@ -176,10 +177,9 @@ struct WobbleConstraint * * @param[in] deviation The max. deviation of wobble effect in degrees. */ - WobbleConstraint( Degree deviation ) - : mDeviation( deviation ) + WobbleConstraint(Degree deviation) + : mDeviation(deviation) { - } /** @@ -187,16 +187,16 @@ struct WobbleConstraint * @param[in] inputs Contains the wobble property (value from 0.0f to 1.0f) * @return The rotation (quaternion) is generated. */ - void operator()( Quaternion& current, const PropertyInputContainer& inputs ) + void operator()(Quaternion& current, const PropertyInputContainer& inputs) { const float& wobble = inputs[0]->GetFloat(); - float f = sinf(wobble * 10.0f) * (1.0f-wobble); + float f = sinf(wobble * 10.0f) * (1.0f - wobble); current = Quaternion(mDeviation * f, Vector3::ZAXIS); } - Radian mDeviation; ///< Deviation factor in radians. + Radian mDeviation; ///< Deviation factor in radians. }; } // unnamed namespace @@ -207,14 +207,35 @@ struct WobbleConstraint class ExampleController : public ConnectionTracker { public: - /** * Constructor * @param application Application class, stored as reference */ - ExampleController( Application& application ) - : mApplication( application ), - mView() + ExampleController(Application& application) + : mApplication(application), + mView(), + mContentLayer(), + mBall(), + mBallStartPosition(), + mBallVelocity(), + mBallAnimation(), + mPaddle(), + mPaddleImage(), + mPaddleHandle(), + mPaddleHitMargin(), + mWobbleAnimation(), + mWobbleProperty(Property::INVALID_INDEX), + mLevelContainer(), + mBrickImageMap(), + mDragAnimation(), + mDragActor(), + mRelativeDragPoint(), + mDestroyAnimationMap(), + mPaddleFullSize(), + mLevel(0), + mLives(TOTAL_LIVES), + mBrickCount(0) + { // Connect to the Application's Init and orientation changed signal mApplication.InitSignal().Connect(this, &ExampleController::Create); @@ -226,100 +247,99 @@ public: */ void Create(Application& application) { - Stage::GetCurrent().KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent); + application.GetWindow().KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent); // Creates a default view with a default tool bar. - // The view is added to the stage. + // The view is added to the window. Toolkit::ToolBar toolBar; - mContentLayer = DemoHelper::CreateView( application, - mView, - toolBar, - BACKGROUND_IMAGE, - TOOLBAR_IMAGE, - APPLICATION_TITLE ); + mContentLayer = DemoHelper::CreateView(application, + mView, + toolBar, + BACKGROUND_IMAGE, + TOOLBAR_IMAGE, + APPLICATION_TITLE); // Add an extra space on the right to center the title text. - toolBar.AddControl( Actor::New(), DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HorizontalRight ); + toolBar.AddControl(Actor::New(), DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HORIZONTAL_RIGHT); // Create the content layer, which is where game actors appear. AddContentLayer(); } private: - /** - * Adds a new layer to the stage, containing game actors. + * Adds a new layer to the window, containing game actors. */ void AddContentLayer() { - Stage stage = Stage::GetCurrent(); - const Vector3 stageSize(stage.GetSize()); + Window window = mApplication.GetWindow(); + const Vector3 windowSize(window.GetSize()); // Ball setup - mBallStartPosition = stageSize * Vector3( BALL_START_POSITION ); - mBall = CreateImage(BALL_IMAGE); - mBall.SetPosition( mBallStartPosition ); - mBall.SetSize( BALL_SIZE * stageSize.width ); + mBallStartPosition = windowSize * Vector3(BALL_START_POSITION); + mBall = CreateImage(BALL_IMAGE); + mBall.SetProperty(Actor::Property::POSITION, mBallStartPosition); + mBall.SetProperty(Actor::Property::SIZE, BALL_SIZE * windowSize.width); mContentLayer.Add(mBall); mBallVelocity = Vector3::ZERO; // Paddle setup - mPaddleHitMargin = Vector2(stageSize) * PADDLE_HIT_MARGIN; - mPaddle = Actor::New(); - mPaddleHandle = CreateImage(PADDLE_HANDLE_IMAGE); - mPaddleImage = CreateImage(PADDLE_IMAGE); - mPaddle.Add( mPaddleHandle ); - mPaddle.Add( mPaddleImage ); - mPaddleHandle.SetParentOrigin( ParentOrigin::TOP_CENTER ); - mPaddleHandle.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - mPaddleHandle.SetPosition( 0.0f, stageSize.width * 0.0125f ); - mPaddleImage.SetParentOrigin( ParentOrigin::TOP_CENTER ); - mPaddleImage.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - mPaddle.SetParentOrigin( ParentOrigin::TOP_LEFT ); - mPaddle.SetAnchorPoint( AnchorPoint::CENTER ); - mPaddleFullSize = PADDLE_SIZE * stageSize.width; - mPaddle.SetSize( mPaddleFullSize + mPaddleHitMargin ); - mPaddleHandle.SetSize( PADDLE_HANDLE_SIZE * stageSize.width ); - mPaddleImage.SetSize( mPaddleFullSize ); - - mWobbleProperty = mPaddle.RegisterProperty(WOBBLE_PROPERTY_NAME, 0.0f); - Constraint wobbleConstraint = Constraint::New( mPaddle, Actor::Property::ORIENTATION, WobbleConstraint(Degree( 10.0f ))); - wobbleConstraint.AddSource( LocalSource(mWobbleProperty) ); + mPaddleHitMargin = Vector2(windowSize) * PADDLE_HIT_MARGIN; + mPaddle = Actor::New(); + mPaddleHandle = CreateImage(PADDLE_HANDLE_IMAGE); + mPaddleImage = CreateImage(PADDLE_IMAGE); + mPaddle.Add(mPaddleHandle); + mPaddle.Add(mPaddleImage); + mPaddleHandle.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER); + mPaddleHandle.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER); + mPaddleHandle.SetProperty(Actor::Property::POSITION, Vector2(0.0f, windowSize.width * 0.0125f)); + mPaddleImage.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER); + mPaddleImage.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER); + mPaddle.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + mPaddle.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + mPaddleFullSize = PADDLE_SIZE * windowSize.width; + mPaddle.SetProperty(Actor::Property::SIZE, mPaddleFullSize + mPaddleHitMargin); + mPaddleHandle.SetProperty(Actor::Property::SIZE, PADDLE_HANDLE_SIZE * windowSize.width); + mPaddleImage.SetProperty(Actor::Property::SIZE, mPaddleFullSize); + + mWobbleProperty = mPaddle.RegisterProperty(WOBBLE_PROPERTY_NAME, 0.0f); + Constraint wobbleConstraint = Constraint::New(mPaddle, Actor::Property::ORIENTATION, WobbleConstraint(Degree(10.0f))); + wobbleConstraint.AddSource(LocalSource(mWobbleProperty)); wobbleConstraint.Apply(); - mPaddle.SetPosition( stageSize * Vector3( PADDLE_START_POSITION ) ); + mPaddle.SetProperty(Actor::Property::POSITION, windowSize * Vector3(PADDLE_START_POSITION)); mContentLayer.Add(mPaddle); mPaddle.TouchedSignal().Connect(this, &ExampleController::OnTouchPaddle); mContentLayer.TouchedSignal().Connect(this, &ExampleController::OnTouchLayer); - const float margin(BALL_SIZE.width * stageSize.width * 0.5f); + const float margin(BALL_SIZE.width * windowSize.width * 0.5f); // Set up notifications for ball's collisions against walls. - PropertyNotification leftNotification = mBall.AddPropertyNotification( Actor::Property::POSITION_X, LessThanCondition(margin) ); - leftNotification.NotifySignal().Connect( this, &ExampleController::OnHitLeftWall ); + PropertyNotification leftNotification = mBall.AddPropertyNotification(Actor::Property::POSITION_X, LessThanCondition(margin)); + leftNotification.NotifySignal().Connect(this, &ExampleController::OnHitLeftWall); - PropertyNotification rightNotification = mBall.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(stageSize.width - margin) ); - rightNotification.NotifySignal().Connect( this, &ExampleController::OnHitRightWall ); + PropertyNotification rightNotification = mBall.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(windowSize.width - margin)); + rightNotification.NotifySignal().Connect(this, &ExampleController::OnHitRightWall); - PropertyNotification topNotification = mBall.AddPropertyNotification( Actor::Property::POSITION_Y, LessThanCondition(margin) ); - topNotification.NotifySignal().Connect( this, &ExampleController::OnHitTopWall ); + PropertyNotification topNotification = mBall.AddPropertyNotification(Actor::Property::POSITION_Y, LessThanCondition(margin)); + topNotification.NotifySignal().Connect(this, &ExampleController::OnHitTopWall); - PropertyNotification bottomNotification = mBall.AddPropertyNotification( Actor::Property::POSITION_Y, GreaterThanCondition(stageSize.height + margin) ); - bottomNotification.NotifySignal().Connect( this, &ExampleController::OnHitBottomWall ); + PropertyNotification bottomNotification = mBall.AddPropertyNotification(Actor::Property::POSITION_Y, GreaterThanCondition(windowSize.height + margin)); + bottomNotification.NotifySignal().Connect(this, &ExampleController::OnHitBottomWall); // Set up notification for ball colliding against paddle. Actor delegate = Actor::New(); - stage.Add(delegate); - Property::Index property = delegate.RegisterProperty(COLLISION_PROPERTY_NAME, Vector3::ZERO); - Constraint constraint = Constraint::New( delegate, property, CollisionCircleRectangleConstraint( -Vector3(0.0f, mPaddleHitMargin.height * 0.575f, 0.0f),-Vector3(mPaddleHitMargin) ) ); - constraint.AddSource( Source(mBall, Actor::Property::POSITION) ); - constraint.AddSource( Source(mPaddle, Actor::Property::POSITION) ); - constraint.AddSource( Source(mBall, Actor::Property::SIZE) ); - constraint.AddSource( Source(mPaddle, Actor::Property::SIZE) ); + window.Add(delegate); + Property::Index property = delegate.RegisterProperty(COLLISION_PROPERTY_NAME, Vector3::ZERO); + Constraint constraint = Constraint::New(delegate, property, CollisionCircleRectangleConstraint(-Vector3(0.0f, mPaddleHitMargin.height * 0.575f, 0.0f), -Vector3(mPaddleHitMargin))); + constraint.AddSource(Source(mBall, Actor::Property::POSITION)); + constraint.AddSource(Source(mPaddle, Actor::Property::POSITION)); + constraint.AddSource(Source(mBall, Actor::Property::SIZE)); + constraint.AddSource(Source(mPaddle, Actor::Property::SIZE)); constraint.Apply(); - PropertyNotification paddleNotification = delegate.AddPropertyNotification( property, GreaterThanCondition(0.0f) ); - paddleNotification.NotifySignal().Connect( this, &ExampleController::OnHitPaddle ); + PropertyNotification paddleNotification = delegate.AddPropertyNotification(property, GreaterThanCondition(0.0f)); + paddleNotification.NotifySignal().Connect(this, &ExampleController::OnHitPaddle); RestartGame(); } @@ -332,10 +352,10 @@ private: { mLives = TOTAL_LIVES; mLevel = 0; - mBall.SetPosition( mBallStartPosition ); + mBall.SetProperty(Actor::Property::POSITION, mBallStartPosition); mBallVelocity = Vector3::ZERO; - mPaddle.SetSize( mPaddleFullSize + mPaddleHitMargin ); - mPaddleImage.SetSize( mPaddleFullSize ); + mPaddle.SetProperty(Actor::Property::SIZE, mPaddleFullSize + mPaddleHitMargin); + mPaddleImage.SetProperty(Actor::Property::SIZE, mPaddleFullSize); LoadLevel(mLevel); } @@ -350,19 +370,30 @@ private: { if(mLevelContainer && mLevelContainer.GetParent() == mContentLayer) { - mContentLayer.Remove( mLevelContainer ); + mContentLayer.Remove(mLevelContainer); } mLevelContainer = Actor::New(); - mLevelContainer.SetAnchorPoint( AnchorPoint::CENTER ); - mLevelContainer.SetParentOrigin( ParentOrigin::CENTER ); - mLevelContainer.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + mLevelContainer.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + mLevelContainer.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mLevelContainer.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); - mContentLayer.Add( mLevelContainer ); + mContentLayer.Add(mLevelContainer); mBrickCount = 0; - switch(level%TOTAL_LEVELS) + if(mBrickImageMap.Empty()) + { + Vector2 windowSize(mApplication.GetWindow().GetSize()); + const Vector2 brickSize(BRICK_SIZE * Vector2(windowSize.x, windowSize.x)); + + mBrickImageMap["desiredWidth"] = static_cast(brickSize.width); + mBrickImageMap["desiredHeight"] = static_cast(brickSize.height); + mBrickImageMap["fittingMode"] = "SCALE_TO_FILL"; + mBrickImageMap["samplingMode"] = "BOX_THEN_LINEAR"; + } + + switch(level % TOTAL_LEVELS) { case 0: { @@ -391,19 +422,19 @@ private: */ void GenerateLevel0() { - Vector2 stageSize(Stage::GetCurrent().GetSize()); - const Vector2 brickSize(BRICK_SIZE * stageSize.width); + Vector2 windowSize(mApplication.GetWindow().GetSize()); + const Vector2 brickSize(BRICK_SIZE * windowSize.width); - const int columns = (0.85f * stageSize.width) / brickSize.width; // 85 percent of the width of the screen covered with bricks. - const int rows = (0.3f * stageSize.height) / brickSize.height; // 30 percent of the height of the screen covered with bricks. - const Vector2 offset( (stageSize.x - (columns * brickSize.width)) * 0.5f, - stageSize.y * 0.125f ); + const int columns = (0.85f * windowSize.width) / brickSize.width; // 85 percent of the width of the screen covered with bricks. + const int rows = (0.3f * windowSize.height) / brickSize.height; // 30 percent of the height of the screen covered with bricks. + const Vector2 offset((windowSize.x - (columns * brickSize.width)) * 0.5f, + windowSize.y * 0.125f); for(int j = 0; j < rows; j++) { for(int i = 0; i < columns; i++) { - Actor brick = CreateBrick(Vector2(i * brickSize.width + offset.x, j * brickSize.height + offset.y) + (brickSize * 0.5f), j % TOTAL_BRICKS ); + Actor brick = CreateBrick(Vector2(i * brickSize.width + offset.x, j * brickSize.height + offset.y) + (brickSize * 0.5f), j % TOTAL_BRICKS); mLevelContainer.Add(brick); mBrickCount++; } @@ -415,23 +446,23 @@ private: */ void GenerateLevel1() { - Vector2 stageSize(Stage::GetCurrent().GetSize()); - const Vector2 brickSize(BRICK_SIZE * stageSize.width); + Vector2 windowSize(mApplication.GetWindow().GetSize()); + const Vector2 brickSize(BRICK_SIZE * windowSize.width); - const int columns = (0.85f * stageSize.width) / brickSize.width; // 85 percent of the width of the screen covered with bricks. - const int rows = (0.3f * stageSize.height) / brickSize.height; // 30 percent of the height of the screen covered with bricks. - const Vector2 offset( (stageSize.x - (columns * brickSize.width)) * 0.5f, - stageSize.y * 0.125f ); + const int columns = (0.85f * windowSize.width) / brickSize.width; // 85 percent of the width of the screen covered with bricks. + const int rows = (0.3f * windowSize.height) / brickSize.height; // 30 percent of the height of the screen covered with bricks. + const Vector2 offset((windowSize.x - (columns * brickSize.width)) * 0.5f, + windowSize.y * 0.125f); for(int j = 0; j < rows; j++) { for(int i = 0; i < columns; i++) { - int i2 = columns - i - 1; - int j2 = rows - j - 1; - int brickIndex = std::min( std::min(i, j), std::min(i2, j2) ) % TOTAL_BRICKS; + int i2 = columns - i - 1; + int j2 = rows - j - 1; + int brickIndex = std::min(std::min(i, j), std::min(i2, j2)) % TOTAL_BRICKS; - Actor brick = CreateBrick(Vector2(i * brickSize.width + offset.x, j * brickSize.height + offset.y) + (brickSize * 0.5f), brickIndex ); + Actor brick = CreateBrick(Vector2(i * brickSize.width + offset.x, j * brickSize.height + offset.y) + (brickSize * 0.5f), brickIndex); mLevelContainer.Add(brick); mBrickCount++; @@ -444,52 +475,52 @@ private: */ void GenerateLevel2() { - Vector2 stageSize(Stage::GetCurrent().GetSize()); - const Vector2 brickSize(BRICK_SIZE * stageSize.width); + Vector2 windowSize(mApplication.GetWindow().GetSize()); + const Vector2 brickSize(BRICK_SIZE * windowSize.width); - const int columns = (0.85f * stageSize.width) / brickSize.width; // 85 percent of the width of the screen covered with bricks. - const int rows = (0.3f * stageSize.height) / brickSize.height; // 30 percent of the height of the screen covered with bricks. - const Vector2 offset( (stageSize.x - (columns * brickSize.width)) * 0.5f, - stageSize.y * 0.125f ); + const int columns = (0.85f * windowSize.width) / brickSize.width; // 85 percent of the width of the screen covered with bricks. + const int rows = (0.3f * windowSize.height) / brickSize.height; // 30 percent of the height of the screen covered with bricks. + const Vector2 offset((windowSize.x - (columns * brickSize.width)) * 0.5f, + windowSize.y * 0.125f); // lays down bricks in a spiral formation starting at i,j = (0,0) top left corner // travelling right di,dj = (1,0) initially - int i = 0; - int j = 0; + int i = 0; + int j = 0; int di = 1; int dj = 0; // contracting boundaries - int left = 0; - int right = columns - 1; - int top = 2; + int left = 0; + int right = columns - 1; + int top = 2; int bottom = rows - 1; // length of current line. we stop laying down bricks when the length is 1 brick or less. int length = 0; while(true) { - Actor brick = CreateBrick(Vector2(i * brickSize.width + offset.x, j * brickSize.height + offset.y) + (brickSize * 0.5f), 0 ); + Actor brick = CreateBrick(Vector2(i * brickSize.width + offset.x, j * brickSize.height + offset.y) + (brickSize * 0.5f), 0); mLevelContainer.Add(brick); - i+=di; - j+=dj; + i += di; + j += dj; bool turn(false); - if((i==right) && (di==1)) + if((i == right) && (di == 1)) { right -= 2; turn = true; } - if((j==bottom) && (dj==1)) + if((j == bottom) && (dj == 1)) { bottom -= 2; turn = true; } - if((i==left) && (di==-1)) + if((i == left) && (di == -1)) { left += 2; turn = true; } - if((j==top) && (dj==-1)) + if((j == top) && (dj == -1)) { top += 2; turn = true; @@ -499,7 +530,7 @@ private: // turn 90 degrees clockwise. std::swap(di, dj); di = -di; - if (length<=1) + if(length <= 1) { break; } @@ -510,38 +541,34 @@ private: } } - /** - * Creates a brick at a specified position on the stage + * Creates a brick at a specified position on the window * @param[in] position the position for the brick * @param[in] type the type of brick * @return The Brick Actor is returned. */ - Actor CreateBrick( const Vector2& position, int type ) + Actor CreateBrick(const Vector2& position, int type) { - Vector2 stageSize(Stage::GetCurrent().GetSize()); - const Vector2 brickSize(BRICK_SIZE * Vector2(stageSize.x, stageSize.x)); - - Image img = ResourceImage::New( BRICK_IMAGE_PATH[type], Dali::ImageDimensions( 128, 64 ), Dali::FittingMode::SCALE_TO_FILL, Dali::SamplingMode::BOX_THEN_LINEAR ); - ImageActor brick = ImageActor::New(img); - brick.SetParentOrigin(ParentOrigin::TOP_LEFT); - brick.SetAnchorPoint(AnchorPoint::CENTER); - brick.SetSize( brickSize ); - brick.SetPosition( Vector3( position ) ); + mBrickImageMap["url"] = BRICK_IMAGE_PATH[type]; + ImageView brick = ImageView::New(); + brick.SetProperty(ImageView::Property::IMAGE, mBrickImageMap); + brick.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + brick.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + brick.SetProperty(Actor::Property::POSITION, position); // Add a constraint on the brick between it and the ball generating a collision-property - Property::Index property = brick.RegisterProperty(COLLISION_PROPERTY_NAME, Vector3::ZERO); - Constraint constraint = Constraint::New( brick, property, CollisionCircleRectangleConstraint(BRICK_COLLISION_MARGIN) ); - constraint.AddSource( Source(mBall, Actor::Property::POSITION) ); - constraint.AddSource( Source(brick, Actor::Property::POSITION) ); - constraint.AddSource( Source(mBall, Actor::Property::SIZE) ); - constraint.AddSource( Source(brick, Actor::Property::SIZE) ); + Property::Index property = brick.RegisterProperty(COLLISION_PROPERTY_NAME, Vector3::ZERO); + Constraint constraint = Constraint::New(brick, property, CollisionCircleRectangleConstraint(BRICK_COLLISION_MARGIN)); + constraint.AddSource(Source(mBall, Actor::Property::POSITION)); + constraint.AddSource(Source(brick, Actor::Property::POSITION)); + constraint.AddSource(Source(mBall, Actor::Property::SIZE)); + constraint.AddSource(Source(brick, Actor::Property::SIZE)); constraint.Apply(); // Now add a notification on this collision-property - PropertyNotification brickNotification = brick.AddPropertyNotification( property, GreaterThanCondition(0.0f) ); - brickNotification.NotifySignal().Connect( this, &ExampleController::OnHitBrick ); + PropertyNotification brickNotification = brick.AddPropertyNotification(property, GreaterThanCondition(0.0f)); + brickNotification.NotifySignal().Connect(this, &ExampleController::OnHitBrick); return brick; } @@ -551,12 +578,16 @@ private: * * @param[in] filename the path of the image. */ - ImageActor CreateImage(const std::string& filename) + ImageView CreateImage(const std::string& filename) { - Image img = ResourceImage::New(filename); - ImageActor actor = ImageActor::New(img); - actor.SetParentOrigin(ParentOrigin::TOP_LEFT); - actor.SetAnchorPoint(AnchorPoint::CENTER); + Property::Map propertyMap; + propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE); + propertyMap.Insert(ImageVisual::Property::URL, filename); + propertyMap.Insert(DevelVisual::Property::VISUAL_FITTING_MODE, DevelVisual::FILL); + ImageView actor = ImageView::New(); + actor.SetProperty(Toolkit::ImageView::Property::IMAGE, propertyMap); + actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); return actor; } @@ -571,7 +602,7 @@ private: } mBallAnimation = Animation::New(MAX_ANIMATION_DURATION); - mBallAnimation.AnimateBy( Property( mBall, Actor::Property::POSITION ), mBallVelocity * MAX_ANIMATION_DURATION); + mBallAnimation.AnimateBy(Property(mBall, Actor::Property::POSITION), mBallVelocity * MAX_ANIMATION_DURATION); mBallAnimation.Play(); } @@ -582,19 +613,19 @@ private: */ bool OnTouchPaddle(Actor actor, const TouchEvent& event) { - if(event.GetPointCount()>0) + if(event.GetPointCount() > 0) { - const TouchPoint& point = event.GetPoint(0); - if(point.state==TouchPoint::Down) // Commence dragging + if(event.GetState(0) == PointState::DOWN) // Commence dragging { // Get point where user touched paddle (relative to paddle's center) - mRelativeDragPoint = Vector3(point.screen.x, point.screen.y, 0.0f); - mRelativeDragPoint -= actor.GetCurrentPosition(); + Vector2 screenPoint = event.GetScreenPosition(0); + mRelativeDragPoint = screenPoint; + mRelativeDragPoint -= actor.GetCurrentProperty(Actor::Property::POSITION); - mDragActor = actor; + mDragActor = actor; mDragAnimation = Animation::New(0.25f); - mDragAnimation.AnimateTo( Property(mDragActor, Actor::Property::SCALE), Vector3(1.1f, 1.1f, 1.0f), AlphaFunction::EASE_OUT); - mDragAnimation.AnimateTo( Property(mPaddleHandle, Actor::Property::COLOR), Vector4(1.0f, 1.0f, 1.0f, 0.0f), AlphaFunction::EASE_OUT); + mDragAnimation.AnimateTo(Property(mDragActor, Actor::Property::SCALE), Vector3(1.1f, 1.1f, 1.0f), AlphaFunction::EASE_OUT); + mDragAnimation.AnimateTo(Property(mPaddleHandle, Actor::Property::COLOR), Vector4(1.0f, 1.0f, 1.0f, 0.0f), AlphaFunction::EASE_OUT); mDragAnimation.Play(); } } @@ -608,19 +639,18 @@ private: */ bool OnTouchLayer(Actor actor, const TouchEvent& event) { - if(event.GetPointCount()>0) + if(event.GetPointCount() > 0) { - const TouchPoint& point = event.GetPoint(0); if(mDragActor) { - Vector3 position(point.screen.x, point.screen.y, 0.0f); - mPaddle.SetPosition( position - mRelativeDragPoint ); + Vector3 position(event.GetScreenPosition(0)); + mPaddle.SetProperty(Actor::Property::POSITION, position - mRelativeDragPoint); - if(point.state==TouchPoint::Up) // Stop dragging + if(event.GetState(0) == PointState::UP) // Stop dragging { mDragAnimation = Animation::New(0.25f); - mDragAnimation.AnimateTo( Property(mDragActor, Actor::Property::SCALE), Vector3(1.0f, 1.0f, 1.0f), AlphaFunction::EASE_IN); - mDragAnimation.AnimateTo( Property(mPaddleHandle, Actor::Property::COLOR), Vector4(1.0f, 1.0f, 1.0f, 1.0f), AlphaFunction::EASE_OUT); + mDragAnimation.AnimateTo(Property(mDragActor, Actor::Property::SCALE), Vector3(1.0f, 1.0f, 1.0f), AlphaFunction::EASE_IN); + mDragAnimation.AnimateTo(Property(mPaddleHandle, Actor::Property::COLOR), Vector4(1.0f, 1.0f, 1.0f, 1.0f), AlphaFunction::EASE_OUT); mDragAnimation.Play(); mDragActor.Reset(); } @@ -670,17 +700,17 @@ private: mBallAnimation.Clear(); } - if(mLives>0) + if(mLives > 0) { mLives--; const float f(static_cast(mLives) / TOTAL_LIVES); mBallVelocity = Vector3::ZERO; Animation shrink = Animation::New(0.5f); - shrink.AnimateTo( Property(mPaddle, Actor::Property::SIZE_WIDTH), mPaddleFullSize.x * f + mPaddleHitMargin.x); - shrink.AnimateTo( Property(mPaddleImage, Actor::Property::SIZE_WIDTH), mPaddleFullSize.x * f ); + shrink.AnimateTo(Property(mPaddle, Actor::Property::SIZE_WIDTH), mPaddleFullSize.x * f + mPaddleHitMargin.x); + shrink.AnimateTo(Property(mPaddleImage, Actor::Property::SIZE_WIDTH), mPaddleFullSize.x * f); - shrink.FinishedSignal().Connect( this, &ExampleController::OnPaddleShrunk ); + shrink.FinishedSignal().Connect(this, &ExampleController::OnPaddleShrunk); shrink.Play(); } } @@ -689,13 +719,13 @@ private: * Paddle Shrink Animation complete. * @param[in] source The animation responsible for shrinking the paddle. */ - void OnPaddleShrunk( Animation &source ) + void OnPaddleShrunk(Animation& source) { // Reposition Ball in start position, and make ball appear. - mBall.SetPosition( mBallStartPosition ); - mBall.SetColor( Vector4(1.0f, 1.0f, 1.0f, 0.1f) ); + mBall.SetProperty(Actor::Property::POSITION, mBallStartPosition); + mBall.SetProperty(Actor::Property::COLOR, Vector4(1.0f, 1.0f, 1.0f, 0.1f)); Animation appear = Animation::New(0.5f); - appear.AnimateTo( Property(mBall, Actor::Property::COLOR), Vector4(1.0f, 1.0f, 1.0f, 1.0f) ); + appear.AnimateTo(Property(mBall, Actor::Property::COLOR), Vector4(1.0f, 1.0f, 1.0f, 1.0f)); appear.Play(); if(!mLives) @@ -710,9 +740,9 @@ private: */ void OnHitPaddle(PropertyNotification& source) { - Actor delegate = Actor::DownCast(source.GetTarget()); - Vector3 collisionVector = delegate.GetProperty(source.GetTargetProperty()); - Vector3 ballRelativePosition(mBall.GetCurrentPosition() - mPaddle.GetCurrentPosition()); + Actor delegate = Actor::DownCast(source.GetTarget()); + Vector3 collisionVector = delegate.GetCurrentProperty(source.GetTargetProperty()); + Vector3 ballRelativePosition(mBall.GetCurrentProperty(Actor::Property::POSITION) - mPaddle.GetCurrentProperty(Actor::Property::POSITION)); ballRelativePosition.Normalize(); collisionVector.x += ballRelativePosition.x * 0.5f; @@ -726,15 +756,15 @@ private: const float normalVelocity = fabsf(mBallVelocity.Dot(collisionVector)); mBallVelocity += collisionVector * normalVelocity * 2.0f; const float currentSpeed = mBallVelocity.Length(); - const float limitedSpeed = std::min( currentSpeed, MAX_VELOCITY ); - mBallVelocity = mBallVelocity * limitedSpeed / currentSpeed; + const float limitedSpeed = std::min(currentSpeed, MAX_VELOCITY); + mBallVelocity = mBallVelocity * limitedSpeed / currentSpeed; } ContinueAnimation(); // wobble paddle mWobbleAnimation = Animation::New(0.5f); - mWobbleAnimation.AnimateTo( Property( mPaddle, mWobbleProperty ), 1.0f ); + mWobbleAnimation.AnimateTo(Property(mPaddle, mWobbleProperty), 1.0f); mWobbleAnimation.Play(); mPaddle.SetProperty(mWobbleProperty, 0.0f); } @@ -745,14 +775,14 @@ private: */ void OnHitBrick(PropertyNotification& source) { - Actor brick = Actor::DownCast(source.GetTarget()); - Vector3 collisionVector = brick.GetProperty(source.GetTargetProperty()); + Actor brick = Actor::DownCast(source.GetTarget()); + Vector3 collisionVector = brick.GetCurrentProperty(source.GetTargetProperty()); const float normalVelocity = fabsf(mBallVelocity.Dot(collisionVector)); mBallVelocity += collisionVector * normalVelocity * 2.0f; const float currentSpeed = mBallVelocity.Length(); - const float limitedSpeed = std::min( currentSpeed, MAX_VELOCITY ); - mBallVelocity = mBallVelocity * limitedSpeed / currentSpeed; + const float limitedSpeed = std::min(currentSpeed, MAX_VELOCITY); + mBallVelocity = mBallVelocity * limitedSpeed / currentSpeed; ContinueAnimation(); @@ -762,9 +792,9 @@ private: // fade brick (destroy) Animation destroyAnimation = Animation::New(0.5f); - destroyAnimation.AnimateTo( Property( brick, Actor::Property::COLOR_ALPHA ), 0.0f, AlphaFunction::EASE_IN ); + destroyAnimation.AnimateTo(Property(brick, Actor::Property::COLOR_ALPHA), 0.0f, AlphaFunction::EASE_IN); destroyAnimation.Play(); - destroyAnimation.FinishedSignal().Connect( this, &ExampleController::OnBrickDestroyed ); + destroyAnimation.FinishedSignal().Connect(this, &ExampleController::OnBrickDestroyed); mDestroyAnimationMap[destroyAnimation] = brick; } @@ -772,9 +802,9 @@ private: * Brick Destruction Animation complete. * @param[in] source The animation responsible for destroying the brick */ - void OnBrickDestroyed( Animation& source ) + void OnBrickDestroyed(Animation& source) { - // Remove brick from stage, it's constraint and property notification should also remove themselves. + // Remove brick from window, it's constraint and property notification should also remove themselves. Actor brick = mDestroyAnimationMap[source]; mDestroyAnimationMap.erase(source); brick.GetParent().Remove(brick); @@ -792,9 +822,9 @@ private: */ void OnKeyEvent(const KeyEvent& event) { - if(event.state == KeyEvent::Down) + if(event.GetState() == KeyEvent::DOWN) { - if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) ) + if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK)) { mApplication.Quit(); } @@ -802,46 +832,38 @@ private: } private: - - Application& mApplication; ///< Application instance - Toolkit::Control mView; ///< The View instance. - Layer mContentLayer; ///< The content layer (contains game actors) - ImageActor mBall; ///< The Moving ball image. - Vector3 mBallStartPosition; ///< Ball Start position - Vector3 mBallVelocity; ///< Ball's current direction. - Animation mBallAnimation; ///< Ball's animation - Actor mPaddle; ///< The paddle including hit area. - ImageActor mPaddleImage; ///< The paddle's image. - ImageActor mPaddleHandle; ///< The paddle's handle (where the user touches) - Vector2 mPaddleHitMargin; ///< The paddle hit margin. - Animation mWobbleAnimation; ///< Paddle's animation when hit (wobbles) - Property::Index mWobbleProperty; ///< The wobble property (generated from animation) - Actor mLevelContainer; ///< The level container (contains bricks) + Application& mApplication; ///< Application instance + Toolkit::Control mView; ///< The View instance. + Layer mContentLayer; ///< The content layer (contains game actors) + ImageView mBall; ///< The Moving ball image. + Vector3 mBallStartPosition; ///< Ball Start position + Vector3 mBallVelocity; ///< Ball's current direction. + Animation mBallAnimation; ///< Ball's animation + Actor mPaddle; ///< The paddle including hit area. + ImageView mPaddleImage; ///< The paddle's image. + ImageView mPaddleHandle; ///< The paddle's handle (where the user touches) + Vector2 mPaddleHitMargin; ///< The paddle hit margin. + Animation mWobbleAnimation; ///< Paddle's animation when hit (wobbles) + Property::Index mWobbleProperty; ///< The wobble property (generated from animation) + Actor mLevelContainer; ///< The level container (contains bricks) + Property::Map mBrickImageMap; ///< The property map used to load the brick // actor - dragging functionality - Animation mDragAnimation; ///< Animation for dragging. (grows - affects ACTOR::SCALE) - Actor mDragActor; ///< The actor which is being dragged (if any) - Vector3 mRelativeDragPoint; ///< The point the user touched, relative to the actor. - std::map mDestroyAnimationMap; ///< Keep track of which actors are to be destroyed. - Vector2 mPaddleFullSize; ///< Initial 100% size of the paddle. - int mLevel; ///< Current level - int mLives; ///< Total lives. - int mBrickCount; ///< Total bricks on screen. + Animation mDragAnimation; ///< Animation for dragging. (grows - affects ACTOR::SCALE) + Actor mDragActor; ///< The actor which is being dragged (if any) + Vector3 mRelativeDragPoint; ///< The point the user touched, relative to the actor. + std::map mDestroyAnimationMap; ///< Keep track of which actors are to be destroyed. + Vector2 mPaddleFullSize; ///< Initial 100% size of the paddle. + int mLevel; ///< Current level + int mLives; ///< Total lives. + int mBrickCount; ///< Total bricks on screen. }; -void RunTest(Application& app) +int DALI_EXPORT_API main(int argc, char** argv) { + Application app = Application::New(&argc, &argv, DEMO_THEME_PATH); ExampleController test(app); - app.MainLoop(); -} - -int main(int argc, char **argv) -{ - Application app = Application::New(&argc, &argv, DALI_DEMO_THEME_PATH); - - RunTest(app); - return 0; }