Changes after TouchedSignal changes
[platform/core/uifw/dali-demo.git] / examples / blocks / blocks-example.cpp
index d61b86d..9018283 100644 (file)
@@ -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.
@@ -23,6 +23,7 @@
 
 #include <dali/dali.h>
 #include <dali-toolkit/dali-toolkit.h>
+#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 #include "shared/view.h"
 
 using namespace Dali;
@@ -31,17 +32,17 @@ 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* 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 = 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* 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[] =    { 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 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);
@@ -59,12 +60,12 @@ const Vector3 INITIAL_BALL_DIRECTION(1.0f, 1.0f, 0.0f);                     ///<
 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 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!
@@ -214,7 +215,29 @@ public:
    */
   ExampleController( Application& application )
   : mApplication( application ),
-    mView()
+    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,10 +249,10 @@ 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,
@@ -239,7 +262,7 @@ public:
                                             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();
@@ -248,68 +271,68 @@ public:
 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 );
+    mBallStartPosition = windowSize * Vector3( BALL_START_POSITION );
     mBall = CreateImage(BALL_IMAGE);
-    mBall.SetPosition( mBallStartPosition );
-    mBall.SetSize( BALL_SIZE * stageSize.width );
+    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;
+    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.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 );
+    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<Quaternion>( 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 rightNotification = mBall.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(stageSize.width - margin) );
+    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 bottomNotification = mBall.AddPropertyNotification( Actor::Property::POSITION_Y, GreaterThanCondition(stageSize.height + margin) );
+    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);
+    window.Add(delegate);
     Property::Index property = delegate.RegisterProperty(COLLISION_PROPERTY_NAME, Vector3::ZERO);
     Constraint constraint = Constraint::New<Vector3>( delegate, property, CollisionCircleRectangleConstraint( -Vector3(0.0f, mPaddleHitMargin.height * 0.575f, 0.0f),-Vector3(mPaddleHitMargin) ) );
     constraint.AddSource( Source(mBall, Actor::Property::POSITION) );
@@ -332,10 +355,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);
   }
@@ -354,14 +377,25 @@ private:
     }
 
     mLevelContainer = Actor::New();
-    mLevelContainer.SetAnchorPoint( AnchorPoint::CENTER );
-    mLevelContainer.SetParentOrigin( ParentOrigin::CENTER );
+    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 );
 
     mBrickCount = 0;
 
+    if( mBrickImageMap.Empty() )
+    {
+      Vector2 windowSize(mApplication.GetWindow().GetSize());
+      const Vector2 brickSize(BRICK_SIZE * Vector2(windowSize.x, windowSize.x));
+
+      mBrickImageMap["desiredWidth"] = static_cast<int>( brickSize.width );
+      mBrickImageMap["desiredHeight"] = static_cast<int>( brickSize.height );
+      mBrickImageMap["fittingMode"] = "SCALE_TO_FILL";
+      mBrickImageMap["samplingMode"] = "BOX_THEN_LINEAR";
+    }
+
     switch(level%TOTAL_LEVELS)
     {
       case 0:
@@ -391,13 +425,13 @@ 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++)
     {
@@ -415,13 +449,13 @@ 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++)
     {
@@ -444,13 +478,13 @@ 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
@@ -512,22 +546,19 @@ 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 )
   {
-    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 );
-    ImageView brick = ImageView::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);
@@ -553,9 +584,14 @@ private:
    */
   ImageView CreateImage(const std::string& filename)
   {
-    ImageView actor = ImageView::New(filename);
-    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;
   }
 
@@ -583,12 +619,12 @@ private:
   {
     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< Vector3 >( Actor::Property::POSITION );
 
         mDragActor = actor;
         mDragAnimation = Animation::New(0.25f);
@@ -609,13 +645,12 @@ private:
   {
     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);
@@ -691,8 +726,8 @@ private:
   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.Play();
@@ -710,8 +745,8 @@ private:
   void OnHitPaddle(PropertyNotification& source)
   {
     Actor delegate = Actor::DownCast(source.GetTarget());
-    Vector3 collisionVector = delegate.GetProperty<Vector3>(source.GetTargetProperty());
-    Vector3 ballRelativePosition(mBall.GetCurrentPosition() - mPaddle.GetCurrentPosition());
+    Vector3 collisionVector = delegate.GetCurrentProperty< Vector3 >( source.GetTargetProperty() );
+    Vector3 ballRelativePosition(mBall.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ) - mPaddle.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ));
     ballRelativePosition.Normalize();
 
     collisionVector.x += ballRelativePosition.x * 0.5f;
@@ -745,7 +780,7 @@ private:
   void OnHitBrick(PropertyNotification& source)
   {
     Actor brick = Actor::DownCast(source.GetTarget());
-    Vector3 collisionVector = brick.GetProperty<Vector3>(source.GetTargetProperty());
+    Vector3 collisionVector = brick.GetCurrentProperty< Vector3 >( source.GetTargetProperty() );
 
     const float normalVelocity = fabsf(mBallVelocity.Dot(collisionVector));
     mBallVelocity += collisionVector * normalVelocity * 2.0f;
@@ -773,7 +808,7 @@ private:
    */
   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);
@@ -791,7 +826,7 @@ 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) )
       {
@@ -816,6 +851,7 @@ private:
   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
 
@@ -829,18 +865,10 @@ private:
   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;
 }