2011-12-27 5 views
0

Я нахожусь на заключительной стадии создания игры Pacman для класса Computer Science. Моя игра функционирует так, как должна, за исключением одной ключевой вещи. Это изменчиво. Я знаю причину, почему она изменчивая, но я не знаю, как ее исправить. Моя проблема в том, что я умножаюсь на 21 из и массива (ниже) для Pacman's и Ghost's Coords. И у меня есть отсрочка 100 мс, означающая, что pacman перемещает 21 пиксель каждые 100 мс, что не является гладким.Создание гладкой анимации при движении из массива

Вот что массив выглядит как в случае, если это имеет значение:

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 и в то же время сделать ее гладкой. Если вам нужна другая информация, я могу предоставить еще несколько фрагментов кода.

Редактировать: В соответствии с запросом приведен код. Я знаю, что это, вероятно, не все нужно, но я не знал, какие части будут необходимы, чтобы помочь в полной мере. И это в значительной степени полностью прокомментировано.

Вот ссылка на него, так как это долго для предела полукокса здесь: Pastebin - Pacman

+0

Я не уверен, если это уместно, но это было бы намного легче просто создайте файл, содержащий «строки», а затем прочитайте его. Кроме того, разместите код. – Jimmt

+0

Добавлен код. Надеюсь, это поможет! – ComputerLocus

ответ

1

Как втягивается, вероятно, более важным, чем абстрактная модель. Например, BitSets как альтернатива не будет говорить много.

Как вы осуществляете перерисовку: repaint(20L, x, y, width, height) (ограниченное изменение области, возможность сбора нескольких изменений с течением времени)? Как вы рисуете? Изменено значение BufferedImage. BufferedImage можно записать (получить Graphics2D), поэтому он может рисовать спрайты.

Choppy также может возникнуть из-за отсутствия использования setDoubleBuffered(true). Кстати, 50 кадров в секунду будут перекрашивать (20L).

Возможно, у вас есть таймер, чтобы анимировать модель и просмотреть компоненты (-ы), нарисованные в потоке событий, как один цельный или 21x21 BufferedImages, и некоторые семафоры для изменения вида. Эти семафоры могут быть узким местом, а компоненты 21x21 могут быть более мелкозернистыми.


После получения кода: Редизайн было бы лучше, но, вероятно, не прагматично.

Font s и Color s должно быть создано за пределами paintComponent, особенно шрифты медленные. Стиль: if (up == true) должно быть просто if (up); имена классов обычно начинаются с капитала: Draw.

Оба метода getResource и getResourceAsStream в пути к классу, и вместо обратного слэша Windows требуется косая черта. (Путь класса может находиться внутри банки.) Шрифты могут быть загружены аналогичным образом.

  sound.open(AudioSystem.getAudioInputStream(
       getClass().getResourceAsStream("Sounds/pac_chomp.wav"))); 

управления Звуком кажется немного простым, следует, вероятно, состоятся в глобальном масштабе, как шрифты, так вводный цикл кажется более «asynchrone», просто вызывая старт, без нагрузки.

Не так важно, но:

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; 
    } 
} 
+0

Я совсем не такой развитый, как ваш разговор. Из метода запуска я вызываю другие методы, чтобы проверить, ясно ли место впереди. Если он добавляет или вычитает в зависимости от того, какой путь был нажат. Сейчас это так же просто, как умножение этих точек массива на 21. И в конце метода запуска все перекрашено. Поэтому примерно каждые 100 мс он перекрашивается снова, и поэтому пакман и призраки затем перемещаются на 21 пиксель в одном из четырех направлений. – ComputerLocus

+0

Я добавил код, если это поможет вам. – ComputerLocus

+0

Не могли бы вы почерпнуть и отправить мне по электронной почте изображения? joop_eggen на yahoo dot de. –

Смежные вопросы