MSX Village forum

La Place des Développeurs Mes outils de développement

aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2753

Le 13/02/2011 à 13h28
Je vais archiver ici les outils PC que j'ai créé pour mon développement sur MSX.

Trigo



Desc. : Programme DOS permettant de créer des tables de pré-calcul trigonométrique (cos, sin, tan, acos, etc.). Sortie sous forme de structure au format C.
Download : trigo v1.2.
Usage :
Code TEXT :
Usage: trigo.exe [options] [tables]
Options:
   -num     x   Entries number
   -shift   x   Shift value
   -bytes   x   Bytes number
   -help        This help
Tables:
   sin          Sinus table
   cos          Cosinus table
   tan          Tangente table
   asin         Arc-sinus table
   acos         Arc-cosinus table
   atan         Arc-tangente table
   proj         Projection matrices (for 3d to 2d vector transformation)
   rot          Rotation angle
   sqrt         Square-root table

Exemple : Créer des tables de cosinus et sinus de 64 entrées sur 2 bytes (WORD) et avec un shift de 8 (valeurs multipliées par 256) et les copier dans le fichier trigo64.inc :
Code TEXT :
trigo.exe -num 64 -shift 8 -bytes 2 sin cos > trigo64.inc


MSXImage



Desc. : Converti tout ou partie d'une image en une table de donnée au format MSX. En entrée, le programme accepte les fichiers 8/16/24/32 bits au format BMP, ICO, JPEG, LBM, IFF, PCX, PNG, TARGA, TIFF, PSD, GIF, et d'autres. En sortie, le programme support actuellement le 8 bits (pour le mode 8) et le 1 bit (pour les sprites ou données compressées). Exporte des structures au format C.
Download : MSXImage v1.2
Usage :
Code TEXT :
Usage: MSXImage.exe [options]
Options:
   -in      file    Inuput file name
   -pos     x   y   Start position
   -size    x   y   Width/height of the block to export
   -num     x   y   Number of block to export
   -out     file    Export file name
   -color   n       Number of color (now support 256 and 2)
   -trans   col     Transparency color (in RGB 24 bits format)
   -name    name    Name of the structure to export

Exemple : Créer une table de sprites contenant 16 blocs de 13x11 pixels à partir de la position (0,33) du fichier sprt_cars.png avec une couleur de transparence de E300E3h :
Code TEXT :
MSXImage.exe -in sprt_cars.png -out sprt_car_4.h  -pos 0 33 -size 13 11 -num 16 1 -name car4 -trans 0xE300E3



Divers



Edité par aoineko Le 11/04/2011 à 21h45


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2753

Le 13/02/2011 à 13h36
Pour l'instant, ces outils exportent des données sous forme de fichier d'entête (header) pour le langage C. Si cela peut être utile à quelqu'un, je peux ajouter une option pour exporter les données sous forme de fichier utilisable depuis l'assembleur (ou un autre langage).


On est toujours ignorant avant de savoir.
Github    
Walter Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 02/10/2009 à 19h33

Messages: 1883

Le 13/02/2011 à 17h38
Excellente initiative aoineko ! :top
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2753

Le 17/02/2011 à 00h33
Passage du tool Trigo en version 1.2 avec l'ajout de la génération des tables de racine-carrées.


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2753

Le 11/04/2011 à 21h42
Ajout d'un p'tit script PHP pour gérer les couleurs du mode 8 (http://noechan.free.fr/msx/msx_color.php).


On est toujours ignorant avant de savoir.
Github    
Visiteur

Vagabond

Rang

Avatar

Message : 0

Le 13/04/2011 à 22h43
Pourquoi ne pas avoir fait tes deux générateurs en Lua ?

Je dis Lua, mais ça aurait pu être Python. Je préfère Lua, et comme c'est très répandu chez les devs dans le jeu video, je suppose que tu connais.
C'est tout à fait adapté à de la génération de données, beaucoup plus que le C d'ailleurs.
Et en plus, les gens sous un autre OS que MS-Windows peuvent en profiter (tu aurais pu mettre tes sources avec le binaire).

Tu peux faire un truc comme ça:

Code :


#!/usr/bin/env lua

local m = require "math"

-- extraction des paramètres de la ligne de commande
function parse_cmdline()
 local cmd = {}
 local sep = ""
 for k,v in ipairs(arg) do
    if string.find(v,"-") then 
       cmd_k = string.match (v, "(%a+)")
       cmd[cmd_k]=""  
    else 
       cmd [cmd_k] = cmd [cmd_k] .. sep .. v
       sep=";"
    end
 end

  return cmd
end


-- construction d'une table de sinus (unité: degrés)
m.sind = function(s,e)
          local t_sin={}
          for i=s,e do t_sin[i] = m.sin(m.rad(i)) end
          return t_sin
         end

         
-- extraction des nombres d'une chaine         
function extract_numbers(str)
   local t={}
   for n in str:gmatch("%d+") do
      t[#t+1] = n
   end
   return t
end


function print_range(t, s,e)
  if (s==nil) then s=0 end
  if (e==nil) then e=s end

  for i=s, e do print (t[i]) end

end


-- les fonctions exécutées d'après le parsing de la ligne de commande
fx = {
   sin = function(params)
            local t_sin=m.sind(0,360)
            local t_p = extract_numbers(params)
            print_range (t_sin, t_p[1],t_p[2])
         end,
   cos = function(params)
            local t_sin=m.sind(90,450)
            local t_p = extract_numbers(params)
            print_range (t_sin, t_p[1]+90,t_p[2]+90)
          end
}


local cmd = parse_cmdline()


for k,v in pairs(cmd) do
    if ( fx[k] ) then
      fx[k](v) 
   else
      io.write (string.format("pas de fonction définie pour %s(%s) dans fx{}n",k,v))
   end
end



Quelques remarques:

Par mesure de sécurité, on ne peut appeller que les fonctions de la table fx.
Les vrais mecs utiliseraient l'environnement global (_G), mais c'est très dangereux, car on peut virtuellement faire exécuter n'importe quoi au script (même plus besoin de se fader un buffer overflow pour récupérer ton ~/.ssh :p )

Les ordres doivent être préfixés d'au moins un tiret.
Les paramètres ont un séparateur libre (espace, virgule, point virgule, arobase... mais attention quand même aux caractères interprétés par le shell).

ex: ./foo -cos 10,20

ou encore: ./foo --cos 10 20

Par curiosité, je serais curieux de voir ce que ça donnait en C.
Surement pas 70 lignes de code :)

Concernant ton convertisseur d'images, j'aurais écrit un plugin pour ImageMagick, ce qui permet de centraliser et d'étendre ses tools. Edité par Visiteur Le 13/04/2011 à 22h49
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2753

Le 13/04/2011 à 23h01
Venom :
Pourquoi ne pas avoir fait tes deux générateurs en Lua ?




J'aime beaucoup Lua, mais je ne m'en sert que pour scripter des comportements simple à l'intérieur d'un programme complexe. Le meilleur exemple est l'IA dans les jeux ; je faire en Lua permet une approche beaucoup plus souple.



Ceci dit, en C++, c'est très rapide à faire et à s'exécuter ; tout ce que je demande à un tool. ^^



Tu peux assouvir ta curiosité par ici. Ca fait plus de 70 lignes, mais c'est surtout parce que j'ai beaucoup de type de table à gérer. :)



Pour mon tool de sprite, j'utilise FreeImage ; c'est OpenSource et ça contient toutes les fonctionnalités dont j'ai besoin. Je connaissais pas ImageMagick ; j'y regarderai de plus prêt tantôt.


On est toujours ignorant avant de savoir.
Github    
Visiteur

Vagabond

Rang

Avatar

Message : 0

Le 14/04/2011 à 01h03
Rien à redire sur ton code C qui fait ce qu'il doit faire dans les limites imparties du langage :)

Ah si, PI est défini dans math.h :) (M_PI)

C'est pour ça que j'aime bien Lua, ça m'évite d'écrire des trucs comme ça:

Code :


const char* ARGV[] = { "", "-num", "1024", "-shift", "3", "-bytes", "1", "sqrt" };
const int ARGC = sizeof(ARGV)/sizeof(ARGV[0]);



qui ne rendent pas la lecture du code agréable
(écrire #ARGV est quand même plus sympathique pour avoir le nombre d'élements).

Ce qui est dommage, c'est que le C++ n'ai pas amélioré les choses de ce côté (peut être voir dans boost, que je ne connais pas).

D'ailleurs, la preuve que le C++ n'est pas si simple, c'est que tout le monde continue à formater ses streams à coup de printf. Normalement, on devrait utiliser les manipulateurs de flux (personne ne le fait, il y a des bouquins entiers consacrés au sujet, preuve que c'est pas facile).

Comme Lua est rapide et permet d'étendre facilement le C, j'ai tendance à l'utiliser de plus en plus dans mon boulot (la gestion) et mes loisirs. Au début, je l'utilisais comme sidekick du shell, puis je l'ai rapidement évolué dans le prototypage.

Si ça t'intéresse, j'ai un peu de code Lua pour controler OpenMSX via un socket Unix (facilement adaptable pour un socket TCP/IP je pense). Ce que j'ai fait permet d'envoyer des commandes dans le basic du MSX, ce qui facilite les "def usr + bload" à répétition par exemple (ou toute opération dans le basic, pour lancer un programme à tester via l'émulation). J'avais commencé ça pour faire un front-end pour le debugger intégré de OpenMSX, puis j'ai arrêté par manque de temps et de motivation.

J'aime bien le C et le C++, et je n'ai jamais rien trouvé pour les remplacer vraiment (je me suis un peu intéressé aux langages fonctionnels, et j'y reviendrais peut être un jour, mais ce n'est plus la même chose).
Lua est un bon compromis pour moi.

Quand tu parles de IA dans les jeux avec Lua, tu parles d'une machine à états ? Vu que Lua optimise les retours en récursion terminale, c'est le premier exemple qui me vienne à l'esprit (d'ailleurs il y a un exemple dans "programming in lua" avec une machine à états qui représente un petit jeu de labyrinthe, dans un programme récursif terminal).

Je ne sais pas si c'est porté sous console, mais LuaJIT est très impressionant en terme de vitesse. Déja que Lua fume la concurrence, LuaJIT enfonce sévèrement le clou :)
Tu auras compris que je suis un grand fan de Lua, et que je ne manque pas une occasion de faire la promotion de ce langage qui souffre de son image "utilisé uniquement dans le jeu video". C'est une vision réductrice de ses possiblités, et par exemple j'ai toujours été dégouté que Blender utilise Python pour son API, plutôt que Lua. Enfin, Lua commence un peu à sortir de son écosystème, il était temps!

Si tu as 5mn, ça serait sympa de passer sur la ML de Lua (tu peux passer par gmane.org pour poster rapidement) et de donner quelques titres récents qui utilisent Lua.
Je pense que ça leur ferait plaisir, car une liste de jeux utilisant Lua a été commencée sur la ML.

Bon courage pour la suite, et n'oublie pas de jeter un coup d'oeil sur ImageMagick. C'est une usine à gaz, mais hyper puissante. Il vaut mieux passer par les tutos de Anthony Thyssen pour se mettre à pied d'oeuvre, sinon c'est décourageant ( http://www.imagemagick.org/Usage/ ) Edité par Visiteur Le 14/04/2011 à 01h07
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2753

Le 14/04/2011 à 15h01
Le dernier jeu utilisant Lua que j'ai fait était The Last Story. Je sais pas si j'aurai le temps de visiter la ML ou de m'initier ImageMagick, mais merci pour toutes ces infos. :)


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie