Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从阵列进行移动时制作平滑动画_Java - Fatal编程技术网

Java 从阵列进行移动时制作平滑动画

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}

我正在为计算机科学课制作一个吃豆人游戏的最后阶段。我的游戏功能正常,除了一个关键点。波涛汹涌。我知道它起伏不定的原因,但我不知道如何修复它。我的问题是,我在和数组(下图)中乘以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
基本上每行都是一行。董事会就是从中抽取的。例如,对于向上移动,只需检查当前位置上方的点是否清晰,如果是,则将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;
    }
}