prosta animacja 2D

0

Witam wszystkich, jestem tu nowy,
mianowicie mam problem z zrobieniem kolizji miedzy kulkami w animacji 2d, gdy się ze sobą spotkają mają się odbić tak jak od ścian okna, ktoś ma jakiś najprostszy sposób? oto kod

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class PanelAnimacja extends JPanel implements MouseListener{

	Vector v;
	
	PanelAnimacja(){
		v = new Vector();
		addMouseListener(this);
	}
	
		
	public void paintComponent(Graphics g){
		Graphics2D g2D = (Graphics2D)g;
		g2D.setColor(Color.yellow); 
		g2D.fillRect(0,0,getSize().width, getSize().height);
		
		g2D.setColor(Color.blue);

		for(int i=0; i<v.size(); i++){
			Pilka pilka = (Pilka)v.get(i);
			pilka.rysuj(g2D);
		}
			try{
				Thread.sleep(40);
			}catch (InterruptedException e){}
			repaint();
	}
	public void mousePressed (MouseEvent e){
		v.add(new Pilka(e.getX(), e.getY(), getSize().width, getSize().height));
		repaint();
	}
	

	 

    public void mouseReleased (MouseEvent e) { }

    public void mouseEntered (MouseEvent e) { }

    public void mouseExited (MouseEvent e) { }

    public void mouseClicked (MouseEvent e) { }

    void saySomething(String eventDescription, MouseEvent e) {    }
	
	
	
}
import javax.swing.*;
import java.awt.*;

class Pilka  implements Runnable{
	
	int x, y, krok=2, kierX=1, kierY=1, rozmiar=20, szer, wys;
	Thread watek;

	Pilka(int x, int y, int szer, int wys){
		this.x=x;
		this.y=y;
		this.szer=szer;
		this.wys=wys;
		
		if (watek==null)
			watek = new Thread(this);
		watek.start();
	}
	
	public void run (){
		while(true){
			
			if(x<0) kierX=1;
			if(x+rozmiar>szer) kierX=-1; 
			if(y<0) kierY=1;
			if(y+rozmiar>wys) kierY=-1; 
							
			x=x+krok*kierX;
			y=y+krok*kierY;
			
			try{
				Thread.sleep(40);
			}catch (InterruptedException e){}		
		}
	}
	public void rysuj(Graphics2D g){
		g.fillOval(x,y,rozmiar, rozmiar);
	}
}
import javax.swing.*;
import java.awt.*;

class Animacja extends JFrame{
	
	Animacja(){
		super("Animacja");
		setBounds(100,100,1024,680);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		PanelAnimacja  animacja  = new PanelAnimacja();
		
		setContentPane(animacja);
		setVisible(true);
	}
	static public void main (String arg[]){
		new Animacja();
	}
}
1

Jest w internecie masa przykładów jak odliczać kolizje dwóch obiektów. Tak na szybko, bo ogólnie logika tego jest lekko do bani. Rozwiązaniem jest na przykład obliczanie dystansu pomiędzy obiektami + rozmiar obiektu i jeśli współrzędne schodzą ponieżej rozmiaru obiektu wtedy jest kolizja czyli obliczenia dla dx oraz dy.

To nie działa idealnie jak teraz patrzę na to bo nie wykrywa wszystkich kolizji ale nie mam ochoty się w tym grzebać specjalnie. Chcę Cie tylko naprowadzić trochę na trop. Z tego co widzę to w dół rozpoznaje kolizje a kiedy obiekt odbije się do góry wtedy już nie. Ale przynajmniej masz już choć trochę działający przykład. Może ktoś wrzuci konkretniejszy...

W konsoli będzie wyświetlało info o kolizji i Id obiektow

Animacja bez zmian, tylko do Pilka i PanelAnimacja wstaw ten kod.

Pilka

import javax.swing.*;
import java.awt.*;
import java.util.*;

class Pilka  implements Runnable{

    private int x, y, krok=2, kierX=1, kierY=1, rozmiar=20, szer, wys;
    private Thread watek;
    protected int id;
    private boolean _collision = false;

    Pilka(int id, int x, int y, int szer, int wys){
        this.x=x;
        this.y=y;
        this.szer=szer;
        this.wys=wys;
        this.id = id;

        if (watek==null)
            watek = new Thread(this);
        watek.start();
    }

    public void run (){
        while(true){

            if(x<0) kierX=1;
            if(x+rozmiar>szer) kierX=-1;
            if(y<0) kierY=1;
            if(y+rozmiar>wys) kierY=-1;

            x=x+krok*kierX;
            y=y+krok*kierY;

            try{
                Thread.sleep(40);
            }catch (InterruptedException e){}
        }
    }

    public void rysuj(Graphics2D g){
        g.fillOval(x,y,rozmiar, rozmiar);
    }

    private int dx;
    private int dy;

    public void track_other_objects(Vector v) {
        for (int i = 0; i < v.size(); i ++) {
            Pilka pilka  = (Pilka) v.get(i);
            int _id = pilka.getId();
            int _x = pilka.getX();
            int _y = pilka.getY();
            boolean cmpId = (this.id == _id) ? true : false;
            if (!cmpId) {
                //System.out.println(this.id + " " + _id + " --> " + this.x + " " + _x + " " + this.y + " " + _y);
                if (this.x > _x) {
                    dx = (this.x - _x);
                } else {
                    dx = (_x - this.x);
                }
                if (this.y > _y) {
                    dy = (this.y - _y);
                } else {
                    dy = (_y - this.y);
                }
                //System.out.println(this.id + " " + _id + " " + dx + " " + dy);
                if (dx < rozmiar && dy < rozmiar) {
                    System.out.println(" K O L I Z J A    Z    O B I E K T E M   ID: " + pilka.getId());
                    _collision = true;
                } else {
                    _collision = false;
                }
            }
            //System.out.println(this.id + " " + _id + " --> " + this.x + " " + _x + " " + this.y + " " + _y);
        }
    }

    public boolean collision() {
        return _collision;
    }

    public int getId() {
        return this.id;
    }

    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }

}

PanelAnimacja

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class PanelAnimacja extends JPanel implements MouseListener{

    Vector v;
    private int counter_id = 0;

    PanelAnimacja(){
        v = new Vector();
        addMouseListener(this);
    }

    public void paintComponent(Graphics g){
        Graphics2D g2D = (Graphics2D)g;
        g2D.setColor(Color.yellow);
        g2D.fillRect(0,0,getSize().width, getSize().height);

        g2D.setColor(Color.blue);

        for(int i=0; i<v.size(); i++) {
            Pilka pilka = (Pilka) v.get(i);
            pilka.rysuj(g2D);
            //System.out.println(pilka.getId() + " "+ pilka.getX() + " " +pilka.getY());
            pilka.track_other_objects(v);
            if (pilka.collision()) {
                g2D.setColor(Color.red);
            }
        }

        try{
            Thread.sleep(40);
        }catch (InterruptedException e){}
        repaint();
    }
    public void mousePressed (MouseEvent e){
        v.add(new Pilka(counter_id, e.getX(), e.getY(), getSize().width, getSize().height));
        counter_id++;
        repaint();
    }

    public void mouseReleased (MouseEvent e) { }

    public void mouseEntered (MouseEvent e) { }

    public void mouseExited (MouseEvent e) { }

    public void mouseClicked (MouseEvent e) { }

    void saySomething(String eventDescription, MouseEvent e) {    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1