30

Merci bien. Je l'ai lu hier en effet (j'oublie vite quand je lis des paquets de docs grin). C'est un simple algo bête et méchant.

Mais je crois que j'ai besoin de très simple en fait. Dans le cas d'un jeu de strat tour par tour, il ne se passe rien tant qu'on a pas d'input de l'utilisateur (pas d'animations). Donc au pire on peut juste limiter le fps/nombre d'input avec une simple différence de timer, si l'on part du principe que l'on rafraichit l'écran (si besoin est) après chaque input. Je crois que je vois trop grand, c'est vraiment simple. ^^

31

GoldenCrystal (./28) :
./25 > Le truc c'est qu'un timer n'aura jamais une précision suffisamment bonne pour te permettre d'obtenir un rendu fluide.
Pour avoir un truc fluide, il y a d'autres méthodes, plus simples qu'un timer.
En fait, il suffit de compter le temps dans ta boucle principale. Avec un API précis bien sûr… Il te faut au moins une précision de l'ordre de 10ms, mais si tu peux avoir 1ms c'est encore mieux ^^int lastTime = …; // Obtenir le temps de référence (je suppose qu'on compte en millisecondes dans cet exemple) int newTime; int desiredInterval = 1000 / 60; // Si tu vises 60 FPS while (loop) { do { usleep(1); // Sleep(1) sous Windows… Tu as peut-être même un équivalent portable SDL ? … // Gestion des évènements newTime = …; // Obtenir le temps actuel } while (newTime - lastTime < desiredInterval); // On répète la boucle d'évènements tant qu'on a pas attendu assez newTime += desiredInterval; // On incrémente le temps de référence de la durée d'une frame fixe. … // Rendu }Par contre cet algo ne gère pas le frameskip. C'est pas forcément dur à ajouter, mais tu n'en auras pas besoin au début.
./27 > Et tu as raison !
Un truc qui bloque toutes les autres opérations sur le système même quand il fout rien, c'est ultra chiant…

Le probleme avec cette boucle, c'est que tu va consommer plus de CPU qu'il ne faut..

il vaux mieux partir sur (comme l'indique le siteduzero, meme si je n'ai aps fait comme ça moi ^^) une base de temps, ie 30ms d'attente, de mesurer le temps que la boucle a prise, et mesurer le temps reel de l'attente et au prochain cycle, avec le delta, fait (30ms + delta) etc...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

32

Euh, il me semble qu'on peut faire de l'événementiel pur avec SDL, sans devoir utiliser ce genre de hacks crades.

Et de toute façon, un jeu digne de ce nom est synchronisé avec le refresh de l'écran, et vérifier les événement une fois par frame c'est bien suffisant smile
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

33

Godzil (./31) :
Le probleme avec cette boucle, c'est que tu va consommer plus de CPU qu'il ne faut..
T'auras un peu plus de changements de contexte, mais rien de trop dramatique non plus…
il vaux mieux partir sur (comme l'indique le siteduzero, meme si je n'ai aps fait comme ça moi ^^) une base de temps, ie 30ms d'attente, de mesurer le temps que la boucle a prise, et mesurer le temps reel de l'attente et au prochain cycle, avec le delta, fait (30ms + delta) etc...

Oui mais dans la pratique, le temps que va prendre ta gestion des événements est totalement indéterminé, et on compte des trucs de l'ordre de la milliseconde. 1000 / 30 ça fait déjà que 33 FPS au maximum (donc moins dans la réalité).
Tu ne peux pas te permettre d'attendre trop, ça va détruire le jeu.
Un sleep(0) ça n'épargne pas l'usage du CPU, mais ça permet au système de rester fluide. Un sleep( > 0 ) ça va permettre au système de rester fluide, et peut-être même réduire l'utilisation CPU (si c'est possible).
Pour 60 FPS, t'as que 16,6 ms entre deux images, c'est à dire presque rien. Avec une granularité en millisecondes, tu ne peux clairement pas te permettre de faire joujou avec des durées de sommeil variables.
Je rapelle d'ailleurs que un sleep a pour garantie de dormir au moins la durée indiquée (sauf exception genre le programme se fait tuer, etc.), mais ne te spécifie en aucun cas que tu vas dormir exactement la durée spécifiée. Ça sera toujours supérieur.
En plus, mesurer le temps pris par la boucle est une aberration. Tu ne peux pas prédire combien de temps prendra l'abération suivante. Tu vas ralentir le jeu parce que tu as présumé que la prochaine itération allait prendre que 1ms parce que c'était le cas de la dernière, mais en vrai la suivante va faire 20 ms, donc tu auras attendu en réalité (29+20 = )59 ms… Tu me suis ? En gros y'a une frame qui s'évapore dans la nature, sans aucune raison valable.
S'il y a un truc à ne jamais faire, c'est justement ça.
Au même titre que les timer, les sleep ne sont pas (jamais) une source de temps fiable.

Economiser le CPU oui, mais pas au détriment de la réactivité du jeu.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

34

(faudra que je regarde ça, je suis pas trop d'accord avec l'approche de GC... mais je reviens pas avant ce soir ^^)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

35

Edited_951

36

Orion : pencil !!!!!!!!!!!!!!!!!!!!!!!!!!!
(merde il a édité grin)
edit -> merci pour le truc smile

Zerosquare (./32) :
Euh, il me semble qu'on peut faire de l'événementiel pur avec SDL, sans devoir utiliser ce genre de hacks crades.

Oui, je compte regarder ça de plus près d'ailleurs, pourquoi pas. ^^
Zerosquare (./32) :
Et de toute façon, un jeu digne de ce nom est synchronisé avec le refresh de l'écran

Je ne sais pas si la SDL permet de le faire (ie si on descend assez bas pour le faire à la main). Mais tu peux ouvrir en mode double-beffuring, je suppose qu'il se démerde comme un grand à mettre tes frames à l'écran en fonction de la syncro hw. En tout cas, tu n'as pas le scintillement que tu as si tu flippes tes plans à la main (et c'est géré directement par la CG, donc à mon avis, c'est fait dans les règles de l'art cheeky).
Zerosquare (./32) :
vérifier les événement une fois par frame c'est bien suffisant

Cool.

37

Il suffit d'avoir deux données: l'heure logique du jeu et l'heure réelle.
Genre j'ai fait ma frame, je suis donc à l'heure logique 20 ms (pour du 50 fps). La vraie heure (système) est 2 ms, c'est le temps que le rendu a pris, alors j'attends 18 ms. Peut être que cette attente sera en fait de 30 ms donc on se retrouvera à une horloge réelle de 32. Prochaine frame, l'heure logique sera 40. Même raisonnement: on attend 8 ms, etc.
Ensuite en cas de retard (heure réelle > heure logique) tu peux tenter de faire du frameskip, c'est à dire de sauter les parties lourdes qui n'ont pas d'effet sur le déroulement du jeu lorsqu'elles ne sont pas présentes, comme l'affichage de la prochaine frame. Et ce jusqu'à ce que tu aies rattrapé le retard (heure logique <= heure réelle). En cas de retard trop important (p.ex. déjà skippé plus de 5 frames de suite) tu peux annuler le retard (heure logique = heure réelle) afin d'afficher quand même quelque chose.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

38

Zerosquare (./32) :
Et de toute façon, un jeu digne de ce nom est synchronisé avec le refresh de l'écran, et vérifier les événement une fois par frame c'est bien suffisant smile
Mais mes recherches google ont suggéré que SDL ne permettait pas de gérer le vsync dans tous les cas, donc je n'ai pas proposé cette option, et j'ai montré l'option de la limitation de FPS manuelle.
Mais ce que tu dis est en effet vrai. Si un truc tel que le vsync te permet de gérer la synchronisation de manière fiable, alors c'est tout bénef'. Par contre il faut encore prendre garde à la durée des itérations (des fois que ta boucle d'événements soit trop longue et bouffe un événement vsync au passage)
(D'autre part la synchro verticale est quand même surtout utile pour éliminer le tearing, mais il vaut mieux ne pas trop se reposer dessus car tu ne connais pas forcément la fréquence de rafraîchissement à l'avance)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

39

GoldenCrystal (./33) :
Godzil (./31) :
Le probleme avec cette boucle, c'est que tu va consommer plus de CPU qu'il ne faut..
T'auras un peu plus de changements de contexte, mais rien de trop dramatique non plus…
il vaux mieux partir sur (comme l'indique le siteduzero, meme si je n'ai aps fait comme ça moi ^^) une base de temps, ie 30ms d'attente, de mesurer le temps que la boucle a prise, et mesurer le temps reel de l'attente et au prochain cycle, avec le delta, fait (30ms + delta) etc...

Oui mais dans la pratique, le temps que va prendre ta gestion des événements est totalement indéterminé, et on compte des trucs de l'ordre de la milliseconde. 1000 / 30 ça fait déjà que 33 FPS au maximum (donc moins dans la réalité).
Tu ne peux pas te permettre d'attendre trop, ça va détruire le jeu.
Un sleep(0) ça n'épargne pas l'usage du CPU, mais ça permet au système de rester fluide. Un sleep( > 0 ) ça va permettre au système de rester fluide, et peut-être même réduire l'utilisation CPU (si c'est possible).
Pour 60 FPS, t'as que 16,6 ms entre deux images, c'est à dire presque rien. Avec une granularité en millisecondes, tu ne peux clairement pas te permettre de faire joujou avec des durées de sommeil variables.
Je rapelle d'ailleurs que un sleep a pour garantie de dormir au moins la durée indiquée (sauf exception genre le programme se fait tuer, etc.), mais ne te spécifie en aucun cas que tu vas dormir exactement la durée spécifiée. Ça sera toujours supérieur.
En plus, mesurer le temps pris par la boucle est une aberration. Tu ne peux pas prédire combien de temps prendra l'abération suivante. Tu vas ralentir le jeu parce que tu as présumé que la prochaine itération allait prendre que 1ms parce que c'était le cas de la dernière, mais en vrai la suivante va faire 20 ms, donc tu auras attendu en réalité (29+20 = )59 ms… Tu me suis ? En gros y'a une frame qui s'évapore dans la nature, sans aucune raison valable.
S'il y a un truc à ne jamais faire, c'est justement ça.
Au même titre que les timer, les sleep ne sont pas (jamais) une source de temps fiable.

Economiser le CPU oui, mais pas au détriment de la réactivité du jeu.

La methode que j'ai cité, c'est celle que j'utilise pour TI-NES et a vrai dire je suis a 60FPS stable, tres stable ^^

(et ça permet de prendre en compte le temps d'execution du code)

Et ton delta peux etre négatif comme positif, tout dépend de des durées d'executions
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

40

./39 > Mais a tu testé ton code sur une configuration "limite" au lieu d'un super PC ?
Pour des raisons de consistance, tu dois toujours gérer tous les évènements strictement avant le dessin de l'image (il ne doit pas y avoir de delay entre ces deux opérations). Cela a pour effet que toute action effectuée par l'utilisateur pendant que l'image « x » est à l'écran se reflètera immédiatement sur l'image « x + 1 » (je considère le temps de dessin et d'affichage comme nul pour simplifier). Si tu cases un sleep entre les deux, tu auras des évènements avec un retard d'une image (pas systématiquement, mais la probabilité est élevée).
Donc tu ne peux mettre ton sleep qu'entre le rendu et la gestion des évènements, mais pas dans le sens inverse. Seulement dans ce cas c'est du prédicitf (en fait je n'avais même pas considéré l'autre option… d'où mon post précédent) donc non fiable, et tu peux potentiellement perdre des frames. (voir ce que j'ai écrit avant)
Bien sûr tout ça requiert de tester ton algo sur une configuration inférieure, ce que tu peux simuler justement en casant des sleep avec temps d'attente fixe dans ta boucle de rendu.
C'est clair qu'à 60 FPS, une image c'est un temps « insignifiant », mais quand ton jeu tombe à 11 FPS (c'est pas hors du commun), un retard d'une image, ou des fps perdues en l'air ça devient facilement remarquable par l'utilisateur. (Et c'est horripilant)

(Même chose pour Brunni)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

41

Oui j'ai testé sur des machines plus lentes, et ça ne fait pas ralentir, ni déstabilise le framerate, et heureusement. Ta boucle reviens a ce que je fait en pire en terme de conso CPU
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

42

(vous avez tous les deux la plus grosse embarrassed)

43

Bon, j'ai un problème de compilation, toujours con comme tous mes problèmes...

Mon source :#include <SDL/SDL.h> #include <SDL/SDL_image.h> #include "data.h" void SetCursor(DATA *Data, const char * Filename) { // Free the current cursor if it exists if (Data->CursorSpr != NULL) SDL_FreeSurface(Data->CursorSpr); // Load the new one Data->CursorSpr = IMG_Load(Filename); }

Et il me fait un "unresolved reference to IMG_Load", alors que le proto est bien défini dans include/SDL/SDL_image.h :/* Convenience functions */ extern DECLSPEC SDL_Surface * SDLCALL IMG_Load(const char *file); extern DECLSPEC SDL_Surface * SDLCALL IMG_Load_RW(SDL_RWops *src, int freesrc);

confus

J'ai essayé avec include <SDL_image.h> ou <SDL/SDL_image.h>, même résultat sad

44

Heu, c'est juste pas un problème de compilation…
Tu sais comment fonctionne la chaîne de compilation d'un programme en C pas vrai ?
Là c'est pas un problème du compilateur en tant que tel mais du linker.
Il veut dire « Espèce de gros noob, tu as oublié de me filer une librairie qui contenait cette fonction » ou bien parfois « Hey mec, c'est pas pour dire, mais tu dois pas avoir la bonne version de la librairie parce que je trouve pas la fonction dedans. »
Le compilateur t'aurais dit « Hé patate, je connais pas cette fonction, alors je vais peut être faire de la merde, mais c'est pas mon problème. » (En tout cas fait souvent ça « assuming int parameters » ou un truc du genre )
Bref, c'est un message qui dit qu'il a pas trouvé la fonction. À toi de l'interpréter comme il se doit (ça peut parfois être tordu). En tout cas ça se résout souvent en ajoutant le bon -l<nom_de_la_lib> (genre -lsdl ? Je sais pas si y'a une lib spéciale pour SDL_image… y'en a tellement cheeky ) à la ligne de commande de gcc.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

45

GoldenCrystal (./40) :
(Même chose pour Brunni)

Heu je vois pas le problème. Evidemment que si l'attente < 0 tu ne fais pas de sleep... (encore qu'un sleep(0) ne fait pas de mal mais c'est un autre problème).
Evidemment l'ordre des choses c'est:
[input]
[gestion]
[rendu]
[attente]
Je n'ai pas vraiment réussi à comprendre ce que tu disais (compliqué tongue), mais comme Godzil je ne me fais pas trop de souci pour ma méthode de gestion du frameskip, elle donne les mêmes résultats sur de faibles configs que les meilleurs émulateurs que j'ai vus (et on peut imaginer que leurs impléms sont justement très bonnes car c'est critique pour l'expérience de jeu hehe).
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

46

Plus le [flip] à la fin, après l'attente (c'est ce que je ferais).

Et j'arrive à charger la surface dessinée en mémoire vidéo (donc dans la CG), ce qui permet à SDL de gérer le double buffering en hw. Le pied, j'ai rien fait pour ça, juste passé les bons argumenrs à SetVideoMode() ^^

GC -> Ok, je vais voir ça, merci bien. smile

47

Ok. Dans les options du linker, Codeblocks a foutu tout seul `sdl-config --libs` (j'ai fait "créer un projet SDL au début").
Me reste juste à trouver ce que je dois utiliser pour SDL image.

48

Yeah, j'ai trouvé dans le Makefile d'exemple : -lSDL_image
Juste à rajouter lSDL_image dans les options du projet, et vala. Merci bien Golden. smile

49

Bon, autre question. tongue

Quand on fait des graphismes, on se retrouve vite avec plein de petits fichiers d'images dans tous les sens. Comment faire pour éviter un tel bordel dans lequel l'utilisateur peut d'ailleurs mettre le bazar ?

- Archiver/compresser le tout ? Ca nécessite d'utiliser encore une lib adéquate, portable et portée (et dans mon cas, sous GPL).
- Format de données personnalisé ? Pas de souci en soi, mais ça demande du boulot (pas trop) pour faire la conversion des sprites, et SDL sait charger des images, mais je ne sais pas comment lui faire avaler autre chose (et pas question de hacker le format de quoi que ce soit pour écrire dans des structures SDL, à la sauvage).
- Quoi d'autres ? Il y a une fonction SDL que je n'ai pas vue et qui me donnerait une solution ?

50

Je choisis ta solution 1, et utilise zlib. (M'enfin SDL a là encore peut-être une solution) Rien d'autre à dire.
PS: Intégrer les données à l'éxécutable c'est cool aussi, parce que ça fait qu'un seul fichier, mais ça apporte d'autres problèmes… Donc je ne vais pas te le conseiller tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

51

Ok, merci, je regarde du côté de zlib. smile

52

En principe, la solution propre pour la boucle d'évènements, c'est d'utiliser SDL_WaitEvent à la place de SDL_PollEvent. Cela dit, l'implémentation n'est pas optimale non plus. sad Normalement, il faudrait utiliser des sémaphores ou des attentes de type select pour gérer ça proprement, eux, ils se contentent de bloquer avec SDL_Delay(10); dans une boucle. sad
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

53

Pour tes images:[ul][li]si tes images sont en PNG, elles sont déjà compressées, ce n'est pas très utile d'essayer de les recompresser,[/li][li]la zlib ne fait que la compression, pas l'archivage; il y a minizip qui est livrée avec les sources de zlib et qui gère le ZIP, mais cette lib n'est normalement pas compilée (mais sous Fedora, elle l'est), donc on la retrouve souvent copiée dans les sources. sick (D'ailleurs, un de mes TODOs est d'utiliser la minizip système dans la libcalcfiles.)[/li][li]personnellement, je te conseillerais la libarchive qui gère le format tar, et qui peut aussi être combinée avec des libs de compression comme zlib, libbzip2 ou xz-utils (cette dernière étant la meilleure solution). Cette lib est utilisée entre autres par KDE et GNOME dans leurs archiveurs graphiques et la licence (BSD sans "advertising clause" à la con) est compatible avec la GPL.[/li][/ul]
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

54

Kevin Kofler (./52) :
En principe, la solution propre pour la boucle d'évènements, c'est d'utiliser SDL_WaitEvent à la place de SDL_PollEvent.
Heu excuse moi mais le principe d'un « Wait » quelconque n'est il pas d'attendre que quelque chose se produise ?
Serais-tu en train de supposer qu'un événement doit forcément se produire à chaque frame ? Car si tel est le cas je t'arrête tout de suite: tu rêves.
Le seul cas où une fonction comme ça pourrait être utile, c'est quand le jeu est en pause. Là oui, tu ne veux probablement pas vérifier les événements en boucle, ni redessiner le jeu en permanence. Et encore, y'a plein de jeux ou tu veux qu'il se passe des trucs quand le jeu est en pause (si tu joues en réseau, que tu as un menu de pause avec des animations, etc.)
Cela dit, l'implémentation n'est pas optimale non plus. sad Normalement, il faudrait utiliser des sémaphores ou des attentes de type select pour gérer ça proprement, eux, ils se contentent de bloquer avec SDL_Delay(10); dans une boucle. sad
Peut-être qu'il n'y a pas de façon simple de gérer ça de manière unifiée sur toutes les plate-formes ?
Il me semble que le modèle de fonctionnement entre les plate-formes est assez hétérogène. Et même hétérogène entre Linux A et Linux B (remplacez Linux A et B par n'importe quels assemblages de logiciels type DirectFB, X.org, fbdev, …).

./53 > Ah oui exact, le support des .zip n'est pas directement dans zlib, mais minizip est fourni avec… Erreur de ma part sad
Sinon j'avais oublié mais il y a aussi LZMA SDK oui (Mais il faut bien garder en tête de ne pas utiliser des archives solides pour un jeu par contre ! ZIP ne gère pas ça donc ça évite le problème)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

55

GoldenCrystal (./54) :
Serais-tu en train de supposer qu'un événement doit forcément se produire à chaque frame ? Car si tel est le cas je t'arrête tout de suite: tu rêves.

S'il n'y a aucun autre évènement, il y a l'évènement timer qui dit que c'est l'heure de dessiner un nouveau frame, évidemment! C'est ça l'évènementiel.
Peut-être qu'il n'y a pas de façon simple de gérer ça de manière unifiée sur toutes les plate-formes ?

Évidemment que non, c'est bien pour ça que la lib est censée avoir du code spécifique à la plateforme pour ça! SDL est une lib d'abstraction de plateformes, ils ont plein de code spécifique aux plateformes ailleurs, je ne vois pas pourquoi ils ne l'utilisent pas dans leur boucle d'évènements. Enfin si, je vois: le hack du delay est beaucoup plus simple à coder, mais ça réveille le processus, voire le CPU, pour rien!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

56

Folco (./49) :
Quand on fait des graphismes, on se retrouve vite avec plein de petits fichiers d'images dans tous les sens.

Tu peux aussi regrouper des images dans une seule, que tu découpe toi même plus tard en software.

57

GoldenCrystal (./54) :
Kevin Kofler (./52) :
En principe, la solution propre pour la boucle d'évènements, c'est d'utiliser SDL_WaitEvent à la place de SDL_PollEvent.
Heu excuse moi mais le principe d'un « Wait » quelconque n'est il pas d'attendre que quelque chose se produise ?
Serais-tu en train de supposer qu'un événement doit forcément se produire à chaque frame ? Car si tel est le cas je t'arrête tout de suite: tu rêves. Le seul cas où une fonction comme ça pourrait être utile, c'est quand le jeu est en pause. Là oui, tu ne veux probablement pas vérifier les événements en boucle, ni redessiner le jeu en permanence. Et encore, y'a plein de jeux ou tu veux qu'il se passe des trucs quand le jeu est en pause (si tu joues en réseau, que tu as un menu de pause avec des animations, etc.)


Ce que tu décris est la différence entre SDL_WaitEvent (attente si pas d'évenement) et SDL_PollEvent (pas d'attente).

58

Jyaif (./56) :
Folco (./49) :
Quand on fait des graphismes, on se retrouve vite avec plein de petits fichiers d'images dans tous les sens.

Tu peux aussi regrouper des images dans une seule, que tu découpe toi même plus tard en software.

J'y ai pensé, ça ne me dérange pas de coder ça, mais comment injecter les données récupérées dans des structures SDL (genre Surface) sans hacker ? Il y a une fonction que je n'ai pas vue ?


PpHd -> Tiens, tu utilises la SDL ?

59

Tu peux utiliser SDL_CreateRGBSurface suivi de SDL_BlitSurface.
Au cas ou tu cherche ensuite à gérer la transparence, enchaine avec SDL_SetColorKey.

60

./58: Je lis les doc.