J'ai un peu (lire: EXTRÊMEMENT) fonction cassé hitwall et je ne vois pas ce que je fais mal

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

  •  27-10-2019
  •  | 
  •  

Question

D'accord, maintenant je travaille sur un petit jeu de DERP-ish basé sur le mouvement brownien, et je travaille sur une fonction mur de succès pour les particules, mais il ne fonctionne pas. En fait, je ne fais qu'exprimer la direction des particules en radians, et chaque fois qu'il frappe un mur, ajouter Pi radians à la direction pour la retourner, mais pour une raison quelconque, il est soit pas appelé ou ne fonctionne pas. Ce sont les peices de code que j'ai, des suggestions sont les bienvenus.

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

}

Et c'est la classe que je utilise pour l'afficher:

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



}

Alors j'ai essayé de changer la fonction de la peinture à la vérification des collisions après avoir agi, et il semble encore comme onHitWall est se sautée, même si après avoir mis dans une déclaration d'impression n'est pas.

Était-ce utile?

La solution

Le problème que vous avez est que vos particules se déplaceront jusqu'à ce qu'ils atteignent un mur, puis la prochaine fois que vous passez par le regard, ils seront toujours dans le mur, tourner autour de nouveau, et continuer à aller dans le mur.

Si vous vérifiez les collisions après votre fonction acte () cela devrait résoudre le problème.

Ils iront dans le mur, voir qu'ils sont dans le mur, et tourner autour. La boucle suivante, ils se déplaceront en arrière sur le mur, et continuer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top