Voilà, je suis en train de faire un petit snake (eh oui je débute
), et j'aimerais que les bords de l'écran soient "reliés" (je sais pas si vous voyez ce que je veux dire...). Enfin bon, j'arrive à faire passer mon "serpent" (juste un rond
) d'un bord à l'autre, mais c'est au niveau des textures que ça gêne. En fait je voudrais que la texture puisse chevaucher les deux bords, mais je ne sais pas comment faire
Pouvez-vous m'aider ?
Merci beaucoup ![]()
Pourquoi ne pas le dessiner deux fois, une par côté de l'écran? ![]()
Oui j'y ai pensé, mais quand le serpent ne chevauche aucun écran, je fais comment ?
et bien, tu ne le dessines qu'une fois, j'imagine. ![]()
En fait, je vois pas trop comment mettre ça en place ![]()
ben, bienvenue dans le monde fascinant de la programmation
Difficile de te donner une solution en particulier, il y en a énormément, en fait ![]()
Je vais essayer de réfléchir à une solution. Je vous redirai si j'ai je n'ai toujours pas trouvé, mais je crois que je suis sur une bonne piste ![]()
En fait, j'ai toujours pas réussi ![]()
Mais j'ai réussi à faire pivoter mon sprite en fonction de la direction donnée ![]()
Désolé du grand up, mais ça évite de refaire un topic ![]()
J'ai trouvé la solution à mon précédent problème mais j'ai un nouveaux problème
En fait je n'ai aucune idée de comment faire pour que le reste du serpent suive la tête.
Je me doute qu'il faut faire une liste de partie de corps puis les updater, mais je n'arrive pas à faire que le corps suivent la tête.
Je vous demande pas forcément de tout me faire, mais au moins de me donner une piste parce que là, j'ai vraiment aucune idée
P.S. Je suis en C# avec XNA
Perso le snake ca me fait penser directement à une liste dynamique.
moi c'est comme ca que je l'ai fait : une liste de coordonnées, et pour avancer tu push() une nouvelle coordonnée (située à (x+10,y) si tu appuie sur la touche flechée de droite, (x-10,y) si tu appuie sur la touche flechée de gauche, (x,y+10) si tu appuies sur la touche flechée du haut, sur (x,y-10) sur la touche flechée du bas) et tu pop() celle de l'arrière, et dans ton int main() tu crée pour chaque coordonnée de la liste un bloc positionné aux coordonnées de la liste de blocs (voir pseudocode). N'oublie pas également de toujours faire avancer le snake dans une direction, même si l'utilisateur n'appuie pas sur une touche flechée.
pseudocode: for(int j = 0; j < listdecoord.size(); j++)
{
Rectangle bloc(listdecoord[j].x, listdecoord[j].y);
}
Je suppose que les vector/listes existent en C#, si oui a toi de trouver comment adapter ton code si tu veux utiliser ma solution.
Je n'ai pas compris tout ce que tu me racontes (faut dire que je suis débutant
)
Mais de ce que je vois ça serait un peu comme des matrices. Le problème c'est que je ne passe que en 1ère, et que à part le nom et vite fait ce que m'ont expliqué mes soeurs (le concept de base) je n'y connais rien du tout !
Cela n'a rien à voir, les "listes" en général peuvent etre/sont en général considérés comme des tableaux dynamiques (c'est à dire dont la longueur peut changer pendant le programme).
Apparemment après avoir cherché un peu ce serait ca:
System.Collections.Generic.List<T>
renseigne toi sur ca (si tu veux utiliser ma solution bien sur, si tu l'aimes pas cherches en une autre).
Et donc tu affiche un sprite pour la tete, et puis pour le corps tu utilise une System.Collections.Generic.List<T> mais de coordonnes, donc System.Collections.Generic.List<Coordonnes> par exemple.
Et tu affiche un rectangle à la position de chaque coordonnée de la liste, c'est tout.
Oui ! j'avais mal compris ! En fait maintenant que j'ai compris ta solution me paraît évidente ![]()
Merci beaucoup ! Je vais la mettre en application.
Mais si d'autres personnes ont des solutions qu'ils pensent plus faciles/pratiques, je reste à l'écoute
Sinon, si tu as une liste des parties du corps qui possèdent des coordonnées, une courante et une précédente, tu peux faire plus simplement un truc.
Imagine ton tableau tel quel :
[0, 1, 1, 1, 1, 1, 1, 2]
0 représente la tête
1 représente une partie du corps
2 représente la queue
Il te suffit alors de faire bouger le premier index dans la direction voulue
tab[0].setPosition(x, y);
Ton "setPosition" resemblera à ça :
public void setPosition(int newx, int newy) {
this.lastX = this.x
this.lastY = this.y;
this.x = newx;
this.y = newy;
}
Et ensuite tout simplement, tu parcours le réstant de ton tableau, et tu mets les coordonnées aux anciennes coordonnées de ton snake, tel que :
for(int i = 1; i < snake.size(); ++i) {
int x = snake.get(i - 1).getPositions().x;
int y = snake.get(i - 1).getPositions().y;
snake.get(i).setPosition(x, y);
}
Ainsi, ton corps avancera suivant la tête tout simplement
.
J’espère que tu as compris
.
ps : Pour le tableau, ça serait plutôt :
[Object=>Head, Object=>Body, Object=>Body, Object=>Body, Object=>Body, Object=>Queue];
Sachant que tous ces objets extends d'une class comme par exemple "BodyPart". Comme ça le tableau ressemble à :
private BodyPart[] snake = new BodyPart[size];
ou
private CopyOnWriteArrayList<BodyPart> snake = new CopyOnWriteArrayList<BodyPart>();
.
public void setPosition(int newx, int newy)
{
this.lastX = this.x
this.lastY = this.y;
this.x = newx;
this.y = newy;
}
Je ne comprends pas trop à quoi servent this.lastX et this.latsY...
Désolé ![]()
Ma solution est plus simple honnetement.
Peut être, mais je ne comprends ni l'une ni l'autre en fait ![]()
En fait, pour ta solution j'ai pas bien ta liste de coordonnées. C'est les coordonnées du Serpent ?
Enfin bon bref, peut être que c'est parce que je suis nul, mais je suis complètement perdu ![]()
sinon tu peux juste faire un tableau statique c'est moins optimisé mai on le verras pas.
en gros tu creer un tableau Snake[nombre_de_casse_de_ton_ecran]
quand ton snake avance tu prend le dernier membre du corps qui va prendre la valeur du dernier corps-1 et a la fin tu modifie la position de la tête!
donc en gros tu créer un tableau Snake (qui comporte les coordonné) et un autre qui compte le nombre de partie de corps et donc
C'est franchement pas compliqué, lit calmement ce qu'on te dit sans paniquer.
Tu crée une classe Bloc qui comporte deux variables : coordonnée en X et coordonnée en Y.
Tu crée une liste de cette classe Bloc. Elle s'appelle SNAKE.
Lis ca calmement, est ce que tu comprends ca au moins ? c'est très très très simple.
Ensuite pour faire bouger le serpent.
Tu crée une énumération (ou si tu ne connais pas ca, tu crée 4 variables). Si tu choisis de faire une énumération, tu mets dedans : DIRECTION_DROITE, DIRECTION_GAUCHE, DIRECTION_HAUT, DIRECTION_BAS.
Si tu choisi 4 variables, tu crée 4 variables ayant pour chaque nom dans leur ordre respectif:
DIRECTION_DROITE, DIRECTION_GAUCHE, DIRECTION_HAUT, DIRECTION_BAS.
Tu comprends toujours ? C'est franchement pas compliqué suffit d'assimiler ce qu'on te dit.
Ensuite.
Dans la gestion des évenements de ta fenetre, tu mets que si la direction est égale à DIRECTION_DROITE, tu fais un nouveau Bloc, mais à quelles coordonnées tu va le placer ?
Réfléchis bien.
Au coordonnée du premier bloc dans ta liste de Bloc appellée SNAKE, c'est à dire à SNAKE.front() par exemple, ou SNAKE[0] si tu préfères, mais pas EXACTEMENT les memes coordonnées puisque tu veux le faire bouger, donc à ces coordonnées là (aka: SNAKE[0].coordonnée X et SNAKE[0].coordonnée Y), sauf que en "coordonnées X" tu rajoute 10. Ainsi le bloc se trouvera à la coordonnée du bloc précédent mais "10 pixels plus loin que la coordonnée X du premier Bloc de ton Snake, c'est à dire Snake[0]".
Et puis tu fais quoi avec ce bloc ?
Réfléchis bien.
Tu le met dans ta liste de blocs, appellée SNAKE.
Et pour les autres directions ?
C'est pas compliqué franchement.
Par contre n'oublie pas d'enlever le dernier élément de ta liste de Bloc SNAKE avant de faire tout ce que je t'ai dit, sinon ton snake s'allongera à l'infini.
Et dans la gestion des évènements du clavier, tu mets que si t'appuie sur la fleche gauche, la direction est égale à DIRECTION_DROITE, etc etc...
Si tu comprends pas ca on peut plus rien faire du tout pour toi
parce que je viens de tout expliquer de A à Z comment le faire. Donc soit tu relis ton livre d'algorithmique/programmation et tu te mets à travailler soit tu laisses tomber.