diff --git a/Makefile b/Makefile index 6b770fb..0b81356 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ #-*- Makefile -*- -OBJS = main.o player.o dt.o block.o entity.o +OBJS = main.o player.o dt.o block.o entity.o camera.o CC = g++ COMPILER_FLAGS = -w -LINKER_FLAGS = -lSDL2 -std=gnu++11 +LINKER_FLAGS = -lSDL2 -std=gnu++11 -lSDL2_image OBJ_NAME = bin/main @@ -17,14 +17,17 @@ all: $(OBJS) main.o: main.cpp $(CC) -c main.cpp $(LINKER_FLAGS) -player.o: player.cpp player.h entity.h +player.o: player.cpp player.h entity.o $(CC) -c player.cpp -lm $(LINKER_FLAGS) dt.o: dt.cpp dt.h $(CC) -c dt.cpp $(LINKER_FLAGS) -block.o: block.cpp block.h entity.h +block.o: block.cpp block.h entity.o $(CC) -c block.cpp $(LINKER_FLAGS) entity.o: entity.cpp entity.h $(CC) -c entity.cpp $(LINKER_FLAGS) + +camera.o: camera.cpp camera.h + $(CC) -c camera.cpp diff --git a/bin/main b/bin/main index a7aec38..474b12f 100755 Binary files a/bin/main and b/bin/main differ diff --git a/block.cpp b/block.cpp index 39eacb6..9dbcad4 100644 --- a/block.cpp +++ b/block.cpp @@ -1,13 +1,19 @@ #include"block.h" -void Block::print(int x, int y, int w, int h,SDL_Renderer* renderer){ - posX = x; - posY = y; - szW = w; - szH = h; - - rect = {posX, posY, szW, szH}; +Block::Block(int x, int y, int w, int h,SDL_Renderer** render){ + //set the rectangle dimensions + rect = {x,y,w,h}; - SDL_SetRenderDrawColor(renderer,0,0xFF,0,0xFF); - SDL_RenderFillRect(renderer,&rect); + //Set the renderer pointer + renderer = render; } + +void Block::print(int cameraX){ + //New SDL_Rect to make the objects follow the camera + SDL_Rect cameraFix = rect; + cameraFix.x -= cameraX; + + //Set render color and render the rectangle + SDL_SetRenderDrawColor(*renderer,0,0xFF,0,0xFF); + SDL_RenderFillRect(*renderer,&cameraFix); +}; diff --git a/block.h b/block.h index 3a25f77..b09dc48 100644 --- a/block.h +++ b/block.h @@ -11,7 +11,10 @@ class Entity; class Block: public Entity{ public: - void print(int x,int y,int w,int h,SDL_Renderer* renderer); + Block(int x,int y,int w,int h,SDL_Renderer** render); + void print(int cameraX); + private: + SDL_Renderer** renderer; }; #endif diff --git a/camera.cpp b/camera.cpp new file mode 100644 index 0000000..8a583f3 --- /dev/null +++ b/camera.cpp @@ -0,0 +1,25 @@ +//Camera class body + +#include"camera.h" + +Camera::Camera(int mapWidth,int screenWidth){ + mW = mapWidth; + scW = screenWidth; +} + +void Camera::update(int playerX, int playerY){ + //Make the camera when the player hits the middle of the screem + if(playerX >= scW/2) posX = playerX - scW/2; + else posX = 0; + if(playerX >= mW - scW/2) posX = mW - scW; + + //posY = playerY; +}; + +int Camera::getPosX(){ + return posX; +}; + +int Camera::getPosY(){ + return posY; +}; diff --git a/camera.h b/camera.h new file mode 100644 index 0000000..ac3c657 --- /dev/null +++ b/camera.h @@ -0,0 +1,17 @@ +//Camera class header + +#ifndef __CAMERA_H_INCLUDED__ +#define __CAMERA_H_INCLUDED__ + +class Camera{ + public: + Camera(int mapWidth,int screenWidth); + void update(int playerX, int playerY); + int getPosX(); + int getPosY(); + private: + int posX, posY; + int mW, scW; +}; + +#endif diff --git a/main b/main deleted file mode 100644 index f2406e4..0000000 Binary files a/main and /dev/null differ diff --git a/main.cpp b/main.cpp index c386288..96c6681 100644 --- a/main.cpp +++ b/main.cpp @@ -2,8 +2,10 @@ #include #include +//#include #include"player.h" #include"block.h" +#include"camera.h" const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; @@ -17,10 +19,6 @@ const int sz = SCREEN_WIDTH/16; void init(); bool loadMedia(); void close(); -void gameLoop(); - -Player posweg; -Block ground; bool loadMedia(){ bool success = true; @@ -46,35 +44,22 @@ void close(){ SDL_Quit(); } -void gameLoop(){ - SDL_SetRenderDrawColor(gRenderer,0,0,0,0xFF); - SDL_RenderClear(gRenderer); - - Block wallA; - Block wallB; - Block wallC; - wallA.print(8*sz,SCREEN_HEIGHT-sz*5,sz*2,sz*2,gRenderer); - wallB.print(4*sz,SCREEN_HEIGHT-sz*3,sz,sz*2,gRenderer); - wallC.print(6*sz,SCREEN_HEIGHT-sz*3,sz,sz*2,gRenderer); - ground.print(0,SCREEN_HEIGHT-sz,SCREEN_WIDTH,sz,gRenderer); - posweg.print(); - - - posweg.check(wallA.getRectangle()); - posweg.check(wallB.getRectangle()); - posweg.check(wallC.getRectangle()); - posweg.check(ground.getRectangle()); - - SDL_RenderPresent(gRenderer); -} - int main(int argc, char* args[]){ init(); loadMedia(); bool quit = false; SDL_Event e; + + Player posweg; + Camera camera(36*sz,SCREEN_WIDTH); + Block wallA(8*sz,SCREEN_HEIGHT-sz*5,sz*2,sz*2,&gRenderer); + Block wallB(4*sz,SCREEN_HEIGHT-sz*3,sz,sz*2,&gRenderer); + Block wallC(6*sz,SCREEN_HEIGHT-sz*3,sz,sz*2,&gRenderer); + Block ground(0,SCREEN_HEIGHT-sz,SCREEN_WIDTH,sz,&gRenderer); + Block ground2(SCREEN_WIDTH+sz*4,SCREEN_HEIGHT-sz,SCREEN_WIDTH,sz,&gRenderer); + posweg.init(100,100,sz,sz,&gRenderer); while(!quit){ @@ -83,8 +68,27 @@ int main(int argc, char* args[]){ quit = true; } } + SDL_SetRenderDrawColor(gRenderer,0,0,0,0xFF); + SDL_RenderClear(gRenderer); - gameLoop(); + camera.update(posweg.getRectangle().x,posweg.getRectangle().y); + + posweg.print(camera.getPosX()); + std::cout << posweg.getRectangle().x << std::endl; + + wallA.print(camera.getPosX()); + wallB.print(camera.getPosX()); + wallC.print(camera.getPosX()); + ground.print(camera.getPosX()); + ground2.print(camera.getPosX()); + + posweg.check(wallA.getRectangle()); + posweg.check(wallB.getRectangle()); + posweg.check(wallC.getRectangle()); + posweg.check(ground.getRectangle()); + posweg.check(ground2.getRectangle()); + + SDL_RenderPresent(gRenderer); } close(); return 0; diff --git a/player.cpp b/player.cpp index f392409..ba1584d 100644 --- a/player.cpp +++ b/player.cpp @@ -2,11 +2,13 @@ #include"player.h" -void Player::print(){ - rect = {posX,posY,szW,szH}; +void Player::print(int cameraX){ + + SDL_Rect cameraFix = rect; + cameraFix.x -= cameraX; SDL_SetRenderDrawColor(*renderer,0xFF,0,0,0xFF); - SDL_RenderFillRect(*renderer, &rect); + SDL_RenderFillRect(*renderer, &cameraFix); oldPosX = posX; oldPosY = posY; @@ -93,6 +95,8 @@ void Player::move(){ //Convert and set new int position posX += static_cast(x); posY -= static_cast(y+0.5); + + rect = {posX,posY,szW,szH}; }; int Player::check(SDL_Rect rectA){ diff --git a/player.h b/player.h index 8bfc399..18e6505 100644 --- a/player.h +++ b/player.h @@ -13,7 +13,7 @@ class Entity; class Player: public Entity{ public: - void print(); + void print(int cameraX); int check(SDL_Rect rectB); void init(int x, int y,int w, int h,SDL_Renderer** render); //SDL_Rect getRectangle();