Algorithmus für bessere Kollisionsabfragen

Feeder

Bekanntes Mitglied
Hey, in folgendem Programm soll eine zufällige Anzahl an 2D-Bällen erstellt werden, diese sollen wenn sie mit anderen Bällen kollidieren mit diesen verschmelzen und im Falle, das sie am Rand der Frame kommen, abprallen.

Vor allen Dingen die korrekte Kollisionsabfrage am Rand ist mir wichtig, leider geschieht es nicht selten, dass die Bälle am Rande "kleben" bleiben, da sie nicht mehr die Grenze in das Spielfeld überschreiten.

Dafür suche ich bessere Kollisionabfragen. Könnte jemand Code- oder theoretische Vorschläge geben?

Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TheWalkerAI {
    JFrame frame;
    AIPanel panel;
    JLabel label;
    ArrayList<Walker> was;
    long lastTime;
    public TheWalkerAI() {
        init();
        while(true) {
        long before = System.currentTimeMillis();
        double delta = (System.currentTimeMillis() - lastTime)*0.001;
        calculate(delta);
        lastTime = before;
        repaint();
   
//        try {
//            Thread.sleep(1);
//        } catch (InterruptedException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
        label.setText( was.size() + " Walkers initialized," + " running by " + Math.round((1/delta)) + " FPS");

        }
    }
    private void calculate(double deltatime) {
        for(int i = 0; i < was.size(); ++i) {
        was.get(i).checkObjectCollision(was, i);
        was.get(i).step(deltatime);
   
        }
    }
    private void repaint() {
        label.repaint();
        panel.repaint();
        frame.repaint();
       
    }
    private void init() {
        lastTime = System.currentTimeMillis();
        frame = new JFrame();
        frame.setBounds(0, 0, 1000, 1000);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBackground(Color.BLACK);
        frame.setResizable(true);
        frame.setTitle("Ellipses rolling...");
        panel = new AIPanel();
        frame.add(panel);
        frame.addComponentListener(new ComponentListener() {
           
            @Override
            public void componentShown(ComponentEvent e) {
                // TODO Auto-generated method stub
               
            }
           
            @Override
            public void componentResized(ComponentEvent e) {
                label.setLocation(0, frame.getHeight()-60);
               
            }
           
            @Override
            public void componentMoved(ComponentEvent e) {
                // TODO Auto-generated method stub
               
            }
           
            @Override
            public void componentHidden(ComponentEvent e) {
                // TODO Auto-generated method stub
               
            }
        });
        label = new JLabel();
        label.setBounds(0, frame.getHeight()-60, 280, 20);
        label.setForeground(Color.WHITE);
        label.setBackground(Color.BLACK);
        label.setOpaque(true);
        panel.add(label);
        panel.setLayout(null);
        createWalkers(600, 1000, 1000,40);
    }
    public void createWalkers(int max, double maxspeedy, double maxspeedx, double maxradius) {
        long length = (Math.round((max)*Math.random()));
        was = new ArrayList<Walker>();
        for(int i = 0; i < length; ++i) {
            double xspeed = maxspeedx * Math.random() - 0.5*maxspeedx;
            double yspeed = maxspeedy * Math.random() - 0.5*maxspeedy;
            double radius = maxradius * Math.random() + 10;
            was.add(new Walker(frame,new Vector(xspeed, yspeed), radius, new Vector(frame.getWidth() * Math.random(), frame.getHeight()*Math.random())));
        }
       
    }
    public static void main(String[] args) {
        new TheWalkerAI();
   
       
    }
    public class AIPanel extends JPanel {
         public void paintComponent(Graphics g) {
            for(int i = 0; i < was.size(); ++i) {
                was.get(i).display(g);

            }
         }
    }

}

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;

public class Walker {
    JFrame motherframe;
    Vector pos;
    double radius;
    Vector speed;
    Color color;
    public Walker(JFrame frame, Vector speed, double radius) {
        double x = frame.getWidth()/2;
        double y = frame.getHeight() / 2;
        pos = new Vector(x, y);
        this.radius = radius;
        motherframe = frame;
        Random ra = new Random();
        int r = ra.nextInt(256);
        int cg = ra.nextInt(256);
        int b = ra.nextInt(256);
        color = new Color(r, cg, b);
    }
    public Walker(JFrame frame, Vector speed, double radius, Vector position) {
        this.speed = speed;
        this.radius = radius;
        motherframe = frame;
        this.pos = position;
        Random ra = new Random();
        int r = ra.nextInt(256);
        int cg = ra.nextInt(256);
        int b = ra.nextInt(256);
        color = new Color(r, cg, b);
    }
    public void step(double time) {
        double posaddx = speed.getX()*time;
        double posaddy = speed.getY()*time;

        if(pos.getX() + posaddx + radius < motherframe.getWidth() && pos.getX() + posaddx > 0 ) {
            pos.setX(pos.getX()+posaddx);
   
        }
        else {
            //Abstand zu Ende berechnen
            //Addieren Teil von posaddx hinzu
            //Subtrahieren den rest hinzu
            //Negieren der Geschwindigkeit
                if (speed.getX() > 0){
                    double r = motherframe.getWidth() - (pos.getX() + radius);
                    pos.setX(pos.getX()+r);
                    posaddx = posaddx - r; //Übriger Teil
                    pos.setX(pos.getX()+posaddx);
                    speed.setX(-speed.getX());
            }     else {
               
                    double r = pos.getX() - radius;
                    pos.setX(pos.getX()+r);
                    posaddx = posaddx - r; //Übriger Teil
                    pos.setX(pos.getX()+posaddx);
                    speed.setX(-speed.getX());
                   
            }
        }
       
        if(pos.getY() + posaddy + radius < motherframe.getHeight() && pos.getY() + posaddy > 0) {
            pos.setY(pos.getY()+posaddy);
        } else {
            //Abstand zu Ende berechnen
            //Addieren Teil von posaddx hinzu
            //Subtrahieren den rest hinzu
            //Negieren der Geschwindigkeit
                if(speed.getY() >= 0) {
                    double r = motherframe.getHeight() - (pos.getY() + radius);
                    pos.setY(pos.getY()+r);
                    posaddy = posaddy - r; //Übriger Teil
                    pos.setY(pos.getY()+posaddy);
                    speed.setY(-speed.getY());
            }      else {
                double r = pos.getY() - radius;
                pos.setY(pos.getY()+r);
                posaddy = posaddy - r; //Übriger Teil
                pos.setY(pos.getY()+posaddy);
                speed.setY(-speed.getY());
   
            }
        }

    }
    public void display(Graphics g) {
        g.setColor(color);
        g.fillOval((int)Math.round(pos.getX()-radius*0.5), (int)Math.round(pos.getY()-radius*0.5), (int)radius, (int)radius);

    }
    public void checkObjectCollision(ArrayList<Walker> was, int himself) {
        for(int i = himself+1; i < was.size(); ++i) {
            if(i != himself){
                if((this.pos.distance(was.get(i).pos) <= this.radius + was.get(i).radius)) {
                    Walker wa = was.get(i);
                    was.remove(i);
                    int g = (int) Math.round((wa.color.getGreen() + this.color.getGreen()) * 0.5);
                    int r = (int) Math.round((wa.color.getRed() + this.color.getRed()) * 0.5);
                    int b = (int) Math.round((wa.color.getBlue() + this.color.getBlue()) * 0.5);
                    color = new Color(r,g,b);
                    this.radius = Math.pow(this.radius*this.radius + wa.radius*wa.radius, 0.5);
                    this.pos.setX((this.pos.getX()+wa.pos.getX())*0.5);
                    this.pos.setY((this.pos.getY()+wa.pos.getY())*0.5);
                    this.speed.setX((this.speed.getX()+wa.speed.getX())*0.5);
                    this.speed.setY((this.speed.getY()+wa.speed.getY())*0.5);
                }
            }
        }
       
    }
}

Java:
public class Vector extends java.awt.Point{

    private static final long serialVersionUID = 5704073610770567171L;
    public void setX(double x) {
        this.x = x;
    }
    public void setY(double y) {
        this.y = y;
    }
    double x,y;
    public Vector(double x, double y) {
        this.x = x;
        this.y = y;
    }
    @Override
    public double getX() {
        // TODO Auto-generated method stub
        return x;
    }

    @Override
    public double getY() {
        // TODO Auto-generated method stub
        return y;
    }

    @Override
    public void setLocation(double x, double y) {
        this.x = x;
        this.y = y;
       
    }
    public void rotate(double angle) {
            double rx = (this.x * Math.cos(angle)) - (this.y * Math.sin(angle));
            double ry = (this.x * Math.sin(angle)) + (this.y * Math.cos(angle));
            x = rx;
            y = ry;
       
    }
    public void add(Vector v) {
        this.y += v.getY();
        this.x += v.getX();
    }
   

}
 

mrBrown

Super-Moderator
Mitarbeiter
Dann fang genau den Fall ab. Wenn sie außerhalb der Grenzen sind, werden sie wieder rein gesetzt.


Deine Vector-Klasse ist btw völliger Unsinn.
 

Feeder

Bekanntes Mitglied
Dann fang genau den Fall ab. Wenn sie außerhalb der Grenzen sind, werden sie wieder rein gesetzt.


Deine Vector-Klasse ist btw völliger Unsinn.

Ich probiers mal aus. Danke!

Wie soll den die Vector Klasse aussehen? Hatte sie mittlerweile abgeändert:

Java:
public class Vector extends java.awt.Point{

    public void setX(double x) {
        this.x = x;
    }
    public void setY(double y) {
        this.y = y;
    }
    double x,y;
    public Vector(double x, double y) {
        this.x = x;
        this.y = y;
    }
    @Override
    public double getX() {
        // TODO Auto-generated method stub
        return x;
    }

    @Override
    public double getY() {
        // TODO Auto-generated method stub
        return y;
    }

    @Override
    public void setLocation(double x, double y) {
        this.x = x;
        this.y = y;
       
    }
    public void rotate(double angle) {
            double rx = (this.x * Math.cos(angle)) - (this.y * Math.sin(angle));
            double ry = (this.x * Math.sin(angle)) + (this.y * Math.cos(angle));
            x = rx;
            y = ry;
       
    }
    public Vector add(Vector v) {
        double y = this.y + v.getY();
        double x = this.x + v.getX();
        return new Vector(x, y);
    }
    public Vector sub(Vector v) {
        double y = this.y - v.getY();
        double x = this.x - v.getX();
        return new Vector(x, y);
    }
    public Vector multiply(double d) {
        Vector v = new Vector(getX()*d, getY()*d);
        return v;
    }
   

}
 

Feeder

Bekanntes Mitglied
Habe die Vector Klasse erstmal überschrieben...

Java:
public class Vector {
    double x,y;
    public Vector(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public void setX(double x) {
        this.x = x;
    }
    public void setY(double y) {
        this.y = y;
    }

    public double getX() {
        // TODO Auto-generated method stub
        return x;
    }

    public double getY() {
        // TODO Auto-generated method stub
        return y;
    }

    public void setLocation(double x, double y) {
        this.x = x;
        this.y = y;
       
    }
    public void rotate(double angle) {
            double rx = (this.x * Math.cos(angle)) - (this.y * Math.sin(angle));
            double ry = (this.x * Math.sin(angle)) + (this.y * Math.cos(angle));
            x = rx;
            y = ry;   
    }
    public void add(Vector v) {
        y = this.y + v.getY();
        x = this.x + v.getX();
   
    }
    public void sub(Vector v) {
        y = this.y - v.getY();
        x = this.x - v.getX();
   
    }
    public void multiply(double d) {
        x = x*d;
        y = y*d;
    }
    public void div(double d) {
        x = x/d;
        y = y/d;
    }
    public double mag() {
          return Math.pow((x*x + y*y), 0.5);
        }
    public void normalize() {
        double m = mag();
        div(m);
    }
    public double distance(Vector b) {
        Vector c = this.clone();
        c.sub(b);
        double x = this.mag();
        return x;
       
    }
    public Vector clone() {
        Vector v = new Vector(this.getX(), this.getY());
        return v;
       
    }
   
   

}
 

mrBrown

Super-Moderator
Mitarbeiter
Ich würde uU sogar trennen zwischen Vektor als Richtungsvektor und Vektor als Punkt, das macht's manchmal übersichtlicher.
Und (ist aber persönliche Präferenz) die Klasse immutable machen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Anderer Algorithmus für Bounding Box Spiele- und Multimedia-Programmierung 9
Z Minimax-Algorithmus für TicTacToe Spiele- und Multimedia-Programmierung 5
S Algorithmus zur Ressourcesuche für die KI Spiele- und Multimedia-Programmierung 5
Fabel TicTacToe MiniMax Algorithmus geht nicht Spiele- und Multimedia-Programmierung 4
Z Such-Algorithmus Spiele- und Multimedia-Programmierung 2
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
E Pathfinding Algorithmus Spiele- und Multimedia-Programmierung 2
B minimax Algorithmus Spiele- und Multimedia-Programmierung 5
S Problem mit 4 gewinnt(MinMax Algorithmus) Spiele- und Multimedia-Programmierung 2
S A*-Algorithmus Spiele- und Multimedia-Programmierung 12
S A* Algorithmus Spiele- und Multimedia-Programmierung 14
C Algorithmus um Flächen zu erkennen Spiele- und Multimedia-Programmierung 6
L Fehlersuche beim Weichzeichner-Algorithmus Spiele- und Multimedia-Programmierung 9
A Negamax-Algorithmus Spiele- und Multimedia-Programmierung 7
B Umsetzung des Minimax-Algorithmus Spiele- und Multimedia-Programmierung 2
N Minecraft Frage für einen Minecraft Server Spiele- und Multimedia-Programmierung 2
Drachenbauer Speicher-Tool für ein Spiel schreiben Spiele- und Multimedia-Programmierung 13
B Deepmind Poker Bot für PokerStars konfigurieren? Spiele- und Multimedia-Programmierung 2
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
K Wie bekomme ich eine Transition für alle Objekte zum stoppen? Spiele- und Multimedia-Programmierung 1
E Organisation für Game Spiele- und Multimedia-Programmierung 1
Excess Ballerfisch für Android Spiele- und Multimedia-Programmierung 3
coolian ich brauche irgendeine gui lib für lwjgl2 Spiele- und Multimedia-Programmierung 51
MiMa MP3 Dateien für Metadaten abgleichen Spiele- und Multimedia-Programmierung 0
Freshy Bot für Discord Spiele- und Multimedia-Programmierung 61
R Ideen für die Backend-Entwicklung eines Games gesucht Spiele- und Multimedia-Programmierung 8
G Mikrophon-/Audiosteuerung für einen Character Spiele- und Multimedia-Programmierung 1
P Tennis- Spielstand- Zähler für Schule programmieren Spiele- und Multimedia-Programmierung 6
M Logik für ein Quiz Spiele- und Multimedia-Programmierung 7
P Hilfe für Seminar Arbeit Spiele- und Multimedia-Programmierung 9
MiMa Metadaten für Multimedia Daten ermitteln Spiele- und Multimedia-Programmierung 4
G Übungsprogramm für Matheaufgaben Spiele- und Multimedia-Programmierung 1
S Bilder Für Schachfiguren Spiele- und Multimedia-Programmierung 14
Timo_neu_in_java Suche etwas einfaches für Anfänger Spiele- und Multimedia-Programmierung 6
I Minecraft Suche Plugin Developer für Minecraft Netzwerk! Spiele- und Multimedia-Programmierung 2
S GUI erstellen für Text Adventure Spiele- und Multimedia-Programmierung 4
S Eigene Klasse vec_t - 3 oder 4 Einheiten für x, y, z und w Spiele- und Multimedia-Programmierung 11
R Vererbbarer GameLoop für Engine Spiele- und Multimedia-Programmierung 14
J Vektor für Gravitation erzeugen Spiele- und Multimedia-Programmierung 34
I Minecraft: Craftingrecipe für Braustand ändern Spiele- und Multimedia-Programmierung 9
H KI für Spiele Spiele- und Multimedia-Programmierung 1
S Pssende Datenstruktur für ein Netz Spiele- und Multimedia-Programmierung 5
S MouseEvents für Sprites Spiele- und Multimedia-Programmierung 3
I Spectator Modus für Spiel ähnlich zu Terraria Spiele- und Multimedia-Programmierung 8
K Bestes Bildformat für Spielegrafiken und deren Einbindung in Java Spiele- und Multimedia-Programmierung 2
J mehrere Listener für einen Button / Label Spiele- und Multimedia-Programmierung 1
C Port umleiten: lesen und schreiben für MCServer-Client über Skype Spiele- und Multimedia-Programmierung 0
J Musik Bibliothek für GUI Spiele- und Multimedia-Programmierung 7
B Hauptmenü für Spiel Spiele- und Multimedia-Programmierung 1
R Ratschlag für 2D-3D Engine für die Spieleentwicklung gesucht Spiele- und Multimedia-Programmierung 4
Androbin KI für Verfolgung im Raster Spiele- und Multimedia-Programmierung 2
A Bot für Browsergame Spiele- und Multimedia-Programmierung 2
H Tutorials für Fortgeschrittene 3D-Anwedungen Spiele- und Multimedia-Programmierung 2
lord239123 suche Graphiker für ein Pokemon-Spiel Spiele- und Multimedia-Programmierung 6
Furtano Vektoren für Bewegung für eine 2D-Simulation Spiele- und Multimedia-Programmierung 3
T Sinusgenerator für eine Hp Spiele- und Multimedia-Programmierung 8
J Menü für Snakespiel in einzelnem JFrame Spiele- und Multimedia-Programmierung 5
M Minecraft weitere Java Entwickler für minecraft projekt gesucht Spiele- und Multimedia-Programmierung 0
Guybrush Threepwood Ketzerische Frage: Opus-Codec für Java Spiele- und Multimedia-Programmierung 14
L Hilfe bei Klassendesign für Spiel Spiele- und Multimedia-Programmierung 2
N Animationen für ein 2D game Spiele- und Multimedia-Programmierung 6
S Aufbau für 2D Spiele Spiele- und Multimedia-Programmierung 7
L Client für ein Browsergame Spiele- und Multimedia-Programmierung 21
Devil0s Swing Elemente für Inventar? Spiele- und Multimedia-Programmierung 9
Kenan89 Ansatzfrage: Kartenspiel für 2 Spieler Online Spiele- und Multimedia-Programmierung 3
F Ideen für spiel Spiele- und Multimedia-Programmierung 4
P Spielfeld für RPG Spiele- und Multimedia-Programmierung 15
Hoppelmann Alphamap (Bild) für 3D-Terrain generieren Spiele- und Multimedia-Programmierung 2
M Farbwerte für Flächen aus einem Bild erkennen Spiele- und Multimedia-Programmierung 3
K Einfache Engine für einfaches 3D gesucht Spiele- und Multimedia-Programmierung 10
C KI für Skatspiel - Wie können die Computerspieler eigenständig handeln? Spiele- und Multimedia-Programmierung 10
S Aufbau von Klassen für Spiel Spiele- und Multimedia-Programmierung 13
Kenan89 Kleines Projekt für Java Spiele- und Multimedia-Programmierung 5
M Empfehlungen für ein 2D-Jump'n'run Spiele- und Multimedia-Programmierung 4
A Grundlagensuche für Spiel Spiele- und Multimedia-Programmierung 8
C Wo ist der MP3 Plugin für JMF? Spiele- und Multimedia-Programmierung 3
qwerqer Design Pattern gesucht für Spielregeln Spiele- und Multimedia-Programmierung 2
M Java als Programmiersprache für kommerzielle Spieleentwicklung? Spiele- und Multimedia-Programmierung 3
K Game Engine für selbstprogrammiertes Spiel Spiele- und Multimedia-Programmierung 27
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
A Music für Android game Spiele- und Multimedia-Programmierung 3
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
M Minecraft Suche Java Programmierer (für Minecraft) Spiele- und Multimedia-Programmierung 2
Luk10 Tipps für bessere Animationen / Grafik Engine Spiele- und Multimedia-Programmierung 2
T 2D Menü für 3D Spiel Spiele- und Multimedia-Programmierung 5
T Grundlagenwissen für den 3D Raum Spiele- und Multimedia-Programmierung 6
I getSubImage sorgt für starken Performanceeinbruch Spiele- und Multimedia-Programmierung 6
M technologie für video, webcam & co Spiele- und Multimedia-Programmierung 25
C Java für große Spiele geeignet ? Spiele- und Multimedia-Programmierung 101
D Libraryempfehlung für Effekte Spiele- und Multimedia-Programmierung 3
B Spiele programmieren für ein Fenster? Spiele- und Multimedia-Programmierung 14
D Tabelle für Spiel Spiele- und Multimedia-Programmierung 3
N Grundlagen für ein Jump&Run Spiele- und Multimedia-Programmierung 3
S Datenbank gesucht für Bilder(gif-dateien) Spiele- und Multimedia-Programmierung 5
J Suche 3D Programm für jMonkeyEngine Spiele- und Multimedia-Programmierung 5
W 3D-APIs für Java - Eine Übersicht Spiele- und Multimedia-Programmierung 8
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
S Game Client für kleine Competition Spiele- und Multimedia-Programmierung 3
F Programm für Bildbearbeitung gesucht: Skalieren und Speichern Spiele- und Multimedia-Programmierung 6
K Lösungsansätze für ein Spiel Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben