精华在于按钮事件机制
一个是长按一个是按下,另外值得一题的是除了0-9的数字键外都认为是游戏见
keyCode需要用getGameAction()转换一下在进行判断
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MIDlet1 extends MIDlet
{
private Display dis;
private Mycanvas mc =new Mycanvas();
protected void startApp() throws MIDletStateChangeException
{
dis=Display.getDisplay(this);
dis.setCurrent(mc);
}
class Mycanvas extends Canvas
{
private Image img;
int x,y,dir=Sprite.TRANS_NONE;;
protected Mycanvas()
{
x=0;y=0;
try
{
img=Image.createImage("/img.gif");
} catch (IOException e)
{
e.printStackTrace();
}
}
protected void paint(Graphics g)
{
g.setColor(255, 255, 255);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.drawRegion(img, 0, 0, img.getWidth(), img.getHeight(), dir, x, y, Graphics.LEFT|Graphics.TOP);
}
protected void keyRepeated(int keyCode)
{
int action;
action=this.getGameAction(keyCode);
switch(action)
{
case Canvas.UP: y-=5;break;
case Canvas.DOWN: y+=5;break;
case Canvas.LEFT: x-=5;break;
case Canvas.RIGHT: x+=5;break;
}
this.repaint();
}
protected void keyPressed(int keyCode)
{
int action;
action=this.getGameAction(keyCode);
if(action==Canvas.FIRE)
{
switch(dir)
{
case Sprite.TRANS_NONE: dir=Sprite.TRANS_MIRROR_ROT270; break;
case Sprite.TRANS_MIRROR_ROT90: dir=Sprite.TRANS_MIRROR_ROT180; break;
case Sprite.TRANS_MIRROR_ROT180: dir=Sprite.TRANS_MIRROR_ROT270; break;
case Sprite.TRANS_MIRROR_ROT270: dir=Sprite.TRANS_NONE; break;
}
this.repaint();
}
}
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
}
posted @
2008-07-21 22:07 atskyline 阅读(637) |
评论 (0) |
编辑 收藏
厦门一中百年校庆典礼一度确定在26日,这天是厦门一中校庆的“正日”,不过,校方考虑到26日是星期四,不方便校友回学校参加,所以确定在28日。Wind和lolanv却不做好事.....
厦门一中百年校庆的时候,学校大发慈悲让全校同学放了一天假。Wind和lolanv又在一起玩游戏了~。
因为以往的游戏决策都太少。Wind觉得几天就能研究透了,所以,他又发明了一个新的游戏。
首先,地板上有k堆石子,Wind和lolanv轮流进行如下操作:
选择一堆石子,从中拿走若干个(至少一个),并可以把剩下的这堆石子拿若干(或全部)自由分到其他堆石子(包括原来没有石子的"堆",而且可以同时分配石子给若干堆)。
谁如果取走最后一个石子,谁就赢了。
Wind很大方的对lolanv说:“就让你先取吧。”
Wind已经对这个游戏了如指掌,但是lolanv也想赢,他吃了一罐菠菜,但是还是想不出来(大力水手),他想知道是不是他永远赢不了,他需要你来帮忙。
--------------------------------------------------------------------------------------------------------------------------
|
输入格式 Input Format |
|
|
每组测试数据第一行为k(k<=10),表示有k个数据 对于每个数据, 第一行为n,表示有n堆石子(n<=5000) 第二行n个数,表示每堆石子有多少(1<=每堆石子<=maxlongint)。 |
|
输出格式 Output Format |
|
|
每组数据k行, 为"Wind"或"lolanv",表示谁能获得胜利。 |
http://www.vijos.cn/Problem_Show.asp?id=1298
posted @
2008-07-20 14:05 atskyline 阅读(343) |
评论 (0) |
编辑 收藏
Canvas类 低级界面开发的一个初步程序
package DrawSin;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MIDlet1 extends MIDlet
{
private Display dis;
private Draw d = new Draw();
protected void startApp() throws MIDletStateChangeException
{
d.setTitle("DrawSin");
dis = Display.getDisplay(this);
dis.setCurrent(d);
}
class Draw extends Canvas
{
protected void paint(Graphics g)
{
g.setColor(255, 0, 0);
g.drawLine(0, 150, 300, 150);//x轴
g.drawLine(100, 0, 100, 300);//y轴
int y=0;
for(int x=0;x<=3600;x++)
{
y= (int)(150+10*Math.sin(x*Math.PI/180));
g.drawLine((int)(x/10), y, (int)(x/10), y);
}
}
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
}
posted @
2008-07-19 23:20 atskyline 阅读(494) |
评论 (0) |
编辑 收藏
其实就是J2SE异常的那些东西.
代码中把字符串s样转换成int 明显会抛出异常
我们定义了一个继承于Exception 的自定义异常类
并将异常抛给客户端处理
import java.util.Date;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MIDlet1 extends MIDlet
{
protected void startApp() throws MIDletStateChangeException
{
String s="a";
try
{
this.print(s);
} catch (CustomException e)
{
System.out.println(e.getMessage());
System.out.println(e.getDate());
}
}
public void print(String str) throws CustomException
{
try
{
int intValue = Integer.parseInt(str);
int result = intValue*intValue;
System.out.println(result);
}
catch(Exception ex)
{
CustomException ce =new CustomException("错误",new Date());
throw ce;
}
}
class CustomException extends Exception
{
private Date date;
public CustomException(String message,Date date)
{
super(message);
this.date=date;
}
public Date getDate()
{
return this.date;
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
}
posted @
2008-07-16 21:17 atskyline 阅读(275) |
评论 (0) |
编辑 收藏
代码中演示了ChoiceGroup和TextField(列表框和文本框)的使用及其事件响应方式的使用
和Dispalyable类不同的是Item类是无法占据整个屏幕的
通常是使用Form类的append(Item item)添加到Form上的
Item的事件处理方式和Command的事件有几分类似
是通过ItemCommandListener或ItemStateListener接口实现的
一个是命令事件一个是状态改变的事件 具体的使用方法参看代码
/**
* project :aboutItem
* @author atskyline
* @FirstWriteTime 2008.07.12
* @LastWriteTime 2008.07.12
*/
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MIDlet1 extends MIDlet implements ItemCommandListener,ItemStateListener
{
private Display dis;
private Form frm = new Form("Form");
private ChoiceGroup cg1 =new ChoiceGroup("ChoiceGroup", Choice.POPUP);
private TextField text1 =new TextField("TEXT1", "text1", 20, TextField.ANY);
private TextField text2 =new TextField("TEXT2", "text2", 20, TextField.ANY);
private Command cmdDel =new Command("删除字符",Command.ITEM,1);
protected void startApp() throws MIDletStateChangeException
{
dis=Display.getDisplay(this);
dis.setCurrent(frm);
frm.append(cg1);
cg1.append("选项A", null);
cg1.append("选项B", null);
frm.append(text1);
frm.append(text2);
text1.addCommand(cmdDel);
text2.addCommand(cmdDel);
text1.setItemCommandListener(this);
text2.setItemCommandListener(this);
frm.setItemStateListener(this);//注意是用frm绑定而非cg1
}
public void commandAction(Command c, Item item)
{
if(c==cmdDel)
{
TextField tf=(TextField)item;
int Position=tf.getCaretPosition();
tf.delete(Position-1, 1);
}
}
public void itemStateChanged(Item item)
{
if(item==cg1)
{
String s=cg1.getString(cg1.getSelectedIndex());
frm.setTitle(s);
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
}
posted @
2008-07-12 21:42 atskyline 阅读(1140) |
评论 (1) |
编辑 收藏
右击项目名选择"Properties"
在J2ME项中的"Device"选择要改变的模拟器
posted @
2008-07-10 22:27 atskyline 阅读(311) |
评论 (0) |
编辑 收藏
JDK6+SunWTK+Eclipse+EclipseMe
第一步:下载
http://www.sun.com/(要下载JDK和WTK)
http://www.eclipse.org/
http://eclipseme.org/
我现在使用的版本是
jdk-6u6-windows-i586-p.exe
sun_java_wireless_toolkit-2_5_2-ml-windows.exe
eclipse-SDK-3.3.2-win32.zip
eclipseme.feature_1.7.9_site.zip
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二步:安装
首先运行jdk-6u6-windows-i586-p.exe
通常选择全部安装就是了 记住安装地址哦~
会要你选择一些自定义安装的东西 全选就是了
这样就完成了JDK的安装
接下来运行sun_java_wireless_toolkit-2_5_2-ml-windows.exe
这是一个模拟器 当然诺基亚 索爱 MOTO等等品牌也有属于自己的手机模拟器
这些在网上都是可以找到的安装配置的方法大同小异
也因为刚刚入门J2ME,还有教程中是用模拟器,就暂时不安装其他品牌的模拟器
安装狂点"下一步"就是了,它会自动找到你JDK的位置
接下来解压eclipse-SDK-3.3.2-win32.zip
运行目录中的eclipse.exe文件
会要求你选择工作目录
点OK就是了
这样就可以进入到Eclipse
接下来就是安装EclipseMe插件
在Eclipse的菜单中选择Help->Sofware Updates->Find and Install...
接下来选择"Search for new feature to install" 后,单击"Next"
进入下图界面
单击右上边的"New Archived Site"找到eclipseme.feature_1.7.9_site.zip文件
最后按下"Finish"
来到Updates界面 把eclipseme.feature_1.7.9_site.zip全部打勾
单击几个"Next"
来到这个界面
单击"Install All" 之后会需要重启Eclipse
这样EclipseMe就算安装完成了
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第三步:配置
我们完成了JDK WTK Eclipse EclipseMe的安装
并且JDK与WTK已经关联到一起了
EclipseMe插件也安装成功了 接下来我们需要把Eclipse和WTK进行关联
这样我们的配置工作就算完成了
运行Eclipse
选择菜单Window->Preferences...
看到如下界面
选择J2ME树下的Devic Management
单击右边的"Import"
单击"Browe.."选择你WTK的安装目录 然后单击右边的"Refresh"这样就可以看到和截图一样的内容,最后单击"Finish"
回到Preferences的界面这是右边多了几个选项 也就是几个不同的模拟器 选择自己喜欢的一个 我是跟这[郭克华]的教程选择了DefaultColorPhone
单击"OK"这样就算完成了基本的配置
接下来顺便一下与WTKdocs关联的配置
在WTK的目录中已经带有doc了
其中又以WTK2.5.2\docs\api\midp下的资料最为常用
回到我们刚才那个界面 选中你常用的模拟器单击右边的"Edit..."
选择第二个标签"Libraries"找到一个"midpapi21.jar"的项单击表格中的"Javadoc"的扩展按钮
单击"External Folder..."选择你WTK目录下的\docs\api\midp
单击"OK"这样就完成doc的配置了
关于更多Eclipse的配置可以参考
Eclipse中文教程.pdf
下载地址http://download.csdn.net/source/351943
或者直接BAIDU
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第四步:第一个程序
安装配置结束也总该开始写我们的第一个程序了
单击菜单File->New->Other...
选择J2ME->J2ME Midlet Suite 单击"Next"
输入项目名称 剩下都是用默认设置就好了
完成后再左侧可以看到我们新建的项目
右击src选择New->Other...
这回选择J2ME Midlet
输入类名称
然后完成新建任务 会自动生成初始的代码
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MIDlet1 extends MIDlet {
public MIDlet1() {
// TODO Auto-generated constructor stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
}
代码的意思在下一篇笔记中会有解释
现在先看看怎么运行
右键你新建的.java文件 Run As->Emulated J2ME Midlet
然后出现如下界面 也就是运行成功了
posted @
2008-07-10 20:46 atskyline 阅读(1686) |
评论 (0) |
编辑 收藏