ça n'a rien à voir, mais il est relativement déconseillé d'utiliser une lib C telle que la SDL telle quelle en C++. Il conviendrait idéalement de tout encapsuler dans un wrapper RAII-conform afin de ne pas avoir à t'embêter à te taper l'allocation / libération de tes ressources.
En gros l'idée est de transformer du code tel que :
// Ces fonctions n'existent pas en vrai,
// c'est juste à titre explicatif
// Allocation
SDL_Type *ptr = SDL_Alloc(/* Params */);
if (!ptr) {
// Erreur
}
// Utilisation
const auto return_value = SDL_DoSomethingWith(ptr);
if (return_value != 0) {
// Erreur
}
// Libération
SDL_Free(ptr);
En :
SDL_Type val{}; // Au pire ça lève une exception
val.DoSomething(); // Pareil
// A la fin du scope, val est détruit
Plus simple, non ?
Alors certes, ça demande un peu de boulot à la fin mais le résultat en vaut la chandelle. Si tu veux wrapper ça de manière simpliste, tu peux partir sur std::unique_ptr avec un truc du genre :
template<class T>
using Wrapper = std::unique_ptr<T, void(*)(T*)>;
Et à l'usage :
// Exemple pour SDL_Window
Wrapper<SDL_Window> window{SDL_CreateWindow(/* ... */), SDL_DestroyWindow};
// Exemple pour SDL_Surface
Wrapper<SDL_Surface> surface{SDL_LoadBMP(/* ... */), SDL_FreeSurface};
Emrack c'est super simpa de vouloir m'apprendre des trucs, mais je n'ai clairement pas le niveau pour comprendre la moindre suite de phrase que tu dit :/ , la programmations avec les objets je croix qu'on commence ça en L2, je vais peut être attendre quelques cours avant de m'y penché d'avantage.
Sinon refresh tout le screen fait un léger flash sur l'écran, pas trop dérangeant quand le bloc bouge mais sur ce qui reste immobile c'est moche, je vote pour refresh le nécessaire perso
Donc tu te lance dans un projet complexe avant de savoir programmer ? Pas top :/ Ou bien c'est du C, et tu es venu sur le mauvais forum (et encore, tu devrais comprendre les problèmes d'allocation/libération de ressource si c'est le cas).
Tu ne devrais pas obtenir de flash, je suis désolé de te dire que tu t'y es mal pris.
Tu ne gagneras rien à vouloir rafraichir que l'endroit concerné, les puces sont optimisées pour faire les rafraichissements de tout l'affichage, avec un double-buffering pour lisser tout ça, en voulant gérer ça toi-même tu risque seulement de faire des bêtises qui vont foirer l'affichage.
PS : Tu es bien sur un PC ? Sur de l'embarqué les règles peuvent peut-être être différentes ... mais je doute que tu soit dans ce cas.
Dream on, Dream on, Dream until your dream comes true
Je me pose la question si dans le cas ci-dessous, ne faut-il pas vérifier si le pointeur retourne NULL ?
Car, les fonctions de la SDL en langage C ne peuvent pas lever d'exception. Et unique_ptr ne leve pas non plus d'exception si le pointeur vaut NULL.
Emrak a écrit:
template<class T>
using Wrapper = std::unique_ptr<T, void(*)(T*)>;
Et à l'usage :
// Exemple pour SDL_Window
Wrapper<SDL_Window> window{SDL_CreateWindow(/* ... */), SDL_DestroyWindow};
// Exemple pour SDL_Surface
Wrapper<SDL_Surface> surface{SDL_LoadBMP(/* ... */), SDL_FreeSurface};
Oui sur PC et c++ mais je l'utilise a peu près comme du C.
En effet je n'ai jamais entendu parler de pointeur d'objet, et là il s'agit d'un tetris qui n'utilise que quelques notions de plus que le sokoban, j'ai pas le niveau pour régler le petit flash, mais je peux commencer à voir pour éviter un maximum de refresh sur la surface fixe, c'est le seul truc qui dérange à l'oeuil nu.
Je vous file le code dès que c'est fini pour les plus curieux
Le problème des gros flashs venait des flip, je pensais qu'il fallait absolument le faire avant de libérer la surface ( c a d chaque appel de fonction d'affichage ), mais non donc flash régler
Le problème des gros flashs venait des flip, je pensais qu'il fallait absolument le faire avant de libérer la surface ( c a d chaque appel de fonction d'affichage ), mais non donc flash régler
Tu dois mal gérer les blit et les flip : on fait tous les blit, puis un seul flip.
pour l'instant ça avance ( et sans bug ), juste un peu embêtant de taper toute les rotation une a une, il doit y avoir une solution plus simple , je vous met le code entier bientôt et vous pourrez test par vous même.
Il n'y a pas une seule ligne de C++ dedans cela dit (et c'est tant mieux :)).
Tu es sûr qu'on vous a demandé de réaliser ça en C++ ?
Attention par contre srand(time(NULL)); à faire une seule fois dans ton programme. Bouge ça hors de Block_Creation.
Et tu effectues un chargement de ressources à chaque tour de boucle (pire, à chaque affichage d'un bloc) impliquant lecture disque, il faut à tout prix limiter ça. Charge ton image une bonne fois pour toute (avec gestion des erreurs) et utilises la autant de fois qu'il te faut, puis à la fin du programme décharge là.
Bon ben on a plus qu'à faire déplacer le sujet sur le forum C.
GautierMaurice a écrit:
si tu peux m'indiqué ce que j'aurai pus changer sous format cpp ça serait cool
Presque tout à vrai dire. Je ne sais même pas par quel bout attaquer mais comme ça m'amuse je vais juste tenter une réécriture en imaginant que j'ai déjà un wrapper SDL (je suis pas fou non plus). En tout cas, même en C, ta fonction "block_rotation" est à bannir, elle devrait être 10 fois moins longue.
si tu peux m'indiqué ce que j'aurai pus changer sous format cpp ça serait cool
En C++, le premier truc à faire est de penser en terme de classes ou structures, et de services qu'elles doivent rendrepour communiquer et interragir entre-elles.
Tu pourras envoyer ton code une fois finis ksass ?
Scorbutic, par chargé l'image tu entend dire sauvegarder le quadrillage et un bloc blanc une bonne fois pour toute dans la structure board par exemple, et n'utiliser que ça dans les fonctions "graphique", puis décharger à la fin du prog, ou autre chose ?
Ksass, pour la fonction bloc rotation, je ne vois pas trop quoi faire pour l'optimisé.
Ca je pourrais le mettre qu'une seule fois à la fin, mais certaines ressemblance comme ceci :
case 0:
block_test[0].hauteur++;
block_test[0].largeur++;
block_test[2].hauteur++;
block_test[2].largeur--;
block_test[3].largeur-=2;
break;
case 1:
block_test[0].hauteur--;
block_test[0].largeur--;
block_test[2].hauteur--;
block_test[2].largeur++;
block_test[3].largeur+=2;
break;
pour les "fusionner".. la solution ne me tape pas dans l'oeuil, après peut être faire intervenir les cosinus, sur chaque case du bloc qui doit bouger, les faire tourner de PI/2 autour du bloc central, arrondir pour avoir la bonne position et la sauvegarder si pas de collision. Mais ça a l'air chaud vu comme ça:/
Pour ta fonction de rotation, tu pourrais créer une fonction , puis par un peu de calculs savants faire une rotation qui pourrait coller à chacune de tes pièces.
Par exemple, en y pensant un peu, on se rend compte que chacune des pièces peut rentrer dans un bloc de 4*4 cases, du coup tu pourrais appliquer cette rotation au bloc de 4*4 cases...
Si je m'explique mal, mes excuses, je vois la représentation dans ma tête mais mes doigts n'arrivent pas à l'exprimer
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Si vous ne trouvez plus rien, cherchez autre chose.
Cours de C++ moderne
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html