Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    25

    collisioni cerchi e rettangoli

    Ciao, sto implementando un piccolo programma 2D che disegni due o più oggetti, tutti cerchi. Il problema è che tra un frame e l'altro devo aggiornarne la posizione di ogni cerchio, controllare se nella stada che hanno percorso hanno colliso con qualcosa, e in quel caso farla rimbalzare.

    Pensavo di creare un rettangolo che contenga l'area occupata dal tempo T(attuale) al tempo Tf(spostamento per frame) per ogni cerchio creando una raccolta, controllare se nella raccolta collidono tra loro con una getBounds(), trovar la collisione che avviene prima, diciamo al tempo T1, aggiornare gli oggetti al tempo T1 e ricominciare.(credo che verrà moolto lento)

    Ho anche notato che forse posso usare la classe Path2D ma non riesco a capire come funziona. Qualcuno mi dà una mano?

    grazziee

    edit.: forse conviene che ogni figura, quando viene chiamato il metodo muovi() controlli se nello spostamento collida con qualcosa ed eventualmente calcolare il ribalzo e trasmettere il vettore rimbalzo all'altra figura, che registra il vettore nei suoi spostamenti.
    poi basta chiamare in sequenza il metodo muovi(), credo
    consigli??

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    il controllo ti conviene farlo per via matematica: due cerchi hanno punti in comune quando la distanza tra i loro centri è minore o uguale alla somma dei raggi (nel caso di uguaglianza in particolare hai la tangenza)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    25
    giusto, se solo i cerchi fossero fermi... il problema è che sono in movimento e tra un'aggiornamento e l'altro di posizione si possono anche muovere più della loro lunghezza, di conseguenza 2 cerchi anzichè incontrarsi a metà strada e rimbalzare "si saltano", esattamente come nel mio secondo sistema..
    proverò a implementare il primo sistema che ho scritto, spero di non perdere troppo in prestazioni

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ma qual è il problema? se si spostano, avrai la direzione e la velocità del moto. ad ogni refresh fai il controllo (con le nuove posizioni dei centri, che dovrai avere visto che stai andando a disegnare questi cerchi) ed il gioco è fatto.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    25
    grazie per l'aiuto,
    non mi sono spiegato bene. Ti allego un'immagine esplicativa così non ci sono problemi. le coordinate sono in double quindi è impossibile controlare tutte le posizioni (anche approssimativamente perchè abbasserei troppo gli fps)... nell'immagine nella prima riga trovi in azzurro la distanza e direzione che si vogliono percrrere in un singolo aggiornamento; nella seconda riga le risposte nella colonna di sinistra del metodo matematico, a destra il metodo che cerco(il disegno è fatto a mano e male, ma il rimbalzo dovrebbe essere elastico).
    help!
    Immagini allegate Immagini allegate

  6. #6
    Sembra un'ovvietà ma, dovresti separare il modello matematico fisico, dalla rappresentrazione grafica.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    25
    cioè? basandomi sul primo modello che ho postato sto creando questa classe (che rappresenta un cerchio):

    Codice PHP:
    public class ModuloScudo extends Modulo{

        public 
    double raggio;
        public 
    double x;
        public 
    double y;

        public 
    void azione(long gameTimestamp){ //metodo astratto presente in Modulo
        
    }

        public 
    void calcolaRimbalzo(ModuloScudo b){
                    
    //manca ancora tutta la parte matematica
        
    }

        public 
    boolean itersecaFermo(ModuloScudo b){
            return 
    false;//manca ancora tutta la parte matematica
        
    }

        public 
    boolean itersecaFermo(java.awt.Rectangle b){
            return 
    false;//manca ancora la parte matematica
        
    }

        public 
    boolean itersecaMovimento(ModuloScudo b){
            return 
    false;//manca ancora la parte matematica
        
    }

        public 
    boolean itersecaMovimento(java.awt.Rectangle b){
            return 
    false;//manca ancora la parte matematica
        
    }

        public 
    double getX(){
            return 
    x;
        }

        public 
    double getY(){
            return 
    y;
        }

        public 
    void setDanno(double danno){
            
    setVita(getVita() - danno);
        }

        public 
    void setX(double x){
            
    this.x;
        }

        public 
    void setY(double y){
            
    this.y;
        }



Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.