📄 game.java
字号:
package com.j2medev.chapter5;
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;
/**
* @name Game
* @author liloi <liloi@hotmail.com>
* @version 2.0
*/
//#if ( NOKIA_S60_V1 || NOKIA_S60_V2 || NOKIA_S40_V1 || NOKIA_S40_V2)
public class Game extends com.nokia.mid.ui.FullCanvas implements Runnable,
MyGameInterface
//#else
//# public class Game
//# extends Canvas
//# implements Runnable, MyGameInterface
//#endif
{
//////////////////////////////////////////////////////////////////////////////
// Variables
//////////////////////////////////////////////////////////////////////////////
//#if MOTO_E680
//# public Image backImage = Image.createImage(SCREEN_WIDTH, SCREEN_HEIGHT);
//# public Graphics backG = backImage.getGraphics();
//#else
public Graphics backG;
//#endif
public Main m_Midlet; // Midlet类
protected boolean bSelectKeyDown; //在菜单动画状态下是否有选择键按下
protected static final int REPAINT_DELAY = 64; //游戏的延迟(一桢动画播放的时间单位毫秒)
public static int SCREEN_W_K700 = 176;
public static int SCREEN_H_K700 = 220;
/**
* 动画变量
* 用于播放动画编辑器制作的动画
*/
protected PieceSprite m_DemoAnimation; //教学动画
protected PieceSprite m_ReadyAnimation; //准备动画
protected PieceSprite m_MenuFrameAnimation; //菜单动画
protected PieceSprite m_CoverAnimation; //封面动画
/**
* 声音变量
* 用于播放声音
*/
private MySound mySound; // 声音类
public int soundLevel = 3; // 声音高低
public boolean sSoundOpen = true; // 是否播放声音
/**各种全局变量值*/
private byte gameState; // 当前游戏状态
private int totalBonus; // 总得分
private boolean isPass; // 是否过关
public Map myMap; // 地图对象
public int mapBase; // 地图移动基准
public Role thisRole; // 当前角色对象
public Role roleBoy; // 创建男孩角色对象
public Role roleGirl; // 创建女孩角色对象
public Role roleNinja; // 创建忍者角色对象
int wordWidth = 0;
/**
*绘制雨或雪时用的参数
*/
//绘制雨或雪的2个方位的位置
short SnowPosx[];
short SnowPosY[];
//雨雪的尺寸
short SnowSize[];
// 用于控制是否下雨或下雪
private Random randSnow = new Random(System.currentTimeMillis());
// 用于控制雨雪量的多少
private Random randSnowCount = new Random(System.currentTimeMillis());
private int currentSnow;
/**奖品、工具、障碍和敌人的存储队列*/
PVector bonusVector = new PVector();
PVector toolVector = new PVector();
PVector fraiseVector = new PVector();
PVector enemyVector = new PVector();
/**各种图片*/
private Image imgLogo1; //移动公司图片
private Image imgLogo2; //摩动时代图片
private Image imgCover; //封面图片
private Image imgLoading; //读取图片
private Image imgMenu; //菜单图片
private Image imgAbout; //关于图片
private Image[] imgRoleHead = new Image[3]; // 角色的头部图片
private Image thisImgRoleHead; //当前头部图片
private Image imgSkateboard; // 滑板图片
private Image imgForeground; // 前景图片
private Image imgDecTop; // 顶层装饰图片
private Image imgDecBottom; // 底层装饰图片
private Image[] imgFraise = new Image[8]; // 障碍物图片
private Image[] imgBonus = new Image[6]; // 奖品图片
private Image[] imgTool = new Image[3]; // 工具图片
private Imagex[] imgxEnemy = new Imagex[3]; // 敌人图片
private Imagex[] imgxEnemyDead = new Imagex[3]; // 敌人受伤图片
private ImageNumber inNumber; // 用于显示数字的对象
//背景的四层结构
private Image imgSky; //天空图片(放在最后一层)
private Image imgCloud; //云彩图片(在天空前面)
private Image imgBuilding; //建筑物图片(在云彩前面)
private Image imgLand; //涂鸦墙图片(在建筑物前面)
/**背景滚动宽度*/
private int bgRockWidth = 0;
/**建筑物滚动宽度*/
private int bgBuildWidth = 0;
/**云彩滚动速度(游戏中有3朵云彩且速度不一样)*/
private int[] bgCloudWidth = new int[3];
/**前景滚动宽度*/
private int fgRockWidth = 0;
/**线程相关*/
private boolean threadLoop; // 线程是否继续
/**其它*/
private int loadingGuage = 0;
private int loadingGuage2 = 0;
private int MacroSpeed; // 整个游戏移动的速度
private byte currentScreen; // 当前关卡(0~5分别对应6个不同关卡;6~9对应高级关卡)
private byte currentRole; // 当前角色(在本游戏中与小局一一对应)
protected Vector m_Text;
private int V600_WORD_HEIGHT;
/** 各种字体 */
protected Font m_MenuFont;
protected Font m_HelpFont;
protected Font m_PressAnyKeyFont;
protected Font m_CreditsFont;
protected Font m_HiscoreFont;
/*帮助菜单变量*/
private int helpLines;
private int helpPages;
private int currPage;
private int m_CursorSmallDIS;
private int m_LastPosition;
private int m_Position; //used for title position indication
public boolean m_Paused = false; //pause flag
public long m_LastTime; //used for timer/delay tasks
private Imagex imgx_selector = new Imagex();
private Imagex imgx_MenuItems = new Imagex();
/*记录存取*/
private RecordStore recordStore;
//记录存储数组
public byte SaveData[];
/////////////////////////////////
/// General look&feel ///
/////////////////////////////////
protected int m_Position_pop;
protected Font m_Font;
protected Font m_BoldFont;
protected Font m_PlainFont;
protected Image m_BufferedImage;
protected Image m_FadeImage;
/////////////////////////////////////////////////////////
/// Methods ///
/////////////////////////////////////////////////////////
/**
* 构造函数
* @param d Display reference
* @return none
*/
public Game() {
//#if ( NOKIA_S60_V1 || NOKIA_S60_V2|| NOKIA_S40_V1 || NOKIA_S40_V2)
//#else
//# setFullScreenMode(true); //设置全屏
//#endif
/* set paused mode */
m_Paused = false; //用于控制循环是否暂停
/* 初始化天气 */
SnowPosx = new short[50];
SnowPosY = new short[50];
SnowSize = new short[50];
for (int i = 0; i < 50; i++) { //绘制雨,向左向右
SnowPosx[i] = (short) (Math.abs(randSnow.nextInt()) % SCREEN_WIDTH);
SnowPosY[i] = (short) (Math.abs(randSnow.nextInt()) % SCREEN_HEIGHT);
SnowSize[i] = (short) (Math.abs(randSnow.nextInt()) % 3 + 1);
}
/* 初始化声音 */
mySound = new MySound();
mySound.setSoundOpen(true);
mySound.setSoundLoopCount(0, -1);
mySound.setSoundLevel(100);
//#if MOTO_E398||MOTO_V600
//# V600_WORD_HEIGHT = 5;
//#else
V600_WORD_HEIGHT = 0;
//#endif
/* start us as thread */
threadLoop = true; // 控制线程循环
new Thread(this).start();
}
/**
* 存储游戏数据
*/
public void WriteData() {
try {
SaveData[0] = currentScreen; // 存储当前关
SaveData[1] = currentRole; // 存储当前人物(亦即当前小局)
recordStore = RecordStore.openRecordStore("skateBoard_data", true);
if (recordStore.getNumRecords() == 0) {
recordStore.addRecord(SaveData, 0, 2);
}
else {
recordStore.setRecord(1, SaveData, 0, 2);
}
}
catch (Exception e) {
e.printStackTrace();
}
System.gc();
}
/**
* 读取游戏数据
*/
protected void ReadData() {
try {
recordStore = RecordStore.openRecordStore("skateBoard_data", true);
if (recordStore.getNumRecords() == 0) {
return;
}
}
catch (Exception e) {
e.printStackTrace();
System.out.println("Error");
}
try {
SaveData = recordStore.getRecord(1);
currentScreen = SaveData[0];
currentRole = SaveData[1];
}
catch (Exception e1) {
e1.printStackTrace();
}
System.gc();
}
/**
* 按键按下的相应
* @brief indicate, that key has been pressed
* @param keyCode key code of the key, which state is to be changed
*/
protected void keyPressed(int keyCode) {
switch (gameState) {
case STATE_DEMO:
switch (keyCode) {
case KEY_2:
case KEY_UP:
case KEY_8:
case KEY_DOWN:
case KEY_5:
case KEY_FIRE:
case SOFT_KEY_LEFT:
changeState(STATE_MAINMENU);
break;
}
break;
case STATE_MAINMENU:
checkKeys(MENU_MAIN, true, keyCode);
break;
case STATE_OPTIONSMENU:
checkKeys(MENU_OPTIONS, false, keyCode);
if (keyCode == KEY_5 || keyCode == KEY_FIRE || keyCode == SOFT_KEY_LEFT) {
switch (m_Position) {
case 0:
mySound.setSoundOpen(true);
break;
case 1:
mySound.setSoundOpen(false);
break;
case 2:
if (bSelectKeyDown == false && m_CursorSmallDIS == 0 &&
bGameMenuAnimationOver()) {
bSelectKeyDown = true;
m_MenuFrameAnimation.setAnimation(1, false);
}
break;
}
}
break;
case STATE_GAMEMENU:
checkKeys(MENU_GAME, true, keyCode);
break;
case STATE_HELP:
switch (keyCode) {
case KEY_UP:
case KEY_2:
m_Position -= HELP_LINES;
if (m_Position < 0) {
m_Position = 0;
}
break;
case KEY_DOWN:
case KEY_8:
m_Position += HELP_LINES;
if (m_Position > helpLines - HELP_LINES) {
m_Position = (helpPages - 1) * HELP_LINES;
}
break;
case SOFT_KEY_RIGHT:
if (bSelectKeyDown == false && bGameMenuAnimationOver()) {
bSelectKeyDown = true;
m_MenuFrameAnimation.setAnimation(1, false);
}
break;
}
break;
case STATE_CREDITS:
if (bSelectKeyDown == false && bGameMenuAnimationOver()) {
bSelectKeyDown = true;
m_MenuFrameAnimation.setAnimation(1, false);
}
break;
case STATE_GAMEREADY:
if (bGameReadyAnimationOver()) {
m_Paused = false;
changeState(STATE_GAME);
}
else {
m_ReadyAnimation.currentFrameNr = (short) (m_ReadyAnimation.
currentAnimation.length - 2);
}
break;
case STATE_GAME:
switch (keyCode) {
case SOFT_KEY_RIGHT:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -