Tengo una función de muro de hit broken algo (leída: extremadamente) y no veo lo que estoy haciendo mal

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Muy bien, ahora estoy trabajando en un pequeño juego DERP-ish basado en el movimiento browniano, y estoy trabajando en una función de pared de golpe para las partículas, pero no funciona. Básicamente, estoy expresando la dirección de las partículas en radianes, y cada vez que golpea una pared, agrego pi radianes a la dirección para voltearlo, pero por alguna razón, no se llama o no funciona. Estas son los pis de código que tengo, cualquier sugerencia es bienvenida.

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;
}

}

Y esta es la clase que estoy usando para mostrarla:

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);}
}



}

Así que intenté cambiar la función de pintura a verificar las colisiones después de actuar, y todavía parece que Onhitwall está siendo saltado, aunque después de poner una declaración de impresión no lo es.

¿Fue útil?

Solución

El problema que tiene es que sus partículas se moverán hasta que golpeen una pared, y luego la próxima vez que pase por el aspecto, todavía estarán en la pared, se darán vuelta nuevamente y continuarán entrando en la pared.

Si verifica las colisiones después de su función de ACT (), esto debería resolver el problema.

Entrarán en la pared, verán que están en la pared y se darán la vuelta. En el siguiente bucle, volverán a salir de la pared y continuarán.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top