📄 gamestart.java
字号:
}
break;
case pressKey:
if(gs.getGameAction(keyCode)==Canvas.FIRE || keyCode==Canvas.KEY_NUM5){
state = readyForRace;
init();
}
break;
case raceBegin:{
if(gplayer[selected].getTripState() || gplayer[selected].getSpeed()==0){ //如果碰到栏
if(key==Canvas.KEY_NUM6){ // 按6键恢复
gplayer[selected].changeActSequence(GamePlayer.runAct);
gplayer[selected].changeTripState(false);
gplayer[selected].changeSpeed(gplayer[selected].getPower()/3);
}
}else{
if(key==Canvas.KEY_NUM6){ // 按6键提速
if(time++>=2){
speedUp(selected,gplayer[selected].getPower()/3);
time = 0;
}
}
if(key==Canvas.KEY_NUM5){ // 5键起跳
gplayer[selected].changeActSequence(GamePlayer.jumpAct);
gplayer[selected].changeJumpState(true);
}
}
}
case readyForRace:
// 5键起跑
// 判断是否抢跑
if(keyCode==Canvas.KEY_NUM6){
if(gplayer[selected].getReadyState()){
gplayer[selected].changeActSequence(GamePlayer.takeoff);
gplayer[selected].changeReadyState(false);
gplayer[selected].changeSpeed(gplayer[selected].getMaxSpeed()); // 以最大速度起步
state = raceBegin;
}else if(state==readyForRace){
time = 0;
isError = true;
}
}
if(keyCode==-7){
selectIndex = 0;
state = pause;
init();
}
break;
case raceEnd:
if(showWinner){ // 任意键跳出领奖画面
showWinner = false;
}
break;
case reTry:
if(keyCode==-6){
state = readyForRace;
init();
}
if(keyCode==-7)
gs.setGameState(GameScreen.MAINMENU);
break;
case pause:
if(gs.getGameAction(keyCode)==Canvas.UP || keyCode==Canvas.KEY_NUM2)
selectIndex--;
if(gs.getGameAction(keyCode)==Canvas.DOWN || keyCode==Canvas.KEY_NUM8)
selectIndex++;
if(gs.getGameAction(keyCode)==Canvas.FIRE || keyCode==Canvas.KEY_NUM5){
if(selectIndex==0){
state = raceBegin;
}
if(selectIndex==1){
gs.setGameState(GameScreen.MAINMENU);
}
if(selectIndex==2){
gs.setGameState(GameScreen.QUIT);
}
}
break;
case inputName:
if(gs.getGameAction(keyCode)==Canvas.UP ||keyCode==Canvas.KEY_NUM2)
name[selectIndex]--;
if(gs.getGameAction(keyCode)==Canvas.DOWN ||keyCode==Canvas.KEY_NUM8)
name[selectIndex]++;
if(gs.getGameAction(keyCode)==Canvas.LEFT ||keyCode==Canvas.KEY_NUM4)
selectIndex--;
if(gs.getGameAction(keyCode)==Canvas.RIGHT ||keyCode==Canvas.KEY_NUM6)
selectIndex++;
if(keyCode==-6) //确认
isDone = true;
break;
}
}
//提速
private void speedUp(int id,int speed) {
gplayer[id].changeSpeed(gplayer[id].getSpeed()+speed);
}
// 逻辑判断
public void doLogic(){
switch(state){
case loading:
if(percent==100)
state = playerSelect;
break;
case playerSelect:
if(selectIndex<0)
selectIndex = allPlayer-1;
if(selectIndex>=allPlayer)
selectIndex = 0;
time++;
break;
case pressKey:
break;
case readyForRace:
setup();
smartCheck();
break;
case raceBegin:
updateTime();
playerRun();
smartCheck(); //智能判断
collistionCheck();
update();
break;
case raceEnd:
// 判断名次
if(!showWinner){
rm = new RecordManager("hurdlerace");
addRecord();
if(notSoGood)
state = reTry;
}else{
// 积分榜排名
// 询问是否再次游戏
}
break;
case reTry:
break;
case pause:
if(selectIndex<0)
selectIndex = 2;
if(selectIndex>=3)
selectIndex = 0;
break;
case inputName:
if(isDone){
addRecord();
isDone = false;
gs.setGameState(GameScreen.HIGHTSCORE);
}
if(selectIndex>=name.length)
selectIndex = name.length-1;
if(selectIndex<0)
selectIndex = 0;
if(name[selectIndex]<'A')
name[selectIndex] = 'Z';
if(name[selectIndex]>'Z')
name[selectIndex] = 'A';
break;
}
}
private void addRecord() {
try {
if(isDone){
rm.addRecord(new String(name), gplayer[selected].getScore());
return;
}
if(winner[winner.length-1]!=selected && rm!=null && rm.isNewRecord(gplayer[selected].getScore())){
state = inputName;
selectIndex = 0;
}else{
notSoGood = true;
}
} catch (RecordStoreNotOpenException e) {
e.printStackTrace();
} catch (RecordStoreFullException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void setup() {
if(isError && time>6){ // 如果违例,等待5
isError = false;
time = 0;
init();
}else{
for(int i=0; i<gplayer.length; i++){
if(time==11)
gplayer[i].changeFrame();
if(time>21){
gplayer[i].changeReadyState(true);
}
}
time++;
}
}
// AI
private void smartCheck() {
if(state==readyForRace){
for(int i=0; i<gplayer.length; i++){
if(i!=selected && gplayer[i].getReadyState()){
if(gplayer[i].getSkill()+gplayer[i].getTime()>=3){ //如果技能值+时间>=3,起跑
gplayer[i].changeActSequence(GamePlayer.takeoff);
gplayer[i].changeReadyState(false);
gplayer[i].changeSpeed(gplayer[i].getMaxSpeed()); //起步速度
state = raceBegin;
}
}
}
}
if(state==raceBegin){
for(int i=0; i<gplayer.length; i++){
int col = gplayer[i].getX()/22;
int block = gmap.getBlock(i,col+1);
if(i!=selected){
if(block==0 && ((rmd.nextInt()>>>1)%(12-gplayer[i].getSkill())==1)){
if(!(gplayer[i].getJumpState())){
gplayer[i].changeActSequence(GamePlayer.jumpAct);
gplayer[i].changeJumpState(true);
}
}
}
if(block==-2 && !gplayer[i].getFinishState()){ // 冲刺
System.out.println(i);
gplayer[i].changeActSequence(GamePlayer.sprint);
gplayer[i].changeFinishState(true);
score = second*100+millis; //记录冲刺时间
if(GamePlayer.getFinishNum()<winner.length){ // 统计名次
winner[GamePlayer.getFinishNum()] = i;
gplayer[i].setScore(score);
}
}
}
}
}
// 数据更新
private void update() {
for(int i=0; i<gplayer.length; i++){
if(i!=selected && !gplayer[i].getFinishState()){
if(gplayer[i].getTripState() && gplayer[i].comeBack()){
gplayer[i].changeActSequence(GamePlayer.runAct);
gplayer[i].changeTripState(false);
gplayer[i].changeSpeed(2); //摔倒后的起身速度
}else
speedUp(i,1);
}
}
//速度减慢
if(time2++>3){
speedUp(selected,-1);
time2 = 0;
}
if(gplayer[selected].getSpeed()==0){
gplayer[selected].changeActSequence(GamePlayer.stopAct);
}
// 检测是否所有运动员都完成了比赛
if(GamePlayer.getFinishNum()==gplayer.length){
// 游戏结束
state = raceEnd;
showWinner = true;
initPic();
}
}
// 碰撞检测
private void collistionCheck() {
for(int i=0; i<gplayer.length; i++){
int col = gplayer[i].getX()/22;
int block = gmap.getBlock(i,col);
if(block==0
&& (gplayer[i].getY()+gplayer[i].getCileH())>=GameMap.runwayWidth*(i+1)+93
&&!(gplayer[i].getTripState())){
if(!gplayer[i].getJumpState()){
gplayer[i].changeActSequence(GamePlayer.tripAct);
gplayer[i].changeTripState(true);
}
gmap.setBlock(i,col,1);
}
}
}
private void playerRun() {
for(int i=0; i<gplayer.length; i++){
gplayer[i].move(gplayer[i].getSpeed());
gplayer[i].run();
}
}
// 资源释放
public void releaseRes() {
bg_img = null;
cp_img = null;
text_img = null;
step_img = null;
winner_img = null;
for(int i=0; i<athlete_img.length; i++)
athlete_img[i] = null;
System.gc();
}
public void selected(int id){
selected = 1;//id%playerNum;
sequence[1] = id%playerNum;
sequence[0] = (sequence[1]+1)%playerNum;
sequence[2] = (sequence[0]+1)%playerNum;
sequence[3] = (sequence[2]+1)%playerNum;
}
private void updateTime() {
millis+=5;
if(millis>=100){
second++;
millis = 0;
}
if(second>=60){
minute++;
second = 0;
}
}
private GameScreen gs = null;
private GamePlayer gplayer[];
private Image athlete_img[];
private int sequence[]; // 序列
private int millis;
private int second;
private int minute;
private int state;
private int selected;
private int playerNum;
private int allPlayer;
private int percent;
//map
private GameMap gmap;
//
private int time; //时间控制器
private int time2;
private int winner[] = new int[4];
private Random rmd = new Random();
// race End
private int score;
private int selectIndex;
private boolean isError;
private boolean showWinner;
private Image bg_img;
private Image pause_img;
private Image lp_img;
private Image rp_img;
private Image step_img;
private Image cp_img;
private Image text_img;
private Image winner_img;
//RMS
private RecordManager rm;
private boolean notSoGood;
private int key;
private char name[] = {'A','A','A'}; //存储玩家姓名
private boolean isDone;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -