我正在开发基于图块的游戏,其中各种图块具有不同的状态。 我现在想要添加一个玩家对象,这个对象将不断检查磁贴的状态以便移动。
我的瓷砖课程:
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并且无法更改。用户可以单击其他单元格将其值从空更改为活动或活动为空。
目前我不确定如何为我设置的静态值分配布尔值 - 或者这可能不是最好的方法。
非常感谢任何帮助或指导。
答案 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语句中调用函数以使代码更易于管理(特别是如果您可能使用许多状态)