私はやや(読んで:非常に)壊れたヒットウォール機能を持​​っています、そして私は自分が間違っていることを見ていません

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

  •  27-10-2019
  •  | 
  •  

質問

さて、今はブラウンモーションに基づいた小さなデルプ風のゲームに取り組んでおり、粒子のヒットウォール関数に取り組んでいますが、機能していません。基本的に、私はラジアンの粒子の方向を表現しています。壁に当たるたびに、方向にPIラジアンを追加してそれを裏返しますが、何らかの理由で、それは呼び出されていないか、動作しません。これらは私が持っているコードの小石であり、どんな提案でも大歓迎です。

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

}

そして、これは私がそれを表示するために使用しているクラスです:

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



}

そこで、私は塗装関数を演技後に衝突をチェックするように変更しようとしましたが、それはまだ印刷された声明を入れた後ではありませんが、それでもOnhitwallがスキップされているように見えます。

役に立ちましたか?

解決

あなたが持っている問題は、あなたの粒子が壁にぶつかるまで動くことです。そして、次にあなたが外観を通過するとき、彼らはまだ壁にいて、再び振り向き、壁に入り続けることです。

ACT()機能の後に衝突を確認すると、問題が解決するはずです。

彼らは壁に入り、壁にいるのを見て、振り向く。次のループでは、彼らは壁から戻って続け、続行します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top