]> code.bitgloo.com Git - clyne/gamedev.git/commitdiff
cleaning up ui code
authorClyne Sullivan <tullivan99@gmail.com>
Mon, 21 Mar 2016 12:49:48 +0000 (08:49 -0400)
committerClyne Sullivan <tullivan99@gmail.com>
Mon, 21 Mar 2016 12:49:48 +0000 (08:49 -0400)
1  2 
Changelog
include/world.h
main.cpp
src/ui.cpp
src/world.cpp

diff --cc Changelog
index fbef63e088e9e38ab01b71f066587ac1cafe1490,05ac163e86f484b1f3ea995e899db350f6d99b9e..546ded47519d83e3810fb2a7ddc6c52b49f7f047
+++ b/Changelog
        - planned ahead
  
        ~ set finish date for game engine: 3/31
 +
 +3/17/2016:
 +==========
 +
 +      - cleaned up ui stuff (more std::strings)
 +      - worlds load adjacent worlds for faster loading
 +      - fixed world fall-through error
 +      - (WIP) made ui options dynamic (boxes can have 'infinite' options)
 +      - can scroll through inventory with mouse wheel
 +      - added text transparency support
++
++3/18/2016:
++==========
++
++      - worked on keeping multiple-sizes fonts in memory (importantText lag)
++      - c++'d more ui stuff
++      - game can run on *BSD systems..
++      - fixed abort bug on exit
++      - added light that follows player
diff --cc include/world.h
Simple merge
diff --cc main.cpp
index acbc4f62ca6a338e82c47f0b6ff4b7eee6354719,e7494a98d393659e1beedda730f528e7ddac492f..0b3984e9673789e0e068cf301ee5f7889d5b1219
+++ b/main.cpp
@@@ -417,9 -415,8 +417,8 @@@ int main(int argc, char *argv[])
        //currentWorld->mob.back()->followee = player;
  
        gameRunning = true;
--
 -      while(gameRunning)mainLoop();
 +      while ( gameRunning )
 +              mainLoop();
  
        /**************************
        ****   CLOSE PROGRAM   ****
diff --cc src/ui.cpp
index 9ed941d23c757394d43652660415bb06d3f766d3,245f1d7208190703d2b8e95017105156d4c77a25..458e797ae6923073399fc84ac856e6747bbe6e9d
@@@ -38,30 -38,23 +38,26 @@@ extern unsigned int tickCount
  
  static FT_Library   ftl;
  static FT_Face      ftf;
--static GLuint       ftex[93];
- /*static vec2                 ftexwh[93];
 -static vec2                   ftexwh[93];
--static vec2                   ftexbl[93];
- static vec2                   ftexad[93];*/
 -static vec2                   ftexad[93];
 +
 +typedef struct {
 +      vec2 wh;
 +      vec2 bl;
 +      vec2 ad;
 +} FT_Info;
 +
- static FT_Info ftdat[93];
++static std::vector<FT_Info> ftdat ( 93, { { 0, 0 }, { 0, 0 }, { 0, 0 } } );
++static std::vector<GLuint>  ftex  ( 93, 0 );
  
- static unsigned char fontColor[3] = {255,255,255};
+ static unsigned char fontColor[4] = {255,255,255,255};
  
  /*
   *    Variables for dialog boxes / options.
--*/
++ */
  
- static std::string   dialogBoxText;
 -static char                    dialogBoxText[512];
 -static char                   *dialogOptText[4];
 -static float         merchAOptLoc[2][3];
 -static float           dialogOptLoc[4][3];
 -static unsigned char dialogOptCount = 0;
 -static bool                    typeOutDone = true;
 +static std::vector<std::pair<std::string,vec3>> dialogOptText;
- static float         merchAOptLoc[2][3];
- static float           dialogOptLoc[4][3];
- static bool                    typeOutDone = true;
++static std::string dialogBoxText;
++static vec3 merchArrowLoc[2];
++static bool typeOutDone = true;
  
  /*
   * Menu-related objects
@@@ -76,12 -69,12 +72,12 @@@ static Mix_Chunk *dialogClick
  extern void mainLoop(void);
  
  /*
-- *    Toggled by pressing 'q', disables some controls when true.
--*/
++ * Fade effect flags
++ */
  
  bool fadeEnable = false;
--bool fadeWhite = false;
--bool fadeFast = false;
++bool fadeWhite  = false;
++bool fadeFast   = false;
  unsigned int fadeIntensity = 0;
  
  bool inBattle = false;
@@@ -161,8 -155,8 +158,7 @@@ namespace ui 
                        std::cout<<"Error! Couldn't initialize freetype."<<std::endl;
                        abort();
                }
--              fontSize=0;
--              memset(&ftex,0,93*sizeof(GLuint));
++              fontSize = 0;
  #ifdef DEBUG
                DEBUG_printf("Initialized FreeType2.\n",NULL);
  #endif // DEBUG
        */
  
        void setFontSize(unsigned int size){
+               mtx.lock();
                unsigned int i,j;
 -              unsigned char *buf;
  
                fontSize=size;
                FT_Set_Pixel_Sizes(ftf,0,fontSize);
                 *      Pre-render 'all' the characters.
                */
  
--              glDeleteTextures(93,ftex);      //      delete[] any already-rendered textures
--              glGenTextures(93,ftex);         //      Generate new texture name/locations?
++              glDeleteTextures(93,ftex.data());       //      delete[] any already-rendered textures
++              glGenTextures(93,ftex.data());          //      Generate new texture name/locations?
  
                for(i=33;i<126;i++){
  
                         *      making it white-on-black.
                        */
  
 -                      buf = new unsigned char[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;//fontColor[0];
 -                              buf[j*4+1]=255;//fontColor[1];
 -                              buf[j*4+2]=255;//fontColor[2];
 -                              buf[j*4+3]=ftf->glyph->bitmap.buffer[j] ? 255 : 0;
 -                              //buf[j*4+3]=ftf->glyph->bitmap.buffer[j];
 -                      }
 +                      std::vector<uint32_t> buf ( ftf->glyph->bitmap.width * ftf->glyph->bitmap.rows, 0 );
  
 -                      ftexwh[i-33].x=ftf->glyph->bitmap.width;
 -                      ftexwh[i-33].y=ftf->glyph->bitmap.rows;
 -                      ftexbl[i-33].x=ftf->glyph->bitmap_left;
 -                      ftexbl[i-33].y=ftf->glyph->bitmap_top;
 -                      ftexad[i-33].x=ftf->glyph->advance.x>>6;
 -                      ftexad[i-33].y=ftf->glyph->advance.y>>6;
 +                      for( j = 0; j < buf.size(); j++ )
 +                              buf[j] = 0x00FFFFFF | (ftf->glyph->bitmap.buffer[j] ? (0xFF << 24) : 0);
  
 -                      glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,ftf->glyph->bitmap.width,ftf->glyph->bitmap.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
 +                      ftdat[i-33].wh.x=ftf->glyph->bitmap.width;
 +                      ftdat[i-33].wh.y=ftf->glyph->bitmap.rows;
 +                      ftdat[i-33].bl.x=ftf->glyph->bitmap_left;
 +                      ftdat[i-33].bl.y=ftf->glyph->bitmap_top;
 +                      ftdat[i-33].ad.x=ftf->glyph->advance.x>>6;
 +                      ftdat[i-33].ad.y=ftf->glyph->advance.y>>6;
  
 -                      delete[] buf;   //free(buf);
 +                      glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,ftf->glyph->bitmap.width,ftf->glyph->bitmap.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,buf.data());
                }
+               mtx.unlock();
        }
  
        /*
  
                /*
                 *      Handle the formatted string, printing it to the buffer.
 -              */
 +               */
  
                va_start(args,str);
 -              vsnprintf(buf,512,str,args);
 +              vsnprintf(buf.get(),512,str,args);
                va_end(args);
  
 -              /*
 -               *      Draw the string, free resources, return the width of the string.
 -              */
 -
 -              width=putString(x,y,buf);
 -              delete[] buf;   //free(buf);
 -
 -              return width;
 +              // draw the string and return the width
 +              return putString( x, y, buf.get() );
        }
 -      void dialogBox(const char *name,const char *opt,bool passive,const char *text,...){
 -              textWrapLimit = 110;
 +
 +      void dialogBox( const char *name, const char *opt, bool passive, const char *text, ... ) {
                va_list dialogArgs;
 -              unsigned int len;
 -              char *sopt,*soptbuf;
 +              std::unique_ptr<char[]> printfbuf (new char[512]);
  
 +              textWrapLimit = 110;
                dialogPassive = passive;
  
 -              /*
 -               *      Set up the text buffer.
 -              */
 -
 -              memset(dialogBoxText,0,512);
 -
 -              /*
 -               *      Get the text ready for rendering.
 -              */
 -
 -              len=strlen(name);
 -              strcpy(dialogBoxText    ,name);
 -              strcpy(dialogBoxText+len,": ");
 -              len+=2;
 +              // reset & add speaker prefix
 +              dialogBoxText.clear();
 +              dialogBoxText = (std::string)name + ": ";
  
 +              // handle the formatted string
                va_start(dialogArgs,text);
 -              vsnprintf(dialogBoxText+len,512-len,text,dialogArgs);
 +              vsnprintf(printfbuf.get(),512,text,dialogArgs);
                va_end(dialogArgs);
 +              dialogBoxText += printfbuf.get();
  
 -              /*
 -               *      Set up option text.
 -              */
 -
 -              while(dialogOptCount){
 -                      if(dialogOptText[dialogOptCount]){
 -                              delete[] dialogOptText[dialogOptCount]; //free(dialogOptText[dialogOptCount]);
 -                              dialogOptText[dialogOptCount] = NULL;
 -                      }
 -                      dialogOptCount--;
 -              };
 +              // setup option text
 +              dialogOptText.clear();
  
 -              dialogOptCount = 0;
                dialogOptChosen = 0;
--              memset(&dialogOptLoc,0,sizeof(float)*12);
  
 -              if(opt != NULL){
 +              if ( opt ) {
 +                      std::string soptbuf = opt;
 +                      char *sopt = strtok(&soptbuf[0], ":");
  
 -                      soptbuf = new char[strlen(opt)+1];
 -                      strcpy(soptbuf,opt);
 -
 -                      sopt=strtok(soptbuf,":");
 -                      while(sopt != NULL){
 -                              dialogOptText[dialogOptCount] = new char[strlen(sopt)+1];       //(char *)malloc(strlen(sopt));
 -                              strcpy(dialogOptText[dialogOptCount++],sopt);
 -                              sopt=strtok(NULL,":");
 +                      // cycle through options
 +                      while(sopt){
 +                              dialogOptText.push_back(std::make_pair((std::string)sopt, vec3 {0,0,0}) );
 +                              sopt = strtok(NULL,":");
                        }
 -
 -                      delete[] soptbuf;
 -
                }
  
                /*
                merchTrade = trade;
  
                // clear the buffer
 -              memset(dialogBoxText, '\0', 512);
 +              dialogBoxText.clear();
 +              dialogBoxText = (std::string)name + ": ";
  
 -              // create the string
 -              strcpy(dialogBoxText, name);
 -              strcat(dialogBoxText, ": ");
 -
 -              len=strlen(dialogBoxText);
                va_start(dialogArgs,text);
 -              vsnprintf(dialogBoxText + len, 512 - len, text, dialogArgs);
 +              vsnprintf(printfbuf.get(),512,text,dialogArgs);
                va_end(dialogArgs);
 +              dialogBoxText += printfbuf.get();
  
                // free old option text
 -              while(dialogOptCount){
 -                      if(dialogOptText[dialogOptCount]){
 -                              delete[] dialogOptText[dialogOptCount];
 -                              dialogOptText[dialogOptCount] = NULL;
 -                      }
 -
 -                      dialogOptCount--;
 -              };
 +              dialogOptText.clear();
  
                dialogOptChosen = 0;
-               memset(&dialogOptLoc, 0, sizeof(float) * 12);
+               merchOptChosen = 0;
 -              memset(&dialogOptLoc, 0, sizeof(float) * 12);
  
                // handle options if desired
                if(opt){
                                glEnd();
                                glDisable(GL_TEXTURE_2D);
  
--                              merchAOptLoc[0][0] = offset.x - (SCREEN_WIDTH / 8.5) - 16;
--                              merchAOptLoc[1][0] = offset.x + (SCREEN_WIDTH / 8.5) + 16;
--                              merchAOptLoc[0][1] = offset.y + (SCREEN_HEIGHT *.2);
--                              merchAOptLoc[1][1] = offset.y + (SCREEN_HEIGHT *.2);
--                              merchAOptLoc[0][2] = offset.x - (SCREEN_WIDTH / 8.5);
--                              merchAOptLoc[1][2] = offset.x + (SCREEN_WIDTH / 8.5);
++                              merchArrowLoc[0].x = offset.x - (SCREEN_WIDTH / 8.5) - 16;
++                              merchArrowLoc[1].x = offset.x + (SCREEN_WIDTH / 8.5) + 16;
++                              merchArrowLoc[0].y = offset.y + (SCREEN_HEIGHT *.2);
++                              merchArrowLoc[1].y = offset.y + (SCREEN_HEIGHT *.2);
++                              merchArrowLoc[0].z = offset.x - (SCREEN_WIDTH / 8.5);
++                              merchArrowLoc[1].z = offset.x + (SCREEN_WIDTH / 8.5);
  
                                for(i = 0; i < 2; i++){
--                                      if(((merchAOptLoc[i][0] < merchAOptLoc[i][2]) ?
--                                              (mouse.x > merchAOptLoc[i][0] && mouse.x < merchAOptLoc[i][2]) :
--                                               (mouse.x < merchAOptLoc[i][0] && mouse.x > merchAOptLoc[i][2])) &&
--                                         mouse.y > merchAOptLoc[i][1] - 8 && mouse.y < merchAOptLoc[i][1] + 8){
++                                      if(((merchArrowLoc[i].x < merchArrowLoc[i].z) ?
++                                              (mouse.x > merchArrowLoc[i].x     && mouse.x < merchArrowLoc[i].z) :
++                                              (mouse.x < merchArrowLoc[i].x     && mouse.x > merchArrowLoc[i].z)    ) &&
++                                           mouse.y > merchArrowLoc[i].y - 8 && mouse.y < merchArrowLoc[i].y + 8 ) {
                                                glColor3ub(255,255, 0);
                                        }else{
                                                glColor3ub(255,255,255);
                                        }
                                        glBegin(GL_TRIANGLES);
--                                              glVertex2f(merchAOptLoc[i][0],merchAOptLoc[i][1]);
--                                              glVertex2f(merchAOptLoc[i][2],merchAOptLoc[i][1]-8);
--                                              glVertex2f(merchAOptLoc[i][2],merchAOptLoc[i][1]+8);
++                                              glVertex2f(merchArrowLoc[i].x,merchArrowLoc[i].y);
++                                              glVertex2f(merchArrowLoc[i].z,merchArrowLoc[i].y-8);
++                                              glVertex2f(merchArrowLoc[i].z,merchArrowLoc[i].y+8);
                                        glEnd();
                                }
  
                                        setFontColor(255, 255, 255);
  
                                        // draw option
-                                       tmp = putStringCentered(offset.x, dialogOptLoc[i][1], dialogOptText[i].first);
 -                                      tmp = putStringCentered(offset.x, dialogOptLoc[i][1], dialogOptText[i]);
++                                      tmp = putStringCentered(offset.x, dialogOptText[i].second.y, dialogOptText[i].first);
  
                                        // get coordinate information on option
--                                      dialogOptLoc[i][2] = offset.x + tmp;
--                                      dialogOptLoc[i][0] = offset.x - tmp;
--                                      dialogOptLoc[i][1] = y - SCREEN_HEIGHT / 2 - (fontSize + HLINE) * (i + 1);
++                                      dialogOptText[i].second.z = offset.x + tmp;
++                                      dialogOptText[i].second.x = offset.x - tmp;
++                                      dialogOptText[i].second.y = y - SCREEN_HEIGHT / 2 - (fontSize + HLINE) * (i + 1);
  
                                        // make text yellow if the mouse hovers over the text
--                                      if(mouse.x > dialogOptLoc[i][0] && mouse.x < dialogOptLoc[i][2] &&
--                                         mouse.y > dialogOptLoc[i][1] && mouse.y < dialogOptLoc[i][1] + 16 ){
++                                      if(mouse.x > dialogOptText[i].second.x && mouse.x < dialogOptText[i].second.z &&
++                                         mouse.y > dialogOptText[i].second.y && mouse.y < dialogOptText[i].second.y + 16 ){
                                                  setFontColor(255, 255, 0);
-                                                 putStringCentered(offset.x, dialogOptLoc[i][1], dialogOptText[i].first);
 -                                                putStringCentered(offset.x, dialogOptLoc[i][1], dialogOptText[i]);
++                                                putStringCentered(offset.x, dialogOptText[i].second.y, dialogOptText[i].first);
                                        }
                                }
  
  
                                putString(x+HLINE,y-fontSize-HLINE,rtext);
  
 -                              for(i=0;i<dialogOptCount;i++){
 +                              for(i=0;i<dialogOptText.size();i++){
                                        setFontColor(255,255,255);
-                                       tmp = putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i].first);
 -                                      tmp = putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i]);
--                                      dialogOptLoc[i][2] = offset.x + tmp;
--                                      dialogOptLoc[i][0] = offset.x - tmp;
--                                      dialogOptLoc[i][1] = y - SCREEN_HEIGHT / 4 + (fontSize + HLINE) * (i + 1);
--                                      if(mouse.x > dialogOptLoc[i][0] &&
--                                         mouse.x < dialogOptLoc[i][2] &&
--                                         mouse.y > dialogOptLoc[i][1] &&
--                                         mouse.y < dialogOptLoc[i][1] + 16 ){ // fontSize
++                                      tmp = putStringCentered(offset.x,dialogOptText[i].second.y,dialogOptText[i].first);
++                                      dialogOptText[i].second.z = offset.x + tmp;
++                                      dialogOptText[i].second.x = offset.x - tmp;
++                                      dialogOptText[i].second.y = y - SCREEN_HEIGHT / 4 + (fontSize + HLINE) * (i + 1);
++                                      if(mouse.x > dialogOptText[i].second.x &&
++                                         mouse.x < dialogOptText[i].second.z &&
++                                         mouse.y > dialogOptText[i].second.y &&
++                                         mouse.y < dialogOptText[i].second.y + 16 ){ // fontSize
                                                  setFontColor(255,255,0);
-                                                 putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i].first);
 -                                                putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i]);
++                                                putStringCentered(offset.x,dialogOptText[i].second.y,dialogOptText[i].first);
                                        }
                                }
                                setFontColor(255,255,255);
                        typeOutDone = true;
                        return;
                }
 -              for(i=0;i<dialogOptCount;i++){
 -                      if(mouse.x > dialogOptLoc[i][0] &&
 -                         mouse.x < dialogOptLoc[i][2] &&
 -                         mouse.y > dialogOptLoc[i][1] &&
 -                         mouse.y < dialogOptLoc[i][1] + 16 ){ // fontSize
 +
 +              for(i=0;i<dialogOptText.size();i++){
-                       if(mouse.x > dialogOptLoc[i][0] &&
-                          mouse.x < dialogOptLoc[i][2] &&
-                          mouse.y > dialogOptLoc[i][1] &&
-                          mouse.y < dialogOptLoc[i][1] + 16 ){ // fontSize
++                      if(mouse.x > dialogOptText[i].second.x &&
++                         mouse.x < dialogOptText[i].second.z &&
++                         mouse.y > dialogOptText[i].second.y &&
++                         mouse.y < dialogOptText[i].second.y + 16 ){ // fontSize
                                dialogOptChosen = i + 1;
-                               goto DONE;
+                               goto EXIT;
+                       }
+               }
+               if(dialogMerchant){
+                       for(i=0;i<2;i++){
 -                              if(((merchAOptLoc[i][0] < merchAOptLoc[i][2]) ?
 -                                      (mouse.x > merchAOptLoc[i][0] && mouse.x < merchAOptLoc[i][2]) :
 -                                  (mouse.x < merchAOptLoc[i][0] && mouse.x > merchAOptLoc[i][2])) &&
 -                                       mouse.y > merchAOptLoc[i][1] - 8 && mouse.y < merchAOptLoc[i][1] + 8){ // fontSize
++                              if(((merchArrowLoc[i].x < merchArrowLoc[i].z) ?
++                                      (mouse.x > merchArrowLoc[i].x && mouse.x < merchArrowLoc[i].z) :
++                                  (mouse.x < merchArrowLoc[i].x && mouse.x > merchArrowLoc[i].z) &&
++                                       mouse.y > merchArrowLoc[i].y - 8 && mouse.y < merchArrowLoc[i].y + 8)){
+                                               merchOptChosen = i + 1;
+                                               goto EXIT;
+                               }
                        }
                }
- DONE:
 -              EXIT:
++EXIT:
+               //if(!dialogMerchant)closeBox();
+               dialogBoxExists = false;
+               dialogMerchant = false;
+               //DONE:
  
                // handle important text
                if(dialogImportant){
diff --cc src/world.cpp
index 2c7e06d85b83efe07b2b50839e233fe502ebaa3f,b1eb12e0a2d5e91dd440cf8114c59cb270a27cdd..1a7322fd400584d2efe0475bfff6b31795aef2f7
@@@ -783,9 -783,9 +782,10 @@@ singleDetect( Entity *e 
  
                /*
                 *      Handle gravity if the entity is above the line.
 -              */
 +               */
 +
 +              } else {
 -              }else{
                        if(e->type == STRUCTURET && e->loc.y > 2000){
                                e->loc.y = worldData[i].groundHeight;
                                e->vel.y = 0;