【Java开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学会员整理了Java开源代码-BoardView.java的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
package com.mot.j2me.midlets.jbombman;
import javax.microedition.lcdui.*;
//
public class BoardView extends Canvas {
private Board oBoard;
private Player oPlayer;
private Enemy oEnemy;
//定义背景色
private final int BackgroundColor = 0xffffff;
//定义每个棋盘格的大小
private final int iCellSize = 20;
//声明内部边框距离坐标原点的横坐标距离
private final int iLeft = 10;
//声明内部边框距离坐标原点的纵坐标距离
private final int iTop = 10;
public BoardView( Board board ) {
oBoard = board;
}
public void setPlayer( Player player ) {
oPlayer = player;
}
public void setEnemy( Enemy enemy ) {
oEnemy = enemy;
}
//绘制游戏屏幕
public void paint( Graphics g ) {
//声明同步块,对Graphics对象g进行同步
synchronized( g ) {
//如果游戏结束,则绘制游戏结束的界面
if( oBoard.isGameOver )
paintGameOver( g );
//如果玩家获胜,则绘制玩家获胜的界面
else if( oBoard.isWin )
paintWin( g );
//否则绘制当前游戏运行的界面
else
paintBoard( g );
}
}
//定义绘制游戏结束的方法
private void paintGameOver( Graphics g ) {
g.drawImage( Img.imgGameOver, 60, 100, Graphics.LEFT|Graphics.TOP );
}
//定义绘制游戏玩家获胜的方法
private void paintWin( Graphics g ) {
g.drawImage( Img.imgCongratulation, 60, 100, Graphics.LEFT|Graphics.TOP );
}
//绘制游戏棋盘边框的方法
private void paintFrame( Graphics g ) {
g.drawRect( 0, 0, 239, 239 );
g.drawRect( 1, 1, 237, 237 );
g.drawRect( 2, 2, 235, 235 );
g.drawRect( 3, 3, 233, 233 );
g.drawRect( 7, 7, 225, 225 );
g.drawRect( 8, 8, 223, 223 );
}
//定义绘制棋盘的方法
private void paintBoard( Graphics g ) {
//判断画布屏幕的工作区的原点是否在坐标轴的原点上,如果是则直接绘制游戏棋盘的边框
if( g.getClipX() == 0 )
paintFrame( g );
//设置画布屏幕的
工作区的左上角坐标以及高度和宽度
int x = ( g.getClipX() - iLeft ) / iCellSize;
int y = ( g.getClipY() - iTop ) / iCellSize;
int w = g.getClipWidth() / iCellSize;
int h = g.getClipHeight() / iCellSize;
System.out.println( "paint: x=" + x + ", y=" + y
+ ", w=" + w + ", h=" + h );
//如果画布屏幕的工作区的高度超过了棋盘的高,则将工作区的高度设置为棋盘的高度
if( h>oBoard.iRows )
h = oBoard.iRows;
//根据工作区的位置,开始绘制棋盘中的元素
for( int i=x; i<x+w; i++ )
for( int j=y; j<y+h; j++ )
//根据遍历得到的数组中的元素类型进行绘制
switch( oBoard.chBoard[i][j] ) {
case 'N': //当前数组元素中的类型表示空白区域,则绘制空白区域的图像
g.setColor( BackgroundColor );
g.fillRect( iLeft + i*iCellSize, iTop + j*iCellSize,
iCellSize, iCellSize );
break;
case 'W': //当前数组元素中的类型表示砖墙,则绘制砖墙的图像
g.drawImage( Img.imgWall, iLeft + i*iCellSize, iTop + j*iCellSize,
Graphics.LEFT|Graphics.TOP );
break;
case 'L': //当前数组元素中的类型表示岩石,则绘制岩石的图像
g.drawImage( Img.imgPillar, iLeft + i*iCellSize, iTop + j*iCellSize,
Graphics.LEFT|Graphics.TOP );
break;
case 'P': //当前数组元素中的类型表示游戏主角,则绘制游戏主角的图像
case 'U': //当前数组元素中的类型表示主角正在放置炸弹,则绘制游戏主角的图像
g.drawImage( Img.imgPlayer, iLeft + i*iCellSize, iTop + j*iCellSize,
Graphics.LEFT|Graphics.TOP );
break;
case 'E': //当前数组元素中的类型表示敌人,则绘制敌人的图像
g.drawImage( Img.imgEnemy, iLeft + i*iCellSize, iTop + j*iCellSize,
Graphics.LEFT|Graphics.TOP );
break;
case 'B': //当前数组元素中的类型表示炸弹,则绘制炸弹的图像
g.drawImage( Img.imgBomb, iLeft + i*iCellSize, iTop + j*iCellSize,
Graphics.LEFT|Graphics.TOP );
break;
case 'X': //当前数组元素中的类型表示炸弹爆炸,则绘制炸弹爆炸的图像
g.drawImage( Img.imgExploding, iLeft + i*iCellSize, iTop + j*iCellSize,
Graphics.LEFT|Graphics.TOP );
break;
}
}
//定义响应按键按下的事件处理方法
public void keyPressed( int code ) {
//如果游戏结束或者玩家胜利,则调用keyForInit()方法响应按键事件
if( oBoard.isGameOver||oBoard.isWin )
keyForInit( getGameAction(code) );
//否则调用keyForPlay()方法响应按键事件
else
keyForPlay( getGameAction(code) );
}
//定义游戏结束或者玩家胜利时的事件处理方法
private void keyForInit( int action ) {
//如果用户按下了手机中的Select按键,则游戏进行初始化
if( action != FIRE )
return;
//棋盘初始化
oBoard.init();
//敌人初始化
oEnemy.init();
//游戏主角初始化
oPlayer.init();
//