Page 2 sur 3

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 30 Déc 2015, 19:39
par Zim
En fait j'écrivais à la base surtout en réaction de ceci :
Non, car ça dépend complètement de ce qu'on veut faire avec RM. Le modèle "event 2000/03" n'est "obsolète" que pour les créateurs de gros projets ambitieux (souvent commerciaux).
Un jeu peut être ambitieux sans avoir à refaire tous les différents aspects du moteur. Les Dragon Quest étaient ambitieux pour plein de raison, et les quatre premiers utilisaient le même moteur.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 30 Déc 2015, 22:06
par Roi of the Suisse
Mais tout ça tu le comprendras peut-être le jour (hypothétique) où tu essaieras RM 2000/03. :sifflote:D
:fufu: Je ne me reconnais jamais dans ce que tu m'accuses d'être. Tu ne combats que des fantômes : l'idée que tu te fais des opinions des gens, et ils te regardent agiter les bras dans le vide et se disent "quel rigolo ce Némeaux".

J'ai déjà utilisé plusieurs fois RM2003, tu n'étais pas né j'avais déjà fait 3 jeux avec. Je ne l'aime pas, principalement à cause de la non-coloration du code et de l'absence d'interrupteurs locaux.
Et je suis dans le même cas que Gaetz pour RMXP, vu que mon projet ne se conforme pas bien à ce que RM veut qu'on fasse de lui.
:tricot:

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 31 Déc 2015, 11:32
par Vincent
Pour moi, c'est simple, la problématique est qu'est-ce qui rend le jeu le plus simple à faire et dans le moteur et dans la création de contenu.

Pour mon jeu clone de POP format DBZ, une fois, les bases du moteur posées, chaque écran était assez simple à faire car il n'y avait plus ou moins que le héros à gérer à l'écran.
Je n'aurais jamais été particulièrement limité par rapport à ce que je voulais faire dans ce jeux-là.

Par contre, j'avais commencé un autre projet avec un mix de CBS FF6 avec de la destruction de terrain, du pathfinding, plein de persos, des techniques à gogo.
J'avais genre une centaine de variable par perso pour une douzaine de persos à l'écran.
J'avais codé un cauchemar de pointeurs de pointeurs pour gérer le tout et ça marchait mais c'était difficile à débugger.
Bref très mauvais choix dans ce cas de figure là.

Pour autant, visuellement, le clone de POP faisait plus avancé car gros sprites, plus de couleurs, pas de charsets moches.

Idem récemment, je m'étais attaqué à un plugin de mouvement pixel par pixel avec le plugin de Cherry mais il me manquait l'accès à certaines variables pour que ça fonctionne et Cherry ne pouvait pas me donner cet accès à ce moment-là.
Sans compter les problèmes d'instabilité (peut être due à mon expérience limitée en C++ ?). Toujours est-il que nouvel échec.

RM2K3 est effectivement un jouet authentiquement génial qui peut faire des projets avancés mais pas n'importe lesquels.
Pour autant les RMXP , VX/Ace sont potentiellement plus difficiles d'accès, cela peut poser problème aussi pour créer du contenu si des membres de l'équipe ne maitrise pas.
Une réflexion préalable est nécessaire par rapport à son équipe et à ce qu'on veux faire et ce que chaque logiciel peut faire.

A titre d'exemple, si je veux faire un clone de Wolfenstein 3D, je prends RM2K3, le plugin de Cherry et je fais le rafraichissement d'écran avec ça la fonction draw de http://rpg-maker.cherrytree.at/dynrpg/c ... anvas.html.
Ca serait probablement plus simple que par RMXP , VX/Ace et ça serait super adapté aux maps Rpgmaker.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 31 Déc 2015, 22:21
par Nemau
Si, puisque c'est "en tant".
xD Décidément.
Certes, ce que je dis vaut aussi pour RMXP et VX/Ace et le dernier
Pas d'accord (si j'ai bien compris ce que tu voulais dire), car si on ne touche pas aux scripts on peut faire moins de choses niveau programmation.
l'idée que tu te fais des opinions des gens
D'accord, en fait tu adores RM 2003, tu reconnais que dans certains cas il est préférable de l'utiliser plutôt qu'XP, et c'est juste moi qui ne comprends pas quand tu parles. :nerd:
Je ne l'aime pas, principalement à cause de la non-coloration du code et de l'absence d'interrupteurs locaux.
C'est presque aussi idiot que de ne pas aimer un RM parce que son splashscreen (quand tu ouvres le logiciel) est moche. Je caricature un peu, ok la coloration de code c'est pratique, ok les interrupteurs locaux aussi, m'enfin voilà.

RM 2003 est tellement plus permissif niveaux events (et pas qu'events d'ailleurs, par exemple dans XP tu ne peux pas faire boucler les maps, et ce n'est vraiment qu'un exemple parmi des tas), toi tu dis que tu l'aimes moins que les autres à cause de l'absence de deux trucs non indispensables, et après tu t'étonnes que je t'accuses de mal connaître le logiciel ? >x)

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 03 Jan 2016, 22:05
par Roi of the Suisse
Je ne l'aime pas, principalement à cause de la non-coloration du code et de l'absence d'interrupteurs locaux.
C'est presque aussi idiot que de ne pas aimer un RM parce que son splashscreen (quand tu ouvres le logiciel) est moche. Je caricature un peu, ok la coloration de code c'est pratique, ok les interrupteurs locaux aussi, m'enfin voilà.

RM 2003 est tellement plus permissif niveaux events (et pas qu'events d'ailleurs, par exemple dans XP tu ne peux pas faire boucler les maps, et ce n'est vraiment qu'un exemple parmi des tas), toi tu dis que tu l'aimes moins que les autres à cause de l'absence de deux trucs non indispensables, et après tu t'étonnes que je t'accuses de mal connaître le logiciel ? >x)
Ta comparaison avec le splashscreen est à côté de la plaque et dessert ta pensée : c'est un détail facilement réglable, alors que la coloration et les interrupteurs locaux ne sont absolument pas une option. Ton commentaire aurait été beaucoup plus sérieux sans cette phrase.

On ne donne pas de l'importance aux mêmes choses alors.
Pour moi le bouclage de map est un gadget inutile et qui n'a pas de sens (à part pour simuler un rêve ou un labyrinthe magique).
Et au contraire, la coloration est vitale en programmation ; ça fait une dizaine d'années qu'un IDE sans coloration est considéré comme prodigieusement ridicule et handicapant.
Pareillement, les interrupteurs locaux sont ultra utiles, pour faire des objets génériques. La factorisation est la sacro-sainte règle d'une programmation de qualité. Toi qui dis que RM2003 est meilleur car plus accessible (par la non-nécessité des scripts), RM2003 introduit la notion de pointeur (variable contenant un numéro de variable) pour remplacer les interrupteurs locaux, alors que c'est une notion très complexe en informatique (qui est la principale cause d'abandon de l'apprentissage du langage C). Et RMXP se passe brillamment de cette notion.
Donc tu vois, tes arguments peuvent être inversés,et tout se défend.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 03 Jan 2016, 22:20
par Zim
(Une précision : la coloration syntaxique existe depuis RM2009 de cherry (où tu peux toi-même définir les couleurs, et la taille et le type de la police), et est intégrée par défaut dans la version qu'il a sortie sur steam. Je suis d'accord sur le fait que c'est très utile.)

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 04 Jan 2016, 16:02
par Nemau
Ta comparaison avec le splashscreen est à côté de la plaque et dessert ta pensée : c'est un détail facilement réglable, alors que la coloration et les interrupteurs locaux ne sont absolument pas une option. Ton commentaire aurait été beaucoup plus sérieux sans cette phrase.
Je caricature un peu, ok la coloration de code c'est pratique, ok les interrupteurs locaux aussi, m'enfin voilà.
Pour moi le bouclage de map est un gadget inutile et qui n'a pas de sens (à part pour simuler un rêve ou un labyrinthe magique).
Ou une world-map, pour les gens qui veulent faire un jeu de type... Attends ça va me revenir... "RPG" je crois que ça s'appelle.


Quoi qu'on veuille faire, on peut se passer de la colorisation de code et des interrupteurs locaux (même si ça prend du coup plus du temps). Si on veut faire une world-map type FF, on ne peut pas se passer du bouclage de map. Et il s'avère également pratique pour les trucs genre la séquence à moto d'Escapade. Et cette histoire de bouclage n'est qu'un exemple des limites d'XP par rapport à 2003.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 06 Jan 2016, 08:51
par Roi of the Suisse
Une world map est sphérique, alors qu'un bouclage comme le fait RM est torique :crepe:
La moto d'escapade aurait pu être faite avec une picture qui défile. Une worldmap aussi si on y pense.
Quoi qu'on veuille faire, on peut se passer du bouclage de map (même si ça prend du coup plus du temps), mais si on veut faire un jeu un minimum complexe, on ne peut pas se passer de la colorisation et des interrupteurs locaux (pour des raisons organisationnelles et de maintenance applicative), on alors ça tient du mec qui veut faire une tour Eiffel grandeur nature en empilant des allumettes (cf. Aedemphia).
Et cette histoire n'est qu'un exemple des limites de 2003 par rapport à XP.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 06 Jan 2016, 20:33
par Nemau
si on veut faire un jeu un minimum complexe
Non, car ça dépend complètement de ce qu'on veut faire avec RM. Le modèle "event 2000/03" n'est "obsolète" que pour les créateurs de gros projets ambitieux (souvent commerciaux).
Donc, oui, si on veut faire un jeu un minimum complexe on n'utilise pas RM 2003. Mais pas XP non plus, ni aucun RM (la preuve, toi-même tu songes à porter KnH sur un moteur plus pertinent). En revanche, si on veut faire un jeu simple (cette simplicité inclut de ne pas se faire chier avec un vrai langage de programmation, ici le Ruby), RM 2003 surpasse XP.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 06 Jan 2016, 23:11
par Roi of the Suisse
Je ne pense pas que ce soit "se faire chier" que d'observer le code Ruby et de s'essayer à singer son contenu. Avec RM2003, comme je t'ai dit, on manipule des pointeurs, alors qu'avec deux trois fonctions Ruby faites soi-même pour dépanner, on ne manipule jamais de pointeur.
On peut également récupérer des scripts sur des sites pour personnaliser son jeu, sans savoir un seul mot de Ruby. Il n'y a alors rien de chiant.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 07 Jan 2016, 16:02
par Nemau
Et ensuite venir se plaindre dans la section d'entraide d'Oniro parce que le script est mal fait, ou parce qu'il rentre en conflit avec d'autres scripts.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 09 Jan 2016, 00:38
par Roi of the Suisse
On va pas refaire la guerre des RM comme il y a la guerre des navigateurs et la guerre des consoles.
Moi je préfère RMXP, Firefox et la PS2, toi tu préfères RM2003, Opéra et la CDi, c'est comme ça, point, on ne va pas refaire le monde dans ce topic.
:youhou:

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 09 Jan 2016, 04:51
par Nemau
la CDi
[Nonor Seal of Approval]
on ne va pas refaire le monde dans ce topic.
Traduction : tu fais chier avec ton débat à la con dans mon topic ! =>[]

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 09 Jan 2016, 12:11
par Roi of the Suisse
On peut aller foutre la merde dans le topic de Gaetz si tu veux :flower:

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 17 Mars 2016, 10:45
par Roi of the Suisse
Ceci est le 11111e message du forum et en l’occurrence il n'est pas très intéressant :youhou:

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 20 Avr 2016, 23:37
par Roi of the Suisse
:) Mes avancées récentes

J'ai refait les pots de Kujira no Hara. Ces vieilleries dataient de 2008 ; à l'époque je m'en fichais de fournir un truc propre, mon objectif c'était que ça soit reconnaissable.

Image => Image

J'ai refait aussi les cubes :

Image => Image

J'ai dessiné un ours pour Némau, mais ce n'est qu'une base : Némau va le retoucher un peu. Je ne sais pas s'il va garder le violet, sur un vrai ours ça correspond à du gris foncé ; j'ai remplacé ça par du violet pour faire plus funky, mais ce n'est pas forcément dans l'esprit du jeu (Polaris 03). Ça aurait été parfait pour Kujira cela dit...

Image

J'ai rafistolé un singe pour Nanaky, mais il est trop grand alors il va falloir que je le refasse :

Image

Et j'ai acheté une beatle jaune, la même qu'Araragi. Vroum vroum !

Image

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 21 Avr 2016, 10:55
par Vincent
Tu te débrouilles bien en pixel art, ça rend très bien ! :pioche:

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 21 Avr 2016, 13:14
par PypeBros
pas à dire: les pots et le cube ont été fameusement améliorés. Je proposerais juste de retoucher un rien l'antialiasing des lignes jaunes sur les pots.
Pour le singe -- très belle progression aussi -- le plus gênant pour l'instant, ce sont les bras. Je les trouves fort raides, et le tramage 1/2 sur l'ensemble du bras n'est pas vraiment idéal pour donner un aspect fourrure. (il faudrait que je retourne voir le post du renard sur Pixelation pour pouvoir donner des conseils plus précis).
Well done :)

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 21 Avr 2016, 22:52
par Giuliani
La beatle jaune est super bien faite, elle a du te prendre un temps fou :fufu:

Sinon très joli travail^^

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 22 Avr 2016, 14:05
par Roi of the Suisse
Merci bienxe.
En effet antialiaser la bande jaune du pot bleu est une bonne idée !

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 18 Oct 2016, 17:04
par Roi of the Suisse
Les dernières avancées sur la version RM de Kujira :

Le désert
Image

Les dernières avancées sur la version Java de Kujira :

Les effets météorologiques :
Image

Image

Au moment même où j'écris, je planche sur les autotiles.

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 26 Oct 2016, 16:53
par Vincent
Sympa ! J'ai un peu de code en C++ dans mon projet concernant les autotiles, mais ça reste de l'interprétation de l'autotile de Rm2k3 (vu que les maps sont faites sous l'éditeur classique).
Si tu as besoin, je peux t'envoyer des extraits (bien que je sois une mauvais en C++ et que j'ai codé comme je pouvais :cry: )

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 26 Oct 2016, 16:59
par Roi of the Suisse
Cool de trouver quelqu'un d'autre qui a implémenté l'autotile :flower:
On comparera nos codes quand j'aurai fini :mdr:

Je ne rencontre pas de problème particulier. J'espère très vite vous montrer le résultat... qui sera le même que dans RM donc ça ne plongera pas forcément les foules dans un état d'extase extatique.

LE SAVIEZ-VOUS :
La première case de l'autotile, celle qui ne contient que les 4 coins (cas d'un carreau isolé), n'est en réalité pas utilisée dans le cas d'un carreau isolé : en effet les 4 coins utilisés sont ceux des cases 4, 6, 10, 12 de l'autotile :loupe:

Image

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 26 Oct 2016, 20:08
par Vincent
Bonne idée ! :mdr:
Ça m'a surpris aussi cette facette des autotiles de découpage par petits carrés de 4. :note:

J'ai rajouté une petite touche quand même. Quand tu crées le tileset. Tu peux faire des versions alternatives à chaque case source. Ensuite j'ai un algorithme qui décide quel alternative utiliser. C'est sympa car ça casse le côté repititif des cases sans rajouter du travail à la personne qui utilise le tileset. :crepe:

[Roi of the Suisse] Collines, nuages, trou du cul

Publié : 27 Oct 2016, 00:10
par Roi of the Suisse
Wouala :

Image Cet autotile complexe permet de se rendre compte que tous les quarts de carreaux sont importants, et qu'il n'y a pas de redondance comme on pourrait le croire au premier abord.

Image

https://github.com/roiofthesuisse/Kujir ... otile.java

Code : Tout sélectionner

public static final int TAILLE_MORCEAU = Fenetre.TAILLE_D_UN_CARREAU/2; //quart haut gauche public static final int X_PLEIN_HAUT_GAUCHE = 2; public static final int Y_PLEIN_HAUT_GAUCHE = 4; public static final int X_PLEIN_HAUT_GAUCHE_VIDE_A_DROITE = 4; public static final int Y_PLEIN_HAUT_GAUCHE_VIDE_A_DROITE = 4; public static final int X_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS = 2; public static final int Y_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS = 6; public static final int X_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS_ET_A_DROITE = 4; public static final int Y_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS_ET_A_DROITE = 6; public static final int X_COIN_RENTRANT_HAUT_GAUCHE = 4; public static final int Y_COIN_RENTRANT_HAUT_GAUCHE = 0; public static final int X_BORD_VERTICAL_HAUT_GAUCHE_LOIN_D_UN_COIN = 0; public static final int Y_BORD_VERTICAL_HAUT_GAUCHE_LOIN_D_UN_COIN = 4; public static final int X_BORD_VERTICAL_HAUT_GAUCHE_PRES_D_UN_COIN = 0; public static final int Y_BORD_VERTICAL_HAUT_GAUCHE_PRES_D_UN_COIN = 6; public static final int X_BORD_HORIZONTAL_HAUT_GAUCHE_LOIN_D_UN_COIN = 2; public static final int Y_BORD_HORIZONTAL_HAUT_GAUCHE_LOIN_D_UN_COIN = 2; public static final int X_BORD_HORIZONTAL_HAUT_GAUCHE_PRES_D_UN_COIN = 4; public static final int Y_BORD_HORIZONTAL_HAUT_GAUCHE_PRES_D_UN_COIN = 2; public static final int X_COIN_SORTANT_HAUT_GAUCHE = 0; public static final int Y_COIN_SORTANT_HAUT_GAUCHE = 2; //quart haut droite public static final int X_PLEIN_HAUT_DROITE = 3; public static final int Y_PLEIN_HAUT_DROITE = 4; public static final int X_PLEIN_HAUT_DROITE_VIDE_A_GAUCHE = 1; public static final int Y_PLEIN_HAUT_DROITE_VIDE_A_GAUCHE = 4; public static final int X_PLEIN_HAUT_DROITE_VIDE_EN_BAS = 3; public static final int Y_PLEIN_HAUT_DROITE_VIDE_EN_BAS = 6; public static final int X_PLEIN_HAUT_DROITE_VIDE_EN_BAS_ET_A_GAUCHE = 1; public static final int Y_PLEIN_HAUT_DROITE_VIDE_EN_BAS_ET_A_GAUCHE = 6; public static final int X_COIN_RENTRANT_HAUT_DROITE = 5; public static final int Y_COIN_RENTRANT_HAUT_DROITE = 0; public static final int X_BORD_VERTICAL_HAUT_DROITE_LOIN_D_UN_COIN = 5; public static final int Y_BORD_VERTICAL_HAUT_DROITE_LOIN_D_UN_COIN = 4; public static final int X_BORD_VERTICAL_HAUT_DROITE_PRES_D_UN_COIN = 5; public static final int Y_BORD_VERTICAL_HAUT_DROITE_PRES_D_UN_COIN = 6; public static final int X_BORD_HORIZONTAL_HAUT_DROITE_LOIN_D_UN_COIN = 3; public static final int Y_BORD_HORIZONTAL_HAUT_DROITE_LOIN_D_UN_COIN = 2; public static final int X_BORD_HORIZONTAL_HAUT_DROITE_PRES_D_UN_COIN = 1; public static final int Y_BORD_HORIZONTAL_HAUT_DROITE_PRES_D_UN_COIN = 2; public static final int X_COIN_SORTANT_HAUT_DROITE = 5; public static final int Y_COIN_SORTANT_HAUT_DROITE = 2; //quart bas gauche public static final int X_PLEIN_BAS_GAUCHE = 2; public static final int Y_PLEIN_BAS_GAUCHE = 5; public static final int X_PLEIN_BAS_GAUCHE_VIDE_A_DROITE = 4; public static final int Y_PLEIN_BAS_GAUCHE_VIDE_A_DROITE = 5; public static final int X_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT = 2; public static final int Y_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT = 3; public static final int X_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT_ET_A_DROITE = 4; public static final int Y_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT_ET_A_DROITE = 3; public static final int X_COIN_RENTRANT_BAS_GAUCHE = 4; public static final int Y_COIN_RENTRANT_BAS_GAUCHE = 1; public static final int X_BORD_VERTICAL_BAS_GAUCHE_LOIN_D_UN_COIN = 0; public static final int Y_BORD_VERTICAL_BAS_GAUCHE_LOIN_D_UN_COIN = 5; public static final int X_BORD_VERTICAL_BAS_GAUCHE_PRES_D_UN_COIN = 0; public static final int Y_BORD_VERTICAL_BAS_GAUCHE_PRES_D_UN_COIN = 3; public static final int X_BORD_HORIZONTAL_BAS_GAUCHE_LOIN_D_UN_COIN = 2; public static final int Y_BORD_HORIZONTAL_BAS_GAUCHE_LOIN_D_UN_COIN = 7; public static final int X_BORD_HORIZONTAL_BAS_GAUCHE_PRES_D_UN_COIN = 4; public static final int Y_BORD_HORIZONTAL_BAS_GAUCHE_PRES_D_UN_COIN = 7; public static final int X_COIN_SORTANT_BAS_GAUCHE = 0; public static final int Y_COIN_SORTANT_BAS_GAUCHE = 7; //quart bas droite public static final int X_PLEIN_BAS_DROITE = 3; public static final int Y_PLEIN_BAS_DROITE = 5; public static final int X_PLEIN_BAS_DROITE_VIDE_A_GAUCHE = 1; public static final int Y_PLEIN_BAS_DROITE_VIDE_A_GAUCHE = 5; public static final int X_PLEIN_BAS_DROITE_VIDE_EN_HAUT = 3; public static final int Y_PLEIN_BAS_DROITE_VIDE_EN_HAUT = 3; public static final int X_PLEIN_BAS_DROITE_VIDE_EN_HAUT_ET_A_GAUCHE = 1; public static final int Y_PLEIN_BAS_DROITE_VIDE_EN_HAUT_ET_A_GAUCHE = 3; public static final int X_COIN_RENTRANT_BAS_DROITE = 5; public static final int Y_COIN_RENTRANT_BAS_DROITE = 1; public static final int X_BORD_VERTICAL_BAS_DROITE_LOIN_D_UN_COIN = 5; public static final int Y_BORD_VERTICAL_BAS_DROITE_LOIN_D_UN_COIN = 5; public static final int X_BORD_VERTICAL_BAS_DROITE_PRES_D_UN_COIN = 5; public static final int Y_BORD_VERTICAL_BAS_DROITE_PRES_D_UN_COIN = 3; public static final int X_BORD_HORIZONTAL_BAS_DROITE_LOIN_D_UN_COIN = 3; public static final int Y_BORD_HORIZONTAL_BAS_DROITE_LOIN_D_UN_COIN = 7; public static final int X_BORD_HORIZONTAL_BAS_DROITE_PRES_D_UN_COIN = 1; public static final int Y_BORD_HORIZONTAL_BAS_DROITE_PRES_D_UN_COIN = 7; public static final int X_COIN_SORTANT_BAS_DROITE = 5; public static final int Y_COIN_SORTANT_BAS_DROITE = 7; /** * Calculer l'apparence du carreau liable en fonction de son voisinnage. * @param x coordonnee x de la case sur la Map (en nombre de carreaux) * @param y coordonnee y de la case sur la Map (en nombre de carreaux) * @param largeurMap largeur de la Map (en nombre de carreaux) * @param hauteurMap hauteur de la Map (en nombre de carreaux) * @param numeroCarreau numéro de ce carreau de décor issu du Tileset * @param layer une des trois couches de décor de l'éditeur de Maps * @return carreau liable avec la bonne apparence */ public BufferedImage calculerAutotile(final int x, final int y, final int largeurMap, final int hauteurMap, final int numeroCarreau, final int[][] layer) { // On veut déterminer les connexions du carreau boolean connexionBas = false; boolean connexionGauche = false; boolean connexionDroite = false; boolean connexionHaut = false; boolean connexionBasGauche = false; boolean connexionBasDroite = false; boolean connexionHautGauche = false; boolean connexionHautDroite = false; // On considère que le bord de l'écran est liable lui aussi if (y == 0) { //bord supérieur de l'écran connexionHaut = true; connexionHautGauche = true; connexionHautDroite = true; } else if (y == hauteurMap-1) { //bord inférieur de l'écran connexionBas = true; connexionBasGauche = true; connexionBasDroite = true; } if (x == 0) { //bord gauche de l'écran connexionGauche = true; connexionHautGauche = true; connexionBasGauche = true; } else if (x == largeurMap-1) { //bord droit de l'écran connexionDroite = true; connexionHautDroite = true; connexionBasDroite = true; } // On regarde les connexions possibles avec les carreaux voisins int numeroVoisin; if (!connexionHaut) { numeroVoisin = layer[x][y-1]; connexionHaut = (numeroVoisin == numeroCarreau) || this.cousins.contains(numeroVoisin); } if (!connexionBas) { numeroVoisin = layer[x][y+1]; connexionBas = (numeroVoisin == numeroCarreau) || this.cousins.contains(numeroVoisin); } if (!connexionGauche) { numeroVoisin = layer[x-1][y]; connexionGauche = (numeroVoisin == numeroCarreau) || this.cousins.contains(numeroVoisin); } if (!connexionDroite) { numeroVoisin = layer[x+1][y]; connexionDroite = (numeroVoisin == numeroCarreau) || this.cousins.contains(numeroVoisin); } // Selon les cas, ceux-là ne sont pas forcément utiles pour dessiner le carreau if (!connexionHautGauche) { numeroVoisin = layer[x-1][y-1]; connexionHautGauche = (numeroVoisin == numeroCarreau) || this.cousins.contains(numeroVoisin); } if (!connexionHautDroite) { numeroVoisin = layer[x+1][y-1]; connexionHautDroite = numeroVoisin == numeroCarreau || this.cousins.contains(numeroVoisin); } if (!connexionBasGauche) { numeroVoisin = layer[x-1][y+1]; connexionBasGauche = (numeroVoisin == numeroCarreau) || this.cousins.contains(numeroVoisin); } if (!connexionBasDroite) { numeroVoisin = layer[x+1][y+1]; connexionBasDroite = (numeroVoisin == numeroCarreau) || this.cousins.contains(numeroVoisin); } final BufferedImage resultat = new BufferedImage(Fenetre.TAILLE_D_UN_CARREAU, Fenetre.TAILLE_D_UN_CARREAU, Lecteur.TYPE_DES_IMAGES); final Graphics2D g2d = (Graphics2D) resultat.createGraphics(); int xMorceauChoisi; int yMorceauChoisi; //quart haut-gauche du carreau if (connexionHaut) { if (connexionGauche) { if (connexionHautGauche) { if (connexionDroite) { if (connexionBas) { xMorceauChoisi = X_PLEIN_HAUT_GAUCHE; yMorceauChoisi = Y_PLEIN_HAUT_GAUCHE; } else { xMorceauChoisi = X_PLEIN_HAUT_GAUCHE_VIDE_A_DROITE; yMorceauChoisi = Y_PLEIN_HAUT_GAUCHE_VIDE_A_DROITE; } } else { if (connexionBas) { xMorceauChoisi = X_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS; yMorceauChoisi = Y_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS; } else { xMorceauChoisi = X_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS_ET_A_DROITE; yMorceauChoisi = Y_PLEIN_HAUT_GAUCHE_VIDE_EN_BAS_ET_A_DROITE; } } } else { xMorceauChoisi = X_COIN_RENTRANT_HAUT_GAUCHE; yMorceauChoisi = Y_COIN_RENTRANT_HAUT_GAUCHE; } } else { if (connexionBas) { xMorceauChoisi = X_BORD_VERTICAL_HAUT_GAUCHE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_HAUT_GAUCHE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_VERTICAL_HAUT_GAUCHE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_HAUT_GAUCHE_PRES_D_UN_COIN; } } } else { if (connexionGauche) { if (connexionDroite) { xMorceauChoisi = X_BORD_HORIZONTAL_HAUT_GAUCHE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_HAUT_GAUCHE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_HORIZONTAL_HAUT_GAUCHE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_HAUT_GAUCHE_PRES_D_UN_COIN; } } else { xMorceauChoisi = X_COIN_SORTANT_HAUT_GAUCHE; yMorceauChoisi = Y_COIN_SORTANT_HAUT_GAUCHE; } } g2d.drawImage(this.image, 0, 0, TAILLE_MORCEAU, TAILLE_MORCEAU, xMorceauChoisi*TAILLE_MORCEAU, yMorceauChoisi*TAILLE_MORCEAU, (xMorceauChoisi+1)*TAILLE_MORCEAU, (yMorceauChoisi+1)*TAILLE_MORCEAU, null); //quart haut-droite du carreau if (connexionHaut) { if (connexionDroite) { if (connexionHautDroite) { if (connexionGauche) { if (connexionBas) { xMorceauChoisi = X_PLEIN_HAUT_DROITE; yMorceauChoisi = Y_PLEIN_HAUT_DROITE; } else { xMorceauChoisi = X_PLEIN_HAUT_DROITE_VIDE_EN_BAS; yMorceauChoisi = Y_PLEIN_HAUT_DROITE_VIDE_EN_BAS; } } else { if (connexionBas) { xMorceauChoisi = X_PLEIN_HAUT_DROITE_VIDE_A_GAUCHE; yMorceauChoisi = Y_PLEIN_HAUT_DROITE_VIDE_A_GAUCHE; } else { xMorceauChoisi = X_PLEIN_HAUT_DROITE_VIDE_EN_BAS_ET_A_GAUCHE; yMorceauChoisi = Y_PLEIN_HAUT_DROITE_VIDE_EN_BAS_ET_A_GAUCHE; } } } else { xMorceauChoisi = X_COIN_RENTRANT_HAUT_DROITE; yMorceauChoisi = Y_COIN_RENTRANT_HAUT_DROITE; } } else { if (connexionBas) { xMorceauChoisi = X_BORD_VERTICAL_HAUT_DROITE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_HAUT_DROITE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_VERTICAL_HAUT_DROITE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_HAUT_DROITE_PRES_D_UN_COIN; } } } else { if (connexionDroite) { if (connexionGauche) { xMorceauChoisi = X_BORD_HORIZONTAL_HAUT_DROITE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_HAUT_DROITE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_HORIZONTAL_HAUT_DROITE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_HAUT_DROITE_PRES_D_UN_COIN; } } else { xMorceauChoisi = X_COIN_SORTANT_HAUT_DROITE; yMorceauChoisi = Y_COIN_SORTANT_HAUT_DROITE; } } g2d.drawImage(this.image, TAILLE_MORCEAU, 0, 2*TAILLE_MORCEAU, TAILLE_MORCEAU, xMorceauChoisi*TAILLE_MORCEAU, yMorceauChoisi*TAILLE_MORCEAU, (xMorceauChoisi+1)*TAILLE_MORCEAU, (yMorceauChoisi+1)*TAILLE_MORCEAU, null); //quart bas-gauche du carreau if (connexionBas) { if (connexionGauche) { if (connexionBasGauche) { if (connexionDroite) { if (connexionHaut) { xMorceauChoisi = X_PLEIN_BAS_GAUCHE; yMorceauChoisi = Y_PLEIN_BAS_GAUCHE; } else { xMorceauChoisi = X_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT; yMorceauChoisi = Y_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT; } } else { if (connexionHaut) { xMorceauChoisi = X_PLEIN_BAS_GAUCHE_VIDE_A_DROITE; yMorceauChoisi = Y_PLEIN_BAS_GAUCHE_VIDE_A_DROITE; } else { xMorceauChoisi = X_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT_ET_A_DROITE; yMorceauChoisi = Y_PLEIN_BAS_GAUCHE_VIDE_EN_HAUT_ET_A_DROITE; } } } else { xMorceauChoisi = X_COIN_RENTRANT_BAS_GAUCHE; yMorceauChoisi = Y_COIN_RENTRANT_BAS_GAUCHE; } } else { if (connexionHaut) { xMorceauChoisi = X_BORD_VERTICAL_BAS_GAUCHE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_BAS_GAUCHE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_VERTICAL_BAS_GAUCHE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_BAS_GAUCHE_PRES_D_UN_COIN; } } } else { if (connexionGauche) { if (connexionDroite) { xMorceauChoisi = X_BORD_HORIZONTAL_BAS_GAUCHE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_BAS_GAUCHE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_HORIZONTAL_BAS_GAUCHE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_BAS_GAUCHE_PRES_D_UN_COIN; } } else { xMorceauChoisi = X_COIN_SORTANT_BAS_GAUCHE; yMorceauChoisi = Y_COIN_SORTANT_BAS_GAUCHE; } } g2d.drawImage(this.image, 0, TAILLE_MORCEAU, TAILLE_MORCEAU, 2*TAILLE_MORCEAU, xMorceauChoisi*TAILLE_MORCEAU, yMorceauChoisi*TAILLE_MORCEAU, (xMorceauChoisi+1)*TAILLE_MORCEAU, (yMorceauChoisi+1)*TAILLE_MORCEAU, null); //quart bas-droite du carreau if (connexionBas) { if (connexionDroite) { if (connexionBasDroite) { if (connexionGauche) { if (connexionHaut) { xMorceauChoisi = X_PLEIN_BAS_DROITE; yMorceauChoisi = Y_PLEIN_BAS_DROITE; } else { xMorceauChoisi = X_PLEIN_BAS_DROITE_VIDE_EN_HAUT; yMorceauChoisi = Y_PLEIN_BAS_DROITE_VIDE_EN_HAUT; } } else { if (connexionHaut) { xMorceauChoisi = X_PLEIN_BAS_DROITE_VIDE_A_GAUCHE; yMorceauChoisi = Y_PLEIN_BAS_DROITE_VIDE_A_GAUCHE; } else { xMorceauChoisi = X_PLEIN_BAS_DROITE_VIDE_EN_HAUT_ET_A_GAUCHE; yMorceauChoisi = Y_PLEIN_BAS_DROITE_VIDE_EN_HAUT_ET_A_GAUCHE; } } } else { xMorceauChoisi = X_COIN_RENTRANT_BAS_DROITE; yMorceauChoisi = Y_COIN_RENTRANT_BAS_DROITE; } } else { if (connexionHaut) { xMorceauChoisi = X_BORD_VERTICAL_BAS_DROITE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_BAS_DROITE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_VERTICAL_BAS_DROITE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_VERTICAL_BAS_DROITE_PRES_D_UN_COIN; } } } else { if (connexionDroite) { if (connexionGauche) { xMorceauChoisi = X_BORD_HORIZONTAL_BAS_DROITE_LOIN_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_BAS_DROITE_LOIN_D_UN_COIN; } else { xMorceauChoisi = X_BORD_HORIZONTAL_BAS_DROITE_PRES_D_UN_COIN; yMorceauChoisi = Y_BORD_HORIZONTAL_BAS_DROITE_PRES_D_UN_COIN; } } else { xMorceauChoisi = X_COIN_SORTANT_BAS_DROITE; yMorceauChoisi = Y_COIN_SORTANT_BAS_DROITE; } } g2d.drawImage(this.image, TAILLE_MORCEAU, TAILLE_MORCEAU, 2*TAILLE_MORCEAU, 2*TAILLE_MORCEAU, xMorceauChoisi*TAILLE_MORCEAU, yMorceauChoisi*TAILLE_MORCEAU, (xMorceauChoisi+1)*TAILLE_MORCEAU, (yMorceauChoisi+1)*TAILLE_MORCEAU, null); return resultat; }