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]Collisions

News jeu

Expeditions: Samurai veut révolutionner le RPG tactique avec une aventure entièrement jouable en coop

Voir
Pseudo supprimé
Pseudo supprimé 22 octobre 2013 à 17:29:42

Salut tout le monde est-ce que quelqu'un pourrait m'expliquer comment fait-on les collisions entre deux rectangles dans XNA.
Je cherche depuis plusieurs jours mais sans rien trouver.
J'ai vu qu'il y a une methode Intersect ou quelque chose du genre mais je ne sais pas l'utiliser.
Merci d'avance :)

FraisePraline
FraisePraline
Niveau 7
22 octobre 2013 à 17:46:40

Recherche "Collision AABB" :ok: .

:d) http://fr.openclassrooms.com/informatique/cours/theorie-des-collisions/collision-aabb

Pseudo supprimé
Pseudo supprimé 22 octobre 2013 à 17:52:22

Merci j'ai tout compris c'est logique :-)

FraisePraline
FraisePraline
Niveau 7
22 octobre 2013 à 18:16:30

Pas de soucis :) .

Bon courage :-))) .

Pseudo supprimé
Pseudo supprimé 22 octobre 2013 à 18:32:36

J'ai un autre problème j'ai créer une methode qui renvoie un booleen si il y a colision sauf que si mon personnage touche un mur il s'arrete(jusque là c'est normal) mais je n'arrive pas a le faire repartir car il est toujours en contact avec le mur.
Quelqu'un a une solution please?

SonyKtamer
SonyKtamer
Niveau 6
22 octobre 2013 à 19:07:57

Il faut que tu vérifies la collision pour la prochaine position de ton perso et pas la position actuelle.
Par exemple si ton perso bouge vers la droite, tu vérifies en x+1 si il y a collision. Si oui tu stoppe le perso :)

adamo12323
adamo12323
Niveau 7
23 octobre 2013 à 01:03:23

Inutile de refaire une fonction collision tu peut utiliser rectangle.Intersects(rectangle) et sinon un truc très simple si tu utilise un Vector2 tu fait un truc genre :

Vector2 lastposition = position;

ton code mouvement ici

if (rectangle.intersects(rectangle))
position = lastposition;

SonyKtamer
SonyKtamer
Niveau 6
23 octobre 2013 à 01:52:47

adamo :d) Perso je préfère faire une fonction qui renvoie un bool pour chaque coté du perso plutot qu'avec intersects.

Le problème que j'avais, c'était que intersects ne donne pas d'info sur l'axe de collision (sur x ou y)
Par exemple si tu te colles a un mur sur la droite en laissant la touche enfoncée, il va détecter une collision et mettre la vitesse du perso a 0. Mais si ensuite tu veux aller vers le haut en étant collé au mur ton perso ne bouge pas.
Et c'est encore pire pour un platefomer puisque le perso est en permanence en collision avec le sol.

A moins qu'il y ait une autre manière d'utiliser cette fonction à laquelle je n'aurais pas pensé, je trouve l'autre méthode plus pratique :(

adamo12323
adamo12323
Niveau 7
23 octobre 2013 à 02:18:28

bah c'est pas impossible mais faut regarder 3 fois si il ya collision :) , peut être que c'est plus pratique une fonction custom mais bon j'ai toujours utiliser intersects personnellement donc je sais pas :p) sinon le code ca donnerais un truc genre ca :

Vector2 lastposition = position;
Vector2 newposition = position;
if (rect.Intersects(rect2)) // premiere collision
{
position.X = lastposition.X;
//si il ya collision apres mouvement on retourne x a sont acienne position pour voir si il ya toujours collision
//on passe la 2ieme collision
}
if (rect.Intersects(rect2)) // deuxieme collision
{
//si il ya toujours collision on remet X a la nouvelle position ou il etais suposer être et on met y a lancienne
//position et on regarde si il ya toujours collision
//on passe a la 3ieme collision
position.X = newposition.X;
position.Y = lastposition.Y;
}
if (rect.Intersects(rect2)) // troisieme collision
{
//si il ya encore collision c'est que les 2 coté on une collision donc on retourne x et y a lancienne position
position.Y = lastposition.Y;
position.X = lastposition.X;
}

en gros cétais un code que j'utilisais pour une tile-based map ca vois tout les collision :)

Pseudo supprimé
Pseudo supprimé 23 octobre 2013 à 13:42:58

Ah en effet, c'est un soucis assez fréquent chez les débutants, les collision !

J'ai un algo tout chaud la, après, a toi de l'adapter a ton langage de prog.

// posPerso
// posTest
// SI collision posTest ET decors = 1 (s'il y a collision)
// ALORS on change pas posPerso
// SINON SI collision posTest ET decors = 0 (pas de collision)
// ALORS posPerso = posTest (on remplace la position de test par la vraie position)

Pseudo supprimé
Pseudo supprimé 29 octobre 2013 à 14:03:03

leoufdu78170 ton algo est super mais j'ai fait un methode pour savoir quand il y a collision.
Je créer une rectangle posPErso et posTest bref le problème viens là quand dans la classe du joueur je test avec la methode
posTest et le décor je n'arrive pas a atteindre le rectangle du decor, j'ai beau mettre public, static meme de mettre ref mais je n'ai aucun moyen d'acceder à ce rectangle.
Sinon tout marche je pense.
Demander si vous voulez mes class avec le code dedans ce sera peut-etre mieux pour m'aider.

Pseudo supprimé
Pseudo supprimé 29 octobre 2013 à 14:54:42

Y'a aussi cette fonction http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.rectangle.intersect.aspx
Ça renvoie le rectangle correspondant à l'endroit où les 2 rectangles se superposent, ça peut servir pour ensuite décaler le personnage.

adamo12323
adamo12323
Niveau 7
29 octobre 2013 à 21:52:01

si tu la mis dans Game1 (classe par defaut de xna) tu dois l'envoyer a ton object perso donc un truc genre :

public class Perso
{
Game1 game;
public Perso(Game1 game)
{
this.game = game;
}

public void update()
{
//si collision avec game.posTest...
}

}

donc quand tu creer ton perso dans la classe Game1 tu lui met this genre ca :
Perso perso = new Perso(this);
ca va tout lui envoyer les variable de ta classe principale

METHODE 2 :
sinon l'autre solution c'est de creer un autre classe a part exemple une class collision en public static et les variable rectangle a l'interieur aussi en static

Pour creer des variables "Globales" aussi :)

public static class CollisionTest
{
public static Rectangle posTest = new Rectangle(0,0,32,32);
}

vue que la classe est static pas besoin de creer un instance donc tu peut directement aller chercher les variables a l'interieur

donc a partir de ta classe perso ou game1 ou n'importe quel classe tu peut faire : CollisionTest.posTest

bonne chance :)

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