java 学做小游戏

在这里插入图片描述
1:
package 三国战纪;
//设置框架
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.IOException;

public class GameFrame extends JFrame {

public GameFrame(){
    setTitle("三国游戏");       //设置标题
    setSize(1024,480);//设置弹出窗口尺寸
    setLocationRelativeTo(null); //Location位置,RelativeTo相对于
    //set设置;Default默认值;Close关闭文件;Operation运算;JFrame窗体;EXIT离开;CLOSE结束
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭窗体时关闭游戏

    //设置标题
    try {
        //IconImage图标;read读取;Resource资源类型;GameFrame游戏窗口
        setIconImage(ImageIO.read(GameFrame.class.getResource("")));
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public static void main(String[] args) {
    GameFrame frame = new GameFrame();    //frame框架
    GamePanel panel = new GamePanel(frame);//panel画板

    panel.action(); //调用开始游戏的方法

    frame.add(panel);        //添加一个画板;add添加
    frame.setVisible(true);        //显示窗体;Visible 可见的
}

}
2:
package 三国战纪;
//获取图片
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;

//读取图片的工具类
public class ImageUtil {
//BufferedImage图像缓冲区;get获取;Img图片;path路径
public static BufferedImage getImg(String path){
//加载图片; try尝试; ImageIO:io流;read读取
try {
//尝试用地址找图片
BufferedImage img = ImageIO.read(ImageUtil.class.getResource(path));
return img;
//catch抓住;IOException异常
} catch (IOException e) {
//输出找不到的原因
e.printStackTrace();
}
return null;
}

}

3:
package 三国战纪;
//人物 吕布
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

public class Herolb {
BufferedImage lbImg;//显示LvBu图片
int x;
int y;
int w;
int h;
//lvbu动作
List list1,list2,list3,list4;
//lvbu向后移动
int dir;//=0向左; =1向右;=2向上;=3向下;=4向左上 =5向左上;=6向右上;=7向右下

public Herolb(){
    //读取LvBu的图片
   lbImg =  ImageUtil.getImg("/img/吕布L1.png");
    //设置游戏开始的初始值,即显示LvBu初始位置
    x = 600;
    y = 200;
    //显示人物的外形大小
    w = lbImg.getWidth();
    h = lbImg.getHeight();
    dir = 0;
    list1 = new ArrayList <BufferedImage>();
    for (int i = 1; i<=7;i++){
        list1.add(ImageUtil.getImg("/img/吕布L"+i+".png"));
    }
    list2 = new ArrayList <BufferedImage>();
    for (int i = 1; i<=8;i++){
        list2.add(ImageUtil.getImg("/img/吕布"+i+".png"));
    }
    list3 = new ArrayList <BufferedImage>();
    for (int i = 1; i<=5;i++){
        list3.add(ImageUtil.getImg("/img/a1-L"+i+".png"));
    }
    list4 = new ArrayList <BufferedImage>();
    for (int i = 1; i<=5;i++){
        list4.add(ImageUtil.getImg("/img/a1-R"+i+".png"));
    }
}
int index = 1;//index索引
//lvbu动起来:Change变换
// 吕布向前动起来
public void LbChange1(){
    if(index>=7){
        index = 1;
    }
    lbImg = list1.get(index);
    index++;
}
// 吕布向后动起来
public void LbChange2(){
    if (index>=8){
        index = 1;
    }
    lbImg = list2.get(index);
    index++;
}
//// 吕布向前攻击
public void LbChange3(){
    if (index>=5){
        index = 0;
    }
    lbImg = list3.get(index);
    index++;
}
// 吕布向后攻击
public void LbChange4(){
    if (index>=5){
        index = 0;
    }
    lbImg = list4.get(index);
    index++;
}
//吕布攻击赵云;Attack攻击
public void AttackZy(Herozy zhaoyun){
    if (x - zhaoyun.x +w <= zhaoyun.w +w ||zhaoyun.x -x +zhaoyun.w <= zhaoyun.w+w
            ||zhaoyun.x>=x && zhaoyun.x <= x +w ){
        //最大值ZhaoYun.w+w;
        //最小值w
        new Herozy().x -= 20;
        System.out.println("1");
    }
}

}
4:人物赵云
package 三国战纪;

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

public class Herozy {

BufferedImage bg;
int x;
int y;
int w;
int h;
int dir;
//
List<BufferedImage> list1,list2;
////赵云活动起来
public Herozy(){
    bg = ImageUtil.getImg("/img/right-0.png");
     x = 300;
     y = 200;
     w = bg.getWidth();
     h = bg.getHeight();
     dir = 0;
    list1 = new ArrayList<BufferedImage>();
    for (int i = 0;i<8;i++){
        list1.add(ImageUtil.getImg("/img/right-"+i+".png"));
    }
    list2 = new ArrayList<BufferedImage>();
    for (int i = 0;i<8;i++){
        list2.add(ImageUtil.getImg("/img/left-"+i+".png"));
    }
}
//赵云向前移动  ;Change position改变位置
int index = 0;
public void ZyChangeposition1(){
    if(index==7){
        index = 0;
    }
     bg= list1.get(index);
    index++;
}
// 赵云向h后移动
public  void ZyChangeposition2(){
    if (index==7){
        index = 0;
    }
     bg= list2.get(index);
    index++;
}

}
5:
package 三国战纪;
//调用图片及人物

import javax.swing.;
import java.awt.
;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.Random;

//游戏的界面
public class GamePanel extends JPanel{
//(1)定义背景图片
BufferedImage bg;
//BufferedImage mnImg;//定义mn(MeiNv)图片
//调用模具 制作LvBu
Herolb lb = new Herolb();
Herozy zy = new Herozy();
//窗体
GameFrame gf;
//Random r = new Random();
//构造方法
public GamePanel(GameFrame gameframe){
this.gf = gameframe;
//(2):调用读取图片的工具
//声明一个用于防背景的窗体
BufferedImage img;
//读取图片
bg = ImageUtil.getImg("/img/bg1.jpg");
//mnImg = ImageUtil.getImg("/img/吕布L1.png");
//1:设置背景;Background背景;Color颜色;green绿色
//setBackground(Color.green);
KeyListener();
}
//专门用来画图的方法,Paint画图;画图代码paint+回车键
//(Graphics g)就是画笔
@Override
public void paint(Graphics g) {
super.paint(g);
/*
//学习基本操作
//2:设置画笔的Color颜色
g.setColor(Color.red);
//3:设置字体 数字越大字越大
g.setFont(new Font(“楷体”, Font.BOLD,50));
//4:设置文字位置 g.drawString(str,x,y);draw画画
g.drawString(“大家好”,50,50);
//5:画图形
//画空心矩形 ;draw绘制;Rect矩形;x,y矩形左上角起始点位置,width长;height高
g.drawRect(60,60,100,20);
//画实心矩形;fill装满
g.fillRect(60,100,100,20);
//画空心椭圆
g.drawOval(60,150,80,60);
//画实心圆
g.setColor(Color.BLACK);
g.fillOval(60,220,80,80);
//画一个五角星 五角星形状可以在中文输入里面找
g.setColor(Color.red);
g.setFont(new Font(“楷体”, Font.BOLD,100));
g.drawString(“★”,50,400);
*/
//画背景图
g.drawImage(bg,0,0,null);
//bg导入图片,x横坐标,y坐标,宽,高.因为不需要画板直接在面板上做所以用null
//g.drawImage(bg,0,0,1024,480,null);
//画图;
//g.drawImage(mnImg,600,200,243,131,null);
//如果不设置图像的宽和高,系统就会默认原图的大小
//g.drawImage(mnImg,400,150,null);
//加载LvBu后
g.setColor(Color.red);
g.fillRect(100,0,350,30);
g.fillRect(617,0,350,30);
g.setColor(Color.blue);
g.fillRect(100,32,350,15);
g.fillRect(617,32,350,15);

    g.drawImage(ImageUtil.getImg("/img/lvbu.png"),970,2,90,45,null);
    g.drawImage(ImageUtil.getImg("/img/zy.png"),3,2,90,45,null);
    g.setColor(Color.yellow);
    g.setFont(new Font("宋体",Font.BOLD,50));
    g.drawString("VS",505,58);

    //画出吕布
    g.drawImage(lb.lbImg,lb.x,lb.y,lb.w,lb.h,null);
    //画出赵云
    g.drawImage(zy.bg,zy.x,zy.y,zy.w,zy.h,null);
}
//KeyListener键盘监听器;即用键盘控制人物移动
public void KeyListener(){

    //键盘控制编程步骤:1:创建键盘适配器即键盘的接口
    KeyAdapter adapter = new KeyAdapter() {

            //keyPressed按下键盘;下面就是监听键盘执行的操作;KeyEvent键盘事件
            @Override
            public void keyPressed(KeyEvent e) {
                //当按下键盘按键时会执行的代码;char字符类型;
                char c = e.getKeyChar();
                zy.ZyChangeposition1();
                // int key=e.getKeyCode(); if (key==KeyEvent.VK_UP) { 键盘向上移动
                if (c=='a'){
                    //向左移动
                    zy.x-=3;
                    zy.ZyChangeposition2();
                    if (zy.x<=0){
                        zy.x=0;
                        //zy.dir = 'd';
                    }
                }else if (c=='d'){
                    //向右移动
                    zy.x+=3;
                    //设置人物边界
                    if(zy.x>=1024-zy.w){
                        zy.x=1024-zy.w;
                       // zy.dir = 'a';
                    }
                }else if(c=='w'){
                    //向上移动
                    zy.y-=3;
                    if (zy.y<=0){
                        zy.y=0;
                       // zy.dir = 'x';
                    }
                }else if(c=='x'){
                    //向下移动
                    zy.y +=3;
                    if (zy.y>=480-zy.h){
                        zy.y=480-zy.h;
                        //zy.dir = 'w';
                    }
                }
                // repaint刷新
                repaint();
            }
        };
        //2:将键盘适配器加入到监听器;add添加;
        gf.addKeyListener(adapter);
    }









    //开始游戏的方法;action动作
    public void action() {
        //创建并启动线程 控制lvbu移动;线程的固定格式;new Thread(){ public void run(){//需要线程做什么事情,就写在在run方法里面}}.start();
        new Thread() {
            public void run() {//run运动
                //吕布移动知道循环次数用for ,不知道用while
                while (true) {
                    lb.LbChange1();//Change 变化
                    //声明一个随机数对象
                    Random random = new Random();//Random随机
                    lb.dir = random.nextInt(9 + 1);//bound边界
                    if (lb.dir == 0) {
                        lb.x -= 3;

                        if (lb.x <= 0) {
                            lb.x = 0;
                            //lb,dir = 1;
                        }
                    } else if (lb.dir == 1) {
                        lb.LbChange2();
                        lb.x += 3;
                        if (lb.x >= 1024 - lb.w) {
                            lb.x = 1024 - lb.w;
                            //lb.dir = 0;
                        }
                    } else if (lb.dir == 2) {
                        lb.y -= 3;
                        if (lb.y <= 0) {
                            lb.y = 0;
                        }
                    } else if (lb.dir == 3) {
                        lb.y += 3;
                        if (lb.y >= 480 - lb.h) {
                            lb.y = 480 - lb.h;
                        }
                        //4左上
                    } else if (lb.dir == 4) {
                        lb.x -= 3;
                        lb.y -= 3;
                        //5左下
                    } else if (lb.dir == 5) {
                        lb.x -= 3;
                        lb.y += 3;
                        //6右上
                    } else if (lb.dir == 6) {
                        lb.x += 3;
                        lb.y -= 3;
                        //7右下
                    } else if (lb.dir == 7) {
                        lb.x += 3;
                        lb.y += 3;
                    } else if (lb.dir == 8) {
                        lb.LbChange3();
                    } else if (lb.dir == 9) {
                        lb.LbChange4();
                    }
                    //线程休眠
                    try {
                        Thread.sleep(100);
                        //重新调用paint方法,将lvbu刷新到新的位置;repaint重画
                        repaint();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }

            }
        }.start();
    }

}

发布了154 篇原创文章 · 获赞 6 · 访问量 5506

猜你喜欢

转载自blog.csdn.net/weixin_45339692/article/details/104649630