diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 90b492a..9eed648 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/assets/maps/map0 b/assets/maps/map0 index f51b231..0c1ff22 100644 --- a/assets/maps/map0 +++ b/assets/maps/map0 @@ -48,20 +48,33 @@ ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -OBJECT313.000000;126.000000;0 -OBJECT160.000000;32.000000;40 -OBJECT256.000000;64.000000;40 -OBJECT256.000000;128.000000;40 -OBJECT384.000000;96.000000;40 -OBJECT352.000000;64.000000;40 -OBJECT448.000000;96.000000;40 -OBJECT416.000000;224.000000;41 -OBJECT352.000000;192.000000;41 -OBJECT256.000000;224.000000;41 -OBJECT288.000000;192.000000;41 -OBJECT320.000000;224.000000;58 -OBJECT384.000000;96.000000;58 -OBJECT480.000000;96.000000;58 -OBJECT544.000000;96.000000;58 \ No newline at end of file +OBJECT256.000000;128.000000;2 +OBJECT224.000000;128.000000;2 +OBJECT160.000000;128.000000;2 +OBJECT192.000000;128.000000;2 +OBJECT288.000000;128.000000;2 +OBJECT212.000000;228.000000;0 +OBJECT192.000000;160.000000;2 +OBJECT160.000000;160.000000;2 +OBJECT192.000000;192.000000;2 +OBJECT160.000000;192.000000;2 +OBJECT192.000000;224.000000;2 +OBJECT160.000000;224.000000;2 +OBJECT313.000000;131.000000;4 +OBJECT288.000000;160.000000;3 +OBJECT224.000000;160.000000;3 +OBJECT256.000000;160.000000;2 +OBJECT313.000000;136.000000;5 +OBJECT313.000000;141.000000;6 +OBJECT313.000000;151.000000;8 +OBJECT256.000000;192.000000;2 +OBJECT288.000000;192.000000;2 +OBJECT224.000000;192.000000;2 +OBJECT288.000000;224.000000;2 +OBJECT256.000000;224.000000;2 +OBJECT224.000000;224.000000;2 +OBJECT288.000000;256.000000;2 +OBJECT256.000000;256.000000;2 +OBJECT224.000000;256.000000;2 +OBJECT192.000000;256.000000;2 +OBJECT160.000000;256.000000;2 \ No newline at end of file diff --git a/assets/maps/map0_2 b/assets/maps/map0_2 index 2268271..a04989a 100644 --- a/assets/maps/map0_2 +++ b/assets/maps/map0_2 @@ -47,6 +47,4 @@ ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? \ No newline at end of file diff --git a/assets/maps/map0_3 b/assets/maps/map0_3 index 880b5d0..0486565 100644 --- a/assets/maps/map0_3 +++ b/assets/maps/map0_3 @@ -47,6 +47,4 @@ ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? \ No newline at end of file diff --git a/assets/maps/map0_4 b/assets/maps/map0_4 index f3f8922..2e36d1a 100644 --- a/assets/maps/map0_4 +++ b/assets/maps/map0_4 @@ -47,6 +47,4 @@ ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? \ No newline at end of file diff --git a/assets/maps/map0_5 b/assets/maps/map0_5 index f3f8922..2e36d1a 100644 --- a/assets/maps/map0_5 +++ b/assets/maps/map0_5 @@ -47,6 +47,4 @@ ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? \ No newline at end of file diff --git a/main.cpp b/main.cpp index 1b9b77d..f1a0010 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,7 @@ #include "references.h" #include "states.h" #include "flags.h" +#include #define WIDTH 256 #define HEIGHT 224 @@ -76,16 +77,20 @@ class Object{ bool drawn=false; int disableFlag; int enableFlag; + int objArrElement; //Which element in the object array this object is located in. For sorting purposes. //animationSpd is how long to wait before switching frames. Object(int id,std::string name,vd2d pos,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1) { this->spr=spr; this->pos=pos; this->id=id; this->name=name; - this->scale=scale; this->color=color; this->animationSpd=animationSpd; - this->originPoint={spr->width/2,spr->spr->sprite->height-4}; + SetScale(scale); + } + void SetScale(vd2d scale) { + this->scale=scale; + this->originPoint={spr->width/2*scale.x,(spr->spr->sprite->height-4)*scale.y}; } }; @@ -114,6 +119,7 @@ public: int SELECTED_OBJ_ID = PLAYER; int OBJ_DISPLAY_OFFSET = 0; bool GAME_FLAGS[128]={}; + Object* PLAYER_OBJ; bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things. @@ -122,8 +128,8 @@ public: std::vector> MAP3; std::vector> MAP4; std::vector> MAP5; //Collision Layer - std::map SPRITES; - std::map ANIMATIONS; + std::map SPRITES; + std::map ANIMATIONS; std::map OBJ_INFO; std::vector OBJECTS; @@ -146,7 +152,7 @@ public: GAME_FLAGS[Flag::TEST_FLAG2]=false; GAME_FLAGS[Flag::TEST_FLAG3]=true; - MAP_ONETT=new Map("map0","map0_2","map0_3","map0_4","map0_5",SPRITES[TILESET1]); + MAP_ONETT=new Map("map0","map0_2","map0_3","map0_4","map0_5",SPRITES["terrainmap.png"]); CURRENT_MAP=MAP_ONETT; //OBJ_INFO["PLAYER"]=PLAYER_ANIMATION; @@ -213,23 +219,23 @@ public: } if (OBJECTS.size()>0) { if (GetKey(I).bHeld) { - if (!Collision({OBJECTS[0]->pos.x+OBJECTS[0]->originPoint.x,OBJECTS[0]->pos.y-1+OBJECTS[0]->originPoint.y})) { - OBJECTS[0]->pos.y-=1; + if (!Collision({PLAYER_OBJ->pos.x+PLAYER_OBJ->originPoint.x,PLAYER_OBJ->pos.y-1+PLAYER_OBJ->originPoint.y})) { + Move(PLAYER_OBJ,{0,-1}); } } if (GetKey(K).bHeld) { - if (!Collision({OBJECTS[0]->pos.x+OBJECTS[0]->originPoint.x,OBJECTS[0]->pos.y+1+OBJECTS[0]->originPoint.y})) { - OBJECTS[0]->pos.y+=1; + if (!Collision({PLAYER_OBJ->pos.x+PLAYER_OBJ->originPoint.x,PLAYER_OBJ->pos.y+1+PLAYER_OBJ->originPoint.y})) { + Move(PLAYER_OBJ,{0,1}); } } if (GetKey(J).bHeld) { - if (!Collision({OBJECTS[0]->pos.x-1+OBJECTS[0]->originPoint.x,OBJECTS[0]->pos.y+OBJECTS[0]->originPoint.y})) { - OBJECTS[0]->pos.x-=1; + if (!Collision({PLAYER_OBJ->pos.x-1+PLAYER_OBJ->originPoint.x,PLAYER_OBJ->pos.y+PLAYER_OBJ->originPoint.y})) { + Move(PLAYER_OBJ,{-1,0}); } } if (GetKey(L).bHeld) { - if (!Collision({OBJECTS[0]->pos.x+1+OBJECTS[0]->originPoint.x,OBJECTS[0]->pos.y+OBJECTS[0]->originPoint.y})) { - OBJECTS[0]->pos.x+=1; + if (!Collision({PLAYER_OBJ->pos.x+1+PLAYER_OBJ->originPoint.x,PLAYER_OBJ->pos.y+PLAYER_OBJ->originPoint.y})) { + Move(PLAYER_OBJ,{1,0}); } } } @@ -378,7 +384,7 @@ public: GAME_STATE=GameState::OBJ_SELECT; } if (EDITING_LAYER==layer::OBJECT&&GetMouse(0).bPressed) { - OBJECTS.push_back(CreateObject(SELECTED_OBJ_ID,HIGHLIGHTED_TILE*32)); + AddObjectToWorld(CreateObject(SELECTED_OBJ_ID,HIGHLIGHTED_TILE*32)); } else if (EDITING_LAYER==layer::OBJECT&&GetMouse(1).bReleased) { for (int i=0;idrawn&&obj->pos.y+obj->originPoint.y*obj->scale.y>(y+yTileOffset)*32&&obj->pos.y+obj->originPoint.y*obj->scale.y<=(y+yTileOffset+1)*32) { + if (!obj->drawn&&obj->pos.y+obj->originPoint.y>(y+yTileOffset)*32&&obj->pos.y+obj->originPoint.y<=(y+yTileOffset+1)*32) { obj->drawn=true; SetDrawTarget(layer::DYNAMIC); DrawPartialDecal(obj->pos-cameraPos,obj->spr->spr,{(obj->frameIndex%obj->spr->frames)*obj->spr->width,0},{obj->spr->width,obj->spr->spr->sprite->height},obj->scale,obj->color); @@ -423,23 +429,23 @@ public: if (x+xTileOffset>=0&&x+xTileOffset=0&&y+yTileOffsettileX*MAP5[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::COLLISION); - DrawPartialSprite({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES[TILESET1]->sprite,{MAP5[y+yTileOffset][x+xTileOffset]->tileX*32,MAP5[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); + DrawPartialSprite({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"]->sprite,{MAP5[y+yTileOffset][x+xTileOffset]->tileX*32,MAP5[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP4[y+yTileOffset][x+xTileOffset]->tileX*MAP4[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::BACKGROUND); - DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES[TILESET1],{MAP4[y+yTileOffset][x+xTileOffset]->tileX*32,MAP4[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); + DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP4[y+yTileOffset][x+xTileOffset]->tileX*32,MAP4[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP3[y+yTileOffset][x+xTileOffset]->tileX*MAP3[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::GROUND); - DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES[TILESET1],{MAP3[y+yTileOffset][x+xTileOffset]->tileX*32,MAP3[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); + DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP3[y+yTileOffset][x+xTileOffset]->tileX*32,MAP3[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP2[y+yTileOffset][x+xTileOffset]->tileX*MAP2[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::DYNAMIC); - DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES[TILESET1],{MAP2[y+yTileOffset][x+xTileOffset]->tileX*32,MAP2[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); + DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP2[y+yTileOffset][x+xTileOffset]->tileX*32,MAP2[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP[y+yTileOffset][x+xTileOffset]->tileX*MAP[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::HIGH); - DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES[TILESET1],{MAP[y+yTileOffset][x+xTileOffset]->tileX*32,MAP[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); + DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP[y+yTileOffset][x+xTileOffset]->tileX*32,MAP[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } } } @@ -454,7 +460,7 @@ public: }break; case GameState::TILE_SELECT:{ //14x14 pixels per tile. - DrawDecal({0,0},SPRITES[TILESET1],{TILEMAP_EDITOR_DRAW_MULT,TILEMAP_EDITOR_DRAW_MULT}); + DrawDecal({0,0},SPRITES["terrainmap.png"],{TILEMAP_EDITOR_DRAW_MULT,TILEMAP_EDITOR_DRAW_MULT}); DrawRectDecal(SELECTED_TILE*(TILEMAP_EDITOR_TILESIZE),{TILEMAP_EDITOR_TILESIZE,TILEMAP_EDITOR_TILESIZE},RED); }break; case GameState::OBJ_SELECT:{ @@ -570,7 +576,7 @@ public: } } if (enabled) { - OBJECTS.push_back(CreateObject(id,{x,y})); + AddObjectToWorld(CreateObject(id,{x,y})); } printf("Object %s Loaded.\n",OBJ_INFO[id]->name.c_str()); } else { @@ -679,7 +685,8 @@ public: } Decal*CreateSprite(std::string spriteName) { - return new Decal(new Sprite("assets/"+spriteName)); + SPRITES[spriteName] = new Decal(new Sprite("assets/"+spriteName)); + return SPRITES[spriteName]; } Object*CreateObject(int id,vd2d pos) { @@ -687,8 +694,10 @@ public: } Object*CreateObjectInfo(Reference ref,std::string name,vd2d pos,std::string spriteFileName,int sprWidth,vd2d scale={1,1},Pixel tint=WHITE,int enableFlag=Flag::NONE,int disableFlag=Flag::NONE,int animationDelay=1) { - ANIMATIONS[ref] = new Animation(SPRITES[ref]=CreateSprite("player.png"),32); - Object*newObj = new Object(ref,name,pos,ANIMATIONS[ref],scale,tint,animationDelay); + if (!ANIMATIONS.count(spriteFileName)) { + ANIMATIONS[spriteFileName] = new Animation(SPRITES[spriteFileName]=CreateSprite(spriteFileName),32); + } + Object*newObj = new Object(ref,name,pos,ANIMATIONS[spriteFileName],scale,tint,animationDelay); newObj->disableFlag=disableFlag; newObj->enableFlag=enableFlag; OBJ_INFO[ref]=newObj; @@ -697,7 +706,7 @@ public: void SetupAnimations() { - SPRITES[TILESET1] = CreateSprite("terrainmap.png"); + CreateSprite("terrainmap.png"); } void SetupObjectInfo() { @@ -870,6 +879,62 @@ public: return collisionData!=MAGENTA; } + void Move(Object*obj,vd2d move) { + if (move.y==0) { + obj->pos+=move; + return; + } else { + if (move.y<0) { + if (obj->objArrElement>0&&OBJECTS[obj->objArrElement-1]->pos.y+OBJECTS[obj->objArrElement-1]->originPoint.y>obj->pos.y+obj->originPoint.y+move.y) { + OBJECTS[obj->objArrElement]=OBJECTS[obj->objArrElement-1]; + OBJECTS[obj->objArrElement-1]=obj; + OBJECTS[obj->objArrElement]->objArrElement=obj->objArrElement; + obj->objArrElement--; + } + } else { + if (obj->objArrElementobjArrElement+1]->pos.y+OBJECTS[obj->objArrElement+1]->originPoint.ypos.y+obj->originPoint.y+move.y) { + OBJECTS[obj->objArrElement]=OBJECTS[obj->objArrElement+1]; + OBJECTS[obj->objArrElement+1]=obj; + OBJECTS[obj->objArrElement]->objArrElement=obj->objArrElement; + obj->objArrElement++; + } + } + obj->pos+=move; + } + } + + void AddObjectToWorld(Object*obj) { + std::vector::const_iterator it = OBJECTS.begin(); + if (obj->id==PLAYER) { + PLAYER_OBJ=obj; + } + bool inserted=false; + for (int i=0;ipos.y+OBJECTS[i]->originPoint.y>obj->pos.y+obj->originPoint.y) { + OBJECTS.insert(it,obj); + obj->objArrElement=i; + inserted=true; + break; + } + it++; + } + if (!inserted) { + obj->objArrElement=OBJECTS.size(); + OBJECTS.push_back(obj); + } else { + for (int i=0;iobjArrElement=i; + } + } + + printf("OBJECTS (%d):\n",OBJECTS.size()); + for (int i=0;iname.c_str(),OBJECTS[i]->objArrElement,OBJECTS[i]->pos.x,OBJECTS[i]->pos.y); + assert(i==OBJECTS[i]->objArrElement); + } + printf("\n"); + } + bool TabHeld(){ return GetKey(TAB).bHeld;