Java 从阵列进行移动时制作平滑动画
我正在为计算机科学课制作一个吃豆人游戏的最后阶段。我的游戏功能正常,除了一个关键点。波涛汹涌。我知道它起伏不定的原因,但我不知道如何修复它。我的问题是,我在和数组(下图)中乘以21,表示吃豆人和幽灵的坐标。我有一个100毫秒的延迟意味着pacman每100毫秒移动21个像素,这是不平滑的 以下是阵列在重要情况下的外观:Java 从阵列进行移动时制作平滑动画,java,Java,我正在为计算机科学课制作一个吃豆人游戏的最后阶段。我的游戏功能正常,除了一个关键点。波涛汹涌。我知道它起伏不定的原因,但我不知道如何修复它。我的问题是,我在和数组(下图)中乘以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}
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
基本上每行都是一行。董事会就是从中抽取的。例如,对于向上移动,只需检查当前位置上方的点是否清晰,如果是,则将1添加到阵列中,并将其乘以21即可获得新位置
我想做的是减慢Pacman的移动速度,同时使其平滑。如果您需要任何其他信息,我也可以提供更多的代码片段
编辑:根据要求,这里是代码。我知道这可能不是所有需要的,但我不知道需要哪些部分才能发挥最大的作用。而且它的评论相当充分
这里有一个链接,因为这里的字符限制太长了:
如何绘制可能比抽象模型更重要。例如,作为替代方案的位集不会说太多 如何重新绘制:
重新绘制(20L,x,y,宽度,高度)
(仅限于更改区域,能够随时间收集多个更改)?你怎么画?更改buffereImage
就可以了。BuffereImage可以写入(获取图形2D),因此可以在其上绘制精灵
斩波还可能源于缺少使用setDoubleBuffered(true)
。顺便说一下,每秒50帧将是一个重绘(20L)
您可能有一个计时器循环来设置模型的动画,以及在事件线程中绘制的视图组件(如一个完整的或21x21 BuffereImage),以及一些用于更改视图的信号量。这些信号量可能是一个瓶颈,21x21组件可能更细粒度
收到代码后: 重新设计会更好,但可能不实用
Font
s和Color
s应在paintComponent外部创建,尤其是字体速度较慢。
样式:if(up==true)
应该是if(up)
;类名通常以大写开头:Draw
getResource和getResourceAsStream在类路径上搜索,而不是Windows反斜杠都需要斜杠。(类路径可以在jar中)字体也可以加载
sound.open(AudioSystem.getAudioInputStream(
getClass().getResourceAsStream("Sounds/pac_chomp.wav")));
声音管理似乎有点简单,可能应该像字体一样在全局范围内进行,因此运行循环似乎更“异步”,只需调用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];
//}
}
我一点也不像你说的那么先进。从run方法中,我调用其他方法来检查前面的点是否清晰。如果它根据按下的方向加或减。现在只需将这些阵列点乘以21即可。在run方法的末尾,所有内容都被重新绘制。因此,大约每100毫秒它就会被重新绘制,因此pacman和鬼魂会在4个方向中的一个方向上移动21个像素。你能把图像压缩并通过电子邮件发送给我吗?yahoo dot de的joop_eggen。我已经向你发送了包含所有内容的电子邮件。我知道代码效率不高,需要重新设计,但我只上了11年级的计算机科学课程,这只是我在CS的第一个学期,因此我的技能水平仍然很低。我试图发送电子邮件,但显然你没有yahoo.de帐户。我猜你给我发错电子邮件了?我确实有这样一个帐户。也许你用负号而不是下划线犯了错误?也许文件太大了(?)?我不确定这是否相关,但只制作一个包含“行”的文件然后从中读取会容易得多。另外,发布一些代码。
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;
}
}