100分求助拼图如何显示在模拟器正中央,帮忙修改代码
MainCanvas代码如下:
import java.util.Random;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class MainCanvas extends Canvas implements Runnable,CommandListener{
public Image m_aImg[];
public int m_anCur[][];
public int m_nHidX, m_nHidY;
public int m_nSta;
private Command ExitCommand;
private PuzzleMidlet midlet;
public MainCanvas( PuzzleMidlet mMidlet )
{
midlet = mMidlet;
try
{
ExitCommand = new Command( "Exit ", Command.EXIT, 0);
addCommand(ExitCommand);
setCommandListener(this);
m_nHidX = 2;
m_nHidY = 2;
m_nSta = 0;
InitCurrent();
m_aImg = new Image[9];
StringBuffer temp = null;
for( int i = 0; i < 9; i ++ )
{
temp=new StringBuffer();
temp.append( "/pic ");
temp.append(i);
temp.append( ".png ");
m_aImg[i] = Image.createImage(temp.toString());
temp=null;
}
}
catch (Exception ex)
{//暂不做出错处理
}
Thread thread = new Thread(this);
thread.start();
}
public void InitCurrent()
{
Random random = new Random();
m_anCur = new int[][] { {0,1,2}, {3,4,5}, {6,7,8} };
int Rx, Ry, k, nTemp;
for( int x = 0; x < 3; x ++ )
{
for( int y = 0; y < 3; y ++ )
{
k = random.nextInt();
Rx = Math.abs(k % 3);
k = random.nextInt();
Ry = Math.abs(k % 3);
if( Rx != x || Ry != y )
{
nTemp = m_anCur[y][x];
m_anCur[y][x] = m_anCur[Ry][Rx];
m_anCur[Ry][Rx] = nTemp;
}
}
}
}
protected void paint(Graphics g)
{
g.setColor(0);
g.fillRect( 0, 0, getWidth(), getHeight() );
int nImg = 0; //暂存图片的编号
switch( m_nSta )
{
case 0:
for( int x = 0; x < 3; x++ )
{
for( int y = 0; y < 3; y++ )
{
if( x == m_nHidX && y == m_nHidY )
continue;
nImg = m_anCur[y][x];
if( nImg > = 0 && nImg < 9 )
{
if( m_aImg[nImg] != null )
g.drawImage( m_aImg[nImg], x * 30, y * 30, Graphics.LEFT|Graphics.TOP);
}
}
}
//接着画线,将9块格子分割开。
g.setColor(0xffffff);//设置成白色
for(int i = 0; i <= 3; i++)
{
g.drawLine( 0, i*30, 3*30, i*30);
g.drawLine( i*30, 0, i*30, 3*30);
}
break;
case 1:
for( int x = 0; x < 3; x++ )
{
for( int y = 0; y < 3; y++ )
{
nImg = y * 3 + x;
if( m_aImg[nImg] != null )
g.drawImage( m_aImg[nImg], x * 30, y * 30, Graphics.LEFT|Graphics.TOP);
}
}
break;
case 2:
default:
g.drawString( "Very Good! ", 10, 45,Graphics.LEFT|Graphics.TOP);
break;
}
}
private boolean CheckMove( int nX, int nY )
{
if( nX < 0 || nX > = 3 || nY < 0 || nY > = 3 )
return false;
if(m_nHidX==nX && m_nHidY==nY)
return false;
if( nX > 0 && nX - 1 == m_nHidX && nY == m_nHidY )
return true;
if( nX < 2 && nX + 1 == m_nHidX && nY == m_nHidY )
return true;
if( nY > 0 && nY - 1 == m_nHidY && nX == m_nHidX )
return true;
if( nY < 2 && nY + 1 == m_nHidY && nX == m_nHidX )
return true;
return false;
}
private void sweep(int x, int y)
{
if( !CheckMove( x, y ) )
return;
int temp = m_anCur[y][x];
m_anCur[y][x] = m_anCur[m_nHidY][m_nHidX];
m_anCur[m_nHidY][m_nHidX] = temp;
m_nHidX = x;
m_nHidY = y;
}
protected void keyPressed(int keyCode)
{
if( m_nSta == 2 )
return;
switch(keyCode)
{
case KEY_NUM1:
sweep( 0, 0 );
break;
case KEY_NUM2:
sweep( 1, 0 );
break;
case KEY_NUM3:
sweep( 2, 0 );
break;
case KEY_NUM4:
sweep( 0, 1 );
break;
case KEY_NUM5:
sweep( 1, 1 );
break;
case KEY_NUM6:
sweep( 2, 1 );
break;
case KEY_NUM7:
sweep( 0, 2 );
break;
case KEY_NUM8:
sweep( 1, 2 );
break;
case KEY_NUM9:
sweep( 2, 2 );
break;
case KEY_NUM0:
if( m_nSta == 0 )
m_nSta = 1;
else
m_nSta = 0;
break;
}
if( isFinish() )
m_nSta = 2;
}
public boolean isFinish()
{
for( int x = 0; x < 3; x++ )
{
for( int y = 0; y < 3; y++ )
{
if( m_anCur[y][x] != y * 3 + x )
return false;
}
}
return true;
}
public void commandAction(Command c, Displayable s)
{
if (c.getCommandType() == Command.EXIT)
{
midlet.notifyDestroyed();
}
}
public void run() {
try{
while(true){
//重绘图形,getWidth与getHeight可分别得到手机屏幕的宽和高
repaint(0, 0, getWidth(), getHeight());
}
}
catch(Exception e){}
}
public void stop()
{
}
}
MIDLET 框架:
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class PuzzleMidlet extends MIDlet {
/**
*
*/
private static MainCanvas m_MainCanvas;
public PuzzleMidlet() {
super();
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see javax.microedition.midlet.MIDlet#startApp()
*/
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
if (m_MainCanvas == null)
{
try
{
m_MainCanvas = new MainCanvas(this);
}
catch (Exception ex)
{
System.out.println(ex);
}
}
Display.getDisplay(this).setCurrent(m_MainCanvas);
}
/* (non-Javadoc)
* @see javax.microedition.midlet.MIDlet#pauseApp()
*/
protected void pauseApp() {
// TODO Auto-generated method stub
m_MainCanvas.stop();
}
/* (non-Javadoc)
* @see javax.microedition.midlet.MIDlet#destroyApp(boolean)
*/
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
m_MainCanvas.stop();
}
}
[解决办法]
调整paint中for循环中的X的初值
[解决办法]
显示在正中间吗?那就把你现在的paint函数里边所有画东西的函数中,x,y坐标分别加一个量dx,dy就好了。
protected void paint(Graphics g) {
g.setColor(0);
g.fillRect( 0, 0, getWidth(), getHeight() );
int nImg = 0; //暂存图片的编号
int dx = (getWidth() - 90) / 2;
int dy = (getHeight() - 90) / 2;
switch( m_nSta ) {
case 0:
for( int x = 0; x < 3; x++ ) {
for( int y = 0; y < 3; y++ ) {
if( x == m_nHidX && y == m_nHidY )
continue;
nImg = m_anCur[y][x];
if( nImg > = 0 && nImg < 9 ) {
if( m_aImg[nImg] != null )
g.drawImage( m_aImg[nImg], dx + x * 30, dy + y * 30, Graphics.LEFT|Graphics.TOP);
}
}
}
//接着画线,将9块格子分割开。
g.setColor(0xffffff);//设置成白色
for(int i = 0; i <= 3; i++) {
g.drawLine( dx + 0, dy + i*30, dx + 3*30, dy + i*30);
g.drawLine( dx + i*30, dy + 0, dx + i*30, dy + 3*30);
}
break;
case 1:
for( int x = 0; x < 3; x++ ) {
for( int y = 0; y < 3; y++ ) {
nImg = y * 3 + x;
if( m_aImg[nImg] != null )
g.drawImage( m_aImg[nImg], dx + x * 30, dy + y * 30, Graphics.LEFT|Graphics.TOP);
}
}
break;
case 2:
default:
g.drawString( "Very Good! ", 10, 45,Graphics.LEFT|Graphics.TOP);
break;
}
}