package game;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.*;
import text.Bullet;
import text.Enemy;
public class GamePane extends JPanel implements Runnable, KeyListener {
private int mScreenWidth = 320;
private int mScreenHeight = 480;
private static final int STATE_GAME = 0;
private int mState = STATE_GAME;
private Image mBitMenuBG0 = null;
private Image mBitMenuBG1 = null;
private int mBitposY0 = 0;
private int mBitposY1 = 0;
public final static int BULLET_POOL_COUNT = 200;
public final static int PLAN_STEP = 20;
public final static int PLAN_TIME = 500;
public final static int ENEMY_POOL_COUNT = 5;
public final static int ENEMY_POS_OFF = 65;
private Thread mThread = null;
private boolean mIsRunning = false;
public int mAirPosX = 0;
public int mAirPosY = 0;
Enemy mEnemy[] = null;
Bullet mBuilet[] = null;
public int mSendId = 0;
public Long mSendTime = 0L;
Image myPlanePic[];
public int myPlaneID = 0;
private boolean isPressingSpace = false;
private long mStartTime = System.currentTimeMillis();
public int mScore = -200;
public int mLifeStar = 2;
int kz=0;
public GamePane() {
setPreferredSize(new Dimension(mScreenWidth, mScreenHeight));
setFocusable(true);
addKeyListener(this);
init();
setGameState(STATE_GAME);
mIsRunning = true;
mThread = new Thread(this);
mThread.start();
}
protected void Draw() {
switch (mState) {
case STATE_GAME:
renderBg();
updateBg();
break;
}
}
private void init() {
try {
mBitMenuBG0 = Toolkit.getDefaultToolkit().getImage("res/map_0.png");
mBitMenuBG1 = Toolkit.getDefaultToolkit().getImage("res/map_1.png");
ImageIO.read(new File("res/map_1.png"));
} catch (IOException e) {
e.printStackTrace();
}
mBitposY0 = 0;
mBitposY1 = -mScreenHeight;
mAirPosX = 150;
mAirPosY = 400;
myPlanePic = new Image[6];
for (int i = 0; i < 6; i++)
myPlanePic[i] = Toolkit.getDefaultToolkit().getImage("res/plan_" + i + ".png");
mEnemy = new Enemy[ENEMY_POOL_COUNT];
for (int i = 0; i < ENEMY_POOL_COUNT; i++) {
mEnemy[i] = new Enemy();
mEnemy[i].init(i * ENEMY_POS_OFF, i * ENEMY_POS_OFF - 300);
}
mBuilet = new Bullet[BULLET_POOL_COUNT];
for (int i = 0; i < BULLET_POOL_COUNT; i++) {
mBuilet[i] = new Bullet();
}
}
private void setGameState(int newState) {
mState = newState;
}
public void renderBg() {
myPlaneID++;
if (myPlaneID == 6)
myPlaneID = 0;
repaint();
}
public void paint(Graphics g) {
g.drawImage(mBitMenuBG0, 0, mBitposY0, this);
g.drawImage(mBitMenuBG1, 0, mBitposY1, this);
g.drawImage(myPlanePic[myPlaneID], mAirPosX, mAirPosY, this);
for (int i = 0; i < BULLET_POOL_COUNT; i++)
mBuilet[i].DrawBullet(g, this);
for (int i = 0; i < ENEMY_POOL_COUNT; i++)
mEnemy[i].DrawEnemy(g, this);
Font font = new Font("仿宋", Font.BOLD, 20);
g.setFont(font);
g.drawString("得分:" + mScore, 10, 40);
g.drawString("生命:" + mLifeStar, 10, 20);
g.drawString("用时:" + (System.currentTimeMillis() - mStartTime) / 1000 + "秒", 10, 60);
}
private void updateBg() {
mBitposY0 += 10;
mBitposY1 += 10;
if (mBitposY0 == mScreenHeight) {
mBitposY0 = -mScreenHeight;
}
if (mBitposY1 == mScreenHeight) {
mBitposY1 = -mScreenHeight;
}
for (int i = 0; i < BULLET_POOL_COUNT; i++) {
mBuilet[i].UpdateBullet();
}
for (int i = 0; i < ENEMY_POOL_COUNT; i++) {
mEnemy[i].UpdateEnemy();
if (mEnemy[i].mAnimState == Enemy.ENEMY_DEATH_STATE
&& mEnemy[i].mPlayID == 6
|| mEnemy[i].m_posY >= mScreenHeight) {
mEnemy[i].init(UtilRandom(0, ENEMY_POOL_COUNT) * ENEMY_POS_OFF, 0);
}
}
if (isPressingSpace && mSendId < BULLET_POOL_COUNT) {
long now = System.currentTimeMillis();
if (now - mSendTime >= PLAN_TIME) {
mBuilet[mSendId].init(mAirPosX - 5, mAirPosY - 40);
mSendTime = now;
mSendId++;
new MusicThread("res/shot1.wav").start();
}
} else {
isPressingSpace = false;
}
for (int i = 0; i < BULLET_POOL_COUNT; i++) {
for (int j = 0; j < ENEMY_POOL_COUNT; j++) {
if (mBuilet[i].m_posX >= mEnemy[j].m_posX - 30
&& mBuilet[i].m_posX <= mEnemy[j].m_posX + 30
&& mBuilet[i].m_posY >= mEnemy[j].m_posY - 30
&& mBuilet[i].m_posY <= mEnemy[j].m_posY + 30) {
mEnemy[j].mAnimState = Enemy.ENEMY_DEATH_STATE;
new MusicThread("res/explosion.wav").start();
mScore++;
mBuilet[i].m_posY = -25;
}
}
}
new Plane().text();
}
public class Plane {
void text() {
if (kz==0){
for (int i = 0; i < ENEMY_POOL_COUNT; i++) {
if (mAirPosX >= mEnemy[i].m_posX
&& mAirPosX <= mEnemy[i].m_posX + 30
&& mAirPosY >= mEnemy[i].m_posY
&& mAirPosY <= mEnemy[i].m_posY + 30) {
mLifeStar--;
kz = 1;
if (mLifeStar == 0) {
mIsRunning = false;
mState = Enemy.ENEMY_DEATH_STATE;
JOptionPane.showMessageDialog(null, "游戏结束");
}
}
}
}
}
}
private int UtilRandom(int botton, int top) {
return ((Math.abs(new Random().nextInt()) % (top - botton)) + botton);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP){
mAirPosY -= PLAN_STEP;
kz=0;
}
if (key == KeyEvent.VK_DOWN){
mAirPosY += PLAN_STEP;
kz=0;
}
if (key == KeyEvent.VK_LEFT) {
kz=0;
mAirPosX -= PLAN_STEP;
if (mAirPosX < 0)
mAirPosX = 0;
}
if (key == KeyEvent.VK_RIGHT) {
kz=0;
mAirPosX += PLAN_STEP;
if (mAirPosX > mScreenWidth - 30)
mAirPosX = mScreenWidth - 30;
}
if (key == KeyEvent.VK_SPACE) {
isPressingSpace = true;
}
}
@Override
public void keyReleased(KeyEvent arg0) {
int key = arg0.getKeyCode();
if (key == KeyEvent.VK_SPACE) {
isPressingSpace = false;
}
}
@Override
public void run() {
while (mIsRunning) {
Draw();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Java项目-飞机大作战源码
共39个文件
png:19个
class:6个
java:5个
需积分: 0 0 下载量 59 浏览量
2023-07-05
17:50:31
上传
评论
收藏 217KB ZIP 举报
温馨提示
飞机大作战,实现了以下拓展功能 1、按下空格键时发射子弹 2、将我的飞机写成一个类,有生命点数,当敌机与我的飞机碰撞时,我的飞机生命点数减1,当生命点数为0时游戏结束 3、游戏界面显示得分情况:每次发射一颗子弹,打中一架敌机得一分,且子弹要消失 4、记录游戏时间 5、发出声音:发射子弹、爆炸(此处的声音是通过一个类实现的,此声音类是万能声音类,通过替换即可使用)
资源推荐
资源详情
资源评论
收起资源包目录
PlaneGame.zip (39个子文件)
PlaneGame
src
game
planeFrame.java 541B
MusicThread.java 2KB
GamePane.java 8KB
text
Bullet.java 989B
Enemy.java 1KB
untitled.iml 433B
out
production
untitled
game
MusicThread.class 3KB
GamePane$Plane.class 1KB
planeFrame.class 901B
GamePane.class 7KB
text
Bullet.class 2KB
Enemy.class 2KB
res
map_1.png 19KB
bullet_3.png 4KB
bomb_enemy_5.png 387B
e1_0.png 1KB
bullet_2.png 4KB
plan_2.png 5KB
plan_5.png 5KB
Thumbs.db 65KB
bomb_enemy_0.png 1KB
explosion.wav 46KB
plan_1.png 5KB
plan_3.png 5KB
bomb_enemy_4.png 840B
plan_0.png 5KB
bomb_enemy_1.png 2KB
map_0.png 24KB
shot1.wav 23KB
plan_4.png 5KB
bullet_0.png 3KB
bomb_enemy_3.png 1KB
bullet_1.png 4KB
bomb_enemy_2.png 2KB
.idea
vcs.xml 188B
workspace.xml 3KB
misc.xml 278B
modules.xml 263B
.gitignore 50B
共 39 条
- 1
资源评论
我叫小白菜
- 粉丝: 161
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功