游戏开发论坛

 找回密码
 立即注册
搜索
查看: 17547|回复: 20

[原创] J2ME手机游戏快速入门

[复制链接]

12

主题

423

帖子

428

积分

中级会员

Rank: 3Rank: 3

积分
428
QQ
发表于 2006-5-22 12:24:00 | 显示全部楼层 |阅读模式
  第一次上网找游戏网站时就找到了GameRes,从GameRes中学到了不少东西,因此也在这里发
表一些经验希望能帮上初学者.
  对于J2ME的开发环境安装在这里就不多说了.下面要用到的编译工具是WTK,编码工具是记事
本.接着就直接进入J2ME代码示例吧!
  首先要将一些文件包含进来如下:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
*.;表示将该文件中的所有的类都包含进来,初学时一般不知要用到那些类,所以这是很好的办法
接着我们就要创建一个程序入口类,如下:
public class main extends MIDlet
{
  public main(){}
  public void startApp(){}
  public void pauseApp(){}
  public void destroyApp(boolean unconditional){}
}
就这么简单,这个程序什么也没有作.
下面一行行来解说代码的作用吧
public class main extends MIDlet
用公用方式(public)创建一个名为main的类(class)
并继承了一个MIDlet实例.
每一个MIDlet都要重载三个函数,
startApp()     开始
pauseApp()   暂停
destroyApp() 结束

于是我们的游戏数据就得到了运算,比如游戏初始化就放在startApp里
资源释放就放在destroyApp里.游戏数据的运算有的很简单比如要一个
角色向左移动,就是将一个变量X的值减减而已,x--;那么这时就要将这个
结果显示到屏幕上,当然不是显示这个变量的值而是通过这个值作为该
角色的位置坐标显示到屏幕上.

12

主题

423

帖子

428

积分

中级会员

Rank: 3Rank: 3

积分
428
QQ
 楼主| 发表于 2006-5-22 15:44:00 | 显示全部楼层

Re: J2ME手机游戏快速入门

  接着就要有个屏幕操作方法,通常都是将其封装在一个类里,然后再创建这
个类的实例再用类里的方法来操作屏幕,如显示文字,显示图片等等.可为这
个类随便起一个名称:CScreen,还要继承Canvas类,每一个Canvas都要重载
一个paint函数;所有的代码如下,运行后将得到一个绿色的屏幕.代码已有注
释,就不再行行来解说了.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class main extends MIDlet
{
  private CScreen screen=null; //声明一个screen变量,类型是一个类CScreen

  public main(){}
  public void startApp()
  {
    screen=new CScreen();      //创建这个类
    Display.getDisplay(this).setCurrent(screen);
    screen.repaint();         //使用类中的父类(继承)的repaint强调重画屏幕方法
  }
  public void pauseApp(){}
  public void destroyApp(boolean unconditional)
  {
    screen=null;              //释放这个类
  }

  //定义屏幕类
  public class CScreen extends Canvas
  {
    public void paint(Graphics g)
    {
      g.setColor(0x00ff00);                   //调置为绿色
      g.fillRect(0,0,getWidth(),getHeight()); //填充一个绿色矩形
    }
  }
}

12

主题

423

帖子

428

积分

中级会员

Rank: 3Rank: 3

积分
428
QQ
 楼主| 发表于 2006-5-22 16:33:00 | 显示全部楼层

Re:J2ME手机游戏快速入门

  上面的代码应该很简单吧?这时程序已经能运算我们的数据,并且可以显示到屏幕上了.但是还
是暂短的,程序一运行就结束了,于是就要作一个死循环让程序不断的运行下去,如果直接用这个
死循环while(true){}程序就会卡死在那里,呵呵死机,于是就要作一个线程序,让这个循环放在
线程序中.多线程不是容易作的,但是J2ME为我们提供了一个接口,再重载线程的方法就方便多了
如:
public class main extends MIDlet implements Runnable
只是加上了一句 implements Runnable
然后在程序中重载:
public void run(){}
接着就:new Thread(this).start();
这样去启动线程
什么样简单吧?下面来试验一下.用字符O表示一个对象,程序要让这个O在屏幕中移动,碰中屏幕
边框就会反弹,就象跳跳球游戏那样,用两个变量记住O的当前位置,用两个变量记住O的移动量
int xm=20,ym=20,vx=3,vy=3;
另外要用两个变量记住屏幕的大小
int width=0,height=0;
然后让xm和ym在循环中作这样的运算:
xm+=vx;
ym+=vy;
if(xm<0 || xm>width) vx=-vx;
if(ym<0 || ym>height) vy=-vy;
接着用显示文字的方法通过xm,ym作为坐标显示到屏幕里
下面是完整的代码


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class main extends MIDlet implements Runnable
{
  private CScreen screen=null; //声明一个screen变量,类型是一个类CScreen
  private int xm=20,ym=20,vx=3,vy=3;
  private int width=0,height=0;

  public main(){}
  public void startApp()
  {
    screen=new CScreen();      //创建这个类
    Display.getDisplay(this).setCurrent(screen);
    screen.repaint();         //使用类中的父类(继承)的repaint强调重画屏幕方法
    new Thread(this).start(); //启动线程
  }
  public void pauseApp(){}
  public void destroyApp(boolean unconditional)
  {
    screen=null;              //释放这个类
  }
  public void run()
  {
    while(true)
    {
      try{Thread.sleep(50);}catch(Exception e){} //程序限针
      xm+=vx;
      ym+=vy;
      if(xm<0 || xm>width) vx=-vx;
      if(ym<0 || ym>height) vy=-vy;
      screen.repaint();         //使用类中的父类(继承)的repaint强调重画屏幕方法
    }
  }
  //定义屏幕类
  public class CScreen extends Canvas
  {
    public CScreen()
    {
      width=getWidth();   //得到屏幕的大小
      height=getHeight();
    }
    public void paint(Graphics g)
    {
      g.setColor(0x00ff00);                   //调置为绿色
      g.fillRect(0,0,getWidth(),getHeight()); //填充一个绿色矩形
      g.setColor(0xff0000);                   //O为红色
      g.drawString("O",xm,ym,Graphics.LEFT|Graphics.TOP);
    }
  }
}

12

主题

423

帖子

428

积分

中级会员

Rank: 3Rank: 3

积分
428
QQ
 楼主| 发表于 2006-5-22 17:39:00 | 显示全部楼层

Re:J2ME手机游戏快速入门

  对于游戏的三个基础中二个已讲完,就是 数据运算,数据显示,还有一个就是数据控制啦.数据的
控制也很简单,就是获取键输入再作相应的处理.如某某键按下某某数据作改变等等.
  要在J2ME中获取键入消息,只要在继承Canvas的类中重载二个函数即可:
如同按下事件
protected void keyPressed(int keyCode){}
放开事件
protected void keyReleased(int keyCode){}
不过我不会把数据控制写进这些事件里,而是用一个变量或数组记住这键的状态
int myKey=0;
再用一个方法去获取这个变量当作键值。
int Getkey(){return myKey;}
然后就可以在类的实例中这样去使用:
if(screen.GetKey()==2) vx--;
好啦我们就去体验一下键控小球吧,当按下方向键时O作相应的变化,可能会回头走,
可能会加速前走,可会向下趺,等等。代码如下:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class main extends MIDlet implements Runnable
{
  private CScreen screen=null; //声明一个screen变量,类型是一个类CScreen
  private int xm=20,ym=20,vx=3,vy=3;
  private int width=0,height=0;

  public main(){}
  public void startApp()
  {
    screen=new CScreen();      //创建这个类
    Display.getDisplay(this).setCurrent(screen);
    screen.repaint();         //使用类中的父类(继承)的repaint强调重画屏幕方法
    new Thread(this).start(); //启动线程
  }
  public void pauseApp(){}
  public void destroyApp(boolean unconditional)
  {
    screen=null;              //释放这个类
  }
  public void run()
  {
    while(true)
    {
      try{Thread.sleep(50);}catch(Exception e){} //程序限针
      if(screen.GetKey()==2) vx--; //键控小球
      if(screen.GetKey()==5) vx++;
      if(screen.GetKey()==1) vy--;
      if(screen.GetKey()==6) vy++;
      xm+=vx;
      ym+=vy;
      if(xm<0 || xm>width) vx=-vx;
      if(ym<0 || ym>height) vy=-vy;
      screen.repaint();         //使用类中的父类(继承)的repaint强调重画屏幕方法
    }
  }
  //定义屏幕类
  public class CScreen extends Canvas
  {
    int myKey=-1;
    public int GetKey(){return myKey;}
    public CScreen()
    {
      width=getWidth();   //得到屏幕的大小
      height=getHeight();
    }//2156
    //重载按键消息
    protected void keyPressed(int keyCode){myKey=getGameAction(keyCode);}
    protected void keyReleased(int keyCode){myKey=-1;}
    //重画屏幕
    public void paint(Graphics g)
    {
      g.setColor(0x00ff00);                   //调置为绿色
      g.fillRect(0,0,getWidth(),getHeight()); //填充一个绿色矩形
      g.setColor(0xff0000);                   //O为红色
      g.drawString("O",xm,ym,Graphics.LEFT|Graphics.TOP);
    }
  }
}

12

主题

423

帖子

428

积分

中级会员

Rank: 3Rank: 3

积分
428
QQ
 楼主| 发表于 2006-5-22 17:52:00 | 显示全部楼层

Re: J2ME手机游戏快速入门

  好了基本功已学好啦,我就把这些应用程序发出来吧。下次再开始更有趣的编程
游戏机构,即是有限状态机。完成游戏标题,游戏帮助,游戏菜单。等等。

sf_2006522175219.rar

2.1 KB, 下载次数:

10

主题

74

帖子

89

积分

注册会员

Rank: 2

积分
89
QQ
发表于 2006-5-23 17:25:00 | 显示全部楼层

Re:J2ME手机游戏快速入门

    好贴啊!!555555

12

主题

423

帖子

428

积分

中级会员

Rank: 3Rank: 3

积分
428
QQ
 楼主| 发表于 2006-5-23 18:26:00 | 显示全部楼层

Re:J2ME手机游戏快速入门

  下面去讲游戏机构,先看看代码
private final int GAMESTATUS_MAINTITLE =1;
private final int GAMESTATUS_INSCENE   =2;
private final int GAMESTATUS_HELP      =3;
private final int GAMESTATUS_ENDING    =4;
让游戏先进入标题状态
private int GameStatus=GAMESTATUS_MAINTITLE;
启动游戏机构
while(true)
{
  switch(GameStatus)
  {
  case GAMESTATUS_MAINTITLE:   //标题状态
    break;
  case GAMESTATUS_INSCENE:     //场景状态
    break;
  case GAMESTATUS_HELP:        //游戏帮助
    break;
  default:                     //状态出错
    GameStatus=GAMESTATUS_ENDING;
  }
}
这就是游戏机构啦,是不是很简单呢?不过现在还看不到她的
用处要继续看下去才能了解,为了方便游戏机构的处理我们要
对一些程序进行封装成类并放在不同的文件中去。对于屏幕的
操作已封装成类了,但是重画方法被封死在paint函数中,我
们不想再在这个函数里作一个机构去驱分是该画标题还是场景
等等,所以我们要把函数中的Graphics对象提出来再操作,这
样就方便多啦,要得到Graphics对象有很多方法,如果不考虑
后缓冲的处理可以这样作:
private Graphics graphics=null;
public void paint(Graphics g)
{
  if(graphics==null) graphics=g;
}
这时程序就保存了Graphics对象,我们就可以随处使用graphics
去进行屏幕操作了。接着就在屏幕类里加上一些方法:

//设置颜色
public void SetColor(int color)
{
  if(graphics==null) return ; //如果对象未创建就退出
  graphics.setColor(color);   //设置颜色
}
//显示文字
public void DrawString(String str,int x,int y)
{
  if(graphics==null) return ; //如果对象未创建就退出
  graphics.drawString(str,x,y,Graphics.LEFT|Graphics.TOP);
}
//清屏
public void Cls(int color)
{
  if(graphics==null) return ; //如果对象未创建就退出
  graphics.setColor(color);
  graphics.fillRect(0,0,getWidth(),getHeight());
}
使用就象这样:
screen.Cls(0x000000);
以后还要什么方法的话再加吧
现在用三个方法,设置颜色,显示文字,清屏,我们就可以作
标题中的菜单,帮助说明。嗯,下面就开始游戏标题的制作吧。

10

主题

74

帖子

89

积分

注册会员

Rank: 2

积分
89
QQ
发表于 2006-5-24 16:52:00 | 显示全部楼层

Re:J2ME手机游戏快速入门

谢谢,努力学习中。

10

主题

74

帖子

89

积分

注册会员

Rank: 2

积分
89
QQ
发表于 2006-5-24 16:53:00 | 显示全部楼层

Re:J2ME手机游戏快速入门

加我QQ好么515627578

12

主题

423

帖子

428

积分

中级会员

Rank: 3Rank: 3

积分
428
QQ
 楼主| 发表于 2006-5-25 14:44:00 | 显示全部楼层

Re:J2ME手机游戏快速入门

加了,你不在线.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-28 16:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表