Vous ne pouvez pas simplement utiliser le même code de dessin pour les murs que pour les sols car les murs et les sols ne sont pas dans le même plan: les sols sont plats (horizontaux) tandis que les murs sont verticaux. Vous devez donc les dessiner légèrement différemment. Vos coordonnées x et y dans le plancher signifient quelque chose comme «gauche/droite» et «avant/arrière» en termes de placement des carreaux. Pour les briques, gauche et droite ont encore du sens, mais nous voulons remplacer vers l'avant/vers l'arrière avec haut et bas pour refléter la direction verticale. Donc, notre "y" prend un nouveau sens. Maintenant, en Maths, l'axe y pointe généralement vers le haut tandis que dans l'infographie 2D, il pointe vers le bas. Vous pouvez faire votre choix - le code ci-dessous suppose qu'il pointe vers le haut afin que y = 0
signifie "au niveau du sol". Alors commençons à penser à la commande. L'exemple de brique que vous avez affiché concerne un mur qui serait l'extrémité gauche (supérieure) d'un étage. En raison des parties noires de la brique (la profondeur du mur), nous devons nous assurer que nous dessinons d'abord les briques les plus droites afin que la profondeur noire sur le côté gauche soit couverte par des briques plus proches. Le même argument s'applique pour le noir sur la partie supérieure du mur, nous devons d'abord tirer les briques inférieures. Si nous nous en tenons aux directions x et y mentionnées plus haut (x va de gauche à droite, y va de bas en haut), cela signifie que nous devons exécuter nos deux boucles for dans des directions négatives:
for (int y = 3; y >= 0; y--) {
for (int x = 5; x >= 0; x--) {
...
}
}
la principale question est maintenant combien nous devons compenser le dessin de chaque brique par rapport aux autres briques. Faisons cela une direction à la fois, en commençant par la direction x.
Imaginons que deux briques à côté de l'autre:
La gauche des deux a la partie de la profondeur noire visible, mais le droit on ne doit pas le montrer.Ainsi, nous ne pouvons pas simplement décaler l'image de droite sur toute la largeur du PNG. En fait, en supposant que les briques s'alignent avec vos carreaux de sol, la largeur de la partie avant réelle du mur devrait être la même que la moitié de la largeur d'une tuile.
int xCo = x * tileWidth/2;
La profondeur de mur noir sur la gauche ne doit pas être ignoré, parce que nous voulons probablement compenser chaque brique un peu à gauche, de sorte que la coordonnée x du coin avant des lignes de mur vers le haut avec le carreaux de sol, pas les coordonnées x du coin arrière.
Maintenant, la coordonnée y de chaque brique est un peu plus compliquée car elle dépend non seulement de la rangée de briques, mais aussi de la coordonnée x: plus la droite est haute, plus nous devons dessiner. Mais nous allons ignorer la direction x pour un moment et essayer d'en tirer simplement une colonne de briques:
Encore une fois, le delta entre les coordonnées y des deux briques n'est pas la hauteur de la PNG . Contrairement au cas gauche/droite où nous avons supposé que les briques s'alignaient avec des tuiles qui nous permettaient d'utiliser tileWidth
comme delta-x, les briques peuvent avoir des hauteurs arbitraires. Mais nous pouvons toujours calculer la hauteur réelle de la brique à partir de la hauteur de l'image, car nous savons que la profondeur du côté gauche et la profondeur du sommet doivent s'aligner. Si nous regardons le petit triangle transparent dans le coin supérieur droit de la brique PNG, nous remarquons que le rapport entre sa largeur et sa hauteur doit être le même que le rapport entre la largeur et la hauteur d'une dalle. Cela nous permet de calculer un yoffset du xoffset calculé ci-dessus, et à l'utiliser pour en déduire la hauteur réelle de la brique:
int yoffset = xoffset * tileHeight/tileWidth;
int wallHeight = wallHeight() - tileHeight/2 - yoffset;
Notez que cela ne fonctionne que sous l'hypothèse qu'il n'y a pas d'espace vide à la frontière le PNG et il pourrait encore échouer en raison d'erreurs d'arrondi. Donc, vous pouvez ajouter un Math.ceil()
(ou simplement + 1
) ici si nécessaire. Donc pour les colonnes simples, il est bon d'y aller maintenant: nous pouvons simplement multiplier notre variable y
par la wallHeight
ci-dessus. Mais comme indiqué précédemment, la position x d'une brique influence également la coordonnée des pixels y. Si nous regardons à nouveau la première image avec les deux briques l'une à côté de l'autre, combien avons-nous dû déplacer la brique droite pour l'aligner avec la brique gauche? Eh bien, celui-ci est vraiment facile, parce que c'est la même chose que pour les carreaux de sol: la moitié de la hauteur d'une tuile!
Donc, nous sommes tous ensemble. Si nous mettons tout ensemble, nous nous retrouvons avec un peu de code comme ceci:
int xoffset = wallWidth() - tileWidth/2;
int yoffset = xoffset * tileHeight/tileWidth;
int wallHeight = wallHeight() - tileHeight/2 - yoffset;
for (int y = 3; y >= 0; y--) {
for (int x = 5; x >= 0; x--) {
int xCo = x * tileWidth/2;
int yCo = y * wallHeight - x * tileHeight/2;
walls.draw(g, xCo - xoffset, yCo - yoffset);
}
}
(Je suppose que wallWidth() et wallHeight() renvoient la largeur et la hauteur de la brique PNG.)
Notez que les trois constantes avant les boucles for peuvent être déplacées du code de dessin réel - elles dépendent uniquement des propriétés de l'image et d'autres constantes et ne doivent pas être recalculées chaque fois que nous dessinons le mur.
Merci d'avoir rendu mes photos visibles. J'ai aussi posté sur gamedev.stackexchange, et ils sont très restrictifs sur les liens et les images, donc je n'ai pas essayé ici. –
J'ai remarqué un motif avec vos murs: le bord horizontal supérieur avant du premier mur est colinéaire avec le bord horizontal inférieur avant du troisième mur. En outre, le bord vertical avant droit du premier mur est colinéaire avec le bord vertical arrière gauche du troisième mur. La même chose est vraie des deuxième et quatrième murs. Donc, ils sont en quelque sorte alignés. Juste pas comme tu le veux. – Kevin
Haha oui, c'est vrai.Je vais prendre un certain réconfort dans ce fait, mais je ne suis pas sûr de savoir quoi en faire, sauf que "ma méthode est à moitié mauvaise" –