Ich habe eine etwas (lesen Sie: extrem) gebrochene Hitwall -Funktion und ich sehe nicht, was ich falsch mache

StackOverflow https://stackoverflow.com/questions/9346235

  •  27-10-2019
  •  | 
  •  

Frage

Okay, jetzt arbeite ich an einem kleinen Derp-ish-Spiel, das auf Brownian Motion basiert, und ich arbeite an einer Hit-Wall-Funktion für die Partikel, aber es funktioniert nicht. Grundsätzlich drücke ich die Richtung der Partikel in Radiantien aus, und wenn sie eine Wand trifft, füge ich Pi -Radians in die Richtung hinzu, um sie umzudrehen, aber aus irgendeinem Grund wird es entweder nicht bezeichnet oder funktioniert nicht. Dies sind die Codekleie, die ich habe, alle Vorschläge sind willkommen.

import java.awt.*;


public class Particle implements Actor {
protected double xPos;
protected double yPos;
protected Velocity v;
protected Color hue;
protected boolean needsUpdate;

public Particle(){
    this((Math.random()*500),(Math.random()*500),new Velocity((int)(Math.random()*500),(Math.random()*Velocity.TAU)));
}

public Particle(double x, double y, Velocity vel){
    xPos=x;
    yPos=y;
    v=vel;
    hue=Color.red;
    needsUpdate=false;
}

public void draw(Graphics g) {
    g.setColor(hue);
    g.fillOval((int)xPos, (int)yPos, 16, 16);
}

public void act() {
    xPos+=v.getSlopefromDirection();
    yPos+=1;
}

public void onHitWall(int dir) {
    v.setDirection((v.getDirection()+Math.PI)%(Math.PI*2));     
}

public void onHitOther(Actor other) {

}

public boolean canCollide() {
    return true;
}

public int getLeftX() {
    return (int)xPos;
}

public int getRightX() {
    return (int)xPos+4;
}

public int getTopY() {
    return (int)yPos;
}

public int getBottomY() {
    return (int)yPos+4;
}

}

Und dies ist die Klasse, die ich verwende, um sie anzuzeigen:

import java.awt.*;
import java.util.*;
import javax.swing.*;
import static java.lang.System.out;

public class Feild extends JFrame{
protected ArrayList<Actor> actors;
private final int size=500;
protected Thread th;

public Feild(ArrayList<Actor> a){
    super("A Brownian Love Story");
    setSize(size, size);
    actors=a;
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    th = new Thread();
    while(true){
        paint(getGraphics());
    }

}

public void paint(Graphics g){
    super.paint(g);
    //g.fillRect(0, 0, 500, 500);
    for(int i=0;i<actors.size();i++){
        if(actors.get(i).getLeftX()<=0)
            actors.get(i).onHitWall(1);
        if(actors.get(i).getRightX()>=500)
            actors.get(i).onHitWall(2);
        if(actors.get(i).getTopY()<=0)
            actors.get(i).onHitWall(1);
        if(actors.get(i).getBottomY()>=500)
            actors.get(i).onHitWall(2);
        actors.get(i).act();
        actors.get(i).draw(g);
    }
    for(int i=0;i<1000;i++){out.println(i);}
}



}

Deshalb habe ich versucht, die Lackierungsfunktion nach dem Handeln nach Kollisionen zu überprüfen, und es sieht immer noch so aus, als würde Onhitwall übersprungen, obwohl dies nach der Eingabe einer Druckanweisung nicht der Fall ist.

War es hilfreich?

Lösung

Das Problem, das Sie haben, ist, dass sich Ihre Partikel bewegt, bis sie eine Wand treffen. Wenn Sie dann das nächste Mal den Look durchgehen, sind sie immer noch in der Wand, drehen sich wieder um und gehen weiter in die Wand.

Wenn Sie nach Ihrer ACT () -Funktion nach Kollisionen suchen, sollte dies das Problem lösen.

Sie werden in die Wand gehen, sehen, dass sie in der Wand sind und sich umdrehen. In der nächsten Schleife bewegen sie sich zurück aus der Wand und fahren weiter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top