Спрайт Движение / Анимация - PullRequest
0 голосов
/ 02 февраля 2012

Сейчас у меня довольно много времени (промедление, zzz), поэтому буду очень признателен за любую помощь!

В настоящий момент у меня есть проект, который включает создание 2D-RPG с топ-мерной размерностью, он не должен быть большим, просто небольшое представление общих элементов RPG.

Хотя я не очень далеко, у меня есть цели и сроки, чтобы встретиться, поэтому в настоящее время я работаю со спрайтами и анимацией.

Во-первых, моя игра построена на системе 2D-массивов, что мне показалось довольно разумным в нисходящей RPG. В любом случае, я нашел подходящий класс Sprite для использования в Интернете, и в своей игре я пытаюсь сделать две вещи анимированными / работающими. Мой главный герой и огненный шар. Огненный шар - это, по сути, его заклинание. По моему мнению, я хочу видеть, когда я нажимаю кнопку на своей клавиатуре, огненный шар должен «появляться» или вытягиваться в месте расположения персонажа (это все, что у меня есть до сих пор D: смеется), а затем продолжайте идти прямо в направлении, в котором стоит персонаж.

Итак, это для огненного шара. Что касается главного героя, у меня есть в общей сложности восемь изображений, причем анимация ходьбы каждого направления представлена ​​двумя изображениями. Это все в одном изображении (spritesheet), которое я импортировал в свой проект и смог отделить с помощью getSubimage () от BufferedImage.

Дело в том, что я застрял здесь. Я не уверен, каким образом я должен заставить огненный шар начинать прямо в направлении, в котором находится персонаж (я предполагаю, что это как-то связано со скоростью, но я также немного невежественен в плаваниях). в дюймы для простоты LOL).

В том же отношении я не уверен, как мне следует плавно воспроизводить символы для двух изображений, предназначенных для анимации ходьбы при каждом нажатии клавиши со стрелкой ВВЕРХ.

Просто не разбираюсь в анимации! Я прочитал почти все, но я все еще в замешательстве и стрессе из-за крайнего срока (ОЧЕНЬ скоро, если вы понимаете, о чем я).

Я выложу часть своего кода, не уверен, что вам, ребята, понадобится больше, но я готов!

Еще раз, я очень ценю любую помощь, которую я получаю, большое спасибо!

p.s. Я новичок, так что мой код должен быть очень запутанным для большинства, но я полагаю, что это придет со временем

ArrayList<TreeMonster> treeMonsters = new ArrayList<TreeMonster>();
ArrayList<Fireball> qProjectiles = new ArrayList<Fireball>();
private Timer timer;

private void toggleKey(int keyCode, boolean pressed){
if (keyCode == KeyEvent.VK_Q){
        qProjectiles.add(new Fireball(vlad.getXLoc(), vlad.getYLoc(), vlad.getDirection(), vlad.getLevel()*10));
    }
}

// Entities are spawned on the map
public void spawnOnMap(Matter[][] map){

    map[1][1] = new Matter(1, 1, 1);
    vlad.moveTo(1,1);
    map[4][4] = new Matter(3, 4, 4);
    treeMonsters.add(new TreeMonster(4, 4));
    map[4][7] = new Matter(3, 4, 7);
    treeMonsters.add(new TreeMonster(4, 7));
    map[8][2] = new Matter(3, 8, 2);
    treeMonsters.add(new TreeMonster(8, 2));
    map[8][8] = new Matter(3, 8, 8);
    treeMonsters.add(new TreeMonster(8, 8));
    map[12][3] = new Matter(3, 12, 3);
    treeMonsters.add(new TreeMonster(12, 3));
    map[12][9] = new Matter(3, 12, 9);
    treeMonsters.add(new TreeMonster(12, 9));
    map[14][6] = new Matter(3, 14, 6);
    treeMonsters.add(new TreeMonster(14, 6));
    map[16][10] = new Matter(3, 16, 10);
    treeMonsters.add(new TreeMonster(16, 10));
    map[19][5] = new Matter(3, 19, 5);
    treeMonsters.add(new TreeMonster(19, 5));
    map[2][1] = new Matter(2, 2, 1);
    npcOne.moveTo(2, 1);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    while (vlad.living()){

        Graphics g2d = (Graphics2D)g;
        g2d.drawImage(desertMap,0,0,this);
        for (int i = 0; i < treeMonsters.size(); i++){
            g2d.drawImage(treeMonsters.get(i).tree, treeMonsters.get(i).getXLoc()*64, treeMonsters.get(i).getYLoc()*64, this);
        }

        for (int i = 0; i < qProjectiles.size(); i++){
            g2d.drawImage(qProjectiles.get(i).fBallSprite.getImage(), qProjectiles.get(i).xLoc()*64, qProjectiles.get(i).yLoc()*64, this);
            if (vlad.getDirection() == 0){
                qProjectiles.get(i).fBallSprite.setVelocityY(0.2f);
            }   
            if (vlad.getDirection() == 1){
                qProjectiles.get(i).fBallSprite.setVelocityY(-0.2f);
            }

            if (vlad.getDirection() == 2){
                qProjectiles.get(i).fBallSprite.setVelocityX(-0.2f);
            }

            if (vlad.getDirection() == 3){
                qProjectiles.get(i).fBallSprite.setVelocityX(0.2f);
            }
        }

        if (vlad.disableFirst){
            g2d.drawImage(vlad.getDirectionImage(), vlad.getXLoc()*64, vlad.getYLoc()*64, this);
        }
        else{
            if (vlad.getDirection() == 0){
                vlad.upWalk.update(System.currentTimeMillis());
                g2d.drawImage(vlad.upWalk.sprite, vlad.getXLoc()*64, vlad.getYLoc()*64, this);
            }
            else if (vlad.getDirection() == 1){
                vlad.downWalk.update(System.currentTimeMillis());
                g2d.drawImage(vlad.downWalk.sprite, vlad.getXLoc()*64, vlad.getYLoc()*64, this);
            }
            else if (vlad.getDirection() == 2) {
                vlad.leftWalk.update(System.currentTimeMillis());
                g2d.drawImage(vlad.leftWalk.sprite, vlad.getXLoc()*64, vlad.getYLoc()*64, this);
            }
            else if (vlad.getDirection() == 3){
                vlad.rightWalk.update(System.currentTimeMillis());
                g2d.drawImage(vlad.rightWalk.sprite, vlad.getXLoc()*64, vlad.getYLoc()*64, this);
            }
        }

        g2d.drawImage(npcOne.getImage(), 2*64, 1*64, this);
   }
}

Ответы [ 2 ]

0 голосов
/ 22 мая 2012

Мое первое впечатление - без запуска кода то, что вам нужно будет настроить игровой цикл --outside- paintComponent. paintComponent должен содержать ТОЛЬКО код, необходимый для рендеринга, и ничего больше. Поэтому вам нужно структурировать свой код, чтобы иметь лучший игровой цикл. Да, вы делаете все внутри, пока (vladLives) вы попали в paintComponent. Прочитайте некоторые учебные пособия в разделе «Как настроить игровой цикл Java», чтобы лучше понять.

http://www.java -gaming.org / index.php / тема, 24220,0

Выше было бы хорошее начало. По сути, мой совет для вас - создать класс под названием Main. Это будет точка входа в ваши игры и будет содержать 'public static void main .... "Кодируйте gameLoop внутри этого класса и вызывайте ваш класс анимации для перемещения ваших фигур.

Хотелось бы, чтобы у меня было больше времени, чтобы быть кристально чистым. Важно, чтобы у вас было несколько вещей. Вам нужен таймер, и вы хотите вызывать функцию рендеринга один раз для каждого таймера. Но держите всю игровую логику вне paintComponent. В идеале, держать все это в основном.

Опять же, извините, я не могу дать вам полный пример на данный момент, но возьмите то, что я сказал, и изучите пример кода в этом руководстве, и он должен стать кристально понятным для вас.

0 голосов
/ 02 февраля 2012

Вот небольшой псевдо:

if(walking north button pressed) {
    play walkNorth animation;
    direction = "north";
} else if(walking east button pressed) {
    play walkEast animation;
    direction = "east";
} else if(walking south button pressed) {
    play walkSouth animation;
    direction = "south";
} else if(walking west button pressed) {
    play walkWest animation;
    direction = "west";
}

Я не знаю, настроено ли у вас движение персонажа, как это, но важно следить за направлением лица, основываясь на последнем перемещенном направлении.(просто и больше else if s для диагоналей. Теперь, когда у вас есть направление, вы можете создать огненный шар следующим образом:

instantiate fireball;
fireball's x = player's x;
fireball's y = player's y;
send direction to fireball instance;

Затем вы захотите, чтобы это выполнялось каждый кадр:

if(this.direction=="north") {
    this.y -= speed;
} else if(this.direction=="east") {
    this.x += speed;
} else if(this.direction=="south") {
    this.y += speed;
} else if(this.direction=="west") {
    this.x -= speed;
}

Примечание. Предполагается, что x увеличивается влево, а y увеличивается вниз.

...