华容道游戏j2me实现(5).htm
来自「这是很好的J2ME实例教程,很适合初学者!」· HTM 代码 · 共 565 行 · 第 1/3 页
HTM
565 行
}
.center01 TD {
COLOR: #000000; LINE-HEIGHT: 20px
}
.center01 A:link {
COLOR: #000000; TEXT-DECORATION: none
}
.center01 A:visited {
COLOR: #000000; TEXT-DECORATION: none
}
.center01 A:hover {
COLOR: #2b7128; TEXT-DECORATION: underline
}
.center02 {
COLOR: #194e00; LINE-HEIGHT: 20px
}
.center02 TD {
COLOR: #194e00; LINE-HEIGHT: 20px
}
.center02 A:link {
COLOR: #194e00; TEXT-DECORATION: none
}
.center02 A:visited {
COLOR: #194e00; TEXT-DECORATION: none
}
.center02 A:hover {
COLOR: #194e00; TEXT-DECORATION: underline
}
</STYLE>
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center bgColor=#f3f3f3
border=0 valign="top">
<TBODY>
<TR class=center01>
<TD style="PADDING-LEFT: 10px; PADDING-TOP: 10px" width=488><A
href="http://act.it.sohu.com/book/index.php">连载</A> > <A
href="http://act.it.sohu.com/book/slist.php?class1=6">程序设计</A> > <A
href="http://act.it.sohu.com/book/slist.php?class2=7">Java</A> > <A
href="http://act.it.sohu.com/book/serialize.php?id=461">Java手机游戏开发专辑</A>
</TD>
<TD style="PADDING-LEFT: 10px; PADDING-TOP: 10px" width=280>
<DIV align=center><FONT color=#0000ff><A
href="http://act.it.sohu.com/book/chapter.php?id=461&volume=4&chapter=4">上一页</A></FONT>
<FONT color=#0000ff><A
href="http://act.it.sohu.com/book/serialize.php?id=461">回书目</A></FONT>
<FONT color=#0000ff><A
href="http://act.it.sohu.com/book/chapter.php?id=461&volume=4&chapter=6">下一页</A></FONT>
</DIV></TD></TR>
<TR class=center01>
<TD style="PADDING-LEFT: 10px; PADDING-TOP: 10px" align=middle
colSpan=2> </TD></TR>
<TBODY>
<TR>
<TD align=middle colSpan=2><BR>
<DIV style="FONT-SIZE: 18pt; COLOR: #990000; FONT-FAMILY: 楷体_GB2312"
align=center><B>Java手机游戏开发实例</B></DIV><BR>
<DIV style="FONT-SIZE: 18px; COLOR: #990000; FONT-FAMILY: ; 宋体: "
align=center>华容道游戏J2ME实现(5)</DIV>
<DIV
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%"
align=left><BR>
<P> <STRONG>六.编码<BR></STRONG><BR> 整个项目共有五个类,有四个类的代码前面已经介绍过了,而且是在其他项目中使用过的相对成熟的代码.现在只需全力去实现Displayable1类.Displayable1类的代码如下:<BR></P>
<P></P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>package huarongroad;</P>
<P>import javax.microedition.lcdui.*;</P>
<P>public class Displayable1 extends Canvas implements
CommandListener {</P>
<P>private int[] loc = new int[2]; <A
href="file://光">file://光</A>标的当前位置,0是水平位置,1是竖直位置<BR>private int[]
SelectArea = new int[4];//被选定的区域,即要移动的区域<BR>private int[] MoveArea =
new int[4];//要移动到的区域<BR>private Map MyMap = new
Map();//地图类<BR>private boolean selected;//是否已经选中要移动区域的标志<BR>private
int level;//但前的关面<BR>public Displayable1() {//构造函数<BR>try
{<BR>jbInit();//JBuilder定义的初始化函数<BR>}catch (Exception e)
{<BR>e.printStackTrace();<BR>}<BR>}<BR>private void
Init_game(){<BR>//初始化游戏,读取地图,设置选择区域,清空要移动到的区域<BR>this.loc =
MyMap.read_map(this.level);//读取地图文件,并返回光标的初始位置<BR>//0为水平位置,1为竖直位置<BR>this.SelectArea[0]
= this.loc[0];//初始化选中的区域<BR>this.SelectArea[1] =
this.loc[1];<BR>this.SelectArea[2] = 1;<BR>this.SelectArea[3] =
1;<BR>this.MoveArea[0] = -1;//初始化要移动到的区域<BR>this.MoveArea[1] =
-1;<BR>this.MoveArea[2] = 0;<BR>this.MoveArea[3] =
0;<BR>}<BR>private void jbInit() throws Exception
{//JBuilder定义的初始化函数<BR><A
href="file://初">file://初</A>始化实例变量<BR>this.selected =
false;//设置没有被选中的要移动区域<BR>this.level =
1;<BR>Images.init();//初始化图片常量<BR>Init_game();//初始化游戏,读取地图,设置选择区域,清空要移动到的区域<BR>setCommandListener(this);//添加命令监听,这是Displayable的实例方法<BR>addCommand(new
Command("Exit", Command.EXIT, 1));//添加“退出”按钮<BR>}</P>
<P>public void commandAction(Command command, Displayable
displayable) {<BR>//命令处理函数<BR>if (command.getCommandType() ==
Command.EXIT) {//处理“退出”<BR>MIDlet1.quitApp();<BR>}<BR>}</P>
<P>protected void paint(Graphics g)
{<BR>//画图函数,用于绘制用户画面,即显示图片,勾画选中区域和要移动到的区域<BR>try
{<BR>g.drawImage(Images.image_Frame, 0, 0,<BR>Graphics.TOP |
Graphics.LEFT);//画背景<BR>MyMap.draw_map(g);//按照地图内容画图<BR>if (
this.selected
)<BR>g.setColor(0,255,0);//如果被选中,改用绿色画出被选中的区域<BR>g.drawRect(this.SelectArea[0]
* Images.UNIT + Images.LEFT,<BR>this.SelectArea[1] * Images.UNIT +
Images.TOP,<BR>this.SelectArea[2] *
Images.UNIT,<BR>this.SelectArea[3] * Images.UNIT);//画出选择区域,<BR><A
href="file://如">file://如</A>果被选中,就用绿色<BR><A
href="file://否">file://否</A>则,使用黑色<BR>g.setColor(255,255,255);//恢复画笔颜色<BR>if
(this.selected) {//已经选中了要移动的区域<BR>g.setColor(255, 0,
255);//改用红色<BR>g.drawRect(this.MoveArea[0] * Images.UNIT +
Images.LEFT,<BR>this.MoveArea[1] * Images.UNIT +
Images.TOP,<BR>this.MoveArea[2] * Images.UNIT,<BR>this.MoveArea[3] *
Images.UNIT);//画出要移动到的区域<BR>g.setColor(255, 255,
255);//恢复画笔颜色<BR>}<BR>}catch (Exception ex)
{<BR>}<BR>System.out.println(Runtime.getRuntime().freeMemory());<BR>System.out.println(Runtime.getRuntime().totalMemory());<BR>}</P>
<P>private void setRange()
{<BR>//设置移动后能够选中的区域<BR>//调整当前光标位置到地图的主位置,即记录人物信息的位置<BR>if
(this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DLEFT)
{<BR>this.loc[0] -= 1;//向左调<BR>}else if
(this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DUP)
{<BR>this.loc[1] -= 1;//向上调<BR>}else if
(this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DLEFTUP)
{<BR>this.loc[0] -= 1;//向左调<BR>this.loc[1] -=
1;//向上调<BR>}<BR>this.SelectArea[0] =
this.loc[0];//设置光标的水平位置<BR>this.SelectArea[1] =
this.loc[1];//设置光标的竖直位置<BR>//设置光标的宽度<BR>if (this.loc[0] + 1 <
Images.WIDTH) {<BR>this.SelectArea[2] =
this.MyMap.Grid[this.loc[1]][this.loc[0] + 1] != (byte) '1' ?<BR>1 :
2;<BR>}else {<BR>this.SelectArea[2] = 1;<BR>}<BR>//设置光标的高度<BR>if
(this.loc[1] + 1 < Images.HEIGHT) {<BR>this.SelectArea[3] =
this.MyMap.Grid[this.loc[1] + 1][this.loc[0]] != (byte) '2' ?<BR>1 :
2;<BR>}else {<BR>this.SelectArea[3] = 1;<BR>}<BR>}</P>
<P>private boolean setMoveRange()
{<BR>//设置要移动到的区域,能够移动返回true,否则返回false<BR>for (int i = 0; i <
this.SelectArea[2]; i++) {<BR>for (int j = 0; j <
this.SelectArea[3]; j++) {<BR>if (this.loc[1] + j >= Images.HEIGHT
||<BR>this.loc[0] + i >= Images.WIDTH ||<BR>(!isInRange(this.loc[0]
+ i, this.loc[1] + j) &&<BR>this.MyMap.Grid[this.loc[1] +
j][this.loc[0] + i] !=<BR>Images.BLANK)) {<BR>return
false;<BR>}<BR>}<BR>}<BR>this.MoveArea[0] =
this.loc[0];<BR>this.MoveArea[1] = this.loc[1];<BR>this.MoveArea[2]
= this.SelectArea[2];<BR>this.MoveArea[3] =
this.SelectArea[3];<BR>return true;<BR>}</P>
<P>private boolean isInRange(int x, int y)
{<BR>//判断给定的(x,y)点是否在选定区域之内,x是水平坐标,y是竖直坐标<BR>if (x >=
this.SelectArea[0] &&<BR>x < this.SelectArea[0] +
this.SelectArea[2] &&<BR>y >= this.SelectArea[1]
&&<BR>y < this.SelectArea[1] + this.SelectArea[3])
{<BR>return true;<BR>}else {<BR>return false;<BR>}<BR>}</P>
<P>private boolean isInRange2(int x, int y)
{<BR>//判断给定的(x,y)点是否在要移动到的区域之内,x是水平坐标,y是竖直坐标<BR>if (x >=
this.MoveArea[0] &&<BR>x < this.MoveArea[0] +
this.MoveArea[2] &&<BR>y >= this.MoveArea[1] &&<BR>y
< this.MoveArea[1] + this.MoveArea[3]) {<BR>return true;<BR>}else
{<BR>return false;<BR>}<BR>}</P>
<P>protected void keyPressed(int keyCode)
{<BR>//处理按下键盘的事件,这是Canvas的实例方法<BR>switch (getGameAction(keyCode))
{//将按键的值转化成方向常量<BR>case Canvas.UP://向上<BR>if (!this.selected)
{//还没有选定要移动的区域<BR>if (this.loc[1] - 1 >= 0)
{//向上还有移动空间<BR>this.loc[1]--;//向上移动一下<BR>setRange();//设置光标移动的区域,该函数能将光标移动到地图主位置<BR>repaint();//重新绘图<BR>}<BR>}else
{//已经选定了要移动的区域<BR>if (this.loc[1] - 1 >= 0)
{//向上还有移动空间<BR>this.loc[1]--;//向上移动一下<BR>if (setMoveRange())
{//能够移动,该函数能够设置要移动到的区域<BR>repaint();//重新绘图<BR>}else
{//不能移动<BR>this.loc[1]++;//退回来<BR>}<BR>}<BR>}<BR>break;<BR>case
Canvas.DOWN://向下<BR>if (!this.selected) {//还没有选定要移动的区域<BR>if
(this.loc[1] + 1 < Images.HEIGHT) {//向下还有移动空间<BR>if
(this.MyMap.Grid[this.loc[1] + 1][this.loc[0]]
==<BR>Images.DUP){//该图片有两个格高<BR>this.loc[1]++;//向下移动一下<BR>if
(this.loc[1] + 1 < Images.HEIGHT) {//向下还有<BR><A
href="file://移">file://移</A>动空间<BR>this.loc[1]++;//向下移动一下<BR>setRange();//设置光标移动的区域,<BR><A
href="file://该">file://该</A>函数能将光标移动到地图主位置<BR>repaint();//重新绘图<BR>}else
{//向下没有移动空间<BR>this.loc[1]--;//退回来<BR>}<BR>}else
{//该图片只有一个格高<BR>this.loc[1]++;//向下移动一下<BR>setRange();//设置光标移动的区域,<BR><A
href="file://该">file://该</A>函数能将光标移动到地图主位置<BR>repaint();//重新绘图<BR>}<BR>}else
{<BR>}<BR>}else {//已经选定了要移动的区域<BR>if (this.loc[1] + 1 <
Images.HEIGHT) {//向下还有移动空间<BR>this.loc[1]++;//向下移动一下<BR>if
(setMoveRange()) {//能够移动,该函数能够设置要移动到的区域<BR>repaint();//重新绘图<BR>}else
{//不能移动<BR>this.loc[1]--;//退回来<BR>}<BR>}<BR>}<BR>break;<BR>case
Canvas.LEFT://向左<BR>if (!this.selected) {//还没有选定要移动的区域<BR>if
(this.loc[0] - 1 >= 0)
{//向左还有移动空间<BR>this.loc[0]--;//向左移动一下<BR>setRange();//设置光标移动的区域,该函数能将光标移动到地图主位置<BR>repaint();//重新绘图<BR>}<BR>}else
{//已经选定了要移动的区域<BR>if (this.loc[0] - 1 >= 0)
{//向左还有移动空间<BR>this.loc[0]--;//向左移动一下<BR>if (setMoveRange())
{//能够移动,该函数能够设置要移动到的区域<BR>repaint();//重新绘图<BR>}else
{//不能移动<BR>this.loc[0]++;//退回来<BR>}<BR>}<BR>}<BR>break;<BR>case
Canvas.RIGHT://向右<BR>if (!this.selected) {//还没有选定要移动的区域<BR>if
(this.loc[0] + 1 < Images.WIDTH) {//向右还有移动空间<BR>if
(this.MyMap.Grid[this.loc[1]][this.loc[0] + 1] ==<BR>Images.DLEFT)
{//该图片有两个格宽<BR>this.loc[0]++;//向右移动一下<BR>if (this.loc[0] + 1 <
Images.WIDTH) {//向右还有<BR><A
href="file://移">file://移</A>动空间<BR>this.loc[0]++;//向右移动一下<BR>setRange();//设置光标移动的区域,<BR><A
href="file://该">file://该</A>函数能将光标移动到地图主位置<BR>repaint();//重新绘图<BR>}else
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?