来源于学习教程,纪念第一个java程序。(只实现了弹弹弹功能)
编辑器:IDEA企业版(新安装有 30 天试用期。至于如何白嫖?某宝搜索:idea激活,9.9搞定)
Java版本:jdk 8(如何安装?请看 01.Java 环境安装 )
版本V1.0 加载窗口代码
// 引用窗口类
import java.awt.*;
import javax.swing.*;
// 用于继承窗口类
public class BallGame extends JFrame {
// 窗口加载
void launchFrame(){
// 设置窗口大小,两个300分别代表窗口的长和宽
setSize(300,300);
// 位置,用于给窗口定位,两个数字分别代表x,y轴上的长度定位。屏幕左上角是 0 点,往屏幕右方是 x 正半轴,往屏幕下方是 y 正半轴
setLocation(400,400);
setVisible(true);
}
//main方法是程序执行的入口
public static void main(String[] args){
System.out.println("我是jungle,我想谈对象了,记于2021年10月3日。");
// 创建对象
BallGame game = new BallGame();
game.launchFrame();
}
}
效果图
版本V1.1 加载两个图片:桌球与桌面
有一个问题,有可能第一次加载图片的时候,会显示不出来,此时最小化窗口,重新点开就可以了。
如果还是没图片,可以最大化窗口,看看图片在哪儿,有可能是坐标数字有问题,慢慢调。
画图顺序:先画桌面,再画球
// 引用窗口类
import java.awt.*;
import javax.swing.*;
// 用于继承窗口类
public class BallGame extends JFrame {
// ball.png 和 desk.png 跟 当前代码文件目录的同级目录 /images/
// 加载桌球图片,括号中放置图片路径
Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
// 加载桌面图片,括号中放置图片路径
Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");
// 定义画窗口的方法,让图片出现在窗口上
public void paint(Graphics g){
System.out.println("窗口被画了一次");
// 画图的坐标参考系为画出的窗口,并非电脑屏幕
// 画 desk 桌面这个对象,位置在坐标(16,24)
g.drawImage(desk,16,24,null);
// 画 ball 这个对象,位置在坐标(200,200)
g.drawImage(ball,200,200,null);
}
// 窗口加载
void launchFrame(){
// 设置窗口大小,1250,650分别代表窗口的长和宽
setSize(1250,650);
// 位置,用于给窗口定位,两个数字分别代表x,y轴上的长度定位。屏幕左上角是 0 点,往屏幕右方是 x 正半轴,往屏幕下方是 y 正半轴
setLocation(100,100);
setVisible(true);
}
//main方法是程序执行的入口
public static void main(String[] args){
System.out.println("我是jungle,我想谈对象了,记于2021年10月3日。");
// 创建对象
BallGame game = new BallGame();
game.launchFrame();
}
}
效果图
版本V1.2 使小球图片水平方向动起来并实现边界检测,触碰边界小球回弹,实现动画效果
思路:让窗口反复 画 这个动作(这次代码先着重原理)
// 引用窗口类
import java.awt.*;
import javax.swing.*;
// 用于继承窗口类
public class BallGame extends JFrame {
// ball.png 和 desk.png 跟 当前代码文件目录的同级目录 /images/
// 加载桌球图片,括号中放置图片路径
Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
// 加载桌面图片,括号中放置图片路径
Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");
// 设置坐标变量
double x = 100; //小球的横坐标
double y = 100; //小球的纵坐标
boolean right = true; //方向
// 定义画窗口的方法,让图片出现在窗口上
public void paint(Graphics g){
System.out.println("窗口被画了一次");
// 画图的坐标参考系为画出的窗口,并非电脑屏幕
// 画 desk 桌面这个对象,位置在坐标(16,24)
g.drawImage(desk,16,24,null);
// 画 ball 这个对象,位置在坐标(200,200)
g.drawImage(ball,(int)x,(int)y,null);
// 每次调用,更改 x 值,达到移动效果
if(right){
x = x + 20;
}else{
x = x - 20;
}
// 设置当小球移动的 x 坐标值大于1090时,改变方向,类似于设置小球碰撞边界
if(x > 1090){
right = false;
}
// 设置当小球移动的 x 坐标值小于100时,改变方向,类似于设置小球碰撞边界
if(x < 90){
right = true;
}
}
// 窗口加载
void launchFrame(){
// 设置窗口大小,1250,650分别代表窗口的长和宽
setSize(1250,650);
// 位置,用于给窗口定位,两个数字分别代表x,y轴上的长度定位。屏幕左上角是 0 点,往屏幕右方是 x 正半轴,往屏幕下方是 y 正半轴
setLocation(100,100);
setVisible(true);
// 重画窗口,设置一个死循环,每秒画20次
while(true){
repaint();
// 用来处理异常
try{
Thread.sleep(50); //设置画的频率:40ms,1秒=1000毫秒,此处相当于1秒画20次窗口
}catch(Exception e){
e.printStackTrace();
}
}
}
//main方法是程序执行的入口
public static void main(String[] args){
System.out.println("我是jungle,我想谈对象了,记于2021年10月3日。");
// 创建对象
BallGame game = new BallGame();
game.launchFrame();
}
}
效果图
版本V2.0 最终版(粗略版:只实现了弹弹弹)
需要删减修改代码,可重新在旁边创建一个 BallGame2.java
// 引用窗口类
import java.awt.*;
import javax.swing.*;
// 用于继承窗口类
public class BallGame2 extends JFrame {
// ball.png 和 desk.png 跟 当前代码文件目录的同级目录 /images/
// 加载桌球图片,括号中放置图片路径
Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
// 加载桌面图片,括号中放置图片路径
Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");
// 设置坐标变量
double x = 100; //小球的横坐标
double y = 100; //小球的纵坐标
// 定义弧度变量
double degree = 3.14/3; // 此处是:60 度
// 定义画窗口的方法,让图片出现在窗口上
public void paint(Graphics g){
System.out.println("窗口被画了一次");
// 画图的坐标参考系为画出的窗口,并非电脑屏幕
// 画 desk 桌面这个对象,位置在坐标(16,24)
g.drawImage(desk,16,24,null);
// 画 ball 这个对象,位置在坐标(200,200)
g.drawImage(ball,(int)x,(int)y,null);
// 设置弹力角度以及速度
x = x + 20 * Math.cos(degree);
y = y + 20 * Math.sin(degree);
// 碰到上下边界,小球回弹
if(y > 650-100 || y < 0+90){ // 650 是窗口高度,100是窗口下方的桌子边框高度+球直径;90是窗口上方的桌子边框高度+球直径。
degree = -degree;
}
// 碰到左右边界,小球弹弹弹
if(x > 1250-120 || x < 0+90){ // 1250 是窗口宽度,70是窗口右方的桌子边框宽度+球直径;90是窗口左边的桌子边框宽度+球直径。
degree = 3.14 - degree;
}
}
// 窗口加载
void launchFrame(){
// 设置窗口大小,1250,650分别代表窗口的长和宽
setSize(1250,650);
// 位置,用于给窗口定位,两个数字分别代表x,y轴上的长度定位。屏幕左上角是 0 点,往屏幕右方是 x 正半轴,往屏幕下方是 y 正半轴
setLocation(100,100);
setVisible(true);
// 重画窗口,设置一个死循环,每秒画20次
while(true){
repaint();
// 用来处理异常
try{
Thread.sleep(50); //设置画的频率:40ms,1秒=1000毫秒,此处相当于1秒画20次窗口
}catch(Exception e){
e.printStackTrace();
}
}
}
//main方法是程序执行的入口
public static void main(String[] args){
System.out.println("我是jungle,我想谈对象了,记于2021年10月3日。");
// 创建对象
BallGame2 game = new BallGame2();
game.launchFrame();
}
}