【Java专题】示例:小球移动

示例:模拟台球在台球桌上移动。

这一版是通过分别定义x轴y轴方向和速度来计算小球坐标。也可以只定义角度和总速度,通过三角函数来计算小球坐标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.awt.*;
import javax.swing.*;

public class BallGame extends JFrame {
Image desk = Toolkit.getDefaultToolkit().getImage("src/main/resources/desk.png");
Image ball = Toolkit.getDefaultToolkit().getImage("src/main/resources/ball.png");

double fixHeight = 30; // mac系统修正窗口顶部的高度
double ballR = 18; // 小球直径
double mx = 600; // 窗口宽度
double my = 300; // 窗口高度
double x = 100; // 小球x坐标
double y = 100; // 小球y坐标
double dx = 0.8; // 小球x方向偏移量
double dy = 0.8; // 小球y方向偏移量
double gap = 38; // 窗口边框大小
boolean isRight = true; // 小球x方向偏移方向
boolean isTop = true; // 小球y方向偏移方向

void launchFrame() {
setTitle("Ball Game");
setSize((int) mx, (int) my);
setLocation(200, 100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

while (true) {
try {
Thread.sleep(16); // 大约60帧每秒
repaint();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}

public void paint(Graphics g) {
System.out.println("窗口绘制了一次");
g.drawImage(desk, 0, (int) fixHeight, null);
g.drawImage(ball, (int)x, (int)y, null);

if (isRight) {
x += dx;
} else {
x -= dx;
}
if (isTop) {
y += dy;
} else {
y -= dy;
}

if (x > (mx - gap - ballR)) {
isRight = false;
} else if (x <= gap) {
isRight = true;
}

if (y > (my - gap - ballR + fixHeight)) {
isTop = false;
} else if (y <= (gap + fixHeight)) {
isTop = true;
}
}

public static void main(String[] args) {
System.out.println("我的第一个java小游戏开始了!");
BallGame bg = new BallGame();
bg.launchFrame();
}
}

/images/java/ball.png


/images/java/desk.png


/images/java/java-03.png