IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Création de jeux vidéo Discussion :

Une fonction de collision


Sujet :

Création de jeux vidéo

  1. #1
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 145
    Points : 83
    Points
    83
    Par défaut Une fonction de collision
    Bonjour

    Si quelqu'un veut de ma fonction de détection de collision :
    C'est uneclassique hein, je la mets juste à disposition pour ceux qui en cherchent.

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function Collize(elem1,elem2){
    	if((elem1.X>elem2.X)&&(elem1.Y>elem2.Y)||(elem1.X<elem2.X+elem2.W)&&(elem1.Y<elem2.Y+elem2.H)){
    		return true; // Collizion.
    	}else return false;
     
    }



    Elle peut servir normalement meme à collizionner un écran, pour savoir si un objet est dans l'écran ou hors de l'écran, quelque soit le coté bien sûr.

    Elle sert à la collision d'un objet avec un autre objet.

    Elle retourne true si collision.


    Un exemple d'utilisation : Le Draw est effectué seulement si les deux éléments sont en collision, remarquez le signe "!" (Not collision, dans notre cas.)

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function Vague_Draw(){
     
    	Tennemis1.forEach(vaiss =>{
    		// Si le vaisseau ne collizionne pas avec l'écran, il est hors écran, on empêche le Draw.
    		if(!Collize(vaiss,Screen)){
    			vaiss.Draw(ctx1);
    		}
     
    	})
     
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je suis pas convaincu que ce soit utile à quiconque tant c'est trivial et basique mais admettons que ça fait pas de mal - si tenté que le code était correct.
    - Collision en anglais c'est collide / collider.
    - Tu as le droit de mettre des espaces dans ton code, au pire il sera plus lisible.
    - La bonne pratique veut que l'on ne mélange pas && et || parce que autant oui il y a une règle claire sur lequel a priorité, autant c'est facilement mélangeant et une paire de parenthèses ne coûte rien.
    - Avoir une fonction IsBetween est bien souvent pratique et permet une meilleure lisibilité à faible coût.
    - Mais surtout, ton test est incomplet et incorrect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (elem1.X>elem2.X)&&(elem1.Y>elem2.Y)
    En supposant que le 0,0 est en haut à gauche, avec des axes qui vont vers la droite et le bas, ça c'est juste pour vérifier que l'origine de elem1 est en bas à droite de l'origine de elem2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (elem1.X<elem2.X+elem2.W)&&(elem1.Y<elem2.Y+elem2.H)
    Et là c'est juste pour savoir si l'origine de elem1 se trouve en haut à gauche du coin bas droit de elem2.
    Mais vu que ton test est vrai dès que l'origine de elem1 est en bas à droite de l'origine de elem2 (parce que && a priorité sur ||)... la seconde partie est uniquement évaluée quand l'origine de elem1 n'est pas en bas à droite de elem2, et dans ce cas toujours vrai si l'origine de elem1 est cette fois située en haut à gauche du coin bas droit de elem2.
    Donc finalement, quand est-ce que ce truc est faux : quand l'origine de elem1 se situe en haut à droite du coin haut droit de elem2, ou en bas à gauche du coin bas gauche de elem2.

    Donc pour un elem2 donné, en rouge dans le dessin suivant, tu retournes true et prétends qu'il y a collision dès que elem1 a son origine dans la zone hachurée en jaune (zones ouvertes et donc qui s'étendent à l'infini dans leurs directions respectives)
    Nom : valid-area.png
Affichages : 50
Taille : 1,08 Mo

    https://jeux.developpez.com/tutoriel...es-collisions/
    https://jeux.developpez.com/tutoriel...es-2d-simples/
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 145
    Points : 83
    Points
    83
    Par défaut
    Oui, tu as raison sur tous les points mais surtout je vois que mon code a eu l'utilité que tu nous as donné des tas d'informations interessantes, merci

    Par contre : Je voulais tester le Point haut gauche de elem2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (elem1.X>elem2.X)&&(elem1.Y>elem2.Y)
    ET là je voulais tester le coin bas droit de elem2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (elem1.X<elem2.X+elem2.W)&&(elem1.Y<elem2.Y+elem2.H)
    Donc au final cela me semblait juste qu'il y ait collision si elem1.X se trouve dans la limite de Elem2.X à Elem2.X+Elem2.W


    Idem pour les Y


    Au final, je constate que dans la pratique, cette fonction marche bien, et je l'utilise.

    N'empêche il faut que j'analyse ce que tu me fais remarquer à tête reposée car je suis nul en géométrie et en math

Discussions similaires

  1. aide pour une fonction collision en bash
    Par dipper dans le forum Linux
    Réponses: 5
    Dernier message: 14/04/2011, 23h21
  2. Modification d'une droite en fonction des collisions
    Par Remizkn dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 26/11/2009, 16h15
  3. Réponses: 1
    Dernier message: 02/06/2008, 11h30
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo