?? 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 + -