Archipel >
faut caster :
Demander("Quel est votre nom ?" , (long*)&nom);
ou alors, changer le prototype en pointeur générique :
void Demander(const char* texte, void* pointeur);
Bonjour à tous j´ai une petite question à poser , j´espère qu´elle n´es pas trop bete . Comment supprimer une image de l´ecran en C avec SDL ?
j´ai essayé avec SDL_FreeSurface(); mais sa ne marche pas !
merci d´avance pour vos réponses !
Etant donné que tu blit à chaque Frame, si au prochain Frame tu ne blit pas, elle ne sera pas affiché ![]()
void Demander(const char* texte, long* pointeur);
void Demander(const char* texte,long* pointeur)
{
char entree;
printf("%s\n",texte);
scanf("%s", entree);
}
perso je la trouve bizare ta fonction....
elle prend un long* en parametre, tu lis ensuite 1 char (avec un %s qui est pour les chaine decaractere)
Et tu affecte ce char au long pointé
Donc si le mec te met 1, tu obtiendras le code ascii de 1.
Enfin, c´est bizarre comme fonction.
Bjr tous en ce moment je m´essai a la SDL et je bute sur 1 choze pourtant toute simple:
-Pour mon avion comment créér un misile partant de l´avion et traversant la fenetre de haut en bas
-Animer mon avion (2 amiages a faire défiler)
M´étant souvenu que j´avais déja posé la question sur l´animation j´ai été regarder aux pages 58 a 62 pour y trouver la réponse, mais je n´ai pas compris comment j´ai fai a l´époque
Pour l´instant voila ou j´en suis
-L´avion est le centre de la souris qui est disabled
-il bouge fluidement grace au double buffering
le fond est blanc (j´aimerais mettre un fond étoilé ou un ciel qui simule le mouvement de vitesse de l´avion)
quand je clique sur un des boutons de la souris le bruitage du tir aparait (piuuu ^^)
je suis entrain de mettre en place SDL_ttf pour la police que je compte mettr en haut de l´écran.
merci pour ceux qui seront m´aider
Giga-Nova.
C´est bon je me debrouillerai
merci
pour le deplacement de ton avion c´est facil
tu change l´image tous les x frames!
imagine que tu fais 30 frames par secondes
disons que tu change l´image que tu affiches tous les 15 frames, et le problème est réglé.
Il s´agit d´un probleme de "moteur physique" (décidément il faut se repeter souvevnt ici!
)
Tu crée un objet dans ton "moteur physique" qui a chaque frame fait un déplacement vers le bas de ton écran.
lol la théorie j´ai compris je sais pertinement que pour animer c´est juste une alternance d´image par frame.
mais le probleme c´est le bout de ligne de code a inserer dans le code source.
je me doute bien qu´il faut utiliser
SDL INIT TIMER ca va de soit mais ce qu´il me manque c´est la ligne qui dit
avion[alterne 2 image a telle fréquence/nb de frame]
Giga-Nova > une formule bien sympa :
tu calcules un "numimage" a chaque frame : ce numéro, ce sera la frame a afficher :
int numimage = (SDL_gettickcount()/T)%N;
nunimage te reneverra un nombre entre 0 et N-1.
(donc joue sur N pour fixer le nombre d´images d´animations)
T définira la vitesse d´animation : si tu mets 1000, l´image changera chaque seconde. Si tu mets 500, chaque demi seconde. D´une façon générale, l´image changera toutes les T millisecondes.
le % te permet de recommencer une fois que tu es arriver au bout.
Exemple, pour N = 3, tu auras la séquence :
0...1...2...0...1...2...0...1 .........
pour N = 5, tu auras la séquence :
0...1...2...3...4...0...1...2........
Bonjour a tous,
j´ai moi aussi un petit probleme : en effet je veux créer un jeu de shoot tout simple (un cureseur qui fait du bruit lorsque l´on clic et un perso a dégomer qui est mobile).
Mais je bloque au niveau des collisions :/
Voila mon code(jai effacé quelques partie donc je sais pourquoi il ne marche pas néanmoins je ne comprend pas pourquoi ma fonction collision ne marche pas:
int Collision(SDL_Surface* a,SDL_Surface* b )
{
if((b->x >= a->x + a->w)
|| (b->x + b->w <= a->x)
|| (b->y >= a->y + a->h)
|| (b->y + b->h) <= a->y
)
return 0;
return 1;
}
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *viseur = NULL,*image = NULL, *texte = NULL;
SDL_Rect position, positionImage;
TTF_Font *police = NULL;
SDL_Color couleurNoire = { 0,0,0};
SDL_Event event;
int continuer = 1;
int TempsPrecedent = 0;
int TempsActuel = 0;
FSOUND_SAMPLE *tir = NULL;
FSOUND_Init(44100,32,0);
tir = FSOUND_Sample_Load(FSOUND_FREE,"gun.wav",0,0,0);
if(tir == NULL)
{
fprintf(stderr,"Erreur de chargement de la musique \n");
exit(EXIT_FAILURE);
}
SDL_Init(SDL_INIT_VIDEO);
TTF_Init();
SDL_ShowCursor(SDL_DISABLE);
ecran = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Gestion du son avec FMOD",NULL);
police = TTF_OpenFont("angelina.ttf", 65); //
Ouverture de la police au début
texte =
TTF_RenderText_Blended(police,"Gagne!!!",couleurNo
ire);
image = IMG_Load("tireur.jpg");
viseur =IMG_Load("viseur.png");
positionImage.x = 0;
positionImage.y = 200;
positionImage.w = 80;
positionImage.h = 104;
while(continuer)
{
SDL_PollEvent (&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONDOWN:
FSOUND_PlaySound(FSOUND_FREE,tir);
break;
case SDL_MOUSEMOTION:
position.x = event.motion.x - (viseur-> w /2);
position.y = event.motion.y - (viseur ->h /2);
position.w = 30;
position.h = 30;
break;
}
TempsActuel = SDL_GetTicks();
if(TempsActuel - TempsPrecedent >30)
{
positionImage.x++;
TempsPrecedent = TempsActuel;
}
else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu´il faut */
{
SDL_Delay(30 - (TempsActuel - TempsPrecedent));
}
if (collision(image,viseur)&& SDL_MOUSEBUTTONUP)
{
position.x =100;
position.y =100;
SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte par-dessus */
}
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format, 255,255,255));
SDL_SetColorKey(image,SDL_SRCCOLORKEY,SDL_MapRGB(i
mage->format,255,255,255));
SDL_BlitSurface(image,NULL,ecran,&positionImage);
SDL_BlitSurface(viseur, NULL, ecran, &position);
SDL_Flip(ecran);
}
SDL_FreeSurface(image);
TTF_CloseFont(police);
TTF_Quit();
SDL_Quit();
FSOUND_Sample_Free(tir);
FSOUND_Close();
return EXIT_SUCCESS;
}
Pour le moment TTf_font ne me sert pas mais je m´en servirait pour affiché si l´on a gagné tt simplement.
Mais pour mes images (2 perso donc 0 et 1)
dois déclarer dans la variable
SDL_Surface *avion = NULL, *avion2 = NULL;
ou SDL_Surface * avion[1] = NULL;
(bien que c´est c la meme chose je ne vois pa pourquoi le 2eme cas ne marche pas
int numimage = (SDL_gettickcount()/500)%1;
numimage ca représente quoi ?
ensuite SDL_INIT_TIMER je pense que ca doit etre mit en le code source. (enfin vu ta fonction c sur)
PAs de réponse sniff .
en fait, un code en deux fonction coller sur un forum au lieu d´un wall, ca ne donne pas tres envie de le lire.
sangohan42 ,
je n´ai pas regardé ton code en détail, de toute façon, je m´y connais pas assez bien en collisions pour pouvoir te dire à l´oeil ce qui est faux. Toutefois, je ne peux que te conseiller de vérifier :
1) si tu n´as pas oublié (ou mal placé) des parenthèses. La priorité des opérations est souvent plus importante qu´on ne le crois.
2)de tester ton algo sur papier en te mettant à la place de l´ordi. Je te conseille de faire ça quand ton ordi est éteint, faire ça en même temps c´est comme si tu code directement, donc ça apporte rien. Enfin, je sais pas si ça t´aidera, moi, c´est comme ça que je teste tous mes algo.
3)(alternative à la 2) : tu prends un crayon, une feuille, et tu imagine un nouvel algo de collision. Quand je dis nouveau, ça veut pas dire qu´il doit être complétement différent de celui que t´as maintenant. Ca peux être le même. Seulement, peut être quand le récrivant tu remarquera un petit détail auquel tu n´avais pas préter attention lors de ta première tentative. Pour que ceci fonctionne, tu ne dois pas avoir ton ancien algo sous les yeux.
En espérant d´avoir un petit peu aidé ![]()
Moi aussi, j´ai une petite question : qu´est-ce qu´une librairie dinamique (.dll) ? Qu´elle est la différence avec un simple fichier Header (.h)?
Une lib tout court (.lib ou .a) : fichier binaire qui contient des fonctions. On l´attache au programme quand on construit l´exe (quand on link).
Une lib dynamique (.dll) : Et bien quand on construit l´exe on lui dit "t´inqueites pas t´auras tes fonctions mais tu les auras quand tu t´executeras" et donc il faut le link sans avoir toutes les fonctions. Il demande des dll au moment de s´executer.
Un fichier .h : et bien c´est juste un fichier texte, qui sert a mettre les entetes de fonctions (et qui genere rien du tout). Donc rien a voir avec les deux precedent elements.
"il fait le link .." et non "il faut".
Oki je vais refaire l´algo je pense. A bientot
Merci Lapintade. Donc les librairie sont déjà compilée ? Et après la compilation du programme qui utilise le .lib, on optient juste un fichier .exe, à la différence du .dll qui restera séparé de l´exe et qui sera appelé au moment ou le programme est lancé. J´ai bien compris ?
Donc je vois une seule utilité aux dll, c´est que tu peux p.e. améliorer un algoritme sans retoucher le programme qui ne fait qu´appeler la fonction.
Maintenant, ma question : comment on fait une DLL ? On code juste un programme où on écrit une suite de fonction (comme un fichier fonction.c par exemple) et on le compile où il y a d´autres étapes ? Je travaille avec DEV c++.
Merci ![]()