📄 gamescreen.java
字号:
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Canvas;
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.Form;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.TextField;
import javax.microedition.rms.InvalidRecordIDException;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotOpenException;
public class GameScreen extends Canvas implements Runnable{
private GameMidlet gml;
private Image offScreenBuffer;
private Graphics bg;
private int screenW;
private int screenH;
//缩放倍数
private static double scale_x;
private static double scale_y;
/*游戏线程*/
private boolean running = true;
private long lastTime = 0;
/*FPS*/
private int cps = 0;
private int second = 0;
private final int CPS = 60;
private boolean show = false;
/**/
private int key = -100;
private int menu_index; //菜单选项索引
//游戏背景
private Image menuback_img;
private Image topscore_img;
private Image gamemap_img;
private Image title_img;
/*锤子*/
private Image snk_img;
private int Snk_Positions[][] = {
{-4,34},{58,39},{116,39},
{-4,70},{54,73},{114,73},
{-4,110},{55,110},{115,109}
};
private int index = 0;
private int frame = 0;
/*星星*/
private Image starts_img;
private int Starts_Positions[][] = {
{ 0, 70},{60, 78},{118,81},
{ 0,112},{55,112},{114,117},
{-2,151},{57,152},{116,151}
};
private int count; //计数器
private int speed = 6; //下锤速度
//
private ShrewMouse mouse = null;
private Random rmd = new Random();
/*时间控制器*/
private int timer = 0;
/*游戏速度*/
private int game_sp;
/*是否命中*/
private boolean isHit = false;
/*操作记录*/
private boolean hasMove = false;
/*积分系统*/
private int score = 0;
private final int MaxLevel = 3; //关数
private int job; //需完成的连击次数
private int got = 0; //连击次数
private Image times_2 = null;
private int miss = 0; //错过次数
private Image devide_2 = null;
private boolean Add = false;
private boolean Minus = false;
private Image score_img = null;
private int sc_x,sc_y;
/*游戏状态*/
static final int game_Start = 0;
static final int game_Pause = 1;
static final int game_Over = -1;
static final int game_Menu = 2;
static final int game_Setting = 3;
static final int game_Record = 4;
static final int game_About = 5;
static final int game_Quit = 6;
static final int game_Pass = 7;
private static int GameState; //当前游戏状态
//private boolean wait = false; //等待玩家按键
/*RMS-游戏记录*/
private GameRecord gr;
private Form f_record;
private GameScreen gs; //本类自身
//时间条
private int game_time = 120;
private int level = 1;
private boolean LevelUp = false;
//暂停画面
private int lx,rx;
private boolean done = false;
//游戏帮助
private int n; //每行打印的字数
private int row; //每行的位置
private int start;
private int end;
/*字体*/
private final Font f1 = Font.getFont(Font.FACE_PROPORTIONAL,
Font.STYLE_BOLD,
Font.SIZE_LARGE);
private final Font f2 = Font.getFont(Font.FACE_SYSTEM,
Font.STYLE_PLAIN,
Font.SIZE_LARGE);
/*色彩表*/
private final int black = 0x000000;
private final int white = 0xffffff;
private final int red = 0xff0000;
private final int blue = 0x0000ff;
/*声音*/
private boolean sound_on_off = true;
private AudioPlayer p1;
private AudioPlayer p2;
private AudioPlayer p3;
/**
* 在构造函数中 获取离屏屏幕画笔
* 初始化图片资源
* @param gameMidlet
*/
public GameScreen(GameMidlet gameMidlet){
setFullScreenMode(true); //全屏模式
gml = gameMidlet;
gs = this;
screenW = getWidth(); //获取屏幕宽
screenH = getHeight(); //获取屏幕高
//计算缩放比率,使屏幕自适应
scale_x = screenW/180.5;
scale_y = screenH/220.0;
//创建缓冲区
offScreenBuffer = Image.createImage(screenW,screenH);
bg = offScreenBuffer.getGraphics();
//属性初始化
GameState = game_Menu; //默认为游戏菜单
menu_index = 0;
/*创建一个地鼠*/
mouse = new ShrewMouse();
mouse.setSpeed(3000);
/*创建RMS*/
gr = new GameRecord("record");
initPic(); //资源初始化
initGame(); //属性初始化
/* 启动线程 */
Thread t = new Thread(this);
t.start();
}
/*********************************************************************/
/* 图片资源初始化 */
/*********************************************************************/
private void initPic() {
try {
switch(GameState){
case game_Start:{
if(gamemap_img==null){
gamemap_img = Image.createImage("/gb0.png");
gamemap_img = scaleImage(gamemap_img, screenW, screenH); //缩放
}
if(snk_img==null){
snk_img = Image.createImage("/martello.png");
snk_img = scaleImage(snk_img, (int)(snk_img.getWidth()*scale_x), //缩放
(int)(snk_img.getHeight()*scale_y));
snk_img = alfImage(snk_img, -1); //使图片原来的透明区域恢复
}
if(score_img==null){
score_img = Image.createImage("/start.png");
score_img = scaleImage(score_img,
(int)(score_img.getWidth()*scale_x),
(int)(score_img.getHeight()*scale_y));
score_img = alfImage(score_img, -1);
}
if(starts_img==null){
starts_img = Image.createImage("/stelle.png");
starts_img = scaleImage(starts_img,
(int)(starts_img.getWidth()*scale_x),
(int)(starts_img.getHeight()*scale_y)); //缩放
starts_img = alfImage(starts_img, -1); //使图片原来的透明区域恢复
}
if(times_2==null){
times_2 = Image.createImage("/x2.PNG");
times_2 = scaleImage(times_2,
(int)(times_2.getWidth()*scale_x),
(int)(times_2.getHeight()*scale_y)); //缩放
times_2 = alfImage(times_2, -1);
}
if(devide_2==null){
devide_2 = Image.createImage("/devi2.PNG");
devide_2 = scaleImage(devide_2,
(int)(devide_2.getWidth()*scale_x),
(int)(devide_2.getHeight()*scale_y)); //缩放
devide_2 = alfImage(devide_2, -1);
}
}break;
case game_Pause:
break;
case game_Over:
break;
case game_Menu:
if(menuback_img==null){
menuback_img = Image.createImage("/back.png");
menuback_img = scaleImage(menuback_img, screenW, screenH); //缩放
}
if(title_img==null){
title_img = Image.createImage("/title.png");
title_img = scaleImage(title_img, (int)(title_img.getWidth()*scale_x),
(int)(title_img.getHeight()*scale_y));
title_img = alfImage(title_img, -1);
}
break;
case game_Setting:
break;
case game_Record:
if(topscore_img==null){
topscore_img = Image.createImage("/topscore.PNG");
topscore_img = scaleImage(topscore_img, screenW, screenH); //缩放
}
break;
default:
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
/*********************************************************************/
/* 游戏属性初始化 */
/*********************************************************************/
void initGame(){
switch(GameState){
case game_Menu:{
level = 1;
n = screenW/16;
row = screenH/8;
start = 0;
}break;
case game_Start:{
game_time = 120;
done = false;
got = 0;
miss = 0;
LevelUp = false;
lx = -screenW/2;
rx = screenW;
if(level==1||level>3){
score = 0;
speed = 6;
}
if(level==1){
game_sp = 6; //默认游戏速度
job = 5;
mouse.changeSequence(ShrewMouse.act1);
}else if(level==2){
game_sp = 5;
job = 4;
speed = 5;
mouse.changeSequence(ShrewMouse.act2);
//开启其他属性
}else if(level==3){
game_sp = 4;
job = 2;
speed = 3;
mouse.changeSequence(ShrewMouse.act2);
//开启其他属性
}
initSound(); //声音资源初始化
}break;
case game_Setting:
break;
case game_Record:
break;
case game_About:
break;
case game_Quit:
break;
default:
System.out.println("ERROR");
break;
}
}
/*********************************************************************/
/* 声音资源初始化 */
/*********************************************************************/
private void initSound() {
if(p1==null)
p1 = new AudioPlayer("/e0.mid");
if(p2==null)
p2 = new AudioPlayer("/e1.mid");
if(p3==null)
p3 = new AudioPlayer("/e2.mid");
}
/*********************************************************************/
/* 绘制游戏界面 */
/*********************************************************************/
protected void paint(Graphics g) {
/* 清屏 */
g.setColor(0x000000);
g.fillRect(0, 0, screenW, screenH);
/*绘制离屏屏幕*/
render();
g.drawImage(offScreenBuffer, 0, 0, 20);
}
/*********************************************************************/
/* 绘制离屏屏幕 */
/*********************************************************************/
private void render() {
bg.setClip(0, 0, screenW, screenH);
switch(GameState){
case game_Menu:{
/******************/
/* 游戏主菜单 */
/*****************/
int x,y;
int border = screenH/40;
int color;
String title[] = {
"新游戏","声 音","排行榜","帮 助","退 出"
};
bg.drawImage(menuback_img, 0, 0, 20); //主菜单背景
bg.drawImage(title_img, screenW/2-title_img.getWidth()/2, screenH/15, 20); //标题
Font f = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE);
for(int i=0; i<title.length; i++){
x = (screenW-f.stringWidth(title[i]))/2; //居中
y = screenH/4+(f.getHeight()+border)*i;
if(menu_index==i)
color = 255|(255<<8)|(151<<16);
else
color = 109|(146<<8)|(219<<16);
drawSTR(title[i], f, color, x, y, bg);
}
}break;
case game_Start:{ //游戏界面
//绘制地图
bg.drawImage(gamemap_img, 0, 0, Graphics.LEFT|Graphics.TOP);
//绘制地鼠
mouse.paint(bg);
//画星星
drawStart(bg);
//绘制锤子
drawSNK(bg);
/******************/
/* 游戏得分 */
/*****************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -