1 项目需求:
桌球在球桌中按照一定线路和角度移动,遇到边框会自动弹回。
要求:即使看不太懂,也要照着敲如下游戏代码,至少 5 遍。要求所有字符和源文件一致。 能够经过调试实现代码的正常运行即可。 下面我们将分以下四个步骤来实现桌球游戏:
第一步:创建项目和窗口。
第二步:加载两个图片。
第三步:实现动画,小球沿着水平方向移动并做边界检测。
第四步:实现小球沿着任意角度飞行(会用到初中学习的三角函数,如果忘记了就 想想你们的体育老师吧)。
1.选择Projects,点击New Projects.如图所示:
2…选择Java,点击Next。如图所示:
3.选择默认的模板,点击Next。如图所示:
4.填写项目名称以及包名。点击Finish。如图所示:
5.在项目名ballgame上单击右键,在菜单中依次选择 new–>Directory, 创建一个名称是 images 的文件夹,并复制两张图片到该目录下。如图所示:
6.桌球游戏代码—绘制窗口的代码如下:
package com.txw;
import javax.swing.*;
/**
* 桌球游戏
* @author Adair
* @qq:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class BallGame extends JFrame {
// 窗口加载
void launchFrame() {
setSize(800,800);
setLocation(400,400);
setVisible(true);
}
// main 方法是程序执行的入口
public static void main(String[] args) {
BallGame ballGame = new BallGame();
ballGame.launchFrame();
}
}
如图所示:
执行结果如图所示:
7.加载两个图片:我们要在 BallGame 类中添加小球和桌面的路径,并指定小球出现在窗 口的的初始位置。然后添加 paint 方法,加载小球和桌面。
代码如下:
package com.txw;
import javax.swing.*;
import java.awt.*;
/**
* 桌球游戏
* @author Adair
* @qq:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class BallGame extends JFrame {
// 添加小球和桌面图片的路径
Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");
// 指定小球的初始位置
double x=100; // 小球的横坐标
double y=100; // 小球的纵坐标
// 画窗口的方法:加载小球与桌面
public void paint(Graphics graphics){
System.out.println("窗口被画了一次!");
graphics.drawImage(desk,0,0,null);
graphics.drawImage(ball, (int)x, (int)y, null);
}
// 窗口加载
void launchFrame() {
setSize(300,300);
setLocation(400,400);
setVisible(true);
}
// main 方法是程序执行的入口
public static void main(String[] args) {
BallGame ballGame = new BallGame();
ballGame.launchFrame();
}
}
如图所示:
执行结果如图所示:
注意:由于懒加载问题,有可能出现第一次加载图片无效的情况;请最大化窗口再打开即可。稍后 大家完成第三步后,就完全不存在这个问题了。
8.实现动画,小球沿着水平方向移动并做边界检测。 要实现动画的关键是改变小球的坐 标,并且要不停的重画窗口来更新小球的坐标;边界检测则是判断小球的坐标是否超出桌面 的范围,如果超出则要改变小球原来的运动方向。
代码如下:
package com.txw;
import javax.swing.*;
import java.awt.*;
/**
* 桌球游戏
* @author Adair
* @qq:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class BallGame extends JFrame {
// 添加小球和桌面图片的路径
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 graphics){
System.out.println("窗口被画了一次!");
graphics.drawImage(desk,0,0,null);
graphics.drawImage(ball, (int)x, (int)y, null);
// 改变小球的坐标
if (right){
x = x + 10;
}else {
x = x - 10;
}
// 边界检测
// 856 是窗口宽度,40 是桌子边框的宽度,30 是小球的直径
if (x > 856 -40 -30){
right = false;
}
if (x < 40){
right = true;
}
}
// 窗口加载
void launchFrame() {
setTitle("桌球游戏");
setSize(300,300);
setLocation(400,400);
setVisible(true);
// 重画窗口,每秒画25次
while (true){
repaint(); // 调用repaint方法,窗口即可重画
try {
Thread.sleep(40); // 40ms, 1秒=1000毫秒. 大约一秒画25次窗口
} catch (Exception e){
e.printStackTrace();
}
}
}
// main 方法是程序执行的入口
public static void main(String[] args) {
BallGame ballGame = new BallGame();
ballGame.launchFrame();
}
}
如图所示:
执行结果如图所示:
9.实现小球沿着任意角度飞行:此时小球的运动方向不能再单纯的使用 right 来表示,需 要一个表示角度的变量 degree,小球坐标的改变也要依据这个角度。
代码如下:
package com.txw;
import javax.swing.*;
import java.awt.*;
/**
* 桌球游戏
* @author Adair
* @qq:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class BallGame extends JFrame {
// 添加小球和桌面图片的路径
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 graphics){
System.out.println("窗口被画了一次!");
graphics.drawImage(desk,0,0,null);
graphics.drawImage(ball, (int)x, (int)y, null);
// 根据角度degree改变小球坐标
x = x + 10 * Math.cos(degree);
y = y + 10 * Math.sin(degree);
// 边界检测:碰到上下边界
// 500 是窗口高度;40是桌子边框,30是球直径;最后一个40是标题栏的高度
if (y > 500 - 40 - 30 || y < 40 + 40){
degree = - degree;
}
//边界检测:碰到左右边界 //856是窗口宽度,40是桌子边框的宽度,30是小球的直径
if(x < 40 || x > 856 - 40 - 30){
degree = 3.14 - degree;
}
}
// 窗口加载
void launchFrame() {
setTitle("桌球游戏");
setSize(300,300);
setLocation(400,400);
setVisible(true);
// 重画窗口,每秒画25次
while (true){
repaint(); // 调用repaint方法,窗口即可重画
try {
Thread.sleep(40); // 40ms, 1秒=1000毫秒. 大约一秒画25次窗口
} catch (Exception e){
e.printStackTrace();
}
}
}
// main 方法是程序执行的入口
public static void main(String[] args) {
BallGame ballGame = new BallGame();
ballGame.launchFrame();
}
}
如图所示:
执行结果如图所示: