📄 gamecanvas.java
字号:
//package src;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import javax.microedition.io.*;
import com.nokia.mid.ui.FullCanvas;
import java.lang.*;
import java.util.*;
import java.io.*;
/**
* <p>Title: GameCanvas</p>
* <p>Description: 游戏控制类</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: Company: NetEase www.163.com </p>
* @author
* @version 1.0
*/
public class GameCanvas extends Canvas/*FullCanvas*/ implements Runnable
{
//--------------------------------------------------------------------------
//
// 系统变量
//
//--------------------------------------------------------------------------
public static boolean ifPhone; // 有电话
private static MainApp App; // application结束使用
private static Graphics g; // 图形
private static Graphics offg; // 关断画图(背面绘画)
private static int[] sysData; // 系统数组
private static int width,height; // 屏幕宽和高
private static int midWidth,midHeight;
// 水平线中,高难度
private static long time1, time2; // 1环花费了的时间
private static Font font; // 现在的字体
private static Image[] cImage; // 图像资源
private static Image aImage; // 角色周边更换用途用
private static Image backImg; // 背景图
// private static ezSound sound; // 声音
// private static NowPro nowCorp; // now专业通讯社
private static String phoneid; // 手机种类
private static boolean KeyUp,KeyDown,KeyLeft,KeyRight;
private static boolean KeyFire,KeySound;// 按键Key
private static boolean soft1Key,soft2Key;// 软件Key
// private static Command cmdSoft1; // 左软键
// private static Command cmdSoft2; // 右软键
//--------------------------------------------------------------------------
//
// 游戏变量
//
//--------------------------------------------------------------------------
private static int[] gameData; // 游戏数据数组
private static int gState,gameState;
// 游戏状态
private static int degree0,degree,Counter1,Counter2,BestScore;
// 游戏难度 计数器 最好成绩
private static int leftHand,rightHand,leftFoot,rightFoot;
// 左手 右手 左脚 右脚
private static int isMove,pMove; // 是否移动,人在画面移动的变量
private static int gameMode; // 攀登还是跳跃模式
private static int musicOn;
private static int gMax1,gMax2; // 时间最大限制值
private static int[] route; // 一回合的路线数据
private static int[] Score; // 积分排列次序用数据
private static int[] aArray; // 排列顺序的
private static int usedTime,timeSet;
// 积分(经过的时间),时间设定
private static int gMenu; // 游戏菜单
private static int count,count2; // 动画片用计数器
private static int pHeight; // Player 的高度
private static int posX,posY; // Player 的位置
private static int posX1,posY1; // 1画框前面 角色的位置
private static int rValue; // 随机减少的量
private static Random random1;
private String okStr,cancelStr;
private static boolean iMenu;
private static int rowIndex;
//--------------------------------------------------------------------------
//
// 静态initializer
//
//--------------------------------------------------------------------------
static
{
sysData = new int[15];
cImage = new Image[65];
gameData = new int[31];
Score = new int[4];
aArray = new int[4];
route = new int[11*156];
random1 = new Random();
}
//--------------------------------------------------------------------------
// 公司tractor
//--------------------------------------------------------------------------
GameCanvas( MainApp Midlet )
{
App = Midlet;
Thread GThread = new Thread( this );
GThread.start();
// 没有正在通话
ifPhone = false;
// 手机屏幕尺寸
width = getWidth();
height = getHeight();
// 把游戏画面当作显示的中央表示的支线
midWidth = ( width - 120 ) / 2;
midHeight = ( height - 120 ) / 2;
// 最初状态
sysData[4] = 1;
// FPS(20恰当的价值)
sysData[7] = 6;
// 计数器 0
Counter1 = 0;
Counter2 = 0;
// 绘画准备没完成
sysData[12] = 0;
// 控制是否进行绘画0为否1为是
sysData[13] = 0;
// 启动次数
sysData[14] = 1;
//sysData[5] 音乐开关控制
// 游戏状态设定
gameState = 2;
gState = 0;
// 难易度的设定
degree0 = 0;
// 现在的难易度设定
degree = 0;
// 游戏内变量格式化
InitGame();
// 排列次序
for(int i = 4-1;i >= 0;i--)
{
aArray[i] = 0;
Score[i] = 180000;
}
// 路线设定
for(int i = 0;i < 207;i++)
route[i*3+(i/4)*21+12] = (random1.nextInt()>>>1)%30;
// try
// {
// // 设置Command接口
// setCommandListener( this );
// }
// catch( Throwable t )
// {
// //( t.toString() );
// }
}
//--------------------------------------------------------------------------
//
// 运行方法
//
//--------------------------------------------------------------------------
public void run()
{
int i, j;
try
{
//------------------------------------------------------------------
// 字体 (统一字型的尺寸)
//------------------------------------------------------------------
font = Font.getDefaultFont();
// 实际设定字体的编码
if( font.getHeight() >= 16 )
font = Font.getFont( Font.FACE_MONOSPACE , Font.STYLE_PLAIN, Font.SIZE_SMALL );
//------------------------------------------------------------------
// 资源读入
//------------------------------------------------------------------
try
{
// 图像
aImage = Image.createImage(10,10);
backImg = Image.createImage(120,120);
offg = backImg.getGraphics();
for( i = 65-1;i >= 50;i--) //分开
{
// 零supply应急措施(为更漂亮的方法变更)
cImage[i] = Image.createImage( "/" + i + ".png" );
//( "img["+i+"] loaded successful" );
// 来信后的)处理
if( ifPhone == true )
{
ifPhone = false;
gameData[30] = 3;
}
// 明示性地paint叫出()的
sysData[13] = 1;
repaint();
serviceRepaints();
gState = 100*(15-i)/(15-1);
}
cImage[0] = Image.createImage( "/" + 0 + ".png" );
aImage.getGraphics().drawImage(cImage[0],0,0,Graphics.LEFT | Graphics.TOP);
// 声音
}
catch( Throwable t )
{
//( t.toString() );
}
//------------------------------------------------------------------
// 如果声音数据不存在的情况初始化为,存在则读取数据
//------------------------------------------------------------------
RecordStore Rec = RecordStore.openRecordStore( "FREE_CLIMBING", true );
if( Rec.getNumRecords() == 0 )
{
//--------------------------------------------------------------
// 声音的初始设定
//
// 这儿追加声音的初始设定值
//
//--------------------------------------------------------------
sysData[5] = 1;
AddRecord( Rec, sysData[5] ); // 音再生标志
AddRecord( Rec, sysData[14] ); // 启动次数
AddRecord( Rec, degree0 ); // 下面难易度
for(i = 0;i < 4;i++)
AddRecord( Rec, aArray[i] ); // 过关
for(i = 0;i < 4;i++)
AddRecord( Rec, Score[i] ); // 分数
AddRecord( Rec, 0); // 限制月
AddRecord( Rec, 0); // 限制日
Rec.closeRecordStore();
//--------------------------------------------------------------
// 从现在起把 31 天后当作记录店保存
//--------------------------------------------------------------
// nowCorp.SaveNextDate();
}
else
{
Rec.closeRecordStore();
//--------------------------------------------------------------
// 从文件读取声音数据
//--------------------------------------------------------------
sysData[5] = GetRecord( 1 );
// if( sysData[5] == 0 )
// sound.Switch();
sysData[14] = GetRecord( 2 );
sysData[14]++;
SetRecord( 2, sysData[14] );
degree0 = GetRecord(3);
degree = degree0+1;
for(i = 0;i < 4;i++)
{
aArray[i] = GetRecord(4+i);
Score[i] = GetRecord(8+i);
}
}
//------------------------------------------------------------------
//------------------------------------------------------------------
// 游戏开始设定
gameState = 2;
//gState = 3;
gameData[30] = 3;
// 软件key设定
SetSoftLabel("开始","");
//------------------------------------------------------------------
//
// 主要处理
//
// 在这里写的「■主要处理」以后的处理是
// 全部实行不可以变更顺序
//
//------------------------------------------------------------------
while( true )
{
// 主要处理
time1 = System.currentTimeMillis();
// 开始计时
Counter1++;
// 通用计数器
// sound.canSound();
// 音乐再生
if( ifPhone == true )
{
ifPhone = false;
sysData[12] = 0;
sysData[13] = 1;
gameData[30] = 3;
if( font.getHeight() >= 16 )
font = Font.getFont( Font.FACE_MONOSPACE , Font.STYLE_PLAIN, Font.SIZE_SMALL );
// if( sound != null )
// sound.Replay();
}
//--------------------------------------------------------------
// 主要处理
//--------------------------------------------------------------
Work();
//--------------------------------------------------------------
// 应用结束
//--------------------------------------------------------------
if( gameState == 13 )
{
// sound.End();
App.Exit();
return;
}
//--------------------------------------------------------------
// 绘画处理
// flag为假时候绘画
//--------------------------------------------------------------
if( sysData[4] == 0 )
{
// 明示性地paint叫出()
sysData[13] = 1;
repaint();
serviceRepaints();
// 直到绘画终了待命
while( sysData[13] != 0 );
}
//--------------------------------------------------------------
// FPS调整
// 1圈的时间「1000 / sys[SYS_FPS]
//--------------------------------------------------------------
time2 = System.currentTimeMillis();
if( (time2 - time1) > 1000 / sysData[7] )
{
//("skip");
// 因为超过了 , 所以下一个画框跳绘画向快速处理
sysData[4] = 1;
}
else
{
// 时间多余了待命
//#ifdef __DEBUG
// Thread.sleep( 100 );
//#else
Thread.sleep( (1000 / sysData[7] - (time2 - time1)) );
//#endif
sysData[4] = 0;
}
// if( Counter2 != 0 && (Counter1-Counter2 == 20
// || gameState == 5 || gameState == 3))
// setCommandListener(this);
}
}
catch( Throwable t )
{
//( t.toString() );
}
}
//--------------------------------------------------------------------------
//
// 按键操作,在这里上写的
//
//--------------------------------------------------------------------------
private void Work()
{
// METHOD_TRACE("WORK IN");
//----------------------------------------------------------------------
// 按键操作处理
//----------------------------------------------------------------------
// 音乐演奏ON/OFF移动等的处理
if( KeySound )
{
if( sysData[5] == 0 )
sysData[5] = 1;
else
sysData[5] = 0;
// sound.Switch();
SetRecord(1, sysData[5]);
}
//----------------------------------------------------------------------
// 游戏连同场面的处理
//----------------------------------------------------------------------
switch( gameState )
{
// 游戏 PLAY
case 5:
{
// Player 手的位置操作
// gameData[30]控制角色运动
// gameData[14]gameData[15]角色的x,y基点用于绘画时候
if( KeyUp )
{
if(gameData[16] == 0 )//gameData[16]控制左右手的动作
{
gameData[9] = 2;//gameData[9]跟leftHand或rightHand控制移动方向
leftHand = 2;//2,2表示向上移动
}
else
{
gameData[9] = 2;
rightHand = 2;
}
count = 1;
gameData[30] = 2;
}
if( KeyDown )
{
if( gameData[16] == 0 && gameData[14] > 10 && gameData[15] < 110 )
{
gameData[9] = 6;
leftHand = 6;//6表示向下移动
count = 1;
}
else if( gameData[16] == 1 && gameData[14] < 80 && gameData[15] < 110 )
{
gameData[9] = 6;
rightHand = 6;
count = 1;
}
gameData[30] = 2;
}
if( KeyLeft )
{
if( gameData[16] == 0 && gameData[14] > 10 )
{
gameData[9] = 4;//4表示向左移动
leftHand = 4;
count = 1;
}
if( gameData[16] == 1 && gameData[14] > 20 )
{
gameData[9] = 0;
rightHand = 0;
count = 1;
}
gameData[30] = 2;
}
if( KeyRight )
{
if( gameData[16] == 1 && gameData[14] < 80 )
{
gameData[9] = 4;
rightHand = 4;
count = 1;
}
if( gameData[16] == 0 && gameData[14] < 70 )
{
gameData[9] = 0;
leftHand = 0;
count = 1;
}
gameData[30] = 2;
}
// 软件按键处理
if( soft1Key && rowIndex==0 && iMenu==false)
backTitle();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -