整体思路
1.GUI画出游戏界面
2.设置监听器,键盘控住游戏人物
3.判断敌人是否被击败,游戏是否结束。
代码实现:
GameFrame类画出基本窗体:
package ui;
import javax.swing.JFrame;
public class GameFrame extends JFrame { //窗体
public GameFrame (){ //创建构造方法
//设置标题
setTitle("射击游戏"); //方法来源于JFrame类
//设置大小setSize(宽度,高度)
setSize(1200,800);
//设置位置
//null 相对于居中显示
setLocationRelativeTo(null);
//不允许改界面大小
setResizable(false);
//设置默认关闭选项
//关闭窗体时候的退出选项
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
//创建对象
GameFrame frame = new GameFrame ();
GamePanel panel=new GamePanel(frame);
//调用开始游戏的方法 启动游戏
//panel.action();
frame.add(panel);
//显示窗体 true 显示 false 隐藏
frame.setVisible(true);
}
}
GamePanel画出场上所有人物:
package ui;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
//import com.sun.java.util.jar.pack.Package.File;
//java游戏面板
public class GamePanel extends JPanel{
//画图片的方法
//1 在类中定义图片
//2在构造方法中调用工具初始化图片
//3 在画图方法中定义图片
//构造方法 确定面板特点
BufferedImage bg; // 背景图
BufferedImage gov;
BufferedImage st;
BufferedImage xue;
BufferedImage gw;
int b=0;
boolean c=false;
//创建英雄机
Hero hero=new Hero();
Boss boss=new Boss();
//创建敌机
//Ep ep=new Ep();
//创建敌机大本营(所有的敌机都在这里面)
List <Ep> eps=new ArrayList <Ep>();
List <Boom> bm=new ArrayList <Boom>();
BufferedImage b1;
BufferedImage b2;
BufferedImage b3;
BufferedImage b4;
BufferedImage b5;
List <Boss> bs=new ArrayList <Boss>();
/*BufferedImage l1;
BufferedImage l2;
BufferedImage l3;
BufferedImage l4;
BufferedImage l5;*/
// 初始化图片
//构造英雄机弹药库
List <Fire>fs=new ArrayList <Fire>();
//定义分数
int score;
int score1;
//构造方法
//开始游戏的方法
boolean gameover;
boolean start = false;
public void action() {
//创建并启动一个线程 控制游戏场景中物体的活动
//固定格式
// new Thread (){public void run(){...线程需要做的事情...}}.start();
new Thread (){
public void run(){
//写一个死循环 让游戏一直运行
while (true) {
if(!gameover&&c==false){
//调用敌机入场方法
epEnter();
//调用敌机移动的方法
epMove();
bsEnter();
bsMove();
//J发射子弹
//shoot();
//让子弹移动
fireMove();
//判断子弹是否打到敌机
shootEp();
//判断敌机是否打到英雄机
hit();
}
//重绘,刷新
//每执行一次就休息一下
//线程休眠 sleep(毫秒数)
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
repaint();
}
}
//检测敌机是否撞到英雄机
//检测是否击中敌机
//排除移除屏幕的飞机
//所有的子弹都有可能打到敌机
//判断一颗子弹是否击中敌人机器
//敌机移动的方法
} .start();
}
protected void bsEnter(){
if(score1>=300&&b==0) {
Boss boss = new Boss();
bs.add(boss);
score1=0;
b=1;
}
}
private void bsMove() {
//遍历所有的敌机
for(int i=0;i<bs.size();i++) {
//获取每一个敌机
Boss b=bs.get(i);
//让敌机移动
b.Move();
}
}
protected void hit(){
for(int i=0;i<eps.size();i++){
Ep e = eps.get(i);
if(e.hitBy(hero)){
eps.remove(e);
hero.hp--;
score += 10;
score1 +=10;
if(hero.hp<=0){
gameover=true;
}
}
}
for(int i=0;i<bs.size();i++){
Boss bos = bs.get(i);
if(bos.hitBy(hero)){
hero.hp--;
bos.hp--;
if(hero.hp<=0){
gameover=true;
}
}
}
}
protected void shootEp(){
for(int i=0;i<fs.size();i++){
Fire f = fs.get(i);
bang(f);
}
}
private void bang(Fire f){
for(int i=0;i<eps.size();i++){
Ep e = eps.get(i);
//判断子弹是否击中敌人
if(e.shootBy(f)){
e.hp--;
if(e.hp<=0) {
eps.remove(e);
Boom b=new Boom(e.x,e.y);
bm.add(b);
score += 10;
score1 += 10;
}
fs.remove(f);
//增加分数
}
}
for(int i=0;i<bs.size();i++){
Boss bos = bs.get(i);
//判断子弹是否击中敌人
if(bos.shootBy(f)){
bos.hp--;
if(bos.hp<=0){
bs.remove(bos);
Boom b=new Boom(bos.x,bos.y);
bm.add(b);
c = true;
}
fs.remove(f);
//增加分数
}
}
}
protected void fireMove(){
for(int i=0;i<fs.size();i++){
Fire f = fs.get(i);
f.move();
}
}
private void epMove() {
//遍历所有的敌机
for(int i=0;i<eps.size();i++) {
//获取每一个敌机
Ep e=eps.get(i);
//让敌机移动
e.Move();
}
}
protected void shoot(){
//创建子弹
Fire fire = new Fire(hero.x,hero.y);
//讲子弹加入到弹药库
fs.add(fire);
}
int index =0;//记录方法执行的次数 每执行n次释放一个敌机
protected void epEnter() {
//记录执行的次数
index ++;
if(index>=5) {
//创建敌机
Ep e=new Ep();
//将敌机加入到敌人=机大本营
eps.add(e);
//将index重新归0
index =0;
}
}
//确定面板的特点
public GamePanel(GameFrame frame) {
//设置背景
setBackground(Color.blue);
gov=App.getImg("/img/lose.png");
bg=App.getImg("/img/map.png");
st=App.getImg("/img/menu.png");
b1=App.getImg("/img/b1.png");
b2=App.getImg("/img/b2.png");
b3=App.getImg("/img/b3.png");
b4=App.getImg("/img/b4.png");
b5=App.getImg("/img/b5.png");
xue=App.getImg("/img/hart.gif");
gw=App.getImg("/img/gw.png");
MouseAdapter adapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(start == true){
action();
}else{
start = true;
action();
}
if(gameover){
hero = new Hero();
gameover = false;
score = 0;
repaint();
}
if(c==true){
hero = new Hero();
c=false;
score = 0;
repaint();
}
}
};
addMouseListener(adapter);
addMouseMotionListener(adapter);
//键盘监听器
KeyAdapter kd = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
//System.out.println(keyCode);
if(!gameover&&c==false){
if(keyCode==KeyEvent.VK_UP){
//英雄向上移动
hero.moveUp();
System.out.println("英雄向上移动了");
}else if(keyCode==KeyEvent.VK_DOWN){
//英雄向下移动
hero.moveDown();
System.out.println("英雄向下移动了");
}else if(keyCode==KeyEvent.VK_LEFT){
//英雄向左移动
hero.moveLeft();
System.out.println("英雄向左移动了");
}else if(keyCode==KeyEvent.VK_RIGHT){
//英雄向右移动
hero.moveRight();
System.out.println("英雄向右移动了");
}else if(keyCode==KeyEvent.VK_J){
shoot();
System.out.println("子弹发射了");
}
}
//重绘
repaint();
}
};
repaint();
//将适配器加入键盘监听器
frame.addKeyListener(kd);
}
//专用画图方法
//Graphics g 画笔
public void paint(Graphics g) {
super.paint(g);
g.drawImage(bg, 0, 0, null);
//画图片时 如果不加入高度和宽度 就是原图大小
//在paint中画图是有顺序的 先画的会被后画的覆盖
//画英雄机器
//g.drawImage(图片,横坐标,纵坐标,宽度,高度,null);
g.drawImage(hero.img,hero.x,hero.y,hero.w,hero.h,null);
//画敌机
//遍历敌机大本营
for (int i=0;i<eps.size();i++) {
//获取每一个敌机
Ep ep=eps.get(i);
g.drawImage(ep.img, ep.x ,ep.y, ep.w, ep.h, null);
}
//画boss
for (int i=0;i<bs.size();i++) {
//获取每一个敌机
Boss bos=bs.get(i);
g.drawImage(bos.img,bos.x,bos.y,bos.w,bos.h,null);
}
//画爆炸效果
for(int i=0;i<bm.size();i++){
//取出炸弹
Boom b = bm.get(i);
//System.out.format("%d",++num);
if(b.life>=5){
g.drawImage(b1, b.x, b.y, 90, 90, this);
}else if(b.life>=4){
g.drawImage(b2, b.x, b.y, 90, 90, this);
}else if(b.life>=3){
g.drawImage(b3, b.x, b.y, 90, 90, this);
}else if(b.life>=2){
g.drawImage(b4, b.x, b.y, 90, 90, this);
}else if(b.life>=1){
g.drawImage(b5, b.x, b.y, 90, 90, this);
}
b.lifeDown();
//System.out.format("1+%d\n",i);
//如果life为 0 酒吧炸弹从bombs向量去掉
if(b.life==0){
bm.remove(b);
//System.out.println("炸弹爆炸");
}
}
//画子弹
for(int i=0;i<fs.size();i++) {
//获取一个子弹
Fire fire=fs.get(i);
g.drawImage(fire.img, fire.x ,fire.y, fire.w, fire.h, null);
}
//画分数
g.setColor(Color.white);
g.setFont(new Font("楷体",Font.BOLD,20));
g.drawString("分数:"+score,10,30);
//画英雄机血量
for(int i=0;i<hero.hp;i++) {
g.drawImage(xue,350+i*35, 5,30,30, null);
}
if(start == false){
g.drawImage(st, 0, 0, 1200,900,null);
}
//游戏结束,画出gameover
if(gameover) {
//g.drawImage(bg, 0, 0, null);
g.drawImage(gov, 0, 0,1200,900, null);
g.setColor(Color.white);
g.setFont(new Font("楷体",Font.BOLD,20));
g.drawString("点击屏幕重新开始",500,290);
}else if(c==true){
//gameover=true;
g.drawImage(gw, 0, 0,1200,900, null);
}
}
}


在GamePanel设置敌人的出现,及敌人出现被子弹击中后消失,子弹在击中敌人后消失,主人翁死后游戏结束!
本文介绍了一个基于Java Swing的射击游戏GUI实现方案,包括游戏界面绘制、键盘控制游戏角色移动、敌人出现与消失逻辑、子弹碰撞检测及游戏结束条件等。
1463

被折叠的 条评论
为什么被折叠?



