Skocz do zawartości


gra-snake ruch węża


1 odpowiedź w tym temacie

#1 luka100

    Nowy na forum

  • Użytkownicy
  • 1 Postów:

Napisano czw, 24 sty 2013 - 15:33

Witam, piszę na zaliczenie gre typu snake, mam stworzone dodawanie jedzenia, samo jedzenie, wydłużanie węża po zjedzeniu oraz kolizje, brakuje mi jedynie ruchu "zawijanego" same węża, może ktoś pomóc to zrobić?

kod:
jest to kod dodawania kolejnego czlonu, licznik to ilosc zjedzonego jedzenia, moveX, moveY ruch zrobiony na timerach, jedzenie robi się 0.03 od srodka poprzedniego członu, myślałem żeby zrobić wektor ruchu w strukturze oraz pozycja każdego członu=pozycja członu następnego, ale w ogóle nie wiem jak się do tego zabrać :( proszę o pomoc
jeśli ktoś potrzebowałby cały kod to prześle, pozdrawiam.

cpp
void CGL::czlon(int a)
{
float g=0.03;
if (licznik==0) cout << "nic";
else
{
/*******************************************************/
  if (obrot==0)
  {
   for(int i=1;i<=licznik;i++)
   {
        float d;
        d=g*i;
 
        glPushMatrix();
 
        glTranslatef(moveX-d,moveY,0);
 
        glScalef( 1.0f/(float)BOARD_X, 1.0f/(float)BOARD_Y, 0.1f );
        glBindTexture( GL_TEXTURE_2D, texture );
        glutSolidSphere( 0.2f,20,20 );
 
        glPopMatrix();
 
   }
  }
/*******************************************************/
  else if (obrot==90)
  {
   for(int i=1;i<=licznik;i++)
   {
        float d;
        d=g*i;
 
        glPushMatrix();
 
        glTranslatef(moveX,moveY-d,0);
 
        glScalef( 1.0f/(float)BOARD_X, 1.0f/(float)BOARD_Y, 0.1f );
        glBindTexture( GL_TEXTURE_2D, texture );
        glutSolidSphere( 0.2f,20,20 );
 
        glPopMatrix();
 
   }
  }
/*******************************************************/
  else if (obrot==180)
  {
   for(int i=1;i<=licznik;i++)
   {
        float d;
        d=g*i;
 
        glPushMatrix();
 
        glTranslatef(moveX+d,moveY,0);
 
        glScalef( 1.0f/(float)BOARD_X, 1.0f/(float)BOARD_Y, 0.1f );
        glBindTexture( GL_TEXTURE_2D, texture );
        glutSolidSphere( 0.2f,20,20 );
 
        glPopMatrix();
 
   }
  }
/*******************************************************/
  else if (obrot==270)
  {
   for(int i=1;i<=licznik;i++)
   {
        float d;
        d=g*i;
 
        glPushMatrix();
 
        glTranslatef(moveX,moveY+d,0);
 
        glScalef( 1.0f/(float)BOARD_X, 1.0f/(float)BOARD_Y, 0.1f );
        glBindTexture( GL_TEXTURE_2D, texture );
        glutSolidSphere( 0.2f,20,20 );
 
        glPopMatrix();
 
   }
  }
 
}
 
}


#2 5corpio

    Guru

  • Super użytkownicy
  • 874 Postów:

Napisano pią, 25 sty 2013 - 11:58

Chciałem napisać samemu ale zobaczyłem, że rozwiązanie tu jest takie samo jak chciałem podać: http://new.cplusplus...beginner/64320/

czyli całego węża trzymasz sobie jako np. tablicę albo listę (nie wiem co będzie lepsze) i przy update ruchu robisz tak jak napisali w 2poście tam. Czyli iterujesz od końca i ostatni element staje się przedostatnim, przedostatni staje się tym przedprzedostatnim ... i tak aż do głowy, która nabiera nowej pozycji w zależności od kierunku ruchu.

Edit: W liście wydaje się będzie lepiej trzymać "ciało węża" bo naturalne dla listy jest, że masz wskaźnik na kolejny i/lub poprzedni element.

Edit2: a tu cały kod najprostrzego snake-a w java: http://imhasib.wordp...th-source-code/