begin process at 2012 05 30 02:28:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

OpenGL

 > 

Le jeu du serpent en C++ / niveau débutant


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Le jeu du serpent en C++ / niveau débutant

lundi 13 juin 2005 à 08:58:59 | Le jeu du serpent en C++ / niveau débutant

edouard57

Bonjour à tous,

Je débute en C ++ et opengl.

Pour m'entrainer j'essaie de réaliser un petit jeu le serpent.

Pour l'instant j'arrive à créer un carré dans la fenêtre windows qui se déplace avec les fléches du clavier (pas compliqué jusqu'à présent).

Maintenant j'aimerai déplacer un serpent dans la fenêtre windows.

Comment puis je m'y prendre ?

Voici mon code du carré qui se déplace :

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

WNDCLASS wc;
MSG msg;
HWND hWnd;
HDC   DC;
HGLRC RC;

double c = 0;
double a = 0;
double b = 10;

void RePaint ()
{
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glMatrixMode (GL_MODELVIEW);
   glLoadIdentity ();

    /* code relatif à l'affichage */
gluLookAt (0,0,-40,0,0,0,0,1,0);
if (b == 0) a += 0.01;
if (b == 1) a -= 0.01;
if (b == 2) c += 0.01;
if (b == 3) c -= 0.01;

glTranslated (a,c,0);       /* déplacement du carré */

glBegin (GL_QUADS);    /*Création du carré */
glVertex2i (-1,1);
glVertex2i (1,1);
glVertex2i (1,-1);
glVertex2i (-1,-1);
glEnd ();


   SwapBuffers (DC);
}

void InitPixelFormat (HDC hDC)
{
      PIXELFORMATDESCRIPTOR pfd =
      {
           sizeof (PIXELFORMATDESCRIPTOR),
           1,
           PFD_SUPPORT_OPENGL | PFD_TYPE_RGBA | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER,
           16,
           0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
           16,
           0, 0, 0, 0, 0, 0, 0
      };

      SetPixelFormat (hDC, ChoosePixelFormat (hDC, &pfd), &pfd);
}

LRESULT CALLBACK WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch (uMsg)
   {
   case WM_CREATE:
        DC=GetDC (hwnd);
        InitPixelFormat (DC);
        RC = wglCreateContext (DC);
        wglMakeCurrent (DC, RC);
        glEnable (GL_DEPTH_TEST); /* On active le Z-Buffer */
      break;

   case WM_CLOSE:
        wglMakeCurrent (NULL, NULL);
        wglDeleteContext (RC);
        ReleaseDC (hwnd,DC);
      PostQuitMessage (0);
      break;
    case WM_SIZE:
       glViewport (0,0,LOWORD (lParam),HIWORD (lParam));
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
       gluPerspective (45,(float)(LOWORD(lParam))/(float)(HIWORD(lParam)),1,100);
       break;
    case WM_PAINT:
       RePaint ();
       break;
   default:
      return DefWindowProc (hwnd,uMsg,wParam,lParam);
      case WM_KEYDOWN:
switch (wParam) {
case VK_LEFT:                /* fléches du clavier */
b = 0;
break;
case VK_RIGHT:
b = 1;
break;
case VK_UP:
b = 2;
break;
case VK_DOWN:
b = 3;
break;
default:
break;
}
break;
   }
   return 0;
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
   wc.style = CS_OWNDC;
   wc.lpfnWndProc = WindowProc;
   wc.cbClsExtra = 0;
   wc.cbWndExtra = 0;
   wc.hInstance = hInstance;
   wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
   wc.hCursor = LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
   wc.lpszMenuName = NULL;
   wc.lpszClassName = "OGL";

   RegisterClass(&wc);

   hWnd = CreateWindow
   ("OGL", "Fenetre OpenGL",
   WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE | WS_MAXIMIZEBOX,
   0, 0, 640, 480, NULL, NULL, hInstance, NULL
   );

   while (GetMessage(&msg, NULL, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

   return 0;
}


Merci par avance pour votre aide
lundi 13 juin 2005 à 13:52:24 | Re : Le jeu du serpent en C++ / niveau débutant

Pamaury

voilà une solution(il y en a sûrement d'autre mais celle-ci marche très bien):
typedef struct _serpent_part;
{
    int x,y;
    _serpent_part *next,*prev;
}serpent_part;

tu créé le serpent:
serpent_part tete;
tete.next=NULL;// next c'est vers la tete donc ici NULL
tete.x=DEPART_X;
tete.y=DEPART_Y;

serpent_part *last_part=&tete;
for(int i=1;i<4;i++)// un serpent en 4 bouts(dont la tête)
{
    serpent_part *part=new serpent_part;
    part->next=last_part;
    part->prev=NULL;
    part->x=DEPART_X+i;
    part->y=DEPART_Y;
    last_part=part;
}

// normalement çà marche(faut vérifier bien entendu)

en suite pour le faire avancer:
// ici dx et dy représente la direction dans laquelle avance la tete
// çà peut-être (1,0) pour aler à droite
// (0,1) vers le bas
// meme (1,1) si tu veux qu'il aille en diagonale lol
// attention à ce qu'il ne revienne sur lui !!!!
// ici le principe est simple:
// chaque bout va passer la position de celui qui devant lui
// et le premier bout à une nouvelle postion:

// exemple: 12345 sont les bout et + la tete
// +12345
// 12345
// puis on avance la tete
//+1235
//
// autre exemple:
//
// +  45
// 123
// çà va donner
//
// 1  5
// 234
// et la tete
// +
// 1  5
// 234
void advanced(serpent_part *tete,int dx,int dy)
{
    serpent_part *part=tete;
    while(part->prev)
       part=part->prev;
    while(part->next)
    {
       part->x=part->next->x;
       part->y=part->next->y;
       part=part->next;
    }
    tete->x+=dx;
    tete->y+=dy;
}

voilà ensuite pour la collsiion dans le serpent il suffit que voir si la tete a les même coordonées que un autre bout
et pour les bonus il suffit de voir si la tete a les coordonnées du bonus .

Bonne journée
A m a u r y
lundi 13 juin 2005 à 16:12:51 | Re : Le jeu du serpent en C++ / niveau débutant

edouard57

Merci beaucoup , j'essarai ça ce soir car la je suis au taff
lundi 13 juin 2005 à 17:11:10 | Re : Le jeu du serpent en C++ / niveau débutant

edouard57

Encore une ou deux questions ce code je l'intégre bien dans void RePaint () ?

Faut-il que je garde glTranslated  et GL_QUADS dans mon code actuel ?

Merci par avance.


Cette discussion est classée dans : case, break, hwnd, dc, wc


Répondre à ce message

Sujets en rapport avec ce message

API Win32, problème de variable [ par bouba ] Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source.LPSTR Path="";LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM Problème avec WM_KEYDOWN: [ par cognac ] Pourquoi est-ce que "j" est toujours égal à 2 lorsque je presse F1(même la première fois). Je pensais qu'à chaque fois que je presse F1 "j" augmente d Affichage d'un boutton en Win32 [ par Crazy_Joe ] Bonjour à tous, Cela va peut-être vous paraître assez bénin mais je n'arrive pas à afficher un boutton tout simple dans mon application. Voici un bou pb affichage ComboBox dans Dialog [ par Guillemouze ] Salut tout le monde,j'ai un souci d'affichage de mon combo dans un dialog. Quand je click sur la fleche pour afficher la liste, il ne m'affiche rien!P API + logiciel réseau [ par lolorenzeb ] Bonjour à tous,Voila j'ai réalisé deux petites applications simples (client et serveur) en mode console. Je souhaite donc améliorer mon programme avec Fenetre windows en cpp [ par FeelCode ] bon j'essaye de cree une fenetre windows tout simple mai j'ai un probleme de convertion voir le code plus bas.//************************************** Problème switch [ par seleccao ] Bonjours à tous Pour mon application en c++ je travaille avec de l'hexadecimal et j'utilise un switch switch(n1) { case '0000': hexa1 = "0";break; ca La librairie FreeImage [ par Alexbad ] Salut,J'ai commencé à programmer en C++ avec la librairie standard de Windows. Là, je réussis à ouvrir une jolie fenêtre grisonnante au centre de l'éc Pb de conception [ par blinix123 ] ....................  switch (*reponse)  {   case 'a': case 'A':    remplissage (tablo, &cpt);    brea Ma fonction ouvrir un dossier ne marche pas [ par papaolive ] Bonjour,je sais que le code qui va suivre n'est pas très beau (c'est le moin sque l'on puisse dire !).J'ai crée 7 edit box qui chacune représente le s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales