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

edouard57 Messages postés 3 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 13 juin 2005 - 13 juin 2005 à 08:58
edouard57 Messages postés 3 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 13 juin 2005 - 13 juin 2005 à 17:11
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

3 réponses

Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
13 juin 2005 à 13:52
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
0
edouard57 Messages postés 3 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 13 juin 2005
13 juin 2005 à 16:12
Merci beaucoup , j'essarai ça ce soir car la je suis au taff
0
edouard57 Messages postés 3 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 13 juin 2005
13 juin 2005 à 17:11
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.
0
Rejoignez-nous