基于Nokia平台的游戏通用框架

本文介绍了一款基于Nokia平台的手机游戏通用框架,通过模块化的处理方式简化了游戏开发流程。该框架包括游戏初始化、主逻辑、绘制及退出四个核心部分,并提供了按键处理和时间控制等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手机游戏程序框架总是一定的,因此,为了节省开发时间,我整理了一个基于Nokia平台的游戏通用框架,这样在开发新的项目的时候,只需稍加修改就可以直奔游戏主题了。这个框架进行了按键处理,游戏主体分为gameInit(),gameMain(),gameDraw(),gameExit()四个大的模块,全部代码如下:


import java.io.InputStream;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

import com.nokia.mid.ui.FullCanvas;
/**
* Project : J2meTools
* JDK version used: jdk1.4.2
* Version: 1.00
* Created By: 飘飘白云
* Created date: 2006-3-8 17:41:11
* Discription: Nokia游戏程序框架
* Modification history
*
**/

public class J2meTools extends MIDlet
{
GameCanvas canvas;
Display display;
public J2meTools() {
super();
try {
display = Display.getDisplay(this);
canvas = new GameCanvas(this,display);
} catch (Exception e) {}
// TODO Auto-generated constructor stub
}

protected void startApp() throws MIDletStateChangeException
{
// TODO Auto-generated method stub
display.setCurrent(canvas);
}

protected void pauseApp()
{
// TODO Auto-generated method stub

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
// TODO Auto-generated method stub

}
}

class GameCanvas extends FullCanvas implements Runnable , CommandListener
{
//====================================================
//系统变量
//====================================================
public Threadthread;
public J2meToolsapp;
Displaydisplay;
ImageoffImage= null;
public Graphicsg= null;
public booleanbePause= false;
public booleanbeExit= false;
public boolean beInited= false;
public static final intsleepTime= 35;

static long startTime;//游戏开始时间
static long curT;//当前时间
static long tmWait;//计时器用

static int scrW ;
static int scrH ;
static int fontH;
static int fontW;
static int mvx = 0;//由于硬件屏幕具体位置可能有偏差,在这里调整描绘的参考原点
static int mvy = 0;
static Font font;


//====================================================
//手机平台相关变量
//====================================================
static final int gameW = 176;//S60机型的屏幕宽
static final int gameH= 208;//S60机型的屏幕高

//====================================================
//键盘变量
//====================================================
private static int keyNow= 0;//
private static int keyEdge= 0;//
private static int keyPrev= 0;//
private static int keyRep= 0;//
private static int keyRepWk= 0;//
private static int keyRepWait= 3;//3次连续按键之后,算重复按键

private static final int K_RIGHT= 1;
private static final int K_LEFT= 2;
private static final int K_UP= 4;
private static final int K_DOWN= 8;
private static final int K_SELECT= 16;
private static final int K_SOFT1= 32;
private static final int K_SOFT2= 64;

//====================================================
//描绘相关变量
//====================================================
//back color
public static final int bgColorR= 41;
public static final int bgColorG= 174;
public static final int bgColorB= 255;

private static final int BLACK = 0;
private static final int WHITE = 0x00ffffff;
private static final int RED= 0x00ff0000;
private static final int BLUE= 0x000000ff;


//====================================================
//声音相关函数
//====================================================
private int sndNum = 5;// 背景音和效果音,本例:sndPlayer[0]为背景音,其他为效果音
private boolean bgSoundOn = true;// 背景音开关标志
private boolean efSoundOn = true;// 效果音开关标志
private int curBGS = 0;// 当前背景音,如果有多个背景音
public Player[] sndPlayer = new Player[sndNum];


//====================================================
//游戏状态
//====================================================
private int gameMode;
private int subMode;

//主状态定义
private static final int GM_INIT = 0;
//.......

//子状态定义
private static final int SM_INIT = 0;
private static final int SM_PROC = 1;
private static final int SM_END= 2;
//.......

//====================================================
//其他变量定义
//====================================================


//====================================================
//函数
//====================================================
public void paint(Graphics _g)
{
_g.drawImage(offImage, 0, 0, 0);
}

public GameCanvas(J2meTools _app,Display dsp)
{
app = _app;
display = dsp;

thread = new Thread(this);
thread.start();
}

public void run()
{
// 初始化
if( !beInited ) {
gameInit();
}

while( !beExit ) {
curT = System.currentTimeMillis();
try {
Thread.sleep( sleepTime );
} catch (Exception e) {
}

scanKey();//键盘扫描
gameMain();//游戏逻辑处理
gameDraw();//游戏描绘处理

}

if( beExit ) {
gameExit();
}
}

/**
* 初始化应用程序
*/
public void gameInit()
{
//==================================================
//系统变量初始化
//==================================================
startTime= System.currentTimeMillis();
beExit = false;

scrW = getWidth();
scrH = getHeight();
mvx = (scrW - gameW) / 2;
mvy = (scrH - gameH) / 2;

if(g == null || offImage == null) {
offImage = Image.createImage(scrW, scrH);
g = offImage.getGraphics();
}
repaint();

font = Font.getFont(Font.FACE_PROPORTIONAL,

Font.STYLE_PLAIN,Font.SIZE_LARGE);
g.setFont(font);
fontH = font.getHeight();
fontW = font.stringWidth("字");


//==================================================
//其他变量初始化
//==================================================
//TODO:其他变量初始化
gameMode = GM_INIT;
subMode = SM_INIT;

beInited = true;
}

/**
* 游戏逻辑处理
*/
public void gameMain()
{
if( gameMode == GM_INIT ) {
if( subMode == SM_INIT ) {
//计时器示例
tmWait = curT + 2000;
subMode = SM_PROC;
}
else if( subMode == SM_PROC ) {
if( curT > tmWait ) {
subMode = SM_END;
}
}
else if( subMode == SM_END ) {
//按键示例
if( 0 != ((keyRep | keyEdge) & K_SELECT)){
beExit = true;
}
}

}
}

/**
* 游戏描绘处理
*/
public void gameDraw()
{
g.translate(mvx,mvy);
if( gameMode == GM_INIT ) {
if( subMode == SM_PROC ) {
g.setColor(bgColorR,bgColorG,bgColorB);
g.fillRect(0,0,scrW,scrH);
g.setColor(WHITE);
g.drawString("Nokia s60 demo!",30,50,0);
}
else if( subMode == SM_END ) {
g.setColor(bgColorR,bgColorG,bgColorB);
g.fillRect(0,0,scrW,scrH);
g.setColor(WHITE);
g.drawString("Timer use!",30,50,0);
g.drawString("Press enter to exit!",30,70,0);
}
}

repaint();
}

/**
* 游戏结束前的清理工作清理处理
*/
public void gameExit()
{
//TODO:断开网络,释放资源等清理工作

app.notifyDestroyed();
}

//====================================================
//键盘操作相关函数
//====================================================
public void scanKey()
{
keyEdge = keyNow & (~keyPrev);
if (keyNow == 0 || keyNow != keyPrev) {
keyRepWk = 0;
keyRep = keyNow;
} else {
if (keyRepWk++ > keyRepWait) {
keyRepWk = 0;
keyRep = keyNow;
} else {
keyRep = 0;
}
}
keyPrev = keyNow;
}

private int getGameKey(int keyCode)
{
if (keyCode == 0){
return 0;
}

int act = getGameAction(keyCode);
if( act == FIRE)
return K_SELECT;
else if( act == RIGHT)
return K_RIGHT;
else if( act == LEFT)
return K_LEFT;
else if( act == UP)
return K_UP;
else if( act == DOWN)
return K_DOWN;

//if( keyCode == KEY_NUM0 )
//return 0x00000200;
//if( keyCode == KEY_NUM1 )
//return 0x00000400;
if( keyCode == KEY_NUM2 )
return K_UP;
//if( keyCode == KEY_NUM3 )
//return 0x00001000;
if( keyCode == KEY_NUM4 )
return K_LEFT;
if( keyCode == KEY_NUM5 )
return K_SELECT;
if( keyCode == KEY_NUM6 )
return K_RIGHT;
//if( keyCode == KEY_NUM7 )
//return 0x00010000;
if( keyCode == KEY_NUM8 )
return K_DOWN;
//if( keyCode == KEY_NUM9 )
//return 0x00040000;
//if( keyCode == KEY_POUND )
//return 0x00000100;
//if( keyCode == KEY_STAR )
//return 0x00000080;
if( keyCode == -6 )
return K_SOFT1;
if( keyCode == -7 )
return K_SOFT2;
return 0;
}

public void ClearKey()
{
keyNow = 0;
keyPrev = 0;
keyEdge = 0;
keyRep = 0;
}

protected synchronized void keyPressed(int keyCode)
{
int key = getGameKey(keyCode);
keyNow |= key;
//电源键
if(keyCode == -11) {
gameExit();
}
}

protected synchronized void keyReleased(int keyCode) {
int key = getGameKey(keyCode);
keyNow ^= key;
}

//====================================================
//声音相关函数
//====================================================

private void loadSound(int no) {
try {
String loc = "/res/snd" + Integer.toString(no) + ".mid";
InputStream is = getClass().getResourceAsStream(loc);
String ctype = "audio/midi";

sndPlayer[no] = Manager.createPlayer(is, ctype);
sndPlayer[no].realize();
sndPlayer[no].prefetch();
} catch (Exception e) {
e.printStackTrace();
}
}

private void playSound(int no)
{
try {
if (no == 0) {
if (bgSoundOn) {
//if(sndPlayer[no].getState() != Player.STARTED){
StopBGM();
loadSound(no);
sndPlayer[no].setLoopCount(-1);
sndPlayer[no].start();
//}
curBGS = no;
}
} else {
if (efSoundOn) {
StopSE();
loadSound(no);
sndPlayer[no].setLoopCount(1);
sndPlayer[no].start();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

public void StopBGM()
{
try {
sndPlayer[0].close();
System.gc();
} catch (Exception e) {
}

}

private void StopSE()
{
try {
for (int i = 1; i < 6; i++) {
sndPlayer[i].close();
}
System.gc();
} catch (Exception e) {
}
}

public void commandAction(Command arg0, Displayable arg1)
{}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值