Création d'un RPG
Posté le 16/12/2017 19:56
Bonjour à toutes et à tous,
Si je poste ce topic aujourd'hui, c'est parce qu'il y a depuis quelques temps déjà, j'ai eu l'envie de créer un jeu style Goblins sur Casio pour ceux qui connaissent.. La programmation du jeu n'est pas un soucis. Là où je rencontre des problèmes, c'est pour afficher mes images (maps, ennemis ...). Plusieurs alternatives s'offraient à moi. Entre autre : coder des sprites comme me l'a gentiment suggéré Zezombye (merci à toi), puis les afficher en super Drawstat. En soit ce n'est pas une mauvaise idée mais je ne trouves pas l'intérêt de coder des sprites que je n'utiliserais qu'une seule fois. En fait, j'aimerais, dans l'absolu, coder toute la map en drawstat, super drawstat ou multidrawstat. Peut-être que le problème vous apparaîtra plus clairement en jetant un coup d'oeil au fichier joint. C'est une des maps en question. Le problème c'est que coder cette map manuellement en draw star prendrait beaucoup de temps, il y a surement une meilleure solution. Si vous avez une idée, je vous prie de me la donner en commentaire.
Merci à tout ceux et celles qui auront pris le temps de lire cette petite question et; si possible, d'y répondre.
Fichier joint
Citer : Posté le 16/12/2017 20:28 | #
Non seulement ça te prendrait du temps, mais ça prendrait aussi du temps pour l'afficher (pour ça que je n'ai pas implémenté le PNG->drawstat dans BIDE, il n'y a pas de raison de l'utiliser).
Dans ce cas il faut l'encoder sous forme de picture, comme ça ta map est affichée instantanément.
Par défaut, les pictures prennent 2048 octets, mais il y a moyen de diviser par 2 la taille dans BIDE en mettant #Size: 0x400 au lieu de 0x800. Attention, il faudra l'afficher avec BG-Pict au lieu de RclPict. Du coup, il faut compter 1 ko par picture.
Après si tu as beaucoup de maps il faudra faire un compromis. Un bon exemple de RPG en basic est Zelda de Remiweb, qui utilise un mix de pictures et de sprites. Par exemple ici le contour de la maison, assez complexe, est stocké dans une picture, tandis que le reste est dessiné en super drawstat.
Pour pouvoir mieux t'aider il faudrait que tu montres d'autres maps : vas-tu réutiliser les sprites des maisons, des panneaux, l'encadrage, etc ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 18/12/2017 19:05 | # | Fichier joint
Merci pour ta réponse,
Je n'ai pas encore réalisé les autre maps mais elle seront dans le même genre que la première. Ça ne me dérange pas d'utiliser les pictures si elles sont réduite à 1k car il n'y aura pas beaucoup de maps.
Ci-joint, un des ennemis du jeu. Par contre là j'imagine qu'il va falloir utiliser le drawstat ?
Citer : Posté le 18/12/2017 20:06 | #
Tu ne peux pas réduire impunément toutes les Picture à 1024 octets ; ça va te poser des problèmes du genre afficher deux Picture en même temps lorsque tu appelles RclPict.
Pour les ennemis, un Super DrawStat est classiquement l'option privilégiée : ils sont trop nombreux pour tenir dans des Picture, à la fois en termes de nombre de fichiers (au plus 20) et d'espace mémoire.
Citer : Posté le 18/12/2017 20:12 | #
Des problèmes ? Peux tu m'en dire un peu plus ? Et sinon sais tu comment je peux convertir l'ennemi en Super DrawStat ?
Citer : Posté le 18/12/2017 20:18 | #
C'est pas compliqué ; RclPict affiche 2048 octets en deux images. Si tes Picture font 1024 octets, il va t'en afficher deux superposées. À la base c'est prévu pour afficher un « fond » en-dessous de l'image ; peut-être quelque chose lié au Background mais j'ai des doutes. Je crois que c'est toujours un rectangle blanc.
La « conversion » des images en Super DrawStat est une opération réellement compliquée du point de vue algorithmique. Il n'y a que des heuristiques et elles ne sont pas forcément très performantes. Peut-être que BIDE le gère ; il n'y a pas de solution miracle. Le Sprite Coder a peut-être su faire, mais je ne sais pas s'il est encore en service...
Edit : Je lis mes MP et le forum avec le même niveau de détail ; je ne peux pas physiquement répondre plus vite par l'un que sur l'autre !
Citer : Posté le 18/12/2017 20:23 | #
Excuse moi pour le MP, je suis un peu trop impatient Du coup si j'ai bien compris, pour convertir une image en Super DrawStat, je dois le faire manuellement ?
Citer : Posté le 18/12/2017 20:26 | #
C'est la façon d'obtenir le meilleur résultat. Mais pour des sprites de la taille que tu manipules pour tes ennemis, tu vas y passer un temps fou.
Pour l'instant, attends de voir si d'autres membres ont des solutions applicables. Je ne code quasiment jamais en Basic donc je ne suis pas bien placé pour tenir un propos autre que général ; peut-être que tu peux trouver une automatisation de la conversion qui t'économisera bien du boulot.
Citer : Posté le 18/12/2017 20:32 | #
J'ai tenté mais comme tu l'as souligné l'algorithme est très compliqué. J'avais essayé de traduire déjà l'image en points stockés dans des listes puis de parcourir ces listes pour savoir si la liste de points est une ligne horizontale (donc, si l'abscisse qui vient = l'abscisse précédente + 1 && ordonnée suivante = ordonnée précédente). J'ai fais ça pour les lignes verticales mais il faut aussi le faire pour les lignes obliques et c'est là que ça se corse réellement.
Merci tout de même pour ta réponse, je vais suivre tes conseils et attendre
Citer : Posté le 18/12/2017 20:37 | #
Je vais essayer de me pencher sur le problème d'algorithmique pour voir si je peux trouver une idée implémentable. Enfin c'est pas dit que je vais trouver quelque chose...
Ajouté le 18/12/2017 à 20:51 :
Bon, après avoir regardé le problème pendant, euh... 8 minutes, ce qui risque de se produire c'est que :
- Décider s'il existe une liste permettant de représenter la figure en au plus k lignes (pour k donné) pourrait être NP-complet ;
- Trouver la combinaison optimale pourraît NP-difficile (voire pas du tout dans NP).
Ce n'est pas garanti, mais c'est possible. Je vais voir si j'arrive à faire une réduction correcte.
Grosso modo, ça voudrait dire que vous ne pourriez pas trouver d'algorithme qui permettre de calculer quoi que ce soit au sujet de ce problème en un temps raisonnable (ie. polynomial en la surface de l'image).
La bonne nouvelle, c'est qu'on a peut-être des supers heuristiques toute cuites qui vont nous tomber dessus.
Citer : Posté le 18/12/2017 20:58 | #
Merci de te pencher sur ce problème,
Effectivement trouver une combi optimale relève presque de l'impossible, même manuellement ça me parait très très compliqué à vue d'oeil. En tout cas je te souhaite bon courage si tu tentes de percer le problème ^^. Si tu y arrives, je pense que tout programmeur Basic t'en sera éternellement reconnaissant (moi le premier)
Citer : Posté le 19/12/2017 08:11 | #
Bof, perso tu passerais moins de temps à faire le sprite manuellement qu'à attendre qu'on te sorte un algo D'ailleurs, ce sprite tu as bien dû le faire (sous paint ou autre), du coup ça te prendrait à peu près autant de temps de le faire avec le générateur de multi drawstat.
Tu pourrais à la limite stocker cet ennemi sur une picture, ça dépend si ton RPG est comme dans pokémon où il y a plein de sprites d'ennemis (dans ce cas non), ou si c'est juste l'un des 2-3 boss (dans ce cas oui). Il faut noter qu'il y a moyen de compresser l'espace non utilisé en bas des pictures, dans ton cas l'ennemi est sur la moitié haute donc tu peux réduire la taille (pour être plus précis, ça fait 0x10 octets/ligne, la dernière ligne occupée est la 35e -> 0x220 pour la taille).
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 19/12/2017 18:19 | #
Merci beaucoup pour ta réponse,
Le jeu comportera une petite dizaine d'ennemis donc on va devoir oublier pour les pictures. La meilleure alternative comme tu l'as souligné c'est de tout simplement dessiner le sprite directement sur Bide pour qu'il puisse le convertir en Multi DrawStat. Ca va être un peu long de redessiner tous les ennemis par contre :/