在处理

时间:2015-08-31 04:05:13

标签: java processing

我正在开发基于图块的游戏,其中各种图块具有不同的状态。 我现在想要添加一个玩家对象,这个对象将不断检查磁贴的状态以便移动。

我的瓷砖课程:

class Tile {

  int x, y;
  boolean empty = true;
  boolean baseCell = true; 
  boolean active = false; 

  public static final int EMPTY = 0;
  public static final int BASE = 1;
  public static final int ACTIVE = 2;

  Tile(int x_, int y_, boolean baseCell_) {
    x=x_;
    y=y_;
    baseCell=baseCell_;
  }

  void display() {
    if (baseCell) {
      fill(0, 0, 255);
    } else {
      if (empty) {
        fill (255);
      } else if (active) {
        fill(255, 100, 50);
      }
    }
    stroke(0);
    rect(x, y, 50, 50);
  }
}

当游戏开始时,将绘制4个baseCell并且无法更改。用户可以单击其他单元格将其值从空更改为活动或活动为空。

目前我不确定如何为我设置的静态值分配布尔值 - 或者这可能不是最好的方法。

非常感谢任何帮助或指导。

2 个答案:

答案 0 :(得分:1)

首先,鉴于你想要分配给布尔值,静态变量的值,我会说因为ACTIVE = 2它是不可能的。这个值不能用作布尔值,因为它不是0因此,如果要使用布尔变量,则所有静态最终变量值应为0或1。

其次,您应该考虑在接口中收集所有常量(静态最终变量),该接口将由需要其中一个常量的每个类实现。这是一种更好的编程习惯,这将有助于您更好地组织项目。

最后,如果你想改变变量值empty,active,baseCell,你应该将它们包含在构造函数中,如下所示:

Tile(int x_, int y_, boolean baseCell_, boolean active_, boolean empty_)    
{
    x=x_;
    y=y_;
    baseCell=baseCell_;
    active = active_;
    empty = empty_;
  }

和/或你应该为每一个实现getter和setter,如下所示:

//setter
protected void setEmpty(boolean empty_)
{
  empty = empty_;
}

//getter
public boolean getEmpty()
{
  return empty;
}

更改相应值的方法是简单地调用构造函数,首次构造对象时,以及之后的setter,如下所示:

(..) new Tile( x, y, BASE, ACTIVE, EMPTY); //constructor
tile1.setEmpty(EMPTY); //tile1 is an instance of the Tile class

最后的说明: 关于setter的可见性,你应该小心,因为如果你公开它,任何人都可以访问它并改变它的'值,这会影响你的应用程序的安全性。解决这个问题的方法是通过层次结构。

我建议你阅读:http://docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html(关于getter / setters的基本信息) 而这:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html (解决二传手问题所需的知识)

答案 1 :(得分:1)

正如我在推荐中所提到的,您可以使用单个整数来跟踪单元状态,而不是为每个状态使用布尔值。 这也允许您使用switch statement。 if / else没有任何问题,你可以做同样的事情,但它可能有助于整洁。

以上是基于现有代码的上述概念的基本证明:

//a few test tiles
int numTiles = 3;
//prepare an array to store each tile
Tile[] tiles = new Tile[numTiles];

void setup(){
  size(150,150);
  //initialize each tile
  for(int i = 0 ; i  < numTiles; i++) 
    tiles[i] = new Tile(50*i,50,random(1) > .5);//50% pseudo-random change of getting a BASE cell
}
void draw(){
  background(255);
  //render tiles (they'll handle their own states internally)
  for(int i = 0 ; i  < numTiles; i++){ 
    tiles[i].display();
  }
}
void mouseReleased(){
  //update each tile on click
  for(int i = 0 ; i  < numTiles; i++)
    tiles[i].click(mouseX,mouseY);
}

class Tile {

  int x, y;
  int size = 50;
  int state = 0; 

  public static final int EMPTY = 0;
  public static final int BASE = 1;
  public static final int ACTIVE = 2;

  Tile(int x_, int y_, boolean baseCell_) {
    x=x_;
    y=y_;
    if(baseCell_) state = BASE;
    else          state = EMPTY;
  }

  void click(int mx,int my){
    //check if the mouse coordinates are within the tile's rectangle
    boolean isOver = (mx >= x && mx <= x + size) && (my >= y && my <= y + size);
    if(isOver){//if so, update states
      switch(state){
        case EMPTY:
          state = ACTIVE;
        break;
        case ACTIVE:
          state = EMPTY;
        break;
        case BASE:
          println("BASE cell clicked, change what happens here");
        break;
      }
    }
  }

  void display() {
    switch(state){
        case EMPTY:
          fill(255);
        break;
        case ACTIVE:
          fill(255, 100, 50);
        break;
        case BASE:
          fill(0,0,255);
        break;
      }

    stroke(0);
    rect(x, y, size, size);
  }
}

稍后您可以选择从switch语句中调用函数以使代码更易于管理(特别是如果您可能使用许多状态)