-1

私はJavaで基本的な落下砂ゲームを作成しようとしています。各パーティクルには、XとYがポイント配列に格納されています。各Point配列はその要素に固有であるため、砂と水は2つの異なる配列です。私が知りたいのは、砂の配列をそれ自体に対してチェックして、2つの粒子が同じ位置にあるかどうかを確認し、同じ位置にある場合はそれらを移動する方法です。 ?

これは私の砂のクラスです

    package testingzone;

import java.awt.Point;
import java.util.Stack;

import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;

public class Sand {

    public Graphics g = new Graphics();
    public float sizeX = 1;
    public float sizeY = 1;
    public int speed = 1;
    public String BaseState = "fall";
    public String state = "fall";
    public String Name = "Sand";
    public Point[] point = new Point[(600 * 800)];
    public Point[] pointcheck = new Point[(600 * 800)];
    public int num = 0;
    public boolean check = false;

    public org.newdawn.slick.Color c = org.newdawn.slick.Color.yellow;

    public void drawParticle(float x, float y) throws SlickException{
        g.setColor(c);
        g.drawRect(x, y, sizeX, sizeY);
    }

    public void createParticle() throws SlickException{
        if(state == "fall"){
            fall(point);
        } else {

        }
        if(state == "stay"){
            stay(point);
        } else {

        }
    }

    public void fall(Point[] point) throws SlickException{
        for (int index = 0; index < point.length; index++) {
            Point p = point[index];
            if (p != null) {
                if (p.y >= 598) {
                    drawParticle(point[index].x, 598);
                } else {
                    drawParticle(p.x, p.y);
                    p.y += speed;
                }
              }
            }
          }

    public void stay(Point[] point) throws SlickException{
        for (int index = 0; index < point.length; index++) {
            Point p = point[index];
            if (p != null) {
                drawParticle(p.x, p.y);
                }
              }
            }

}

そしてこれは私のメインクラスの簡略版です

    package testingzone;
import java.awt.Point;
import org.lwjgl.input.Mouse;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class Control extends BasicGameState {
    public static final int ID = 2;

    public Sand s = new Sand();

    public Run run = new Run();
    int maxnum = (800 * 600);
    int pressedX;
    int pressedY;
    int num = 0;
    String Build = "1.4";
    String Element = "sand";
    String name;
    public boolean endgame = false;


    public void init(GameContainer container, StateBasedGame game) throws SlickException{
    }

    public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException {
        if(Element == "sand"){
            s.createParticle();
            name = s.Name;
        }
        g.setColor(Color.yellow);
        g.drawRect(240, 10, 15, 15);
        g.fillRect(240, 10, 15, 15);
        if(Element == "sand"){
            // g.setColor(Color.white);
            // g.drawRect(235, 5, 25, 25);
            g.drawLine(235, 35, 260, 35);
        }
        g.setColor(Color.white);
        g.drawString("Open Sand", 700, 0);
        g.drawString("Build: " + Build, 700, 15);
        g.drawString("Total Pixels: " + num, 10, 25);
        g.drawString("Current Type: " + name, 10, 40);
        g.drawString("Mouse X: " + Mouse.getX(), 10, 55);
        g.drawString("Mouse Y: " + Mouse.getY(), 10, 70);
        }


    public void update(GameContainer container, StateBasedGame game, int delta) {
        if(endgame == true){
            container.exit();
        }
    }

    public void mouseDragged(int oldx, int oldy, int newx, int newy) {
        pressedX = newx;
        pressedY = newy;
        num = num + 1;
        if(Element == "sand"){
            s.num = s.num + 1;
            s.point[s.num] = new Point(pressedX, pressedY);
            s.pointcheck[s.num] = new Point(pressedX, pressedY);
        }
    }

    public void keyPressed(int key, char c) {
        if (key == Input.KEY_ESCAPE) {
            endgame = true;
        }
        if (key == Input.KEY_1) {
            Element = "sand";
    }

    public int getID() {
        return ID;
    }

}

4

2 に答える 2

0

私があなたの質問を理解したかどうかわかりませ
ん..これがあなたが望むものであるかどうかを確認してください..

// These loops will make each of the points compare to each other..
Point sands[] = new Point[10];
for ( int i = 0; i < sands.length - 1; i++ ) {
    for ( int k = i + 1; k < sands.length; k ++ ) {
        if ( sands[i].equals(sands[k]) ) {
            // Move Them
        }
    }
}
于 2012-10-13T05:09:41.030 に答える
0

提案:パーティクルクラスにはポイント(xy座標)があります。パーティクルのequalsメソッドを実装します

boolean equals(Object o){
   if(! o instanceof Particle) return false;
   if(o.getPoint().equals(this.getPoint())) return true;

次に、Pointクラスにequalsを次のように実装します。

    boolean equals(Object o){
       if(! o instanceof Point) return false;
       if(o.getXCoordinate.equals(this.getXCoordinate()) 
&& o.getYCoordinate.equals(this.getYCoordinate())) return true;

必要に応じて、Pointクラスのメソッドの代わりgetXCoordinateにインデックスをチェックできます。getYCoordinate

于 2012-10-13T05:12:26.017 に答える