menu

Za vse novince v izdelovanju iger.

menu

OdgovorNapisal/-a senad » Ne Jan 15, 2012 2:03 pm

Pozdravljeni svi, imam jedno pitanje,..
Kako narediti menu v opengl , delam neko igro in po sreči sem našel ta forum. Če ima kdo nasvet proceduro kako delat ali primer se pripročam
PS:Opravičujem se za slabo slovenščino.
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » Ne Jan 15, 2012 3:08 pm

Pozdravljen na SGD-ju senad! :D

Prvo me zanima, kakšen menu točno si želiš? Preprost kot je "New Game" ter "Quit" ali naprednejši z raznimi gradniki kot so tekstovna polja za vnos, gumbi itd.?
Poleg tega me še zanima, če že izrisuješ kakšne objekte preko openGL-a.
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a senad » Ne Jan 15, 2012 3:17 pm

Želim si imeti nekaj vmes new game options (pa sound on off nekaj na ta stil pa še kaj drugega) in še exit seveda delam igro jack sparrow bojevnik na ladji (jack se vozi z ladjo in poskuša izsuti čimveč španskih ladij tako igro na ta stil..)
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a impulse9 » Ne Jan 15, 2012 4:53 pm

Pozdravljen.

Za izris teksta v OpenGL obicajno nastavimo ortografsko projekcijo (ce to ze tako ali tako uporabljas kot privzeto projekcijo potem pokomentiraj ustrezne dele):

Koda: Izberi vse
   glDisable(GL_LIGHTING); // luci izklopimo, da svetloba ne vpliva na barvo teksta
   setOrthographicProjection();
   glPushMatrix();
   glLoadIdentity();
   drawText(0.0f, 0.0f, "test", 1.0f, 1.0f, 1.0f);
   glPopMatrix();
   restorePerspectiveProjection();
   glEnable(GL_LIGHTING);


Za izris lahko uporabis tole funkcijo (uporablja GLUT):

Koda: Izberi vse
void drawText(float x, float y, const char* text, float r, float g, float b)
{
   // izrise text na ekran
   if(!text || !strlen(text)) return;
   glColor3f(r, g, b);
   glRasterPos2f(2.0f + x, 14.0f + y);
   do {
      glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *text);
      text++;
   } while (*text);
}


Za font lahko poskusis enega od teh:

Koda: Izberi vse
GLUT_BITMAP_8_BY_13
GLUT_BITMAP_9_BY_15
GLUT_BITMAP_TIMES_ROMAN_10
GLUT_BITMAP_TIMES_ROMAN_24
GLUT_BITMAP_HELVETICA_10
GLUT_BITMAP_HELVETICA_12
GLUT_BITMAP_HELVETICA_18


Ko imas enkrat to, pa potrebujes le se malo logike (npr. tipke GOR / DOL spreminjajo polozaj v meniju, izbran element pa je obarvan rdece itd.).

P.S.: naj nekdo ki je dejansko moderator prestavi to temo v Zacetniki / Izdelovanje iger. :)
What
Uporabniški avatar
impulse9
SGD Moderator
SGD Moderator
 
Prispevkov: 397
Pridružen: Pe Jan 10, 2003 10:14 pm

Re: menu

OdgovorNapisal/-a senad » Ne Jan 15, 2012 4:57 pm

Ja razmišljal sem malo drugače da bi klikal ne pa da bi se premikal ali pa oboje kaj misliš impluse, če maš kako idejo..
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a impulse9 » Ne Jan 15, 2012 5:06 pm

Registriraj callback glutMouseFunc, preveri stanje tipke in ce je polozaj miske na koordinatah, ki si si jih zamislil.

Koda: Izberi vse
void mouseButtonEvent(int button, int state, int x, int y)
{
   if (state == GLUT_DOWN && button == GLUT_LEFT_BUTTON)
   {
      if (x >= mojGumb_x && y >= mojGumb_y &&
          x <= mojGumb_x + mojGumb_sirina && y <= mojGumb_y + mojGumb_visina)
      {
         // ... uporabnik je kliknil gumb "mojGumb" ...
      }
   }
}


Gumbe lahko das v nek seznam, kjer vsak element opisuje polozaj / tekst itd. od posameznega gumba, nato pa se sprehodis cez njih in preverjas, ce jih je uporabnik kliknil. Podobno naredis za render: sprehodis se cez seznam in izrisujes ustrezne elemente.

Lp
What
Uporabniški avatar
impulse9
SGD Moderator
SGD Moderator
 
Prispevkov: 397
Pridružen: Pe Jan 10, 2003 10:14 pm

Re: menu

OdgovorNapisal/-a senad » Ne Jan 15, 2012 7:51 pm

može vendar:
Glej jaz uprabljam nekako takole:
Takole zgleda moj main in nekako je potrebno razbit vse na dele ker meni takoj zaštarta se igra z asteridi..
Koda: Izberi vse
       


int main(int argc, char** argv) {
//   za naključna števila
   srand((unsigned)time(0));
//   generiranje asteroidov
   for (int i=0; i<ASTEROIDS; i++) {
      asteroids.push_back(new Asteroid());
//      cout << asteroids[i]->x << " " << asteroids[i]->y << endl;
   }
      
   ship = new Ship();
      glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
   glutInitWindowPosition(10, 10);
   glutInitWindowSize(512, 512);
   glutCreateWindow("Asteroids");
   
   glutReshapeFunc(reshape);
   glutDisplayFunc(display);
   glutIdleFunc(idle);
   glutKeyboardFunc(tipkovnica);
   glutMouseFunc(miska);
   glutTimerFunc(1000/FPS, timer, 1);
   
   glClearColor(0, 0, 0, 0);
   
   glutMainLoop();
   return 0;
}


senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a senad » Po Jan 16, 2012 3:00 pm

Mogoče če mate kak tutorial ja ga ne najdem ..da jaz se potrudim ali pa če je kdo kdaj delu v open gl- mi naj da primer rad pa bi res tako da kot gumbe da kliknem ..Zelo bom vsakemu hvaležen ki mi bo pomagal
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a Emigma » Po Jan 16, 2012 3:47 pm

To pa tudi mene zanima ;) Se strinjam z impluze9 da bi eden objavil, primer ker verjetno prvič je problem potem pa gre sej se vse dela na isto štanco..
Emigma
novinec
novinec
 
Prispevkov: 25
Pridružen: To Jan 10, 2012 10:50 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » Po Jan 16, 2012 6:02 pm

Impulse9 je povedal že vse kar je pomembno, sedaj imate najverjetneje problem kako dobit koordinate miškinega kazalca oz. kako ugotovit če je bil na miški klik.

http://www.lighthouse3d.com/tutorials/glut-tutorial/the-mouse/

Tukaj bosta dobila vodič, kako zaznavati miško v in njene klike v GLUTU. Ko boste imela to v delovanju bomo šli korak dalje proti meniju in ustvarjanju gumbov ter njihovih reakcij :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a koscak » Po Jan 16, 2012 10:54 pm

Ekola naredil sem vam na ta stil kot ste rekli senad-u in klemziju, sem jima naredil to kar ste rekli sedaj se pripročam za korake :D :))) Kako naprej knofke dodamo tole je za džabe :)))))))))))))))))))))))
:D

Koda: Izberi vse
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>

#include <stdlib.h>



#include <stdlib.h>
#include <stdio.h>

#ifdef WIN32
   #define WIN32_LEAN_AND_MEAN
   #include <Windows.h>
#endif

#include <GL/glut.h>


void Draw2D()
{

}


void Draw()
{

   glClear( GL_COLOR_BUFFER_BIT |
          GL_DEPTH_BUFFER_BIT );


   glEnable(GL_DEPTH_TEST);
   glEnable(GL_LIGHTING);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(45,1,1,100);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();




   glDisable(GL_DEPTH_TEST);
   glDisable(GL_LIGHTING);


   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();


   Draw2D();

   glutSwapBuffers();
}




void MouseButton(int button,int state,int x, int y)
{
   if (state == GLUT_DOWN)
   {
      switch(button)
      {
      case GLUT_LEFT_BUTTON:
         printf("left ");
         break;
      case GLUT_MIDDLE_BUTTON:
         printf("middle ");
         break;
      case GLUT_RIGHT_BUTTON:
         printf("right ");
         break;
      }
      printf("button pressed at (%d,%d)\n",x,y);
   }
   else
   {

      switch(button)
      {
      case GLUT_LEFT_BUTTON:
         printf("left ");
         break;
      case GLUT_MIDDLE_BUTTON:
         printf("middle ");
         break;
      case GLUT_RIGHT_BUTTON:
         printf("right ");
         break;
      }
      printf("button released at (%d,%d)\n",x,y);
   }


   glutPostRedisplay();
}


int main(int argc,char **argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
   glutInitWindowSize(512,512);

   glutCreateWindow("Krneki");

   glutDisplayFunc(Draw);

   glutMouseFunc(MouseButton);

   glutMainLoop();
}






koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: menu

OdgovorNapisal/-a klemzi » Po Jan 16, 2012 11:06 pm

Ja izpiše je pa do 512 , kot si pikslov nastavil, po moje je ok, nej pa res pogleda kak strokovnak :D, drgač pa kuskack ti si kr strokovnak če ti je to ratal naredit
klemzi
novinec
novinec
 
Prispevkov: 4
Pridružen: Ne Jan 15, 2012 1:31 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » Po Jan 16, 2012 11:33 pm

Ola, tako tako, se mi dopade da brez večje pomoči implementirate take stvari :)
No, sedaj pa kar je še treba je zdrava kmečka logika :D

Recimo da imamo nek kvadrat ki predstavlja gumb:

Gumb:
int x; // X pozicija gumba
int y; // Y pozicija gumba
int width; // širina
int height: // višina

Koda: Izberi vse
glBegin(GL_QUADS)
     glVertex2f(x, y);
     glVertex2f(x + width, y);
     glVertex2f(x + width, y + height);
     glVertex2f(x, y height);
glEnd()


Tako, gumb imamo izrisan, sedaj pa ob kliku miške ( case GLUT_LEFT_BUTTON ...)

Koda: Izberi vse
if( x > gumb.x && x < gumb.x + width)
if( y > gumb.y && y < gumb.y + height)
{
    // klik na gumb je uspel, in kupili smo 10 krav za na našo kmetijo
    // s šalo na stran - tukaj napište kaj se zgodi ob kliku na gumb :)
}


----------------- NAPREDNEJŠE ----------------------------------------------------------
Seveda, pa lahko zakomplicirate vse kolikor je le možno in naredite razred za gumb in nato gumbe vržete v vektor in si naredite lepše življenje v prihodnosti.

Koda: Izberi vse
class Gumb(){
   
Gumb()  //constructor
{
  x= 0;
  y= 0;
  width  = 128;
  height = 128;
}

int x;
int y;
int width;
int height;
char* name;

void Set(int x, int y, int width, int height)  //nastavimo vrednosti
{
  this->x = x;
  this->y = y;
  this->width = width;
  this->height = height;
}

void Draw() // izris gumba
{
  glBegin(GL_QUADS)
     glVertex2f(x, y);
     glVertex2f(x + width, y);
     glVertex2f(x + width, y + height);
     glVertex2f(x, y height);
  glEnd()

}
bool IsClicked(int x, int y) // preverimo če je bil pritisnjen
{
   if( x > gumb.x && x < gumb.x + width)
   if( y > gumb.y && y < gumb.y + height)
   {
      return true;
   }
   return false;
}

void SetName(char * name)
{
   this->name = name;
}

char* GetName()
{
   return name;
}
}


Ustvarimo vektor gumbov
Koda: Izberi vse
vector<Gumb*> vGumbi;


V inicializaciji igre ustvarimo gumbe:
Koda: Izberi vse
Gumb *btn = new Gumb();
btn.Set( 128, 128, 100, 20)  // gumb bo na poziciji X=128, Y=128, širok bo 100 pikslov, visok pa 20
btn.Name = "gumb_nova_igra"; //ime gumba, da bomo vedli kateri je
vGumbi.pushBack( btn ); // vrzemo gumb v vektor
//po zelji ustvrami vec gumbov


Kjer izrisujemo stvari dodamo:
Koda: Izberi vse
for( int i=0; i< vGumbi.size(); i++ )
{
  vGumbi.at(i)->Draw();
}


Kjer pritisnemo levi miškin gumb:
Koda: Izberi vse
for( int i=0; i< vGumbi.size(); i++ )
{
    if( vGumbi.at()->IsClicked() )
    {
        if( !strcmp(vGumbi.at()->GetName(), "gumb_nova_igra")
        {
           //zaženemo igro
           break; //skočimo iz zanke ker več kot en gumb ne more biti pritisnjen naenkrat
        } else
        if( !strcmp(vGumbi..at()->GetName(), "gumb_zajec")
        {
           //nekaj se zgodi z rjavim zajcem
        }
    }
}

// strcmp je C-jeva funkcija, ki primerja dva niza med seboj (char*)
// če funkcije vrne 0 pomeni da sta niza enaka



To je to za lepše življenje. Seveda sem spisal to zdej na hitro in mogoče malo na grdo ampak idejo morate imeti kako si olajšat stvari. Dodate lahko izrisovanje teksture zraven, teskta, oz. karkoli se vam poželi.

Bo? :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a senad » To Jan 17, 2012 12:03 pm

Hmm napake javi pri vektorju problem je da ga gori ustvariš kot več vektorjov spodaj pa da je kot eden, se opravičujem ker komentiram vendar mi žal ne dela... Tole dober , mislim jave napake potem pa problem je v tem da ko izrišem kvadrat 0.1 in 0.1 velikost je hud problem ker pri miški gledamo kot piksl, tam pa podam pod x,y =0.1 :)) Tak da ti dva problema če kdo ve lahka pa kodo nalimam..
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a Emigma » To Jan 17, 2012 1:55 pm

He he jaz tut meni rabm..se pravi sem šel po navodilih in mi polno napak jav.. bom poslal kodo ..
Emigma
novinec
novinec
 
Prispevkov: 25
Pridružen: To Jan 10, 2012 10:50 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » To Jan 17, 2012 7:47 pm

Celotno stvar sem napisal direktno na forum, brez preverjanja in vsekakor so napake vmes ter tiskarski škrati ampak poskusite jih sami razrešit, saj se boste tako največ naučili.

Če ne razumete kako deluje vektor class (ki ni nič drugega kot povezana lista objektov), obiščite spodnji link in si malo preberite.
http://www.dreamincode.net/forums/topic/33631-c-vector-tutorial/

Če že kaj pošiljate pošljite raje poročilo o napaki kot pa celo kodo, saj vzame veliko časa za pregledat celo kodo vsakemu posebaj. Programiranja se boste najbolje naučili tako, da se sami trudite reševati napake. Če kopirate vrsto error-ja v google boste lahko marsikaj dobili.

@senad:
Zgoraj ustvarim le en vektor, ki pa je povezana lista in hrani poljubno število elementov (kolikor jih pač dodamo). Spodaj pa dostopam da posameznega elementa v vektorju.

vector<Gumb*> Gumbi - seznam kazalcev na objekt Gumb
Gumbi.at(0) - dostop do objekta Gumb, ki se nahaja na poziciji 0 (torej je prvi v seznamu)

Glede velikosti kvadrata - meni moraš izrisovat v ortografski projekciji (2D) kar že verjetno delaš. V 2D je vs Pri kvadratu pa si moral tudi določiti širino in višino a ne? Širino pa ne boš določil 0.1 ker to ni niti piksel.

(temo sem premaknil pod forum "Začetniki")
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a senad » To Jan 17, 2012 8:18 pm

tega pa ne štekam kako pa dam da mi v pikslih izriše prosim..če mi lahko pokažeš,.. ker drugače ne znam izriat , samo v drugem ne pa v pikslih..
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » To Jan 17, 2012 8:35 pm

Koda: Izberi vse
glBegin(GL_QUADS)
     glVertex2f(100, 100);
     glVertex2f(300, 100);
     glVertex2f(300,120);
     glVertex2f(100, 120);
glEnd()


Če imaš velikost okna 640x480 bi ti moralo to izrisat natančno tako kot je na sliki.
Ne razumem česa ne razumeš točno :D
Priponke
izris.png
izris.png (2.14 KiB) Videno 1948 krat
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a senad » To Jan 17, 2012 9:17 pm

Ni mi jasno tole poskušam tole vspostavit po 3 urnim -5 urnim preverjanjem poskušam rešit da mi naredi normalen knof vendar ne rata javi pa veliko napak, lahko bi malo pogledal, in mi svetoval, kako kaj odpravit. Ni mi pa jasno kako lahko piksle izrisuješ, ker do sedaj sem povedal direktno vrednost in tako izrisoval vrendosti pa so če gledamo koordinatni sistem, takole in po tem sem izrisoval, enako koscak ki mi je dal neko kodo ...Mi lahko poveš kako to drugače po pikslih barvam . Hvala
1
|
|
|
----------------|----------------------->1
-1 |
-1 |
Koda: Izberi vse
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>

#include <stdlib.h>

    class Gumb{
    int x; // X pozicija gumba
int y; // Y pozicija gumba
int width; // širina
int height; // višina
  char* name;
     public:
    Gumb()  //constructor
    {
      x= 0;
      y= 0;
      width  = 128;
      height = 128;
    }




    void Set(int x, int y, int width, int height)  //nastavimo vrednosti
    {
      this->x = x;
      this->y = y;
      this->width = width;
      this->height = height;
    }

    void Draw() // izris gumba
    {
      glBegin(GL_QUADS);
         glVertex2f(x, y);
         glVertex2f(x + width, y);
         glVertex2f(x + width, y + height);
         glVertex2f(x, y+ height);
      glEnd();

    }
    bool IsClicked(int x, int y) // preverimo če je bil pritisnjen
    {
       if( x > gumb.x && x < gumb.x + width)
       if( y > gumb.y && y < gumb.y + height)
       {
          return true;
       }
       return false;
    }

    void SetName(char * name)
    {
       this->name = name;
    }

    char* GetName()
    {
       return name;
    }
    }
    vector<Gumb*> vGumbi;


void Draw()
{

   glClear( GL_COLOR_BUFFER_BIT |
          GL_DEPTH_BUFFER_BIT );


   glEnable(GL_DEPTH_TEST);
   glEnable(GL_LIGHTING);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(45,1,1,100);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();


for( int i=0; i< vGumbi.size(); i++ )
{
  vGumbi.at(i)->Draw();
}

   glDisable(GL_DEPTH_TEST);
   glDisable(GL_LIGHTING);


   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();




   glutSwapBuffers();
}




void MouseButton(int button,int state,int x, int y)
{
   if (state == GLUT_DOWN)
   {
      switch(button)
      {
      case GLUT_LEFT_BUTTON:
if( x > x && x < x + width)
if( y > y && y < y + height)
{
printf("nobk ");

// klik na gumb je uspel, in kupili smo 10 krav za na našo kmetijo
    // s šalo na stran - tukaj napište kaj se zgodi ob kliku na gumb :)
}
else
printf("nobk ddd");
        break;
      case GLUT_MIDDLE_BUTTON:
         printf("middle ");
         break;
      case GLUT_RIGHT_BUTTON:
         printf("right ");
         break;
      }
      printf("button pressed at (%d,%d)\n",x,y);
   }
   else
   {

      switch(button)
      {
      case GLUT_LEFT_BUTTON:
         if( x > x && x < x + width)
if( y > y && y < y + height)
{
printf("nobk ");

// klik na gumb je uspel, in kupili smo 10 krav za na našo kmetijo
    // s šalo na stran - tukaj napište kaj se zgodi ob kliku na gumb :)
}
else
printf("nobk ddd");
         break;
      case GLUT_MIDDLE_BUTTON:
         printf("middle ");
         break;
      case GLUT_RIGHT_BUTTON:
         printf("right ");
         break;
      }
   //   printf("button released at (%d,%d)\n",x,y);
   }


   glutPostRedisplay();
}


int main(int argc,char **argv)
{
Gumb *btn = new Gumb();
btn.Set( 128, 128, 100, 20);  // gumb bo na poziciji X=128, Y=128, širok bo 100 pikslov, visok pa 20
btn.Name = "gumb_nova_igra"; //ime gumba, da bomo vedli kateri je
vGumbi.pushBack( btn ); // vrzemo gumb v vektor
//po zelji ustvrami vec gumbov

for( int i=0; i< vGumbi.size(); i++ )
{
    if( vGumbi.at()->IsClicked() )
    {
        if( !strcmp(vGumbi.at()->GetName(), "gumb_nova_igra")
        {
           //zaženemo igro
           break; //skočimo iz zanke ker več kot en gumb ne more biti pritisnjen naenkrat
        } else
        if( !strcmp(vGumbi..at()->GetName(), "gumb_zajec")
        {
           //nekaj se zgodi z rjavim zajcem
        }
    }
    }
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
   glutInitWindowSize(512,512);

   glutCreateWindow("Krneki");

   glutDisplayFunc(Draw);

   glutMouseFunc(MouseButton);

   glutMainLoop();
}



SA PRIMERUM NAPAKE:
Koda: Izberi vse


In member function 'void Gumb::Set(int, int, int, int)':|
40|warning: declaration of 'height' shadows a member of 'this'|
40|warning: declaration of 'width' shadows a member of 'this'|
40|warning: declaration of 'y' shadows a member of 'this'|
|40|warning: declaration of 'x' shadows a member of 'this'|
|In member function 'bool Gumb::IsClicked(int, int)':|
58|warning: declaration of 'y' shadows a member of 'this'|
58|warning: declaration of 'x' shadows a member of 'this'|
|59|error: 'gumb' was not declared in this scope|
||In member function 'void Gumb::SetName(char*)':|
|68|warning: declaration of 'name' shadows a member of 'this'|
77|error: expected initializer before '<' token|
|In function 'void Draw()':|
97|error: 'vGumbi' was not declared in this scope|
|In function 'void MouseButton(int, int, int, int)':|
128|error: 'width' was not declared in this scope|
129|error: 'height' was not declared in this scope|
128|warning: suggest explicit braces to avoid ambiguous 'else'|
154|error: 'width' was not declared in this scope|
155|error: 'height' was not declared in this scope|
154|warning: suggest explicit braces to avoid ambiguous 'else'|
|In function 'int main(int, char**)':|
183|error: request for member 'Set' in 'btn', which is of non-class type 'Gumb*'|
184|error: request for member 'Name' in 'btn', which is of non-class type 'Gumb*'|
185|error: 'vGumbi' was not declared in this scope|
193|error: expected ')' before '{' token|
201|error: expected primary-expression before '}' token|
201|error: expected ';' before '}' token|
549|warning: 'int glutCreateMenu_ATEXIT_HACK(void (*)(int))' defined but not used|
||=== Build finished: 13 errors, 18 warnings ===|

senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » To Jan 17, 2012 9:56 pm

Še enkrat, kodo ki sem jo napisal, ni za kopirat ter prilepit v vaš projekt ampak je kvečjemu primer kako stvar izgleda. Seveda morate pravilno premaknit te kose kode v vaš projekt. Če je vse pravilno postavljeno ter če so tiskarski škrati popravljeni bi moralo delovati.

1.) V tvojem primeru si kar kopiral del kode, ki preverja če je bil gumb pritisnjen v Inicializacijo ( v main funkcijo). Se ti zdi da je to pravilno? A ni bolj verjetno da bo tisti del kode prišel tam, kjer zaznamo pristik na miškin gumb?

1. NAMIG ----> void MouseButton(int button,int state,int x, int y)
--------------> case GLUT_LEFT_BUTTON

2.) Ali si si prebral članek o C++ vektorju? .<(4)>
Če bi si ga, bi ugotovila da sem naredil tiskarsko napako v nekaj primerih, kot naprimer v

Koda: Izberi vse
if( !strcmp(vGumbi.at()->GetName(), "gumb_nova_igra")


vGumbit.at() ni pravilno, ker ne podamo indexa za parameter. Pravilno je vGumbi.at( i )

3.) Še ena napaka in sicer v
Koda: Izberi vse
if( !strcmp(vGumbi..at()->GetName(), "gumb_zajec")


Vidimo kaj je narobe? 2 piki sta zaporedoma.

4.)
Koda: Izberi vse
case GLUT_LEFT_BUTTON:
    if( x > x && x < x + width)
    if( y > y && y < y + height)


Hmm...hm? Zakaj si to kopiral sem spodaj?

Koda: Izberi vse
128|error: 'width' was not declared in this scope|
129|error: 'height' was not declared in this scope|

Ta dva errorja ti povesta, da spremenljivki width ter height ne obstajata v tem obsegu. Iz tega lahko razbereš ta tekaj nekaj ne štima.

Da nekaj ni vredu pa bi lahko tudi opazil saj piše
if( x > x ... )
To pomeni če je x večji od x ( kar pomeni da se pogoj nikoli ne bo zgodil)

5.) Vektor je del std knjižnice, in ga moraš includat čisto na vrhu, nato pa še dodat, da uporabljašt namespace std.
Koda: Izberi vse
#include <vector.h>
using namespace std;


6.) Seveda, lahko bi ti popravil celo kodo, da bi se ti zagnala takoj ampak s tem se sam ne boš nič naučil ampak bom le zate opravil domačo nalogo. Poskusi it skozi kodo ter se jo potrudi tudi razumet. Prvo moraš popravit osnovne napake kot so dvojne pike, tiskarske škrate ki se jih naredil in šele potem greš na postavlanje kode na pravilno mesto. Ko se ti bo zagnal projekt in ko stvari ne bodo delali pa le vpraši.

PS: pozabite na tisto s piksli kar sem rekel, hotel sem samo reči, da širino še vedno podajaš v pikslih, ter da med dolžinama 100.2 ter 100.0 je razlika le za 0.2 piklsa, kar skoraj da ni vidno (oz. v nekaj primerih vam lahko poblura del kvadrata) ampak še vedno bo glavna dolžina 100 pikslov.
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a senad » To Jan 17, 2012 11:07 pm

Eko porpavu na 3 napke sedaj je le problem še v mainu ..

Koda: Izberi vse
Gumb *btn = new Gumb();
btn.Set( 128, 128, 100, 20);  // gumb bo na poziciji X=128, Y=128, širok bo 100 pikslov, visok pa 20
btn.Name = "gumb_nova_igra"; //ime gumba, da bomo vedli kateri je
vGumbi.pushBack( btn ); // vrzemo gumb v vektor
//po zelji ustvrami vec gumbov

request for member 'Set' in 'btn', which is of non-class type 'Gumb*'|
request for member 'Name' in 'btn', which is of non-class type 'Gumb*'|
class std::vector<Gumb*, std::allocator<Gumb*> >' has no member named 'pushBack'|

||=== Build finished: 3 errors, 16 warnings ===|


senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » To Jan 17, 2012 11:37 pm

No no, to pa je nekaj drugega :) Gre če se potrudiš!
Lepo da si prepoznal in izpostavil točno mesto napake, tako je lažje tudi zame

Koda: Izberi vse
Gumb *btn = new Gumb();
btn.Set( 128, 128, 100, 20);
btn.Name = "gumb_nova_igra";
vGumbi.pushBack( btn );


1.) Gumb *btn pomeni, da ustvarimo kazalec, ki kaže na objekt tipa "Gumb".
Do funkcij objekta, na katerega kaže kazalec pa dostopamo preko "->" in ne preko pike kot sem se zatipkal, torej je pravilno naslednje
Koda: Izberi vse
Gumb *btn = new Gumb();
btn->Set( 128, 128, 100, 20);
btn->Name = "gumb_nova_igra";


2.) Še ena napaka pa je v zadnji vrstici, kjer ne prepozna funkcije "pushBack". Tukaj sem spet na pamet pisal,
pravilno ime funkcije pa je "push_back", torej je v popravku
Koda: Izberi vse
vGumbi.push_back( btn );


--------------------------------------------------------------------------------------------------------

Vse skupaj popravljeno:
Koda: Izberi vse
Gumb *btn = new Gumb();
btn->Set( 128, 128, 100, 20);
btn->Name = "gumb_nova_igra";
vGumbi.push_back( btn );
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a koscak » Sr Jan 18, 2012 12:01 am

Po mojem občutku si malo falil, možn da se motim ampak : tist name ni nič vsaj v gumbku nič, kolikor
Koda: Izberi vse
btn->SetName ( "gumb_nova_igra");
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » Sr Jan 18, 2012 12:48 am

koscak napisal/-a:Po mojem občutku si malo falil, možn da se motim ampak : tist name ni nič vsaj v gumbku nič, kolikor
Koda: Izberi vse
btn->SetName ( "gumb_nova_igra");


Ko kliknemo z miško in preverjamo če je bil katerikoli od gumbov pritisnjen, lahko preko imena zvemo če je bil pritisnjen gumb za novo igro npr. :)

Koda: Izberi vse
if( !strcmp(vGumbi.at()->GetName(), "gumb_nova_igra")
{
    //zaženemo igro
    break;
}
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a senad » Če Jan 26, 2012 1:51 pm

Eko bloodyavengerd radi sve :)Najlepša hvala:

Sedaj prosim če mi lahko kdo pove kako naj loadam teksture na gumb.
če bi mi kdo pokazal 3 različne slike naloadat na gumbe,

Koda: Izberi vse
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>

#include <stdlib.h>



#include <stdlib.h>
#include <stdio.h>

#ifdef WIN32
   #define WIN32_LEAN_AND_MEAN
   #include <Windows.h>
#endif

#include <GL/glut.h>
#include <vector>
int width=512;
int height=512;
using namespace std;

    class Gumb{
    int x; // X pozicija gumba
int y; // Y pozicija gumba
int width; // širina
int height; // višina
  char* name;
     public:
    Gumb()  //constructor
    {
      x= 0;
      y= 0;
      width  = 128;
      height = 128;
    }




    void Set(int x, int y, int width, int height)  //nastavimo vrednosti
    {
      this->x = x;
      this->y = y;
      this->width = width;
      this->height = height;
    }

    void Draw() // izris gumba
    {
      glBegin(GL_QUADS);
       glColor3d(1,0,0);
         glVertex2f(x, y);
         glVertex2f(x + width, y);
         glVertex2f(x + width, y + height);
         glVertex2f(x, y+ height);
      glEnd();

    }
bool IsClicked(int xx, int yy) // preverimo če je bil pritisnjen
{

   if( xx > x && xx < x + width)
   if( yy > y && yy < y + height)
   {
      return true;
   }
   return false;
}
    void SetName(char * name)
    {
       this->name = name;
    }

    char* GetName()
    {
       return name;
    }
    };

   vector<Gumb*> vGumbi;


void Draw()
{

   glClear( GL_COLOR_BUFFER_BIT |
          GL_DEPTH_BUFFER_BIT );




    glMatrixMode (GL_PROJECTION);
        glLoadIdentity ();
        glOrtho (0, width, height, 0, 0, 1);
         glMatrixMode (GL_MODELVIEW);


for( int i=0; i< vGumbi.size(); i++ )
{
  vGumbi.at(i)->Draw();
}






   glutSwapBuffers();
}




void MouseButton(int button,int state,int x, int y)
        {
              if (state == GLUT_DOWN)
                  {
                    switch(button)
                        {
                         case GLUT_LEFT_BUTTON:
                         //  cout<<x<<"  "<<y<<"  ";

                             for( int i=0; i< vGumbi.size(); i++ )
                                 {
                                     //preverjanje èe je levi gum pritisnjen

                                  if( vGumbi.at(i)->IsClicked(x,y) )
                                       {
                                           //preverjanje èe je kliknen gum nova igra

                                       if( !strcmp(vGumbi.at(i)->GetName(), "gumb_nova_igra"))
                                               {

                      }
                      else if( !strcmp(vGumbi.at(i)->GetName(), "aa"))
                      {

                      }


                      else if( !strcmp(vGumbi.at(i)->GetName(), "exit"))
                      {
                         exit(1);
                         // printf("zapri");
                      }
                      break;
                   }
                }
             glutPostRedisplay();
          }
       }
    }


int main(int argc,char **argv)
{

Gumb *btn = new Gumb();
btn->Set( 128, 128, 100, 20);
btn->SetName ( "gumb_nova_igra");
vGumbi.push_back( btn );
Gumb *bukn = new Gumb();
bukn->Set( 128, 220, 100, 20);
bukn->SetName ( "exit");
vGumbi.push_back( bukn );
Gumb *bun = new Gumb();
bun->Set( 128, 180, 100, 20);
bun->SetName ( "aa");
vGumbi.push_back( bun );

   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
   glutInitWindowSize(width,height);

   glutCreateWindow("Krneki");

   glutDisplayFunc(Draw);

   glutMouseFunc(MouseButton);

   glutMainLoop();
}






senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a Blodyavenger » Če Jan 26, 2012 10:48 pm

Super, sam da si zrihtal :D Aja, pa dobrodošel na SGD-ju ;)

Glede tekstur in tega, je Tomaa lepo napisal kako to naredit v eni drugi temi - http://slogamedev.net/viewtopic.php?f=49&t=2452. Poglej, nekje na sredini je napisal primer uporabe SOIL knjižnice. Upam da ti bo v pomoč
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: menu

OdgovorNapisal/-a senad » Če Jan 26, 2012 11:02 pm

..
Zadnjič spremenil senad, dne Če Jan 26, 2012 11:17 pm, skupaj popravljeno 1 krat.
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm

Re: menu

OdgovorNapisal/-a senad » Če Jan 26, 2012 11:08 pm

...
senad
novinec
novinec
 
Prispevkov: 12
Pridružen: Ne Jan 15, 2012 2:01 pm


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron