Déplacement d'un sssserpent !

Contenu du snippet

Ce bout de code court et simple simule l'effet de la balle rebondissante. Ici, la balle est remplacé par un serpent de pixels qui ondule de façon aléatoire

Source / Exemple :


// Créer un fichier MFC AppWizard(exe) de type Dialog Based 
// et insérer ceci dans le else de CxxDlg::OnPaint()

CClientDC aDC(this); // définit la fenêtre client comme contexte de périphérique
const COLORREF GREEN = 0x0000FF00, LIGHTGRAY = 0xD8E9EC; //0xD8E9EC = fond gris
const int ExecTime = 7; // Temps d'exécution de la démo en seconde
const int SnakeLength = 50; // Longueur du serpent
const int SnakeSpeed =	5; // Vitesse de déplacement du serpent
CRect aRect;
GetClientRect(&aRect); //Retourne dans aRect les coordonées de la fenêtre client
CPoint P2 = CPoint(aRect.right/2, aRect.bottom/2); // Point de départ au centre
CPoint aPoint[SnakeLength]; //Tableau des points du serpent courant (pas tout à fait)
BOOL xPos=1, yPos=1; //Flags indiquant la direction du serpent
int i=0;
CTime TheTime = CTime::GetCurrentTime();
while(CTime::GetCurrentTime()-TheTime<=ExecTime)
{
	if (P2.x == aRect.right)  xPos = 0; // si le serpent arrive à l'extrémité droite
										// de la fenêtre, on change de sens
	if (P2.y == aRect.bottom) yPos = 0; // idem si il arrive en bas : il remonte
	if (P2.x == 1) xPos = 1; // s'il arrive à l'extrémité gauche, il repart à droite
	if (P2.y == 1) yPos = 1; // s'il arrive en haut, il redescent
	if (xPos == 1) P2.x = P2.x + rand() % 2; // on ajoute 0 ou 1 aléatoirement
	if (yPos == 1) P2.y = P2.y + rand() % 2; //   pour changer la trajectoire du serpent
	if (xPos == 0) P2.x = P2.x - rand() % 2; // idem mais on
	if (yPos == 0) P2.y = P2.y - rand() % 2; //   ôte 0 ou 1
	aPoint[i]= P2; // ce point de tête du serpent est conservé
	aDC.SetPixel(aPoint[i], GREEN); // le pixel est coloré en vert
	Sleep(SnakeSpeed); // on attend un peu car l'exécution de la boucle est trop rapide
	i=i%(SnakeLength-1); // ici, aPoint retient de 0 à 49, donc qd i arrive à 50-1 -> i=0
	i++; // i évolue donc entre 0 et 49
	aDC.SetPixel(aPoint[i], LIGHTGRAY); //chaque fois qu'un pixel vert est coloré en tête, 
										//il faut "effacé" le pixel vert en queue
}
exit(0); //fin du programme

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.