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

Caml Discussion :

Gestion de collisions entre objets mobiles?


Sujet :

Caml

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Gestion de collisions entre objets mobiles?
    Bonjour!

    Dans le cadre d'un projet, je dois programmer un petit jeu, celui-ci en l'occurence: http://members.iinet.net.au/~pontipak/redsquare.html

    J'ai créé l'obstacle et l'ai fait rebondir, ainsi que le carré rouge et les ai enfermés dans un carré de 500*500. Mais là je bloque un peu sur le problème des collisions. Je pense créer une fonction auxiliaire que j'intégrerai à celle qui lance le jeu, un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let aux = fun (a,b) ->
    if a >= b and a <= b+tf then true
    else false;;
    Où a et b seraient les coordonnées respectives du carré rouge et de l'obstacle, et tf la taille de l'obstacle. La fonction vaut vrai si la première est comprise entre l'autre et prend en compte le côté de l'obstacle en rajoutant la taille. Le problème c'est que je ne vois pas trop comment l'intégrer à mon programme, ça fait beaucoup trop de cas à traiter et je ne suis pas sûr que ça fonctionne. J'ai songé à la récursivité, mais je ne vois pas où l'appliquer. C'est assez urgent, donc si vous avez des conseils je suis preneur.

    En complément le code de la fonction principale et les paramètres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    let couleur_carre = red;; (*carré que l'on va déplacer*)
    let couleur_formes = blue;; (*couleur des obstacles*)
    let couleur_fond = white;; (*couleur du fond*)
    let t = 30;; (*côté du carré*)
    let tf = 50;; (*taille des obstacles*)
    let M = 500;; (*largeur et hauteur du cadre*)
     
     
    let rec redsquare = fun (xr,yr,vx,vy) ->
    let a = wait_next_event[Button_down; Poll] in
    if a.button then ()
    else 
    begin
    (*gestion du carré*)
    let (xs,ys) = mouse_pos() in
    let x = if xs < 1 then 1 
    else if xs > M-1-t then M-1-t (*on prend M-1 pour ne pas colorer le bord du cadre*)
    else xs
    and y = if ys < 1 then 1 (*même chose pour y, afin que le carré soit enfermé*)
    else if ys > M-1-t then M-1-t 
    else ys in
    begin
    set_color couleur_carre; (*dessin du carré*)
    fill_rect x y t t;
    delay(40);
    set_color couleur_fond; (*permet d'effacer le carré quand il se déplace*)
    fill_rect x y t t;
    end;
    (*gestion de l'obstacle*)
    set_color couleur_formes; 
    fill_rect xr yr tf tf;
    delay(40);
    set_color couleur_fond;
    fill_rect xr yr tf tf; (*annule la trace du carré*)
    if yr > M-tf or yr < tf 
    then redsquare(xr+vx, yr-vy, vx, -vy) (*rebond vertical*)
    else if xr < tf or xr > M-tf 
    then redsquare(xr-vx, yr+vy, -vx, vy) (*rebond horizontal*)
    else redsquare(xr+vx, yr+vy, vx, vy);
    end;;

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Points : 39
    Points
    39
    Par défaut
    Aye, nos yeux !
    Utilise la balise code, ce que tu as écrit, sans indentation, est tout bonnement illisible. Avant de te lancer bille en tête dans les fonctions, essaye de définir quelques types, genre, le type point, le type rectangle, etc. Pat exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type pt = int*int (* si tu es en coordonnées entières *)
    tye rect = pt * pt (* définit un rectangle par deux points *)
    Puis quelques fonctions utiles, du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    let x (v,_) = v (* extrait l'abscice d'un point*)
    let y (_,v) = v (* extrait l'ordonnée d'un point*)
     
    let est_entre a b c = 
      (** a b c trois entiers. est vrai si a est entre b et c *)
      (a <= (max b c) ) && ( a>= (min b c))
     
    let est_dans p r =
    (** est vrai quand le point p est dans le rectangle r*)
      let c1,c2 = r in (* c1 et c2 sont les deux coins de ton rectangle *)
      (est_entre (x p) (x c1) (x c2) ) && (est_entre (y p) (y c1) (y c2) )
    Je te laisse imagine comment coder ta principale fonction qui va tester si une collision a lieu entre deux rectangles ... Et quelques opérations géométriques de base, du type translater un rectangle par un vecteur.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Ah oui, travailler avec des types et des vecteurs du coup. Ca va demander pas mal de remaniement! J'ai un peu de mal avec ces choses là, ça va être difficile à mettre en oeuvre. Merci du conseil en tout cas (désolé pour les balises, c'est corrigé).

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Points : 39
    Points
    39
    Par défaut
    Allez, encore un petit effort et tu nous indente tout ça proprement (le mode tuareg d'emacs est un must, sinon il y a un plugin ocaml pour eclipse mais je connais mal), et promis, j'essaye de lire ce que tu as écrit.

    De loin, ton programme ressemble à une séquence assez imbitable d'instructions, découpe ça en fonctions propres, qui font peu de choses, mais qui le font bien et juste.

    Pour en revenir aux types, c'est un des éléments qui te permettent d'abstraire ton problème et de penser plus haut niveau (comme les fonctions). Tu ne penses plus en x et y, mais en rectangles. D'ailleurs qui t'empêche d'ajouter un champs pour la couleur de tes rectangles, et donc d'utiliser la même routine pour tous les dessiner. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type g_rect = {
      coord:rect;
      couleur:int*int*int; (*triplet rgb *)
    }
    let dessine_g_rect r = 
      set_color r.couleur;
      let (c1,c2) = r.coord in
      fill_rect c1 c2
    Tu me suis ?
    Alors soyons encore plus fous, et disons que la structure g_rect pourrait contenir un vecteur de déplacement, genre qu'on appliquerait à chaque cycle d'affichage pour calculer de nouvelles coordonnées. Bon, je m'arrête là, j'en ai beaucoup trop dit.

Discussions similaires

  1. Gestion de collision entre BOX
    Par Darkantho dans le forum Mathématiques
    Réponses: 8
    Dernier message: 19/03/2011, 13h38
  2. collision entre deux mobiles
    Par Bastuccio dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 24/09/2009, 08h36
  3. Collision entre souris et objet
    Par youp_db dans le forum SDL
    Réponses: 8
    Dernier message: 26/07/2006, 13h15
  4. GLScene et les collisions entre les objets
    Par HopeLeaves dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/06/2005, 19h45
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

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