-1

I am trying to create a basic falling sand game in java, I have each particle store it's X and Y in a Point array. Each Point array is specific to it's element, so sand and water are two different arrays, what i would like to know is how do i check my sand array against itself to see if two particles have the same position, and if so, move them?

This is my Sand Class

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

}

And this is a simplified version of my main class

    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 类实现等于:

    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 回答