📄 gamestart.java
字号:
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotOpenException;
public class GameStart {
static final int loading = 0;
static final int playerSelect = 1;
static final int pressKey = 2;
static final int readyForRace = 3;
static final int raceBegin = 4;
static final int raceEnd = 5;
static final int reTry = 6;
static final int pause = 7;
static final int inputName = 8;
private int pos[][] = {
{18,68,21,28}, //红
{42,68,21,28}, //2
{80,68,21,28}, //紫
{104,69,21,28}, //2
{62,69,16,12}, //裤子
{62,82,16,7}, //红
{62,90,16,7} //紫
};
public GameStart(GameScreen gs){
this.gs = gs;
state = loading;
percent = 0;
}
public void init(){
if(state==pause){
return;
}
if(state==inputName){
selectIndex = 0;
return;
}
if(state!=pressKey && state!=playerSelect && state!=loading)
state = readyForRace;
key = 0;
time = 0;
score = 0;
second = 0;
millis = 0;
isError = false;
notSoGood = false;
showWinner = false;
allPlayer = GamePlayer.Name.length;
playerNum = 4; // 参赛选手数
if(state!=playerSelect && state!=loading){
//map
gmap = new GameMap();
gmap.setPosition(0, 113); //初始化地图
//player
gplayer = new GamePlayer[playerNum];
for(int i=0; i<gplayer.length; i++){
gplayer[i] = new GamePlayer();
gplayer[i].setPosition(GameScreen.screenW/2-GameMap.runwayWidth*i+8,
GameMap.runwayWidth*i+93); //初始化人物坐标
gplayer[i].setImage(athlete_img[sequence[i]]);
gplayer[i].setup(sequence[i]);
}
}else{
sequence = new int[playerNum];
}
initPic();
}
private void initPic() {
try {
if(bg_img==null)
bg_img = Image.createImage("/bg0.png");
if(state==loading){
percent += 9;
gs.repaint();
gs.wait(200);
}
athlete_img = new Image[4];
for(int i=0; i<4; i++){
if(athlete_img[i]==null){
athlete_img[i] = Image.createImage("/athlete"+i+".png");
if(state==loading){
percent += 9;
gs.repaint();
gs.wait(200);
}
}
}
if(cp_img==null)
cp_img = Image.createImage("/caipan.png");
if(state==loading){
percent += 9;
gs.repaint();
gs.wait(200);
}
if(text_img==null)
text_img = Image.createImage("/text.png");
if(state==loading){
percent += 9;
gs.repaint();
gs.wait(200);
}
if(winner_img==null)
winner_img = Image.createImage("/winner.png");
if(state==loading){
percent += 9;
gs.repaint();
gs.wait(200);
}
if(step_img==null)
step_img = Image.createImage("/step.png");
if(state==loading){
percent += 9;
gs.repaint();
gs.wait(200);
}
if(pause_img==null)
pause_img = Image.createImage("/pause.png");
if(state==loading){
percent += 9;
gs.repaint();
gs.wait(200);
}
if(lp_img==null)
lp_img = Image.createImage("/pointl.png");
if(rp_img==null)
rp_img = Image.createImage("/pointr.png");
if(state==loading){
percent += 10;
gs.repaint();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void paint(Graphics g){
// 清屏
g.setClip(0, 0, GameScreen.screenW, GameScreen.screenH);
g.setColor(0xffffff);
g.fillRect(0, 0, GameScreen.screenW, GameScreen.screenH);
if(state==loading){
GameMenu.drawLoading(percent, 28, GameScreen.screenH/2, 120, 10, percent/10, g);
}
if(state==playerSelect){
selectScreen(g);
}
if(state==pressKey || state==raceBegin || state==readyForRace || state==pause){
gmap.drawBackground(g);
int trans = gplayer[selected].getX()+selected*GameMap.runwayWidth;
g.translate(-trans+88, 0);
gmap.draw(g,trans/23-4);
g.translate(trans-88, 0);
if(state==readyForRace){ // 预备状态
g.setClip(GameScreen.screenW/2+20, 60, 24, 48);
g.drawImage(cp_img, GameScreen.screenW/2+20, 60, 20);
if(isError){
g.setClip((GameScreen.screenW-text_img.getWidth())/2,20,51,17);
g.drawImage(text_img, (GameScreen.screenW-text_img.getWidth())/2, -14, 20);
}else if(time>20){
g.setClip(GameScreen.screenW/2+13, 50, 13, 24);
g.drawImage(cp_img, GameScreen.screenW/2+13-24, 50, 20);
g.setClip((GameScreen.screenW-text_img.getWidth())/2,20,51,16);
g.drawImage(text_img, (GameScreen.screenW-text_img.getWidth())/2, 2, 20);
}else if(time>=11){
g.setClip((GameScreen.screenW-text_img.getWidth())/2,20,51,17);
g.drawImage(text_img, (GameScreen.screenW-text_img.getWidth())/2, 20, 20);
}
}
for(int i=0; i<gplayer.length; i++){
g.translate(-trans+88, 0);
gplayer[i].paint(g);
g.translate(trans-88, 0);
}
drawMessage(g); // 绘制比赛信息
if(state==pressKey)
drawTips(g);
}
if(state==raceEnd){
if(showWinner){
drawWinScreen(g);
}
}
if(state==reTry){
// 帮助界面
g.setColor(0x000000);
g.setClip(0, 0, GameScreen.screenW, GameScreen.screenH);
g.fillRect(0, 0, GameScreen.screenW, GameScreen.screenH);
g.setColor(0xffffff);
g.drawString("再来一次?", 60, 80, 20);
GameMenu.drawIcons(0, 5, GameScreen.screenH-20, g);
GameMenu.drawIcons(2, GameScreen.screenW-25, GameScreen.screenH-20, g);
}
if(state==pause){
g.drawImage(pause_img, 38, 67, 20);
g.drawImage(rp_img, 38, selectIndex*23+70, 20);
}
if(state==inputName){
drawTable(g);
}
}
// 玩家输入界面
private void drawTable(Graphics g) {
g.setColor(0x000000);
g.fillRect(0, 0, GameScreen.screenW, GameScreen.screenH);
g.setColor(0xffffff);
g.drawString("恭喜进入高分榜", 50, 20, 20);
g.drawString("name:", 45, 65, 20);
int px = 60;
int py = 80;
for(int i=0; i<name.length; i++){
if(i==selectIndex){
g.setColor(255,200,200);
g.fillRect(px-2+10*i, py, 12, 16);
}
g.setColor(0xffffff);
if(i==selectIndex)
g.setColor(0x000000);
g.drawString(""+name[i], px+10*i, py, 20);
}
GameMenu.drawIcons(0, 5, GameScreen.screenH-20, g);
}
// 运动员选择界面
private void selectScreen(Graphics g) {
GameMenu.drawBack(0, g);
g.setColor(0x000000);
g.drawString("选择你的运动员", 60, 25, 20);
String name = GamePlayer.Name[selectIndex];
g.drawString(name, 20, 50, 20);
g.drawString("国籍:"+GamePlayer.Country[selectIndex], 20, 80, 20);
g.setColor(0x000000);
g.drawString("速度:", 20, 100, 20);
g.setColor(0x00ff00);
g.fillRoundRect(20, 113, GamePlayer.Speed[selectIndex]*50/12, 10, 5, 5);
g.setColor(0xffffff);
g.drawRoundRect(20, 113, 50, 10, 5, 5);
g.setColor(0x000000);
g.drawString("力量:", 30, 120, 20);
g.setColor(0xff0000);
g.fillRoundRect(30, 133, GamePlayer.Speed[selectIndex]*50/12, 10, 5, 5);
g.setColor(0xffffff);
g.drawRoundRect(30, 133, 50, 10, 5, 5);
g.setColor(0x000000);
g.drawString("技巧:", 40, 140, 20);
g.setColor(0x0000ff);
g.fillRoundRect(40, 153, GamePlayer.Speed[selectIndex]*50/12, 10, 5, 5);
g.setColor(0xffffff);
g.drawRoundRect(40, 153, 50, 10, 5, 5);
if(selectIndex>0)
g.drawImage(lp_img, 2+time%4, 80, 20);
if(selectIndex<GamePlayer.Name.length-1)
g.drawImage(rp_img, GameScreen.screenW-(14+time%4), 80, 20);
GameMenu.drawIcons(0, 5, GameScreen.screenH-20, g);
GameMenu.drawIcons(2, GameScreen.screenW-25, GameScreen.screenH-20, g);
}
// 游戏提示
public void drawTips(Graphics g) {
int x = (GameScreen.screenW-120)/2;
int y = 50;
g.setColor(182,73,36);
g.fillRect(x, y, 120, 140);
g.setColor(0xffffff);
g.drawString("跑道编号", x+5, y+5, 20);
g.drawString("参赛选手", x+65, y+5, 20);
for(int i=0; i<gplayer.length; i++){
int pos = y+28*(i+1);
g.drawLine(x, pos, x+120, pos);
g.drawString(""+(i+1), x+12, pos+2, 20);
g.drawString(GamePlayer.Name[sequence[i]], x+70, pos+2, 20);
}
g.drawLine(x+60, y, x+60, y+140);
g.setColor(0x000000);
g.drawRect(x, y, 120, 140);
}
// 游戏信息
private void drawMessage(Graphics g) {
// 速度槽
g.setClip(0, 0, GameScreen.screenW, GameScreen.screenH);
g.setColor(0xff0000);
g.fillRoundRect(GameScreen.screenW-70, GameScreen.screenH-20,
(gplayer[selected].getSpeed()*50/gplayer[selected].getMaxSpeed()),
6, 8, 10);
g.setColor(0x000000);
g.drawRoundRect(GameScreen.screenW-70, GameScreen.screenH-20, 50, 6, 8, 10);
// 时间
g.setColor(0xffffff);
g.drawString(""+second+"."+millis, 74, 83, 20);
// 选手名字
g.setColor(0xffffff);
g.drawString(GamePlayer.Name[sequence[selected]], 6, 85, 20);
}
// 领奖台画面
private void drawWinScreen(Graphics g) {
g.setClip(0, 0, GameScreen.screenW, GameScreen.screenH);
// 背景
g.setColor(219,255,219);
g.fillRect(0, 0, 116, 120);
g.setColor(0xffffff);
g.drawRect(0, 0, 116, 120);
g.setColor(109,109,182);
for(int i=0; i<winner.length-1; i++){
g.drawString(GamePlayer.Name[sequence[winner[i]]], 10, 10+30*i, 20);
int sc = gplayer[winner[i]].getScore();
g.drawString(""+sc/100+"."+sc%100+"秒", 70, 10+30*i, 20);
}
//
int x = (GameScreen.screenW-step_img.getWidth())/2;
int y = 120;
g.drawImage(step_img, x-10, y, 20);
x += 16;
for(int k=0; k<3; k++){
int i = (rmd.nextInt()>>>1)%2;
int j = 0;
int border = 20;
if(winner[k]!=selected){
i += 2;
}
if(i<=1){
j = 5;
}else{
j = 6;
}
if(k==1)
x -= border;
if(k==2)
x += 2*border;
y = 78+7*k;
g.setClip(x, y, pos[i][2], pos[i][3]);
g.drawImage(winner_img, x-pos[i][0], y-pos[i][1], 20);
g.setClip(x-1, y+28, pos[j][2], pos[j][3]);
g.drawImage(winner_img, x-pos[j][0]-1, y-pos[j][1]+28, 20);
g.setClip(x+1, y+35, pos[4][2], pos[4][3]);
g.drawImage(winner_img, x-pos[4][0]+1, y-pos[4][1]+35, 20);
}
}
public void run(){
doLogic();
}
// 按键处理
public void keyPress(int keyCode){
key = keyCode;
switch(state){
case playerSelect:
if(gs.getGameAction(keyCode)==Canvas.LEFT || keyCode==Canvas.KEY_NUM4)
selectIndex--;
if(gs.getGameAction(keyCode)==Canvas.RIGHT || keyCode==Canvas.KEY_NUM6)
selectIndex++;
if(gs.getGameAction(keyCode)==Canvas.FIRE || keyCode==Canvas.KEY_NUM5 || keyCode==-6){
selected(selectIndex); //选定人物
state = pressKey;
init();
}
if(keyCode==-7){
gs.setGameState(GameScreen.MAINMENU);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -