java swing(GUI图形化界面)基础教程4-游戏开发

1.开始前

在开始本篇内容前,先回顾一下之前的代码,以及其中存在的问题.(需要用到面向对象知识)如下:

链接:(28条消息) java swing(GUI图形化界面)基础教程3-添加事件监听1_java图形界面监听类_尽辰的博客-CSDN博客

     public static void main(String[] args) {
 
        JFrame frame=new JFrame();//这是一个窗口类
 
        frame.setBounds(100,100,500,500);//设置窗口位置与大小
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用户关闭时会关闭所有窗口
 
        JPanel panel=new JPanel();//创建一个面板,并且将这个面板添加到窗口里面去
        frame.add(panel);
        panel.setLayout(null);//取消默认的布局管理
 
 
        JButton button=new JButton();//创建一个按钮,并且将这个按钮添加到面板上面
        button.setText("按钮");//设置按钮的文字内容
        button.setBounds(100,100,100,100);//设置按钮的位置大小
        panel.add(button);//添加按钮到面板
        
 
        frame.setVisible(true);//设置这窗口可见,记得尽量要把这一句放在最后面
    }

即,全部东西都挤在一起,这对于我们后面游戏开发是不利的,因此我把它分为3个类:

 代码分别为:

public class MyFrame extends JFrame {

    public MyFrame(){
        setBounds(100,100,500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new MyPanel());
        setVisible(true);
    }

}
public class MyPanel extends JPanel {

    public MyPanel(){
        init();
        addObj();
    }
    private void init(){
        setLayout(null);//取消默认的布局管理
    }
    private void addObj(){

        JButton button=new JButton();
        button.setText("按钮");
        button.setBounds(100,100,100,100);
        add(button);

    }
}
public class MyMain {
    public static void main(String[] args) {
        new MyFrame();
    }
}

这样,各个类分工明确,我们本片文章的功能实现主要就在MyPanel类中

2.正片开始

首先,把我们MyPanel类里面多余的东西删除,变成下面这样:

public class MyPanel extends JPanel {

    public MyPanel(){
        init();
    }
    private void init(){
        setLayout(null);//取消默认的布局管理
    }
    
}

然后这个时候去运行MyMain时,会出现一个空白的窗口

现在我们想在这空白的窗口上面画一个矩形,重写 paintComponent(g) 方法即可

(只要知道这个方法是可以用来画东西就行),下面代码就是画了一个矩形

    @Override
    protected void paintComponent(Graphics g) {
        g.fillRect(10,10,100,100);
    }

效果如下:

 如果想改变颜色,如红色,可以这样:

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(10,10,100,100);
    }

再画一个空心圆:

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(10,10,100,100);
        g.setColor(Color.blue);
        g.drawOval(110,110,50,50);
    }

现在,你已经可以画这些基本的东西了,且可以根据idea的提示功能来发现更多东西

但是,我们画的东西都还是静止的,如果想要动起来,那么要开始使用多线程知识了

如果你还没有学过多线程,那么建议你先去学习或者看我对他的简单介绍(如果你对自己的理解能力有足够信心的话)

多线程简单介绍

这里,我只简单介绍他的部分基础使用,并不涉及高级操作

让一个类实现Runnable接口,他会强制让你实现run方法

 

    @Override
    public void run() {
        while (true){

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(1);
        }
    }

上面的意思是每过500毫秒打印一个1

同时要记得启动它

 完整代码为

public class MyPanel extends JPanel implements Runnable{

    Thread thread=new Thread(this);

    public MyPanel(){
        init();
        thread.start();
    }
    private void init(){
        setLayout(null);//取消默认的布局管理
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(10,10,100,100);
        g.setColor(Color.blue);
        g.drawOval(110,110,50,50);
    }

    @Override
    public void run() {
        while (true){

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(1);
        }
    }
}

让图片移动

定义矩形x,y坐标为全局变量

 

每过500毫秒x坐标增加10,并且重新画一次(repaint()可以刷新,即去调用paintComponent(),注意,paintComponent()方法不能主动调用)

 

运行后发现图片并不是移动,而是产生了手机电池充电的效果

 

 这是因为,我们没有把之前画在面板上的内容清空,在这里添加一句话就行

(父类的paintComponent()方法默认会清空面板内容)

 现在,再运行就是正常的移动了

本文章基本就差不多了,其实,我们还可以通过按下键盘按键来控制图形移动,

但是,改天再写吧

可以提示一下,下面图片是我以前写过的监听之一(定义一个方法,里面

addKeyListener(new KeyAdapter(){} 可以配合switch或if语句对按键判断

)

 over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尽辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值