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