diff --git a/C++ProjectTemplate b/C++ProjectTemplate index ac4d319..fbd6816 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/cutscene.h b/cutscene.h index 2e4946e..02b7b14 100644 --- a/cutscene.h +++ b/cutscene.h @@ -19,6 +19,7 @@ enum class ActionType{ SET_FLAG_WHEN_CUTSCENE_ENDS, FADE, DIALOG, + MOVE_CUTSCENE_OBJ }; class CutsceneAction{ @@ -73,6 +74,35 @@ class PanCamera:public CutsceneAction{ } }; +class MoveCutsceneObject:public CutsceneAction{ + private: + int objID; + vd2d targetPos; + double moveSpd; + PriorityDirection dir; + public: + MoveCutsceneObject(int objID,vd2d targetPos,double moveSpd=CAMERA_MOVESPD,PriorityDirection dir=BOTH) { + this->objID=objID; + this->targetPos=targetPos; + this->moveSpd=moveSpd; + this->dir=dir; + } + ActionType GetActionType() override{return ActionType::MOVE_CUTSCENE_OBJ;} + //Based on how they were created in the cutscene, an object ID starting from 0 indicating which object you want to manipulate. + int GetObjectID() { + return objID; + } + double GetMoveSpd() { + return moveSpd; + } + vd2d GetTargetPos() { + return targetPos; + } + PriorityDirection GetMovement() { + return dir; + } + }; + class SetFlagWhenCutsceneEnds:public CutsceneAction{ private: Flag flag; diff --git a/main.cpp b/main.cpp index 4407c57..1936bf4 100644 --- a/main.cpp +++ b/main.cpp @@ -192,6 +192,7 @@ public: (CutsceneAction*)new SetFlagWhenCutsceneEnds(Flag::TEST_FLAG1), (CutsceneAction*)new PanCamera({128,128},BOTH), (CutsceneAction*)new PanCamera({64,0},BOTH), + (CutsceneAction*)new MoveCutsceneObject(1,{80,64}), (CutsceneAction*)new DialogBox(R"(Hello! This is a test message that lets us trigger straight from a cutscene! Cool!)"),}); @@ -276,6 +277,11 @@ goes on a very long time, I hope you can understand this is only for testing pur CurrentCutscene->AdvanceAction(); } }break; + case ActionType::MOVE_CUTSCENE_OBJ:{ + if (MoveObjectTowardsPoint(CurrentCutscene->GetCutsceneObjects()[((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetObjectID()],((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetTargetPos(),((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetMovement(),((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetMoveSpd())) { + CurrentCutscene->AdvanceAction(); + } + }break; case ActionType::CREATE_OBJECTS:{ for (auto&obj:((CreateObjects*)CurrentCutscene->GetAction())->GetObjects()) { obj->temp=true; @@ -1309,6 +1315,49 @@ goes on a very long time, I hope you can understand this is only for testing pur return reachedPosition; } + bool MoveObjectTowardsPoint(Object*obj,vd2d targetPos,PriorityDirection dir,double moveSpd,bool secondRun=false) { + bool reachedPosition=true; + if (dir==HORZ_FIRST||dir==BOTH) { + if (obj->pos.x!=targetPos.x) { + if (obj->pos.xpos.x+=moveSpd; + if (obj->pos.x>targetPos.x) { + obj->pos.x=targetPos.x; + } + } else { + obj->pos.x-=moveSpd; + if (obj->pos.xpos.x=targetPos.x; + } + } + reachedPosition=false; + } else + if (!secondRun&&dir!=BOTH) { + MoveObjectTowardsPoint(obj,targetPos,dir,moveSpd,true); + } + } + if (dir==VERT_FIRST||dir==BOTH) { + if (obj->pos.y!=targetPos.y) { + if (obj->pos.ypos.y+=moveSpd; + if (obj->pos.y>targetPos.y) { + obj->pos.y=targetPos.y; + } + } else { + obj->pos.y-=moveSpd; + if (obj->pos.ypos.y=targetPos.y; + } + } + reachedPosition=false; + } else + if (!secondRun&&dir!=BOTH) { + MoveObjectTowardsPoint(obj,targetPos,dir,moveSpd,true); + } + } + return reachedPosition; + } + void SetGameFlag(Flag flag,bool val) { GAME_FLAGS[flagint(flag)]=val; }