📄 基于nokia手机的移动游戏开发(1).htm
字号:
<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=6">上一页</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=8">下一页</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>基于Nokia手机的移动游戏开发(1)</DIV>
<DIV
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%"
align=left><BR>
<P> <STRONG>一、游戏开发策略</STRONG><BR><BR> 1
游戏动作(Action)的使用<BR><BR> MIDP的Canvas类让程序员处理某些按键事件,要么作为特定的低级键控代码事件要么作为抽象的游戏动作。FullCanvas是Nokia的全屏画布(FullCanvas)类,它是从Canvas类继承而来的。<BR><BR> 在回合制游戏或者不需要超过四个方向键(上、下、左、右)的游戏中,最好使用直接的键盘代码来控制游戏动作。可以使用抽象游戏动作的游戏例子包括国际象棋和知识测验以及解谜游戏,这些都是使用方向键来滚动屏幕或者移动。</P>
<P> 游戏动作应该只在不需要快速反应的游戏中使用。这是因为所选择的设备的游戏动作映射可能对于要求快速动作的游戏并不适用。并且,如果一个游戏要求斜的方向键或者这个游戏是一个快节奏的动作游戏,那时游戏者一只手需要移动游戏角色,另一只手需要执行其他操作,比如射击、开门等等,那么就需要使用直接键盘代码。原因是在MIDP中没有斜向的游戏动作,并且游戏动作映射是为一只手使用设计的。<BR><BR> 当使用直接键盘代码事件的时候,必须特别注意应用程序的可移植性。<BR><BR> 在不同的设备之间键盘的布局有很大区别(参见图1,是两种手机不同的键盘布局)。开发者可以通过允许用户在游戏中自己定义按键的方式来解决这个问题。这可以在游戏开始之前或者在游戏的"选项"页面中完成。<BR><BR> 键盘代码和游戏动作在同一个应用程序中决不应该混合使用。
<BR></P>
<P align=center><BR><IMG src="基于Nokia手机的移动游戏开发(1).files/1101781867-1.jpg"
align=baseline border=0><BR>图1、不同手机的键盘布局<BR></P>
<P><BR> 2
关于游戏动作的说明<BR><BR> 一个MIDlet应用程序通过调用Canvas方法来探测哪些键盘代码映射到运行的应用程序中的抽象游戏动作:<BR><BR></P>
<P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>public static int getGameAction(int keyCode);
</P></TD></TR></TBODY></TABLE></P>
<P><BR> Canvas类定义抽象游戏动作集:UP、DOWN、LEFT、RIGHT、FIRE等等。<BR><BR> 游戏开发者应该知道MIDP
1.0规范中的一个问题。这个类定义了转化键盘代码到游戏动作的方法,同样也定义了转化游戏动作到键盘代码的方法。<BR><BR></P>
<P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>public int getGameAction(int keyCode)<BR>public int
getKeyCode(int gameAction)</P></TD></TR></TBODY></TABLE></P>
<P><BR> 方法getKeyCode(int gameAction)可能会导致一些问题,因为它只能返回基于游戏动作的一个键盘代码,即使MIDP
1.0允许超过一个键盘代码被实现。在Nokia手机中,个别的一些键盘代码被映射到相同的游戏动作,比如"UP键"和"2键"都被映射为向上的游戏动作。而这个方法只能返回其中之一;返回的值是特定的实现。然而,如果方法getGameAction(int
KeyCode)使用"UP键"和"2键"的键盘代码作为参数,这个方法将返回正确的向上的游戏动作。下面来看一个不好的例子,以加深我们的印象:<BR><BR></P>
<P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>//不好的例子,不要这么做:<BR>class TetrisCanvas extends Canvas {<BR>int
leftKey, rightKey, downKey, rotateKey;<BR>void init
(){<BR>//FOLLOWING MUST NOT BE DONE<BR>leftKey =
getKeyCode(LEFT);<BR>rightKey = getKeyCode(RIGHT);<BR>downKey =
getKeyCode(DOWN);<BR>rotateKey = getKeyCode(FIRE);<BR>}<BR>public
void keyPressed(int keyCode) {<BR>if (keyCode == leftKey)
{<BR>moveBlockLeft();<BR>} else if (keyCode = rightKey)
{<BR>...<BR>}<BR>}<BR>} </P></TD></TR></TBODY></TABLE></P>
<P><BR> 下面是更好的解决方案:<BR><BR></P>
<P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>class TetrisCanvas extends Canvas {<BR>void init
(){<BR>}<BR>public void keyPressed(int keyCode) {<BR>int action =
getGameAction(keyCode);<BR>switch (action)<BR>{<BR>case
Canvas.LEFT:<BR>moveBlockLeft();<BR>break;<BR>case
Canvas.RIGHT:<BR>moveBlockRight();<BR>break;<BR>}<BR>}<BR>}</P></TD></TR></TBODY></TABLE></P>
<P><BR> 这个例子是MIDP 1.0规范中的例子,使用getKeyCode ( int
gameAction)处理键盘代码值,只能返回一个值。如果这样的话,其它可能的按键映射就不能在MIDlet中使用了。比如说,在Nokia
7650中就会出现问题,Nokia
7650有五个方向键和一个操纵杆以及普通的键盘布局,上面这个例子就会返回操纵杆的值而不是键盘的值。这是处理事件的一种与设备无关的方法,也是一种不好的方法。更好的解决方法是在keyPressed
()方法内使用getGameAction ( int KeyCode)。通常,应用程序应该避免使用getKeyCode ( int
gameAction)方法并且总是使用getGameAction ( int KeyCode)。</P><BR><BR></DIV></TD></TR>
<TR>
<TD class=center01>
<DIV align=center>来源:天极网 作者:
<DIV></DIV></DIV></TD>
<TD class=center01 width=280>
<DIV align=center><FONT color=#0000ff><A
href="http://act.it.sohu.com/book/chapter.php?id=461&volume=4&chapter=6">上一页</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=8">下一页</A></FONT>
</DIV></TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD width=760>
<TABLE height=10 cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE><!------------ 评论 ---------------->
<TABLE cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD><IFRAME id=vs src="基于Nokia手机的移动游戏开发(1).files/comment_list1.htm"
frameBorder=0 width="100%"
scrolling=no></IFRAME></TD></TR></TBODY></TABLE><BR>
<SCRIPT language=javascript>function CheckNetwordForm(theForm){ if("" == theForm.content.value) { alert("写两句吧~~"); theForm.content.focus(); return false; } var index; for(index=0;index<theForm.content.value.length;index++) { if(" " != theForm.content.value.charAt(index)) break; } if(index == theForm.content.value.length) { alert("写两句吧~~"); theForm.content.focus(); return false; } if (theForm.content.value.length>100){ alert("评论字数不能超过100哦"); theForm.content.focus(); return false; } return true;}</SCRIPT>
<!------------------ 评论 --------------->
<FORM name=netword onsubmit="javascript: return CheckNetwordForm(this);"
action=insertnetword.php method=post>
<TABLE cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD class=text6 height=25> 给此书打分:<A name=1></A> <SELECT
name=score> <OPTION value=5 selected>非常好</OPTION> <OPTION
value=4>还凑合</OPTION> <OPTION value=3>一般吧</OPTION> <OPTION
value=2>不太行</OPTION> <OPTION value=1>太差了</OPTION></SELECT>
用户名: <INPUT id=id type=hidden value=461 name=id> <INPUT type=hidden
value=/book/chapter.php?id=461&volume=4&chapter=7
name=backurl> <INPUT id=username maxLength=20 name=username> <FONT
color=#666666>*评论字数请控制在一百字以内</FONT> </TD></TR></TBODY></TABLE><BR> <TEXTAREA id=description name=content rows=4 wrap=off cols=80></TEXTAREA>
<INPUT type=submit value=提交 name=Submit>
</FORM></TD></TR></TBODY></TABLE></TD></TR></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD width=1003 background=基于Nokia手机的移动游戏开发(1).files/t_bj01.gif
height=9><IMG height=1 src="" width=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=760 bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<HR width=760 noShade SIZE=1>
</TD></TR>
<TR>
<TD align=middle><A class=black href="http://www.chinaren.com/"
target=_blank>ChinaRen</A> - <A class=black
href="http://big5.www.sohu.com/" target=_blank>繁体版</A> - <A class=black
href="http://hr.sohu.com/hrm.html" target=_blank>搜狐招聘</A> - <A class=black
href="http://add.sohu.com/" target=_blank>网站登录</A> - <A class=black
href="http://help.sohu.com/" target=_blank>帮助中心</A> - <A class=black
href="http://book.news.sohu.com/onClick=this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.sohu.com');return"
target=_blank false;>设置首页</A> - <A class=black
href="http://adinfo.sohu.com/" target=_blank>广告服务</A> - <A class=black
href="http://www.sohu.com/about/lianxi.htm" target=_blank>联系方式</A> - <A
class=black href="http://www.sohu.com/about/privacy.html"
target=_blank>保护隐私权</A> - <A class=black href="http://www.sohu.com/about/"
target=_blank>About SOHU</A> - <A class=black
href="http://www.sohu.com/about/" target=_blank>公司介绍</A><BR><SPAN
class=eng>Copyright © 2004 Sohu.com Inc. All rights reserved. 搜狐公司
版权所有</SPAN> </TD></TR></TBODY></TABLE></CENTER><!-- START NNR Site Census V5.1 --><!-- COPYRIGHT 2004 Nielsen // Netratings -->
<SCRIPT language=JavaScript type=text/javascript>
<!--
var _rsCI="cn-sohu";
var _rsCG="0";
var _rsDT=0;
var _rsDU=0;
var _rsDO=0;
var _rsX6=0;
var _rsSI=escape(window.location);
var _rsLP=location.protocol.indexOf('https')>-1?'https:':'http:';
var _rsRP=escape(document.referrer);
var _rsND=_rsLP+'//secure-cn.imrworldwide.com/';
if (parseInt(navigator.appVersion)>=4)
{
var _rsRD=(new Date()).getTime();
var _rsSE=1;
var _rsSV="";
var _rsSM=0.01;
_rsCL='<scr'+'ipt language="JavaScript" type="text/javascript" src="'+_rsND+'v51.js"><\/scr'+'ipt>';
}
else
{
_rsCL='<img src="'+_rsND+'cgi-bin/m?ci='+_rsCI+'&cg='+_rsCG+'&si='+_rsSI+'&rp='+_rsRP+'">';
}
document.write(_rsCL);
//-->
</SCRIPT>
<NOSCRIPT><IMG alt="" src="基于Nokia手机的移动游戏开发(1).files/m.gif"> </NOSCRIPT><!-- END NNR Site Census V5.1 -->
<SCRIPT language=JavaScript
src="基于Nokia手机的移动游戏开发(1).files/nnselect.js"></SCRIPT>
<NOSCRIPT><IMG height=1 src="" width=1> </NOSCRIPT></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -