📄 gamecanvas.java
字号:
protected synchronized void keyPressed(int keyCode) {
if( gameState != GAME_PLAYING ||
(gameState == GAME_PLAYING && isPaused)) {
return;
}
//为清除按键时不处理
if(keyCode == 0) return; //for KDDI
switch(keyCode) {
case KEY_NUM4:
doLeft();
break;
case KEY_NUM6:
doRight();
break;
case KEY_NUM8:
doDown();
break;
case KEY_NUM2:
doUp();
break;
case KEY_NUM5:
doFire();
}
int gameCode = getGameAction(keyCode);
switch(gameCode) {
case LEFT: //按下向左按键时
doLeft();
break;
case RIGHT: //按下向右按键时
doRight();
break;
case DOWN: //按下向下按键时
doDown();
break;
case UP: //按下向上按键时
doUp();
break;
case FIRE://按下Fire按键时
doFire();
}
}
protected void keyRepeated(int keyCode) {
keyPressed(keyCode);
}
/** 线程的运作部分 */
public void run() {
try {
switch(gameState) {
case GAME_START:
removeCommand(startCmd);
removeCommand(exitCmd);
repaint();
Thread.sleep(1500);
addCommand(quitCmd);
if(! isPaused) {
addCommand(pauseCmd);
}
gameState = GAME_PLAYING;
case GAME_PLAYING:
repaint();
boolean isGameOver = false;
//开始游戏循环
while(! isStopped) {
repaint();
myShip.doMove();
//UFO处理
for(int i=0; i < ufos.length; i++) {
if(ufos[i].isAlive()) {
//只处理在Alive状态的UFO
//移动UFO
ufos[i].doMove();
if(! ufos[i].isAlive() ||
ufos[i].getX()+ufos[i].getWidth() < 0 ||
ufos[i].getX() > screenWidth) {
//移动UFO之后不是Alive状态时
//或是UFO跑到画面外时
//设定UFO不是Alive状态,减少UFO数目
ufos[i].setAlive(false);
ufoCount--;
//若UFO为命中状态的话,在分数中新增DEFAULT_SCORE
if(ufos[i].isHit()) {score = score + DEFAULT_SCORE;
if(score >=livesup*1000) {lives++;livesup++;}
}
}else if(ufoMissileCount < ufoMissiles.length &&
ufos[i].isDropBomb()) {
//UFO在Alive状态下发射飞弹时
//进行炸弹处理
//在飞弹数组中寻找不是Alive状态的飞弹
for(int j=0; j < ufoMissiles.length; j++) {
if(! ufoMissiles[j].isAlive()) {
//不是Alive状态的飞弹时
//符合飞弹的座标来攻击
ufoMissiles[j].setX((
ufos[i].getWidth() - ufoMissiles[j].getWidth()) /2 +
ufos[i].getX());
ufoMissiles[j].setY(ufos[i].getY() + ufos[i].getHeight());
ufoMissiles[j].setAlive(true);
ufoMissileCount++;
break;
}
}
}
}
}// end for
//UFO飞弹处理
for(int i=0; i < ufoMissiles.length; i++) {
if(ufoMissiles[i].isAlive()) {
//只处理Alive状态的UFO飞弹
//移动UFO飞弹
ufoMissiles[i].doMove();
//命中判定
if(myShip.isOverlaps(ufoMissiles[i])) {
//UFO飞弹与自机重叠时
myShip.setHit(true);
//删除飞弹
ufoMissiles[i].setAlive(false);
ufoMissileCount--;
//减少生命点数
lives--;
if(lives < 1) {
//当生命点数用完时
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
isGameOver = true;
break;
}
}else if(ufoMissiles[i].getY() > getHeight()) {
//UFO飞弹跑到画面外时
//将UFO飞弹设为无效
ufoMissiles[i].setAlive(false);
ufoMissileCount--;
}
}
}
//自机飞弹处理
for(int i=0; i < myMissiles.length; i++) {
if(myMissiles[i].isAlive()) {
myMissiles[i].doMove();
//命中判定
for(int j=0; j < ufos.length; j++) {
if(ufos[j].isAlive() && ! ufos[j].isHit()) {
//当UFO为在Alive状态,而不是被击中状态时
if(ufos[j].isOverlaps(myMissiles[i])) {
//自机飞弹与UFO重叠时
ufos[j].setHit(true);
//删除飞弹
myMissiles[i].setAlive(false);
myMissileCount--;
break;
}
}
}
}
if( myMissiles[i].isAlive() &&
myMissiles[i].getY() + myMissiles[i].getHeight() < SCORE_AREA)
{
//从画面消失时
//删除自机飞弹
myMissiles[i].setAlive(false);
myMissileCount--;
}
}// end for
if(isGameOver) {
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//结束这个循环
doGameStop();
gameState = GAME_END;
repaint();
Thread.sleep(5000);
doTitle();
break;
}else {
doEmerge4UFO();
Thread.sleep(DRAW_INTERVAL);
}
}// end while
break;
}
}catch(Exception e) {}
}
/** 左按键被压下时所调用的方法 */
private void doLeft() {
int tmpX = myShip.getX() - (myShip.getWidth() /2);
if(tmpX < 0) {
tmpX = 0;
}
myShip.setX(tmpX);
}
private void doRight() {
int tmpX = myShip.getX() + (myShip.getWidth() /2);
if(tmpX > screenWidth -myShip.getWidth()) {
tmpX = screenWidth -myShip.getWidth();
}
myShip.setX(tmpX);
}
private void doUp() {
int tmpX = myShip.getY() - (myShip.getHeight() /2);
if(tmpX <0) {
tmpX = 0;
}
myShip.setY(tmpX);
}
private void doDown() {
int tmpX = myShip.getY() + (myShip.getHeight() /2);
if(tmpX > screenHeight -myShip.getHeight()) {
tmpX = screenHeight -myShip.getHeight();
}
myShip.setY(tmpX);
}
/** 按下决定按键被调用的方法 */
private void doFire() {
if(myMissileCount < myMissiles.length) {
for(int i=0; i < myMissiles.length; i++) {
if(! myMissiles[i].isAlive()) {
myMissiles[i].setX((myShip.getWidth() - myMissiles[i].getWidth()) /2 +
myShip.getX());
myMissiles[i].setY(myShip.getY() - myMissiles[i].getHeight());
myMissiles[i].setAlive(true);
myMissileCount++;
break;
}
}
}
}
private void doEmerge4UFO() {
tickCount4UFO++;
if(ufoCount < 1 || tickCount4UFO > 4) {
tickCount4UFO = 0;
if(ufoCount < ufos.length) {
//UFO的数目比上限还少时
//取得乱数的int值
int tmpInt = random.nextInt() % 2;
if(tmpInt == 1 || tmpInt == -1) {
tmpInt = random.nextInt() % 2;
UFO ufo;
for(int i=0; i < ufos.length; i++) {
if(! ufos[i].isAlive()) {
if(tmpInt == 0) {
tmpInt = random.nextInt() % 2;
if(tmpInt < 0) tmpInt = tmpInt* (-1);
ufos[i].setDirection(UFO.DIRECTION_RIGHT);
ufos[i].setX(0 +2);
ufos[i].setY(SCORE_AREA + (((ufos[i].getHeight() +2) *2) * tmpInt));
}else {
tmpInt = random.nextInt() % 2;
if(tmpInt < 0) tmpInt = tmpInt* (-1);
ufos[i].setDirection(UFO.DIRECTION_LEFT);
ufos[i].setX((screenWidth - ufos[i].getWidth() / 2) -2);
ufos[i].setY(SCORE_AREA +
(((ufos[i].getHeight() +2) *2) * tmpInt) +
(ufos[i].getHeight() +2));
}
ufos[i].setAlive(true);
ufoCount++;
break;
}
}
}
}
}
}
private void setHighScore(long score) {
if(score > highScore) {
highScore = score;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -