📄 penguinscreen.java
字号:
package penguin;
import java.util.Random;
import com.nokia.mid.ui.*;
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import java.util.*;
import javax.microedition.io.HttpConnection;
/**
*
* <p>Title: StgTetrisScreen</p>
* <p>Description: 程序主控类,包含主循环更新,屏幕绘制,按键捕捉等等</p>
* <p>Copyright: Copyright (c) 2004</p>
*/
public class PenguinScreen
extends FullCanvas
implements Runnable
{
/**
* 存放调用此类变量的父类变量;
*/
private PenguinMIDlet gameMIDlet;
/**
* 程序控制更新线程
*/
private volatile Thread gameThread = null;
/**
* 最后更新时间
*/
private long lastUpdateTime = 0;
private long lastGcTime = 0;
/**
* 存储前五名的分数
*/
public static int newsreel[] = new int[5];
/**
* 存储前五名的名字
*/
public static byte name[][] = new byte[6][];
/**
* 输入名字时的当前字母序号
*/
public byte currentLetter = 0;
/**
* 前五名名字长度
*/
public static int namelen[] = new int[6];
/**
* 当前用户排名
*/
public static int order = 0;
/**
* 距离上次更新的相对时间
*/
private long updateTime = 0;
private long strikeTime = 0;
private long demoTime = 0;
/**
* fps 数量
*/
private int fps = 0; //fps 数量
/**
* 当前秒内的fps和
*/
private int currentFps = 0; //当前秒内的fps和
/**
* 是否更换currentFps标志
*/
private boolean drawfps = false; //更换currentFps标志
/**
* 用于产生随机数
*/
private static Random random = new Random(System.currentTimeMillis());
/**
* 用于读取地图文件
*/
InputStream inputStream;
/**
* 播放声音所需要的变量,每个变量对应单独的文件
*/
private static MediaList pOnce;
private static MediaList pMain;
private static MediaList pRecord;
private static MediaList pReady;
private static MediaList pJump;
private static MediaList pKnock;
private static MediaList pDrop;
private static MediaList pSlide;
private static MediaList phut;
/**
* 游戏主状态定义
*/
public final static int LINK = 0;//对应主菜单的邦邦网
public final static int RUN = 1;//对应主菜单的开始游戏
public final static int OPTION = 2; //对应主菜单的设置
public final static int SCORE = 3;//对应主菜单的排名
public final static int HELP = 4;//对应主菜单的帮助
public final static int END = 5;//对应主菜单的退出
public final static int COPYRIGHT = 6;//对应程序运行时的Logo
public final static int DEMO = 7;//Demo初始化
public final static int MENU = 8;//主菜单
public final static int INPUT = 9;//用户输入高分
public final static int LOCAL = 10;//查看本地排名
public final static int NET = 11;//查看网络排名
public final static int PAUSE = 12;//暂停状态
public final static int INIT = 13;//程序初始化
public final static int GAMEOVER = 14;
public final static int DEMORUN = 15;//演示游戏运行
public final static int INITINPUT = 16;//中间状态,初始化和计算用户输入需要的变量
public final static int DEMOLOCAL = 17;//演示本地排名
public final static int NETDISP = 18; //显示网络排名
//would be use in update for Send and Recv data.
public final static int UPLOAD = 19; //paint the Yes or No
public final static int SCOREUPLOAD = 20; //prepare score and send data
public final static int NETERROR = 21; //Display Error of Net Link
/**
* 根据该静态数组来判断游戏中该用到的地图,在UpdateState中更新状态,并在InitMap中调用该状态所对应的地图文件
* 之所以用这种方法是因为Nokia 40系列只能同时打开一张地图,用此方法保证代码一致和可移植性。
*/
public final static int[][] stateArray = {
{
COPYRIGHT}
, {
RUN, PAUSE, DEMORUN}
, {
MENU, OPTION, SCORE, HELP, DEMO, INPUT, LOCAL, DEMOLOCAL,
INITINPUT, LINK, NETDISP}
, {
NET, UPLOAD, SCOREUPLOAD}
};
/**
* 企鹅坠落时所用图在图片中的位置
*/
public final static int[][] mapDrop = {
{
26, 250}
, {
26 * 2, 250}
, {
26 * 3, 250}
, {
26 * 4, 250}
, {
26 * 5, 250}
, {
26 * 6, 250}
, {
26 * 2, 250 + 26 * 2}
};
/**
* 打企鹅时所用图在图片中的位置
*/
public final static int[][] mapStrike = {
{128, 378},{128, 378},{128, 378},{128, 378},{128, 378},
{64, 378},{64, 378},
{0, 378}
};
/**
* 企鹅落在地面发出爆炸效果时所用图在图片中的位置
*/
public final static int[][] mapExplode = {
{
176, 126}
, {
176, 126}
, {
215, 126}
, {
254, 126}
};
/**
* 结束显示分数时所用图在图片中的位置
*/
public final static int[][] ScoreShow = {
{0, 328}, {40, 328},{80,328},{120,328}
};
/**
* 企鹅飞行时所用图在图片中的位置
*/
public final static int[][] mapFly = {
{
0, 276}
, {
1 * 26, 276}
, {
2 * 26, 276}
, {
3 * 26, 276}
, {
4 * 26, 276}
, {
5 * 26, 276}
, {
6 * 26, 276}
, {
7 * 26, 276}
, {
8 * 26, 276}
, {
9 * 26, 276}
, {
8 * 26, 250}
, {
9 * 26, 250}
, {
10* 26, 250}
, {
0, 276 + 26}
, {
1 * 26, 276 + 26}
};
/**
* option 变量
*/
private int[] optionMenu = new int[2];
private int optionSelect = 0;
public int recordCnt = 5;
/**
* demo 变量
*/
private int[] demoAction = new int[20];
private int nowAction = 0;
public boolean bDemo;
/**
* 声音变量
*/
public boolean bSound;
private boolean PlayOnce = true;
//Demo 显示"按OK键开始"
public boolean bShowOK;
public int ShowOK = 0;
public int ClickTime = 0;
//双buffer机制所用到的变量,用来减少刷屏幕次数和面积
private Image BufferSurface = null;
private Image LastBuffer;
private static Image ThisBuffer;
private Graphics gsprite;
//更新状态所用变量,决定是否本次刷屏
private boolean bStateMapEntry = true;
private boolean bStateStringEntry = true;
private boolean bGameStateMapEntry = true;
private boolean bGameStateStringEntry = true;
//游戏运行中状态,是游戏状态RUN中的
public final static int EntryWait = -7;
public final static int Wait = 0;
public final static int Ready = 1;
public final static int Hit = 2;
public final static int Fly = 3;
public final static int Show_Succ = 4;
public final static int Show_Fail = 5;
public final static int End = 6;
public final static int Init_fly = 7;
public final static int Init_End = 8;
//初始化gameState,此变量表示游戏运行中状态
public int gameState = EntryWait;
/**
*创建菜单所需要变量
*/
MenuNode[] tempMenuNode;
MenuNode menuArrow;
Menu mainMenu;//主菜单
Menu pauseMenu;//暂停界面菜单
Menu uploadMenu;//是否上传网络排名选择
/**
* 企鹅飞行或者其他状态都会有一个Animate对象,在Update时更新其坐标,paint时根据坐标画到屏幕上
*/
Animate Drop;
Animate Strike;
Animate Explode;
Animate Flying;
Animate AnimateScore;
Animate PauseBack;
/**
* Demo停留在没个界面的时间参数
*/
public final static int SHOWOK = 500;
public final static int MENUIDLE = 10000;
/**
* 游戏状态初始化
*/
public static int state = COPYRIGHT;
private static int bgCurX = 0;
private Graphics Bg;
//Response
private static int phyX = 0;
/**
* 游戏中的垫子的位置,根据随机数得到保存在该数组中
*/
private int[] ElasticPos = new int[50];
public boolean bDrawDrop;
public boolean bDrawStrike=false;
public boolean bDrawFly;
public boolean bDrawScore;
public int curFrame = 0;
public int BackTime = 0;
public int FlyTime = 0;
/**
* 根据位置来判断有没有打中企鹅,在如下参数范围内,挥棒才可能击中企鹅
*/
private static int HITTOP = 140;
private static int HITBOTTOM = 180;
/**
* 显示路标
*/
private static int ROADFLAG1 = -36;
/**
* 每次移动屏幕的绝对位移
*/
private static int RATE = 8;
/**
* 山移动的相对位移,每次++可以让山慢慢移出屏幕
*/
private static int MCurX = 0;
public boolean notHit = true;
private static int maxSpeed = 100;
private int speedX;
private int speedY;
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -