Java 处理。即使数组内容已更改,使用draw()方法绘制的内容也不会';不变
常数Java 处理。即使数组内容已更改,使用draw()方法绘制的内容也不会';不变,java,processing,Java,Processing,常数 public final int DIMENSIONS = 4; public final int MOVE_RIGHT = 1; public final int MOVE_LEFT = 2; public final int MOVE_UP = 3; public final int MOVE_DOWN = 4; main PuzzleFrame board; void setup(){ size(401,401); board = new PuzzleFrame();
public final int DIMENSIONS = 4;
public final int MOVE_RIGHT = 1;
public final int MOVE_LEFT = 2;
public final int MOVE_UP = 3;
public final int MOVE_DOWN = 4;
main
PuzzleFrame board;
void setup(){
size(401,401);
board = new PuzzleFrame();
background(100);
}
void draw(){
background(100);
board.draw();
}
void keyPressed()
{
if(key == CODED)
{
if(keyCode == RIGHT) board.moveTile(MOVE_RIGHT);
if(keyCode == LEFT) board.moveTile(MOVE_LEFT);
if(keyCode == UP) board.moveTile(MOVE_UP);
if(keyCode == DOWN) board.moveTile(MOVE_DOWN);
}
}
创建拼图框的类
class PuzzleFrame{
private Tile[][] puzzleFrame;
private Tile[][] solvedPuzzleFrame;
public PuzzleFrame()
{
puzzleFrame = new Tile[DIMENSIONS][DIMENSIONS];
solvedPuzzleFrame = new Tile[DIMENSIONS][DIMENSIONS];
int tileNumber = 1;
for(int i = 0; i < DIMENSIONS; i++)
{
for(int j = 0; j < DIMENSIONS; j++)
{
puzzleFrame[i][j] = new Tile(tileNumber, j*100, i*100);
solvedPuzzleFrame[i][j] = new Tile(tileNumber, j*100, i*100);
tileNumber++;
}
}
}
public void draw()
{
for(int i = 0; i < DIMENSIONS; i++)
{
for(int j = 0; j < DIMENSIONS; j++)
{
puzzleFrame[i][j].draw();
}
}
}
public void moveTile(int side)
{
if(isMoveAllowed(side))
{
switch(side)
{
case MOVE_RIGHT:
{
for(int i = 0; i < DIMENSIONS; i++)
{
for(int j = 0; j < DIMENSIONS; j++)
{
if(puzzleFrame[i][j].getTileNumber() == DIMENSIONS*DIMENSIONS)
{
Tile tempTile = puzzleFrame[i][j];
puzzleFrame[i][j] = puzzleFrame[i][j-1];
puzzleFrame[i][j-1] = tempTile;
System.out.println("right");
break;
}
}
}
break;
}
}
}
}
private boolean isMoveAllowed(int side)
{
switch(side)
{
case MOVE_RIGHT:
{
for(int i = 0; i < DIMENSIONS; i++)
{
for(int j = 0; j < DIMENSIONS; j++)
{
if(puzzleFrame[i][j].getTileNumber() == DIMENSIONS*DIMENSIONS)
{
if(j > 0) return true;
}
}
}
break;
}
}
return false;
}
}
class Tile{
private final int mTileNumber;
private final int width = 100;
private final int height = 100;
private String number = "";
private int xpos;
private int ypos;
private int xOffSet;
private int yOffSet;
public Tile(int tileNumber, int xpos, int ypos)
{
mTileNumber = tileNumber;
number += tileNumber;
textSize(64);
this.xpos = xpos; this.ypos = ypos;
xOffSet = 30;
yOffSet = 70;
if(mTileNumber >= 10)
{
xOffSet = 10;
}
}
public void draw()
{
if(mTileNumber == DIMENSIONS*DIMENSIONS)
{
}
else
{
strokeWeight(2);
fill(255);
rect(xpos, ypos, width, height);
fill(0);
text(number, xpos+xOffSet, ypos+yOffSet);
}
}
public int getTileNumber()
{
return mTileNumber;
}
}
我正在尝试制作15个益智游戏,但我遇到的问题是,当我向右按箭头键时,益智框架数组的内容发生了变化(我通过调试器在Eclipse中检查了它),但在处理绘制的图像时仍然保持不变。目前,我的代码只包含一个允许向右滑动平铺的函数。老实说,我不明白为什么即使数组的内容发生了变化,图像仍然保持不变。我知道这并不能回答您的问题,但在赋值过程中如何避免Tile类中出现编译器错误:mTileNumber=tileNumber
您将mTileNumber声明为最终变量,因此不应将其重新分配给任何对象。也许令人惊讶的是,您不应仅使用“draw()”(如在旧FORTRAN程序中调用函数)。相反,您必须有一个响应图形“绘制”事件的事件处理程序。事件处理程序是进行所有绘图的位置。密钥处理程序可以调用图形“invalidte”来触发重画事件。这里有一个很好的教程:我发现了一个问题,即使数组的内容发生了变化,每个磁贴的坐标也保持不变,因此图像保持不变。谢谢您的帮助。@paulsm4这是处理,不是普通Java。您可以调用一个global draw(),在事件处理函数中调用一个redraw()(也是预先应用的)。请参见@user1796741,可见性不是处理API的一部分。虽然它们可以工作,因为它在PDE中编译时通过javac运行,但任何公共/私有/受保护标记实际上都不是在处理代码,但混合处理+Javaa final是一个变量,其值在赋值后不会更改。他的代码不赋值,只声明,所以第一次赋值是允许的,之后任何试图更改它的行为都会导致“可能已经被赋值”编译器异常