[c]Besoin d'aide pour un switch (SDL)
Dernière réponse : dans Programmation
Bonjour
je suis en train d'étudier la librairie SDL sur le sdz mais dans un exercice j'ai un peoblème, mon switch ne fonctionne pas ^^ . le principe du code est d'afficher 3 zozor puis avec une touche on les éfface, pour ce qui est de l'affichage des 3 zozor pas de problème mais des que je met la touche j'ai des erreurs de compilation, j'aimerez savoir si mon switch est bon... et si il n'est pas bon ou est-ce que j'ai faux.
je suis en train d'étudier la librairie SDL sur le sdz mais dans un exercice j'ai un peoblème, mon switch ne fonctionne pas ^^ . le principe du code est d'afficher 3 zozor puis avec une touche on les éfface, pour ce qui est de l'affichage des 3 zozor pas de problème mais des que je met la touche j'ai des erreurs de compilation, j'aimerez savoir si mon switch est bon... et si il n'est pas bon ou est-ce que j'ai faux.
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONUP:
if (event.button.button == SDL_BUTTON_LEFT)
{
positionZozor[0].x = event.button.x;
positionZozor[0].y = event.button.y;
i = 0;
}
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_UP:
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
SDL_Flip(ecran);
break;
}
break;
}
Autres pages sur : besoin aide switch sdl
Lassé par la pub ? Créez un compte
Voila le rapport d'érreur, je précise que je suis sous visual c++ express
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl_video.h(513) : voir la déclaration de 'SDL_FreeSurface'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(91) : error C2371: 'SDL_FreeSurface' : redéfinition ; types de base différents
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl_video.h(513) : voir la déclaration de 'SDL_FreeSurface'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(92) : error C2371: 'SDL_Quit' : redéfinition ; types de base différents
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl.h(86) : voir la déclaration de 'SDL_Quit'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(94) : error C2059: erreur de syntaxe : 'return'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(95) : error C2059: erreur de syntaxe : '}'
et voila le code en entier:
edit: il y avait une erreur de boucle mais le programme ne fonctionne toujours pas, j'ai corrigé la boucle
Citation :
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(90) : error C2371: 'SDL_FreeSurface' : redéfinition ; types de base différents1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl_video.h(513) : voir la déclaration de 'SDL_FreeSurface'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(91) : error C2371: 'SDL_FreeSurface' : redéfinition ; types de base différents
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl_video.h(513) : voir la déclaration de 'SDL_FreeSurface'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(92) : error C2371: 'SDL_Quit' : redéfinition ; types de base différents
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl.h(86) : voir la déclaration de 'SDL_Quit'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(94) : error C2059: erreur de syntaxe : 'return'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(95) : error C2059: erreur de syntaxe : '}'
et voila le code en entier:
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
int main(int argc, char *argv[])
{
int continuer = 1;
long i = 0;
SDL_Surface *ecran = NULL, *zozor = NULL;
SDL_Rect positionZozor[5];
SDL_Init(SDL_INIT_VIDEO);
ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Couleur via clavier", NULL);
zozor = SDL_LoadBMP("zozor.bmp");
SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));
SDL_EnableKeyRepeat(10, 10);
while (continuer)
{
SDL_Event event;
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONUP:
if (event.button.button == SDL_BUTTON_LEFT)
{
positionZozor[0].x = event.button.x;
positionZozor[0].y = event.button.y;
i = 0;
}
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_UP:
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
SDL_Flip(ecran);
break;
}
break;
}
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
SDL_BlitSurface(zozor, NULL, ecran, &positionZozor[0]);
for (i = 0; i <= 2; i++)
{
positionZozor[i+1].x = positionZozor[i].x - 100;
positionZozor[i+1].y = positionZozor[i].y - 100;
SDL_BlitSurface(zozor, NULL, ecran, &positionZozor[i]);
}
SDL_Flip(ecran);
SDL_FreeSurface(ecran);
SDL_FreeSurface(zozor);
SDL_Quit();
return EXIT_SUCCESS;
}
edit: il y avait une erreur de boucle mais le programme ne fonctionne toujours pas, j'ai corrigé la boucle
Normal SDL_WaitEvent reste bloquée en attente d'un évènement. Quand tu appuie sur une touche, tu débloques et tu continues.
Il faut utiliser la technique de SDL_PollEvent() qui n'est pas bloquante, mais il faut gérer les sprites ce qui peut poser d'autres problèmes: http://www.infos-du-net.com/forum/261318-21-problemes
ps: dans la boucle "while" tu n'affiche pas tes "zozors", tu ne les afficheras que lorsque tu quitteras
Il faut utiliser la technique de SDL_PollEvent() qui n'est pas bloquante, mais il faut gérer les sprites ce qui peut poser d'autres problèmes: http://www.infos-du-net.com/forum/261318-21-problemes
ps: dans la boucle "while" tu n'affiche pas tes "zozors", tu ne les afficheras que lorsque tu quitteras
j'ai corrigé un ou deux petit truc pais j'ai encore une question,
comment faire pour éffacer ce qu'il y à l'écran, j'avais pensé faire ca:
# case SDLK_UP:
# SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
# SDL_Flip(ecran);
# break;
le problème est qu'on vois bien que l'écran change puisque les images "clignote" quelques instans mais ca n'éfface pas les zozor
comment faire pour éffacer les zozor ?
comment faire pour éffacer ce qu'il y à l'écran, j'avais pensé faire ca:
# case SDLK_UP:
# SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
# SDL_Flip(ecran);
# break;
le problème est qu'on vois bien que l'écran change puisque les images "clignote" quelques instans mais ca n'éfface pas les zozor
comment faire pour éffacer les zozor ?
En fait avec la SDL, tu travaille en double-buffering, c'est-à-dire que ce que tu mets dans "ecran" ne s'affiche pas à l'écran, mais dans une autre zone de mémoire tampon (que j'appelle buffer). C'est SDL_Flip qui force à afficher ce qu'il y a dans le buffer.
Si l'on affichait les sprites directement à l'écran (ce qui est possible si on gère tout en assembleur par exemple), alors on voit des clignotements dues au rafraichissement de l'écran. Un écran à 60Hz rafraichit tout l'écran 60 fois par seconde. Si on y met un gros sprite au milieu de l'écran et que le rafraichissement est en cours et également au milieu de l'écran, pour une image, on aura le sprite coupé en 2.
Ceci génère des clignotements. Pour éviter ça, le double buffering permet de n'afficher à l'écran que lorsque tout est prêt dedans (en plus on se synchronise avec le balayage pour éviter le clignotement du doube-buffering).
Bref, dans ton exemple, tu fait un SDL_Flip après avoir effacé ton buffer. Donc le buffer vide est affiché à l'écran. Donc ton écran noir devient noir un court instant. C'est ce qui génère ton clignotement.
Le SDL_Flip ne doit se faire que lorsque le buffer contient tout ce qui doit être affiché à l'écran, PAS AVANT (donc, logiquement, on ne devrait voir qu'un seul SDL_Flip dans ton code)
Si l'on affichait les sprites directement à l'écran (ce qui est possible si on gère tout en assembleur par exemple), alors on voit des clignotements dues au rafraichissement de l'écran. Un écran à 60Hz rafraichit tout l'écran 60 fois par seconde. Si on y met un gros sprite au milieu de l'écran et que le rafraichissement est en cours et également au milieu de l'écran, pour une image, on aura le sprite coupé en 2.
Ceci génère des clignotements. Pour éviter ça, le double buffering permet de n'afficher à l'écran que lorsque tout est prêt dedans (en plus on se synchronise avec le balayage pour éviter le clignotement du doube-buffering).
Bref, dans ton exemple, tu fait un SDL_Flip après avoir effacé ton buffer. Donc le buffer vide est affiché à l'écran. Donc ton écran noir devient noir un court instant. C'est ce qui génère ton clignotement.
Le SDL_Flip ne doit se faire que lorsque le buffer contient tout ce qui doit être affiché à l'écran, PAS AVANT (donc, logiquement, on ne devrait voir qu'un seul SDL_Flip dans ton code)
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumClipping sdl
- ForumAide pour configuration vlan de switch d-link
- ForumProbleme sdl
- ForumSdl collisions
- ForumProblème sdl
- ForumAide reseau prive modem routeur switch
- solutionsUbuntu sdl
- ForumAide configuration pc switch box
- ForumAide brancher switch netgear wifi a thomson
- ForumLibrairies sdl
- Voir plus