diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | include/UIClass.h | 8 | ||||
-rw-r--r-- | src/UIClass.cpp | 280 | ||||
-rw-r--r-- | src/World.cpp | 9 | ||||
-rw-r--r-- | src/entities.cpp | 3 | ||||
-rw-r--r-- | src/main.cpp | 24 |
6 files changed, 173 insertions, 153 deletions
@@ -1,6 +1,6 @@ FLAGS_LINUX = -lGL -lSDL2_image -lfreetype
FLAGS_WIN32 = -lopengl32 -lmingw32 -lSDL2_Image -lfreetype
-FLAGS = -m32 -std=c++11 -Iinclude -Iinclude/freetype2 -Wall -Werror -lSDL2main -lSDL2
+FLAGS = -m32 -std=c++11 -Iinclude -Iinclude/freetype2 -Wall -Werror -Wextra -lSDL2main -lSDL2
all:
@g++ src/*.cpp -o main $(FLAGS_LINUX) $(FLAGS)
diff --git a/include/UIClass.h b/include/UIClass.h index 9bf301c..867044e 100644 --- a/include/UIClass.h +++ b/include/UIClass.h @@ -5,18 +5,14 @@ #include <cstdarg>
#include <cstdio>
-class UIClass {
-private:
- unsigned int fontSize;
-public:
+namespace ui {
+ extern int mousex,mousey;
void init(const char *ttf);
void setFontSize(unsigned int fs);
void putText(const float x,const float y,const char *s,...);
void putString(const float x,const float y,const char *s);
void msgBox(const char *str,...);
void handleEvents();
- int mousex, mousey;
- bool debug = false;
};
#endif // UICLASS_H
diff --git a/src/UIClass.cpp b/src/UIClass.cpp index 0ee56ca..94aa09c 100644 --- a/src/UIClass.cpp +++ b/src/UIClass.cpp @@ -9,154 +9,166 @@ extern World *currentWorld; static FT_Library ftl; static FT_Face ftf; static GLuint ftex; +static unsigned int fontSize; -void UIClass::init(const char *ttf){ - if(FT_Init_FreeType(&ftl)){ - std::cout<<"Error! Couldn't initialize freetype."<<std::endl; - abort(); - } - if(FT_New_Face(ftl,ttf,0,&ftf)){ - std::cout<<"Error! Couldn't open "<<ttf<<"."<<std::endl; - abort(); - } +namespace ui { + int mousex, mousey; + bool debug = false; -} -void UIClass::setFontSize(unsigned int fs){ - fontSize=fs; - FT_Set_Pixel_Sizes(ftf,0,fontSize); -} -void UIClass::putString(const float x,const float y,const char *s){ - unsigned int i=0,j; - float xo=x,yo=y,w,h; - char *buf; - do{ - if(s[i]=='\n'){ - xo=x; - yo-=fontSize*.0022; - }else{ - FT_Load_Char(ftf,s[i],FT_LOAD_RENDER); - glGenTextures(1,&ftex); - glBindTexture(GL_TEXTURE_2D,ftex); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - buf=(char *)malloc(ftf->glyph->bitmap.width*ftf->glyph->bitmap.rows*4); - for(j=0;j<ftf->glyph->bitmap.width*ftf->glyph->bitmap.rows;j++){ - buf[j*4]=255; - buf[j*4+1]=255; - buf[j*4+2]=255; - buf[j*4+3]=ftf->glyph->bitmap.buffer[j]?255:0; - } - glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,ftf->glyph->bitmap.width,ftf->glyph->bitmap.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,buf); - w=ftf->glyph->bitmap.width*(2.0/SCREEN_WIDTH); - h=ftf->glyph->bitmap.rows *(2.0/SCREEN_HEIGHT); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D,ftex); - if(s[i]=='\''|| - s[i]=='\"'|| - s[i]=='-'|| - s[i]=='*'){ - yo+=fontSize*.001; - } - glBegin(GL_QUADS); - glColor3ub(255,255,255); - glTexCoord2f(0,1);glVertex2f(xo,yo); - glTexCoord2f(1,1);glVertex2f(xo+w,yo); - glTexCoord2f(1,0);glVertex2f(xo+w,yo+h); - glTexCoord2f(0,0);glVertex2f(xo,yo+h); - glEnd(); - if(s[i]=='\''|| - s[i]=='\"'|| - s[i]=='-'|| - s[i]=='*'){ - yo-=fontSize*.001; - } - glDisable(GL_TEXTURE_2D); - xo+=w+(fontSize*.0002); - free(buf); + void init(const char *ttf){ + if(FT_Init_FreeType(&ftl)){ + std::cout<<"Error! Couldn't initialize freetype."<<std::endl; + abort(); } - }while(s[i++]); -} -void UIClass::putText(const float x,const float y,const char *str,...){ - va_list args; - char *buf; - buf=(char *)calloc(128,sizeof(char)); - va_start(args,str); - vsnprintf(buf,128,str,args); - va_end(args); - putString(x,y,buf); - free(buf); -} -void UIClass::msgBox(const char *str,...){ - va_list args; - va_start(args,str); - glColor3ub(0,0,0); - glRectf(-1,.6,1,1); - setFontSize(24); - putText(-1,1-24*.0022,str,args); - va_end(args); -} + if(FT_New_Face(ftl,ttf,0,&ftf)){ + std::cout<<"Error! Couldn't open "<<ttf<<"."<<std::endl; + abort(); + } + } + void setFontSize(unsigned int fs){ + fontSize=fs; + FT_Set_Pixel_Sizes(ftf,0,fontSize); + } + void putString(const float x,const float y,const char *s){ + unsigned int i=0,j; + float xo=x,yo=y,w,h; + char *buf; + do{ + if(s[i]=='\n'){ + xo=x; + yo-=fontSize*.0022; + }else{ + if(FT_Load_Char(ftf,s[i],FT_LOAD_RENDER)){ + std::cout<<"Error! Invalid character."<<std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glGenTextures(1,&ftex); + glBindTexture(GL_TEXTURE_2D,ftex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + buf=(char *)malloc(ftf->glyph->bitmap.width*ftf->glyph->bitmap.rows*4); + for(j=0;j<ftf->glyph->bitmap.width*ftf->glyph->bitmap.rows;j++){ + buf[j*4]=255; + buf[j*4+1]=255; + buf[j*4+2]=255; + buf[j*4+3]=ftf->glyph->bitmap.buffer[j]?255:0; + } + glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,ftf->glyph->bitmap.width,ftf->glyph->bitmap.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,buf); + w=ftf->glyph->bitmap.width*(2.0/SCREEN_WIDTH); + h=ftf->glyph->bitmap.rows *(2.0/SCREEN_HEIGHT); + if(s[i]=='\''|| + s[i]=='\"'|| + s[i]=='-'|| + s[i]=='*'){ + yo+=fontSize*.001; + } + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D,ftex); + glBegin(GL_QUADS); + glColor3ub(255,255,255); + glTexCoord2f(0,1);glVertex2f(xo,yo); + glTexCoord2f(1,1);glVertex2f(xo+w,yo); + glTexCoord2f(1,0);glVertex2f(xo+w,yo+h); + glTexCoord2f(0,0);glVertex2f(xo,yo+h); + glEnd(); + glDisable(GL_TEXTURE_2D); + if(s[i]=='\''|| + s[i]=='\"'|| + s[i]=='-'|| + s[i]=='*'){ + yo-=fontSize*.001; + } + xo+=w+(fontSize*.0002); + free(buf); + } + }while(s[i++]); + } + void putText(const float x,const float y,const char *str,...){ + va_list args; + char *buf; + buf=(char *)calloc(128,sizeof(char)); + va_start(args,str); + vsnprintf(buf,128,str,args); + va_end(args); + putString(x,y,buf); + free(buf); + } + void msgBox(const char *str,...){ + va_list args; + va_start(args,str); + glColor3ub(0,0,0); + glRectf(-1,.6,1,1); + setFontSize(24); + putText(-1,1-24*.0022,str,args); + va_end(args); + } -void UIClass::handleEvents(){ - static bool space=false; - float thing; - SDL_Event e; - while(SDL_PollEvent(&e)){ - switch(e.type){ - case SDL_MOUSEMOTION: - mousex=e.motion.x; - mousey=e.motion.y; - break; - case SDL_WINDOWEVENT: - switch(e.window.event){ - case SDL_WINDOWEVENT_CLOSE: - gameRunning = false; + void handleEvents(){ + static bool space=false; + float thing; + SDL_Event e; + while(SDL_PollEvent(&e)){ + switch(e.type){ + case SDL_MOUSEMOTION: + mousex=e.motion.x; + mousey=e.motion.y; break; - } - case SDL_KEYDOWN: - if(e.key.keysym.sym == SDLK_d) player.right = true; - if(e.key.keysym.sym == SDLK_a) player.left = true; - if(e.key.keysym.sym == SDLK_LSHIFT) player.speed = 3; - if(e.key.keysym.sym == SDLK_SPACE){ - if(!space&&player.vel.y<=0){ - space=true; - player.loc.y += HLINE*1.2; - player.vel.y += .003; + case SDL_WINDOWEVENT: + switch(e.window.event){ + case SDL_WINDOWEVENT_CLOSE: + gameRunning = false; + break; } - } - if(e.key.keysym.sym == SDLK_i){ - if(currentWorld->behind){ - thing=(currentWorld->getWidth()-currentWorld->behind->getWidth())/2; - if(player.loc.x>thing-1&& - player.loc.x<thing-1+currentWorld->behind->getWidth()){ - player.loc.x-=thing; + case SDL_KEYDOWN: + if(e.key.keysym.sym == SDLK_d) player.right = true; + if(e.key.keysym.sym == SDLK_a) player.left = true; + if(e.key.keysym.sym == SDLK_LSHIFT) player.speed = 3; + if(e.key.keysym.sym == SDLK_SPACE){ + if(!space&&player.vel.y<=0){ + space=true; + player.loc.y += HLINE*1.2; + player.vel.y += .003; + } + } + if(e.key.keysym.sym == SDLK_k){ + if(currentWorld->infront){ + player.loc.x+=(currentWorld->infront->getWidth()-currentWorld->getWidth())/2; memset(&player.vel,0,sizeof(vec2)); - currentWorld=currentWorld->behind; + currentWorld=currentWorld->infront; } } - } - if(e.key.keysym.sym == SDLK_k){ - if(currentWorld->infront){ - player.loc.x+=(currentWorld->infront->getWidth()-currentWorld->getWidth())/2; - memset(&player.vel,0,sizeof(vec2)); - currentWorld=currentWorld->infront; + break; + if(e.key.keysym.sym == SDLK_i){ + if(currentWorld->behind){ + thing=(currentWorld->getWidth()-currentWorld->behind->getWidth())/2; + if(player.loc.x>thing-1&& + player.loc.x<thing-1+currentWorld->behind->getWidth()){ + player.loc.x-=thing; + memset(&player.vel,0,sizeof(vec2)); + currentWorld=currentWorld->behind; + } + } } } if(e.key.keysym.sym == SDLK_F3){ debug = !debug; } break; - case SDL_KEYUP: - if(e.key.keysym.sym == SDLK_d) player.right = false; - if(e.key.keysym.sym == SDLK_a) player.left = false; - if(e.key.keysym.sym == SDLK_LSHIFT) player.speed = 1.0; - if(e.key.keysym.sym == SDLK_SPACE) - if(player.vel.y<=.001)space=false; - - if(e.key.keysym.sym == SDLK_ESCAPE) gameRunning = false; - break; - } + case SDL_KEYUP: + if(e.key.keysym.sym == SDLK_d) player.right = false; + if(e.key.keysym.sym == SDLK_a) player.left = false; + if(e.key.keysym.sym == SDLK_LSHIFT) player.speed = 1.0; + if(e.key.keysym.sym == SDLK_SPACE) + if(player.vel.y<=.001)space=false; + + if(e.key.keysym.sym == SDLK_ESCAPE) gameRunning = false; + break; + } + } + } } diff --git a/src/World.cpp b/src/World.cpp index 4237d42..49bdf0d 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -24,7 +24,7 @@ World::World(const float width,World *l,World *r){ toRight=r;
behind=infront=NULL;
entCount=0;
- entity=(void**)calloc(MAX_ENTITIES,sizeof(void**));
+ entity=(void **)calloc(MAX_ENTITIES,sizeof(void *));
if(toLeft){ // Make sure linked worlds link back
if(toLeft->toRight){
std::cout<<"There's already a world to the left!"<<std::endl;
@@ -101,7 +101,8 @@ LOOP2: // Should be in furthest back layer once this is first rea }else{
drawOffsetX=drawOffsetY=0; // Reset for next draw() call
for(i=0;i<entCount;i++){ // Draw any bound entities
- ((Entity **)entity)[i]->draw();
+ if(entity[i])
+ ((Entity **)entity)[i]->draw();
}
}
}
@@ -135,6 +136,6 @@ void World::addLayer(const float width){ behind->infront=this;
}
}
-void World::addEntity(void *e){
- entity[entCount++]=e; // duh
+void World::addEntity(void *addr){
+ entity[entCount++]=addr;
}
diff --git a/src/entities.cpp b/src/entities.cpp index ee909d8..7275af1 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -17,10 +17,11 @@ void Entity::draw(void){ } void Entity::wander(int timeRun, vec2 *v){ + static int hey; if(ticksToUse == 0){ ticksToUse = timeRun; v->x = .00010; - int hey = (grand() % 3 - 1); + hey = (grand() % 3 - 1); v->x *= hey; } ticksToUse--; diff --git a/src/main.cpp b/src/main.cpp index cad8fc9..3b525d5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,7 +23,6 @@ Entity *entnpc[32]; //The NPC base Player player; //The actual player object NPC npc[32]; Structures build; -UIClass ui; //Yep World *currentWorld;//u-huh World *spawn; @@ -36,7 +35,7 @@ unsigned int millis(void){ return std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count(); } -int main(int argc,char **argv){ +int main(/*int argc,char **argv*/){ //runs start-up procedures if(!SDL_Init(SDL_INIT_VIDEO)){ atexit(SDL_Quit); @@ -82,7 +81,7 @@ int main(int argc,char **argv){ **** GAMELOOP **** **************************/ - ui.init("ttf/VCR_OSD_MONO_1.001.ttf"); + ui::init("ttf/VCR_OSD_MONO_1.001.ttf"); irand(time(NULL)); entPlay = &player; @@ -121,6 +120,7 @@ int main(int argc,char **argv){ npc[i].loc.x += npc[i].vel.x * deltaTime; } } + render(); if(prevTime + MSEC_PER_TICK >= millis()){ //the logic loop to run at a dedicated time @@ -179,14 +179,14 @@ void render(){ glRectf(build.loc.x, build.loc.y, build.loc.x + build.width, build.loc.y + build.height); ///BWAHHHHHHHHHHHH - ui.setFontSize(16); + ui::setFontSize(16); if(++div==20){ div=0; d=deltaTime; fps=(1000/d); } //ui.putText(-.98 + player.loc.x, .88, "DT: %1.0f",d); - ui.putText(player.loc.x,player.loc.y-(HLINE*10),"(%+1.3f,%+1.3f)",player.loc.x,player.loc.y); + ui::putText(player.loc.x,player.loc.y-(HLINE*10),"(%+1.3f,%+1.3f)",player.loc.x,player.loc.y); /************************** **** CLOSE THE LOOP **** @@ -223,7 +223,8 @@ void render(){ void logic(){ float gw; - ui.handleEvents(); // Handle events + + ui::handleEvents(); // Handle events if(player.right)player.vel.x=.00075; else if(player.left)player.vel.x=-.00075; @@ -247,7 +248,7 @@ void logic(){ player.loc.x=-1+HLINE; } } - + currentWorld->detect(&build.loc,&build.vel,build.width); for(int i = 0; i < eAmt(entnpc); i++){ if(npc[i].alive == true){ @@ -259,7 +260,16 @@ void logic(){ ui.putText(entnpc[i]->loc.x, entnpc[i]->loc.y - HLINE * 3, "HEY", NULL); } } + + /*for(int i = 0; i < 32; i++){ + if(entnpc[i]->alive){ + currentWorld->detect(&entnpc[i]->loc,&entnpc[i]->vel,entnpc[i]->width); + std::cout<<(void *)entnpc[i]<<" "<<i<<" "<<entnpc<<" "<<eAmt(entnpc)<<std::endl; + entnpc[i]->wander(30, &entnpc[i]->vel); + } } + */ + tickCount++; } |