Bonjour a tous
je débute dans la sdl, et je n'ai vraiment pas compris comment faire une collision.Je voudrait que quand le player1 touche le player2 un texte s'affiche, voici mon programme:
#include <cstdlib>
#include <stdlib.h>
void pause();
int main(int argc, char *argv[])
{
void pause();
SDL_Surface *ecran = NULL, *player1 = NULL , *player2 = NULL;
SDL_Rect positionPlayer1;
SDL_Rect positionPlayer2;
SDL_Event event;
int continuer = 1;
SDL_Init(SDL_INIT_VIDEO);
ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);
pause();
/* Chargement de Zozor */
player1 = SDL_LoadBMP("player1.bmp");
SDL_SetColorKey(player1, SDL_SRCCOLORKEY, SDL_MapRGB(player1->format, 0, 0, 255));
/* On centre Zozor à l'écran */
positionPlayer1.x = ecran->w / 2 - player1->w / 2;
positionPlayer1.y = ecran->h / 2 - player1->h / 2;
player2 = SDL_LoadBMP ("player1.bmp");
positionPlayer2.x = 0;
positionPlayer2.y = 0;
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_UP: // Flèche haut
positionPlayer1.y--;
break;
case SDLK_DOWN: // Flèche bas
positionPlayer1.y++;
break;
case SDLK_RIGHT: // Flèche droite
positionPlayer1.x++;
break;
case SDLK_LEFT: // Flèche gauche
positionPlayer1.x--;
break;
}
break;
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
SDL_BlitSurface(player1, NULL, ecran, &positionPlayer1); /* On place zozor à sa nouvelle position */
SDL_BlitSurface(player2, NULL , ecran , &positionPlayer2);
SDL_Flip(ecran); /* On met à jour l'affichage */
}
SDL_FreeSurface(player1);
SDL_FreeSurface(player2);
SDL_Quit();
return EXIT_SUCCESS;
}
void pause()
{
int continuer = 1;
SDL_Event event;
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}
aidez moi svp
La prochaine fois publie ton code sur un wall s'il te plaît, jv.com n'est pas approprié pour afficher du code.
Tout dépend de la tronche de tes objets colisionables. Si ce sont des rectangles il faut qu'avant chaque nouveau rafraîchissement de l'image tu détermines si les deux rectangles s'intersectent.
C'est une première approximation qui ne consomme pas trop d'énergie à l'ordinateur. Après si tu as des images, il faut que tu regardes ensuite sur toute la zone d'intersection si le canal alpha de chaque pixel respectif des deux images superposées est différent de transparent. Si deux pixels non transparents sont au même endroit alors tu en déduis tout de suite qu'il y a normalement une collision.
Donc cette nouvelle partie du code se situerait juste après ton switch événementiel.
Merci de ta répons mais j'ai encore un problème, en fait j'ai fait:
if (Collision = true);
SDL_Quit;
puis:
bool Collision(SDL_Rect player1, SDL_Rect player2)
{
if((player2.x >= player1.x + player1.w) // trop à droite
|| (player2.x + player2.w <= player1.x) // trop à gauche
|| (player2.y >= player1.y + player1.h) // trop en bas
|| (player2.y + player2.h <= player1.y)) // trop en haut
return false;
else
return true;
}
mais il me signale un problème:
error: cannot convert 'bool' to 'SDL_Surface*' in assignment|
Déjà c'est if (Collision == true)
Le compiler doit t'indiquer la ligne de tes problèmes normalement. Là il te dit simplement qu'à cette ligne que tu n'indiques pas que tu essayes de convertir un booléen en surface_SDL, aïe aïe aïe.
Pourquoi tu veux quitter ton application quand il y a une collision ? C'est un comportement un peu bizarre. Tu devrais au moins pour commencer juste envoyer un petit printf en console disant "collision detected".
" if (Collision = true);
SDL_Quit; "
Déjà il manque les arguments:
Collision(argument1, argument2)
Ensuite quand on vérifie une valeur on mets toujours deux signes égal, si tu n'en mets qu'un seul il pense que tu veux changer la valeur.
Puis en fait tu n'a même pas obligé de mettre un truc genre "== 1" si ce n'est qu'une question de true ou false, si tu ne mets rien (ex: if( Collision(ceci, cela) ) ça vérifiera si la valeur est positive (true quoi), pour le false tu peux mettre un point d'exclamation devant "Collision".
Puis pour finir SDL_Quit() (tu as oublié les parenthèses d'ailleurs) sert a "fermer" la SDL et tous ses subsystems puis a libérer la mémoire, ça ne dit pas a ton programme de s’arrêter! Tu devrais avoir un joli crash avec ça.
En fait c'était pour simplifier...
et comment je peut convertir un booléen en surface-sdl stp?
Oui donc toutes ces petites bêtises grossières montrent que tu te précipites un peu trop vite sur le forum au lieu de corriger les problèmes au coup par coup à l'aide du compilateur.
Reviens nous voir quand ton code sera un peu plus tiré au clair ![]()
"et comment je peut convertir un booléen en surface-sdl stp? "
Est-ce que tu vois ce qu'est un booleen ? Est-ce que tu vois ce que c'est une surface_SDL ?
Autre exemple :
Est-ce que tu vois ce qu'est un téléski ? Est-ce que tu vois ce qu'est un chocapic ?
Comment convertir un chocapic en téléski ? Voilà une bonne question
Ne postes pas un message d'erreur sans la ligne concernée ça n'a pas de sens nous ne sommes pas des devins. Même si là le code d'erreur est totalement explicite et donc ça veut dire que tu essayes de convertir un booleen en surface_SDL.
Moi je pense que tu grilles un peu trop d'étapes du sdz (puisqu'on t'a démasqué petit voyoux
) et que limite tu devrais tout reprendre depuis le début.
Ah et autre petite erreur, tu as mis un point virgule juste après ton "if", ce n'est pas bon, tu dois écrire directement la commande a exécuter après ton "if", et tu mets seulement un point virgule après la commande en question.
En fait il y a des erreurs et des questions qui ne devraient plus figurer quand on a passé l'étape du premier jeu en console du sdz donc je répéte, j'émets l'hypothèse que tu as voulu aller plus vite que la musique et qu'une bonne relecture et des petits projets de ton imagination avant de s'attaquer au socle SDL ne ferait pas de mal.
ok je pense que je vais suivre t'es conseille, merci pour t'es réponses.
TES conseiLS, TES réponses.
Bonne continuation l'ami. Attention les règles de la programmation sont moins nombreuses et alambiquées que celles de la grammaire française mais le compilateur est lui beaucoup plus sévère que le correcteur orthographique de Word.
"il faut que tu regardes ensuite sur toute la zone d'intersection si le canal alpha de chaque pixel respectif des deux images superposées est différent de transparent. Si deux pixels non transparents sont au même endroit alors tu en déduis tout de suite qu'il y a normalement une collision. "
le problème de SDL, c'est qu'il n'y a pas de fonctions pour récupérer la couleur d'un pixel d'une surface.
il est toujours possible de récupérer des bouts de code sur le net, qui iront récupérer les données dans le buffer d'octets de la surface, et ce en fonction de sa profondeur de couleurs (8 bits, 24 bits, monochrome...). mais ils ne sont pas super-fiables ![]()
Il y a un pointeur vers les pixels dans SDL_Surface, tu peux utiliser ça non? ![]()
toutafé. c'est ce que font les bouts de code dont je parlais
http://pastebin.com/mY4jyvH8
mate la tronche du truc. c'est ce que j'utilise dans ISRV2 ![]()
Je vois, quel usage en fais-tu exactement?
Si ce n'est pas trop indiscret. ![]()
si tu regardes les ressources d'ISRV2, tu vois deux PNG unidimentionnels et en niveaux de gris. ils contiennent respectivement les définitions de découpage des sprites et la géométrie du niveau actuel. le tout stocké dans les couleurs des pixels ![]()