DispLayer
From SWWorkshop
In SWEngine there is no Z axis but have a layer mechanism.
- swDispManagerAdd(defenderDisplay,defender,NULL,NULL,&defender->layer); 5th parameters is item layer referance. You can configure your layer with changing layer properties. You can take an item front or back.
Sample This example is extreme case. We walk defender around xen. In 3D it's simple operation. But in 2D you must make lot's of setting and calls YouTube Video
About Code
- In 3D define a path and move item on path.
- In 2D this operation is a bit harder.
- Create avoid and rotate sprite
- Move with avoid animation in two coordinate. Go..
- When defender access target point. Stop defender move and switch rotate animation
- At the end of rotation mirror defender.
- Resize defender. it will smaller when far away .
- At the end of resize set layer 1.
- Move defender to start point . (It will come back.)
- Resize.
- Rotate
- Mirror
- LOOP ...... I use swInterpolater api for animated visual.
Source Code
//------------------------------------------------------------------------------------------- void defenderExecute(void *obj){ Defender *defender=(Defender*)obj; switch(defender->state){ //======================================================================= // STATE: MOVE X0 TO X1 //====================================================================== case DefenderState_Move_X0_X1_Enter: swInterpolaterStart(x0_x1_InterpolaterID); defender->state=DefenderState_Move_X0_X1_Exec; break; case DefenderState_Move_X0_X1_Exec: defender->target.x=swInterpolaterGetValue(x0_x1_InterpolaterID); if(swInterpolaterIsFinished(x0_x1_InterpolaterID)) defender->state=DefenderState_Move_X0_X1_Exit; break; case DefenderState_Move_X0_X1_Exit: defender->state=DefenderState_RotateLeft_Enter; break; //======================================================================= // STATE: ROTATE LEFT //======================================================================= case DefenderState_RotateLeft_Enter: defender->spriteID=spriteRotID; defender->animatorID=defender->rotateAnimatorID; swAnimatorSetIndex(defender->rotateAnimatorID,0); swAnimatorSetExecutionMode(defender->rotateAnimatorID,SW_ANIMATOR_EXEC_FORWARD); defender->state=DefenderState_RotateLeft_Exec; break; case DefenderState_RotateLeft_Exec: if(swAnimatorIsLastFrameActive(defender->animatorID)){ defender->state=DefenderState_RotateLeft_Exit; } break; case DefenderState_RotateLeft_Exit: swAnimatorSetIndex(defender->rotateAnimatorID,0); swRectCopy(&defender->source,&SW_SPRITE_SOURCE_DEFAULT); defender->spriteID=spriteVoidID; defender->animatorID=defender->avoidAnimatorID; defender->state=DefenderState_SwitchLayer1_Enter; break; //======================================================================= // STATE: SWTICH LAYER 3 TO 1 //======================================================================= case DefenderState_SwitchLayer1_Enter: swInterpolaterStart(L3w_L1w_InterpolaterID); swInterpolaterStart(L3h_L1h_InterpolaterID); defender->state=DefenderState_SwitchLayer1_Exec; break; case DefenderState_SwitchLayer1_Exec: defender->target.w=swInterpolaterGetValue(L3w_L1w_InterpolaterID); defender->target.h=swInterpolaterGetValue(L3h_L1h_InterpolaterID); if(swInterpolaterIsFinished(L3w_L1w_InterpolaterID) && swInterpolaterIsFinished(L3h_L1h_InterpolaterID)) defender->state=DefenderState_SwitchLayer1_Exit; break; case DefenderState_SwitchLayer1_Exit: defender->layer=1; defender->state=DefenderState_Move_X1_X0_Enter; break; //======================================================================= // STATE: MOVE X1 TO X0 //======================================================================= case DefenderState_Move_X1_X0_Enter: swInterpolaterStart(x1_x0_InterpolaterID); defender->state=DefenderState_Move_X1_X0_Exec; break; case DefenderState_Move_X1_X0_Exec: defender->target.x=swInterpolaterGetValue(x1_x0_InterpolaterID); if(swInterpolaterIsFinished(x1_x0_InterpolaterID)) defender->state=DefenderState_Move_X1_X0_Exit; break; case DefenderState_Move_X1_X0_Exit: defender->state=DefenderState_SwitchLayer3_Enter; break; //======================================================================= // STATE: SWTICH LAYER 1 TO 3 //======================================================================= case DefenderState_SwitchLayer3_Enter: swInterpolaterStart(L1w_L3w_InterpolaterID); swInterpolaterStart(L1h_L3h_InterpolaterID); defender->state=DefenderState_SwitchLayer3_Exec; break; case DefenderState_SwitchLayer3_Exec: defender->target.w=swInterpolaterGetValue(L1w_L3w_InterpolaterID); defender->target.h=swInterpolaterGetValue(L1h_L3h_InterpolaterID); if(swInterpolaterIsFinished(L1w_L3w_InterpolaterID) && swInterpolaterIsFinished(L1h_L3h_InterpolaterID)) defender->state=DefenderState_SwitchLayer3_Exit; break; case DefenderState_SwitchLayer3_Exit: defender->layer=3; defender->state=DefenderState_RotateRight_Enter; break; //======================================================================= // STATE: ROTATE RIGHT //======================================================================= case DefenderState_RotateRight_Enter: defender->spriteID=spriteRotID; defender->animatorID=defender->rotateAnimatorID; swAnimatorSetIndex(defender->rotateAnimatorID,0); swAnimatorSetExecutionMode(defender->rotateAnimatorID,SW_ANIMATOR_EXEC_FORWARD); defender->state=DefenderState_RotateRight_Exec; break; case DefenderState_RotateRight_Exec: if(swAnimatorIsLastFrameActive(defender->animatorID)){ defender->state=DefenderState_RotateRight_Exit; } break; case DefenderState_RotateRight_Exit: defender->spriteID=spriteVoidID; defender->animatorID=defender->avoidAnimatorID; swRectCopy(&defender->source,&SW_SPRITE_SOURCE_MIRRORY); swAnimatorSetExecutionMode(defender->avoidAnimatorID,SW_ANIMATOR_EXEC_FORWARD_LOOP); defender->state=DefenderState_Move_X0_X1_Enter; break; } }
