Programmation de jeux Java 2D-Animations SpriteSheet


Je travaille actuellement sur un petit jeu Java 2D et je viens de terminer de corriger les bugs/erreurs, etc. que j'ai obtenu en suivant les tutoriels YouTube de CodeNMore.

Avec tout dans mon jeu à jour avec le sien, j'ai travaillé sur l'expansion de mon jeu. J'ai donc créé un sprite pour un personnage qui fait face dans des directions différentes. Malheureusement, je n'ai même pas la moindre idée de la façon dont je devrais afficher les images.

Pour expliquer plus en détail, CodeNMore utilise cette ligne de code: [À Partir De La SpriteSheet.java]

public BufferedImage crop(int col, int row, int w, int h){
        return sheet.getSubimage(col * 16, row * 16, w, h);
}

Le problème que j'ai est que je n'ai aucune idée de la façon d'animer/changer le sprite des caractères sur la feuille de spritesheet chaque fois qu'ils se déplacent dans une certaine direction.

C'est-à-dire que si le joueur fait face à droite, j'ai besoin de l'image (qui est ,par défaut, dans la colonne 0, ligne 0) pour passer à la colonne 1, ligne 3.

Et une fois cela terminé, je dois trouver comment animer le joueur. (ce qui, espérons-le, devrait tout comprendre par m').

Tout ce que vous devez voir peut être téléchargé à partir de ce mediafire:

Http://www.mediafire.com/download/dfdkudun91wdup5/tile_rpg_part_20.zip

Ce sont les fichiers exacts sur lesquels CodeNMore a travaillé, juste avec ma feuille de spritesheet dans le / res.

Author: Kultid_Games, 2014-08-06

1 answers

Voici la classe d'animation que j'utilise

import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class Animation {
private int speed;
private int frames;

private int index = 0;
private int count = 0;

private BufferedImage[] images;
private BufferedImage currentImg;

public Animation(int speed, BufferedImage... args){
    this.speed = speed;
    images = new BufferedImage[args.length];
    for(int i = 0; i < args.length; i ++){
        images[i] = args[i];
    }
    frames = args.length;
}

public Animation(int speed, boolean flip, BufferedImage... args) {
    if (flip) {
        this.speed = speed;
        images = new BufferedImage[(args.length * 2) - 2];
        for (int i = 0; i < args.length; i++) {
            images[i] = args[i];
        }
        BufferedImage[] temp = new BufferedImage[args.length - 2];
        for (int i = args.length - 2; i > 0; i--) {
            temp[args.length - i - 2] = images[i];
        }
        for (int i = args.length; i < images.length; i++) {
            images[i] = temp[i - args.length];
        }
        frames = images.length;
    }else{
        this.speed = speed;
        images = new BufferedImage[args.length];
        for (int i = 0; i < args.length; i++) {
            images[i] = args[i];
        }
        frames = args.length;
    }
}

public void runAnimation(){
    index ++;
    if(index > speed){
        index = 0;
        nextFrame();
    }
}

private void nextFrame(){
    for(int i = 0; i < frames; i ++){
        if(count == i)
            currentImg = images[i];
    }

    count ++;

    if(count >= frames)
        count = 0;
}

public void drawAnimation(Graphics g, int x, int y, int scaleX, int scaleY){
    g.drawImage(currentImg, x, y, scaleX, scaleY, null);
}
}

Pour l'utiliser, créez simplement une instance de cette classe pour chaque boucle d'images et dans le paramètre speed, donnez-lui le nombre de ticks entre chaque image et les images dans les args. Ensuite, dans votre méthode tick (ou avec quoi que vous cochez votre objet), appelez l'animation run et dans votre méthode de rendu, appelez la méthode drawAnimation lorsque vous souhaitez rendre l'animation. Si vous ajoutez le paramètre flip comme true, il inversera automatiquement votre séquence de des images par exemple. Vous lui donnez Img1, Img2, Img3, Img4, Img5. il le traitera comme Img1, Img2, Img3, Img4, Img5, Img4, Img3, Img2.

 1
Author: ModDL, 2014-08-06 04:34:28