移动来自阵列时制作平滑动画

时间:2011-12-27 01:50:51

标签: java

我正处于为计算机科学课打造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

1 个答案:

答案 0 :(得分:1)

如何绘制可能比抽象模型更重要。例如BitSets作为替代方案不会说太多。

如何实现重绘:repaint(20L, x, y, width, height)(仅限于更改区域,能够随时间收集多个更改)?你怎么画的?改变BufferedImage就行了。可以写入BufferedImage(获取Graphics2D),因此可以在其上绘制精灵。

Choppy也可能源于setDoubleBuffered(true)的缺失使用。顺便说一句,每秒50帧将重新绘制(20L)。

您可能有一个定时器循环来为模型设置动画,并查看事件线程中绘制的组件 - 比如整个或21x21 BufferedImages,以及一些用于更改视图的信号量。这些信号量可能是一个瓶颈,21x21组件可能更精细。


收到代码后: 重新设计会更好,但可能不实用。

应该在paintComponent外部创建

FontColor,特别是字体很慢。 风格: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;
    }
}