CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[XNA] Problème Snake

siniht
siniht
Niveau 4
06 août 2013 à 22:36:59

Voilà, je suis en train de faire un petit snake (eh oui je débute :noel: ), 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 :hap: ) 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 :)

caelacanthe
caelacanthe
Niveau 10
06 août 2013 à 22:38:22

Pourquoi ne pas le dessiner deux fois, une par côté de l'écran? :oui:

siniht
siniht
Niveau 4
06 août 2013 à 22:41:13

Oui j'y ai pensé, mais quand le serpent ne chevauche aucun écran, je fais comment ?

caelacanthe
caelacanthe
Niveau 10
06 août 2013 à 22:42:52

et bien, tu ne le dessines qu'une fois, j'imagine. :-(

siniht
siniht
Niveau 4
06 août 2013 à 22:45:29

En fait, je vois pas trop comment mettre ça en place :(

caelacanthe
caelacanthe
Niveau 10
06 août 2013 à 22:47:22

ben, bienvenue dans le monde fascinant de la programmation :hap:

Difficile de te donner une solution en particulier, il y en a énormément, en fait :peur:

siniht
siniht
Niveau 4
06 août 2013 à 22:58:46

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 :-)

siniht
siniht
Niveau 4
07 août 2013 à 15:50:28

En fait, j'ai toujours pas réussi :-(
Mais j'ai réussi à faire pivoter mon sprite en fonction de la direction donnée :noel:

siniht
siniht
Niveau 4
28 août 2013 à 23:44:16

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 :hap:

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 :rouge:

P.S. Je suis en C# avec XNA

Engineer
Engineer
Niveau 12
28 août 2013 à 23:47:31

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.

siniht
siniht
Niveau 4
28 août 2013 à 23:53:30

Je n'ai pas compris tout ce que tu me racontes (faut dire que je suis débutant :noel: )

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 !

Engineer
Engineer
Niveau 12
29 août 2013 à 00:05:57

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.

siniht
siniht
Niveau 4
29 août 2013 à 00:14:10

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

FraisePraline
FraisePraline
Niveau 7
29 août 2013 à 00:27:38

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 :-) .

FraisePraline
FraisePraline
Niveau 7
29 août 2013 à 00:30:01

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>();

:) .

siniht
siniht
Niveau 4
29 août 2013 à 10:18:36

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é :-p

Engineer
Engineer
Niveau 12
29 août 2013 à 10:33:19

Ma solution est plus simple honnetement.

siniht
siniht
Niveau 4
29 août 2013 à 10:50:57

Peut être, mais je ne comprends ni l'une ni l'autre en fait :nonnon:
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 :hum:

TrollDieu
TrollDieu
Niveau 6
29 août 2013 à 11:43:22

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

Engineer
Engineer
Niveau 12
29 août 2013 à 14:58:16

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 :ok: 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.

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment