📄 mysurfaceview.java
字号:
}
//按键监听事件函数根据游戏状态不同进行不同监听
switch (gameState) {
case GAME_MENU:
break;
case GAMEING:
//主角的按键按下事件
player.onKeyDown(keyCode, event);
break;
case GAME_PAUSE:
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
}
return super.onKeyDown(keyCode, event);
}
/**
* 按键抬起事件监听
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
//处理back返回按键
if (keyCode == KeyEvent.KEYCODE_BACK) {
//游戏胜利、失败、进行时都默认返回菜单
if (gameState == GAMEING || gameState == GAME_WIN || gameState == GAME_LOST) {
gameState = GAME_MENU;
}
//表示此按键已处理,不再交给系统处理,
//从而避免游戏被切入后台
return true;
}
//按键监听事件函数根据游戏状态不同进行不同监听
switch (gameState) {
case GAME_MENU:
break;
case GAMEING:
//按键抬起事件
player.onKeyUp(keyCode, event);
break;
case GAME_PAUSE:
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
}
return super.onKeyDown(keyCode, event);
}
/**
* 游戏逻辑
*/
private void logic() {
//逻辑处理根据游戏状态不同进行不同处理
switch (gameState) {
case GAME_MENU:
break;
case GAMEING:
//背景逻辑
backGround.logic();
//主角逻辑
player.logic();
//敌机逻辑
if (isBoss == false) {
//敌机逻辑
for (int i = 0; i < vcEnemy.size(); i++) {
Enemy en = vcEnemy.elementAt(i);
//因为容器不断添加敌机 ,那么对敌机isDead判定,
//如果已死亡那么就从容器中删除,对容器起到了优化作用;
if (en.isDead) {
vcEnemy.removeElementAt(i);
} else {
en.logic();
}
}
//生成敌机
count++;
if (count % createEnemyTime == 0) {
for (int i = 0; i < enemyArray[enemyArrayIndex].length; i++) {
//苍蝇
if (enemyArray[enemyArrayIndex][i] == 1) {
int x = random.nextInt(screenW - 100) + 50;
vcEnemy.addElement(new Enemy(bmpEnemyFly, 1, x, -50));
//鸭子左
} else if (enemyArray[enemyArrayIndex][i] == 2) {
int y = random.nextInt(20);
vcEnemy.addElement(new Enemy(bmpEnemyDuck, 2, -50, y));
//鸭子右
} else if (enemyArray[enemyArrayIndex][i] == 3) {
int y = random.nextInt(20);
vcEnemy.addElement(new Enemy(bmpEnemyDuck, 3, screenW + 50, y));
}
}
//这里判断下一组是否为最后一组(Boss)
if (enemyArrayIndex == enemyArray.length - 1) {
isBoss = true;
} else {
enemyArrayIndex++;
}
}
//处理敌机与主角的碰撞
for (int i = 0; i < vcEnemy.size(); i++) {
if (player.isCollsionWith(vcEnemy.elementAt(i))) {
//发生碰撞,主角血量-1
player.setPlayerHp(player.getPlayerHp() - 1);
//当主角血量小于0,判定游戏失败
if (player.getPlayerHp() <= -1) {
gameState = GAME_LOST;
}
}
}
//每2秒添加一个敌机子弹
countEnemyBullet++;
if (countEnemyBullet % 40 == 0) {
for (int i = 0; i < vcEnemy.size(); i++) {
Enemy en = vcEnemy.elementAt(i);
//不同类型敌机不同的子弹运行轨迹
int bulletType = 0;
switch (en.type) {
//苍蝇
case Enemy.TYPE_FLY:
bulletType = Bullet.BULLET_FLY;
break;
//鸭子
case Enemy.TYPE_DUCKL:
case Enemy.TYPE_DUCKR:
bulletType = Bullet.BULLET_DUCK;
break;
}
vcBullet.add(new Bullet(bmpEnemyBullet, en.x + 10, en.y + 20, bulletType));
}
}
//处理敌机子弹逻辑
for (int i = 0; i < vcBullet.size(); i++) {
Bullet b = vcBullet.elementAt(i);
if (b.isDead) {
vcBullet.removeElement(b);
} else {
b.logic();
}
}
//处理敌机子弹与主角碰撞
for (int i = 0; i < vcBullet.size(); i++) {
if (player.isCollsionWith(vcBullet.elementAt(i))) {
//发生碰撞,主角血量-1
player.setPlayerHp(player.getPlayerHp() - 1);
//当主角血量小于0,判定游戏失败
if (player.getPlayerHp() <= -1) {
gameState = GAME_LOST;
}
}
}
//处理主角子弹与敌机碰撞
for (int i = 0; i < vcBulletPlayer.size(); i++) {
//取出主角子弹容器的每个元素
Bullet blPlayer = vcBulletPlayer.elementAt(i);
for (int j = 0; j < vcEnemy.size(); j++) {
//添加爆炸效果
//取出敌机容器的每个元与主角子弹遍历判断
if (vcEnemy.elementAt(j).isCollsionWith(blPlayer)) {
vcBoom.add(new Boom(bmpBoom, vcEnemy.elementAt(j).x, vcEnemy.elementAt(j).y, 7));
}
}
}
} else {//Boss相关逻辑
//每0.5秒添加一个主角子弹
boss.logic();
if (countPlayerBullet % 10 == 0) {
//Boss的没发疯之前的普通子弹
vcBulletBoss.add(new Bullet(bmpBossBullet, boss.x + 35, boss.y + 40, Bullet.BULLET_FLY));
}
//Boss子弹逻辑
for (int i = 0; i < vcBulletBoss.size(); i++) {
Bullet b = vcBulletBoss.elementAt(i);
if (b.isDead) {
vcBulletBoss.removeElement(b);
} else {
b.logic();
}
}
//Boss子弹与主角的碰撞
for (int i = 0; i < vcBulletBoss.size(); i++) {
if (player.isCollsionWith(vcBulletBoss.elementAt(i))) {
//发生碰撞,主角血量-1
player.setPlayerHp(player.getPlayerHp() - 1);
//当主角血量小于0,判定游戏失败
if (player.getPlayerHp() <= -1) {
gameState = GAME_LOST;
}
}
}
//Boss被主角子弹击中,产生爆炸效果
for (int i = 0; i < vcBulletPlayer.size(); i++) {
Bullet b = vcBulletPlayer.elementAt(i);
if (boss.isCollsionWith(b)) {
if (boss.hp <= 0) {
//游戏胜利
gameState = GAME_WIN;
} else {
//及时删除本次碰撞的子弹,防止重复判定此子弹与Boss碰撞、
b.isDead = true;
//Boss血量减1
boss.setHp(boss.hp - 1);
//在Boss上添加三个Boss爆炸效果
vcBoom.add(new Boom(bmpBoosBoom, boss.x + 25, boss.y + 30, 5));
vcBoom.add(new Boom(bmpBoosBoom, boss.x + 35, boss.y + 40, 5));
vcBoom.add(new Boom(bmpBoosBoom, boss.x + 45, boss.y + 50, 5));
}
}
}
}
//每1秒添加一个主角子弹
countPlayerBullet++;
if (countPlayerBullet % 20 == 0) {
vcBulletPlayer.add(new Bullet(bmpBullet, player.x + 15, player.y - 20, Bullet.BULLET_PLAYER));
}
//处理主角子弹逻辑
for (int i = 0; i < vcBulletPlayer.size(); i++) {
Bullet b = vcBulletPlayer.elementAt(i);
if (b.isDead) {
vcBulletPlayer.removeElement(b);
} else {
b.logic();
}
}
//爆炸效果逻辑
for (int i = 0; i < vcBoom.size(); i++) {
Boom boom = vcBoom.elementAt(i);
if (boom.playEnd) {
//播放完毕的从容器中删除
vcBoom.removeElementAt(i);
} else {
vcBoom.elementAt(i).logic();
}
}
break;
case GAME_PAUSE:
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
}
}
@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* SurfaceView视图状态发生改变,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
/**
* SurfaceView视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -