我正处于为计算机科学课打造Pacman游戏的最后阶段。除了一个关键的东西,我的游戏应该起到应有的作用。这是不稳定的。我知道为什么它起伏不定但我不知道如何解决它。我的问题是,我与Pacman和Ghost的Coords乘以21和阵列(下图)相乘。而且我有100毫秒的延迟意味着pacman每100毫秒移动21个像素,这是不平滑的。
以下是数组在重要的情况下的样子:
public int board[][] =
{{2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //1
{2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 3, 0, 2}, //2
{2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 2}, //3
{2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2}, //4
{2,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,1,0,2}, //5
{2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,2}, //6
{2,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2}, //7
{2,2,2,2,0,1,0,1,1,1,1,1,1,1,0,1,0,2,2,2,2}, //8
{0,0,0,0,0,1,0,1,0,0,-1,0,0,1,0,1,0,0,0,0,0}, //9
{5,2,2,2,2,1,1,1,0,2,2,2,0,1,1,1,2,2,2,2,6}, //10
{0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0}, //11
{2,2,2,2,0,1,0,1,1,1,2,1,1,1,0,1,0,2,2,2,2}, //12
{2,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,2}, //13
{2,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,2}, //14 - pacman on this row
{2,0,1,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,2}, //15
{2,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2}, //16
{2,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,0,2}, //17
{2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,2}, //18
{2,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,2}, //19
{2,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,2}, //20
{2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}; //21
基本上每行都是一行。董事会就是从那里得出的。例如,为了向上移动,只需检查当前位置上方的点是否清晰,是否向阵列添加一个并将其乘以21以获得新位置。
我想做的是放慢Pacman的移动速度,同时让它变得平滑。如果您需要任何其他信息,我还可以提供更多代码片段。
编辑:这里要求的是代码。我知道这可能并非全部都需要,但我不知道需要哪些部分来帮助最大化。它的评论非常充分。
这是一个指向它的链接,因为这里的char限制很长: Pastebin - Pacman
答案 0 :(得分:1)
如何绘制可能比抽象模型更重要。例如BitSets作为替代方案不会说太多。
如何实现重绘:repaint(20L, x, y, width, height)
(仅限于更改区域,能够随时间收集多个更改)?你怎么画的?改变BufferedImage
就行了。可以写入BufferedImage(获取Graphics2D),因此可以在其上绘制精灵。
Choppy也可能源于setDoubleBuffered(true)
的缺失使用。顺便说一句,每秒50帧将重新绘制(20L)。
您可能有一个定时器循环来为模型设置动画,并查看事件线程中绘制的组件 - 比如整个或21x21 BufferedImages,以及一些用于更改视图的信号量。这些信号量可能是一个瓶颈,21x21组件可能更精细。
收到代码后: 重新设计会更好,但可能不实用。
应该在paintComponent外部创建 Font
和Color
,特别是字体很慢。
风格:if (up == true)
应该只是if (up)
;类名通常以大写字母开头:Draw
。
getResource和getResourceAsStream都在类路径上搜索,而不是Windows反斜杠需要斜杠。 (类路径可以在jar中。)字体也可以同样加载。
sound.open(AudioSystem.getAudioInputStream(
getClass().getResourceAsStream("Sounds/pac_chomp.wav")));
声音管理似乎有点简单,应该像全局一样保持全局,因此运行循环似乎更“asynchrone”,只需调用start,而不加载。
不是那么重要,但是:
for (int r = 0; r < board.length; r++) {
System.arraycopy(newboard[r], 0, board[r], 0, board[r].length);
// Replaces:
//for (int c = 0; c < board[0].length; c++) {
// board[r][c] = newboard[r][c];
//}
}
更聪明的是交换别名:
int[][] physicalBoard0 = new int[21][21];
int[][] physicalBoard1 = new int[21][21];
boolean boardIs0 = true;
int[][] board = physicalBoard0;
int[][] newboard = physicalBoard1;
private void swapBoards() {
boardIs0 = !boardIs0;
if (boardIs0) {
board = physicalBoard0;
newBoard = physicalBoard1;
} else {
board = physicalBoard1;
newBoard = physicalBoard0;
}
}