ils ne proposent aucun terminaux,
j'ai pas du être clair, je voulais parler d'un IDE comme l'a dit FlyingPhantom01 juste ensuite.
Aller plus loin ? (dans quel sens ?)
Tu peux installer des librairies extérieures, genre opengl, sdl, sfml, etc !
Suffit de chercher. (en précisant bien "ruby" dans la recherche, parce que c'est des bindings qui sont faits en général par des tiers)
![]()
Aller plus loin c'est à dire, j'aimerai pouvoir créer un fichier .exe qui puisse lire mes programmes.
Je suis en train d'apprendre à me servir du langage comme un fou, mais j'aimerai comprendre comment faire afficher des images, plutot que de me répondre des phrases ou des chiffres sur l'invite de commande et noir et blanc.
Je regarde aux script de base de RPG Maker XP en parallèle. J'aimerai savoir comment on crée des fichiers sauvegardes si je veux faire un RPG.
Pour l'instant j'ai surtout fait beaucoup de hachage pour répertorier les donnés du jeu. (Item, Compétence, Stats de base des personnages) Pour le jeu, il faut bien faire une copie des stats des personnages (qui sont des hachages) et les faire évoluer non ?
Et je ne comprends rien de ce que tu appeles librairies OpenGL... A quoi elles servent ?
J'ai pas compris non plus la différence entre les variables d'instances, de classes et d'objets. Pour moi elles font exactement la même chose que l'on met un $, un @ ou rien.
huum,
il y a un petit problème sur ce que tu attend d'un langage.
Un langage n'est qu'un outil, un moyen, d'exprimer un algorithme.
Ce n'est que le support de la créativité du programmeur, pas plus.
Une API (Application Programming Interface), est un ensemble de fonctions et de classes (ou objets), de plus ou moins haut niveau, qui te permet d'utiliser certaines primitives sans avoir à les ré-écrire toi même (afin d'éviter de ré-inventer la roue).
Par exemple, si tu as un tout petit peu programmé en C++ tu as du rencontrer la STL : la librairie standard du langage.
Cette API te permettait d'utiliser des fonctions telles que "cout" et "cin" que tu n'avais pas préalablement définie.
Toi tu veux faire un jeu 2D, donc les primitives dont tu vas avoir besoin sont "charger ce sprite", "le blit à la position P", "charger texture tropbelle.jpg", etc...
Cella d'évitera de coder des fonctions de très très bas niveau que tu aurais de toute facon beaucoup de mal à écrire.
Alors, OpenGl est une librairie graphique 2D/3D qui permet de faire ce genre de choses là (et beaucoup plus).
Un dernier mot concernant ta formation :
<
mais j'aimerai comprendre comment faire afficher des images, plutôt que de me répondre des phrases ou des chiffres sur l'invite de commande et noir et blanc.
il est indispensable de s'exercer sur de petits problemes simples avant de vouloir coder de la 2D.
Tu ne pourras pas te débrouiller tout seul tant que tu n'auras pas fait l'effort de faire des trucs moches et bêtes avec la console.
Ceci te permettra d'acquérir la base de la syntaxe, et des concepts fondamentaux du langage.
-----
Ensuite, les variables (bien que tu puisse trouver ceci sur le net)
Une variable c'est une variable, certes.
Concrètement c'est un nom auquel on va associer une valeur.
.Une variable globale est accessible par toute la source.
.Une variable locale n'existe que respectivement à une portée (un endroit bien précis où elle existe : une fonction, une boucle, etc...)
.Une variable d'objet est une donnée membre d'un objet.
Si Personnage contient (entier)age et (flottant)poids, age et poids sont des variables de l'objet Personnage.
Voila, je ne peux pour finir que te conseiller de bien bien t'intéresser au langage en lui meme avant de vouloir partir sur des choses plus complexes.
Bon courage, et bon apprentissage.
Je me suis déjà tapé plus de 100 pages de tutoriels répertorié un peu partout sur internet. Et à chaque fois c'est toujours les mêmes trucs qu'on me demande de faire. class, def, while, for, if, yield, each do. Je pense que je maitrise déjà tout ces trucs là, c'est pas bien compliqué. Maintenant j'aimerai bien avoir un tuto qui m'explique comment créer quelque chose de concret, et puis aussi où se procurer OpenGL.
Ce qui est vraiment différent avec RPGMakerXP, c'est que sur RMXP on pouvait créer des scripts (en langage ruby) à la volée, elles forment un tout. Ici, il est clair que je ne peux pas créer 2 fichier.rb différent, l'une faisant appel à l'autre sans qu'il y ait des non-reconnaissance de variable.
Bon, j'ai commencé a taper quelque chose, ça donne déjà ça :
http://img181.imageshack.us/my.php?image=sanstitre1pn5.gif
Je te conseillerait aussi de ne pas essayer de faire de graphismes trop tot.
Si tu veux developper un rpg, peut etre peux tu commencer par faire ton systeme de combat complet en mode terminal. C'est deja un exercice non trivial et interessant d'un point de vue du developpement comme de point de vue de la conception de systeme de jeu.
Euh, pour un système de combat à la Grandia, ça va être dur de ne l'écrire qu'en terminale. Je vais m'amuser à repérer les perso par rapport aux monstres grace à leur coordonné XY...
Je ne connais même pas la commande require...
Si j'ai bien compris à propos des variables
@ est une variable qui n'existe que dans la classe ? Il peut y en avoir autant de variable du même nom à valeur différente que je crée de classe ?
$ c'est une variable qui marche partout ?
Et j'ai remarqué que dans les tuto ils invoquent d'abord une variable genre @var, et ensuite ils n'utilisent plus que var.
$globale
@instance
@@classe
normale
Constante
:symbole (à mi-chemin entre type et genre)
La constante est la variable que tu ne peux pas changer (en théorie), mais qui reste valide dans tout le fichier. Elle est très utile en tant que "flag" (genre "if commande==ATTAQUER" plutôt que prendre une string qui prend de la mémoire ; quoique les symboles vont bien pour ça aussi)
Le nom d'une classe/module est d'ailleurs une constante (commence par majuscule) ; la méthode commence sans exception par une minuscule.
La variable normale se détruit à la fin à la fin d'une méthode.
La variable de classe est globale dans la classe. Par exemple, si tu as deux classes chien et chat, et que tu veux définir le nombre de pattes des chiens (sans perdre inutiliement de la mémoire), tu fais une variable de classe égale à 4 ; seules les instances de cette classe pourront modifier celle-ci. Aussi, la variable est valide jusqu'à la fin du programme (et tu peux la prendre d'un autre fichier, si tu y as inclus la classe la contenant).
La variable d'instance est la variable sans conteste la plus utile : chaque instance d'une classe aura sa valeur pour une variable du même nom pour chaque instance. Par exemple, si on veut faire un système de particules, et qu'on met à l'initialisation que @x=rand(5), on aura pour 5 instances de la classe, 5 valeurs pas obligatoirement les mêmes (ici dû au rand()) ; on peut y accéder avec des accesseurs depuis l'extérieur, et alors avoir un rôle encore plus important ; exemple :
for i in instances
print i.x
end
Qui nous affichera par exemple "14022".
Cette variable est valable dans toute l'instance, donc. (et est détruite lors de la destruction de l'instance).
Il y a les variables globales, qui sont valables pendant tout le programme (jusqu'à la fin de l'exécution), et si tu utilises un autre fichier, elle existe alors depuis celui-ci.
Enfin, tu as les symboles, qui sont déjà plus spéciaux :
- En général, c'est une sorte de string : beaucoup de méthodes similaires, mais tous les symboles :symbol auront la même id, de même pour tous les :chiens et :chats.
- On peut aussi citer une convention : lors de la création d'accesseurs, on met un symbole pour donner le nom de la variable d'instance qu'on veut. Exemple :
attr_accessor :accesseur
attr_reader :reader1,:reader2
attr_writer :writer
class Machin
def initialize(*params)
@params=params
@accesseur=@reader1=@reader2=@writer=0
end
def params=(p)
@params=p
end
def params?
return @params
end
end
On vient, si tu l'as remarqué, de créer une sorte d'accesseur pour @params, mais en beaucoup plus long à écrire.
![]()
Merci, c'est à peu près ce que je me suis dis là dessus. Mais comme je ne sais pas encore utiliser plusieurs fichiers...
Est-ce qu'il existe une commande pour tester l'appartenance d'un objet à un tableau ? Genre pour tester si 1 appartient à [1,2,3]... Où faut t-il taper la fonction nous-même ?
Sinon il y a un truc qui me tracasse, c'est si Ruby sait détruire des objets ou non. Parce qu'il faudrait bien le faire pour les objets et les ennemis (dans le jeu). Pour les objets, je peux seulement me contenter de donner un nom, des caractéristiques, et un nombre qui correspond au nombre dans l'inventaire (0 quand on en a pas). Mais ce système ne marchera pas pour les monstres car on peut très bien avoir plusieurs monstres identiques dans un même combat.
Donc je me demande si ce serait intelligent de créer une liste qui correspondrait à la liste des ennemis, puis les détruires une fois le combat terminé avec delete ? Si c'est le cas j'en ferai autant pour les objets.
Crée une classe Ennemi pour les ennemis en eux-mêmes, puis une classe Ennemis qui aurait une méthode delete() pour effacer des objets de la classe Ennemi.
Sinon, je te renvoie sur la doc de Ruby pour toutes les méthodes de chaque type de variables. Tu devrais l'avoir sur ton ordi.
(dans ton cas, c'est la méthode "include?()" d'Array qui permet de tester)
![]()
Merci beaucoup pour ces infos.
Encore une question (je suis chiant) : je voudrais savoir si quelles sont les fonctions à utiliser plutôt que d'autre pour améliorer la demande en mémoire. J'utilise souvent attr_accessor, et j'ai l'impression que cette fonction permet vraiment de tout faire. Il y a t-il un intérêt en terme de mémoire d'utiliser attr_reader au lieu de accessor quand on peut s'en passer ?
Ces fonctions en font pas de gain de mémoire à proprement parler ; à la base, c'est plutôt pour éviter qu'on modifie des valeurs depuis l'extérieur (rendre la variable "privée").
Dans un petit programme, on en voit pas trop l'intérêt, mais quand il devient plus conséquent, c'est bien d'être sûr du comportement des variables. Le Ruby offre cette possibilité, mais quand je programme en Python, par exemple, on a jamais cette protection, et ça peut devenir catastrophique. (imagine que la variable contrôlant la boucle principale est modifiée...
)
![]()
Mais je voudrais savoir si c'est vraiment bien de ma part de créer autant de classe ?
Je n'ai pour l'instant que la class Characters qui a des méthodes interressante : add_item, remove_item, (remarque : chaque perso dans le jeu a un inventaire personnel), equips etc... Mais les autres classes, comme Item, Skill n'ont rien d'autre que def initialize et tout un paquet de attr_accessor. Ca ne gène pas non ?
Et moi je te conseille encore une fois de voir d'abord les bases du langage avant de t'attaquer à d'autres choses sinon tu n'as pas fini de demander de l'aide sur des probleme de conception ou d'implémentation
(ne crois pas que ton topic me gene hein, mais c'est juste pour toi que je dis ca, pour que tu puisse prendre plaisir à concevoir et à implémenter toi meme).
Pour ton probleme de gestion des créatures, qui peuvent naitre ou disparaitre à tout moment, je ne vois pas d'autre solution que l'allocation dynamique et une liste (enfin un tableau ou n'importa quoi d'autre) pour gerer l'ensemble des unitées.
Parce que à un moment t donnée tu ne pourras pas savoir combien tu dois afficher d'ennemis à l'ecran (ca depens de combien ou été crées, de combien sont mortes, etc..).
La seule solution est donc ce le créer de manière dynamique et de stocker leurs adresses dans un tableau de pointeurs sur tes objets.
Et donc pour le dessin tu demande à dessiner toute ta liste de 0 à liste.size.
Enfin le coup du dessin n'est qu'un exemple.
Bon courage
Ca doit peut-être te sidérer de savoir que j'apprends un langage si vite, mais j'ai déjà l'habitude de la programmation. Les bases du langage sont déjà acquise mais je n'ai encore aucune expérience de l'application du langage pour créer ce que je souhaite.
Sinon pour les monstres j'avais déjà réglé ce problème.
J'ai bien fais une class Enemy et maintenant une class Enemy_Party qui est à la base un tableau vide avec la fonction add_enemy. J'ai ensuite crée une classe Battle qui prends comme entrée (party,enemy_list) qui est evidemment correspond évidemment aux groupes des héros et un tableau de nom de monstre. La classe Battle au départ crée enemy_party=Enemy_Party.new (on s'en doute), puis rempli le tableau grace à enemy_list.
Bon sur ce, je retourne réfléchir à mon programme. Je suis confronté à des probs qui dépasse certainement le langage de programmation, et se rapporte davantage sur la création du système d'un RPG.