Aller au contenu
ZeAmateis

[Astuce] Changer le curseur de la souris

Recommended Posts

Changer le curseur de la souris



88x31.png
Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé .
Tout partage implique que vous citiez l'auteur original.




-[iNTRODUCTION]-
Nous allons voir comment changer le curseur de la souris

-[PRES-REQUIS]-
1]La base d'un mod Forge ou un MCP Vanilla

-[sOMMAIRE]-
1]La fonction
2] Appeler la fonction
3]Pourquoi une rotation ?
4] La classe complète et le rendu final





1]La fonction

1.1] Creation

La première chose à faire est d'ajouter une fonction qui s'occupera de contenir notre code

private void setCursor(String modid, String path, int width, int height, double rotation)
{
}

Hormis le premier, tous les paramètres concerne l'image à appliquer, les nom sembles explicites, je ne pense pas qu'il soit utile de détailler.


1.2]Remplissage

Commencez par instancier un transform que vous utiliserez plus tard pour la rotation de l'image.

AffineTransform transform = new AffineTransform();

Comme à chaque fois qu'on accède à un fichier ou qu'on affiche quelque chose, il y a des chances que ça plante, ajoutez donc un bloc try-catch pour éviter que le jeu crash si cela arrive.

try{
}
catch (LWJGLException e) { // Catch les exceptions liées aux changements appliqués à l'image
  e.printStackTrace();
}
catch (IOException e) { // Catch les exceptions liées à la lecture du fichier
  e.printStackTrace();
}

A l'intérieur de celui-ci, récupérez l'image est stockez la dans une variable

BufferedImage cursorTexture = ImageIO.read(getClass().getResource("/assets/" + modid + path));

Ajoutez également un traitement pour changer les sens de l'image et préparer l'affichage de la texture

//Change la valeur de rotation du transform que vous appliquerez plus tard, le paramètre 'rotation' est un radian.
transform.rotate(rotation, cursorTexture.getWidth()/2, cursorTexture.getHeight()/2);

AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
cursorTexture = op.filter(cursorTexture, null);

//Creation d'un tableau d'int de la taille de la texture, il est utilisé pour créer un buffer.
int[] rgbs = new int[cursorTexture.getWidth() * cursorTexture.getHeight()];

//Creation d'un buffer, il sera utilisé plus tard lors de la création du curseur. 
IntBuffer buffer = IntBuffer.wrap(cursorTexture.getRGB(0, 0, cursorTexture.getWidth(), cursorTexture.getHeight(), rgbs, 0, cursorTexture.getHeight()));     
//Permet la lecture et l'application du curseur.
buffer.rewind();

Finissez par créer le curseur et changer celui par défaut

//Enregistre les informations créées précédemment dans une variable de type 'Cursor'
Cursor newCursor = new Cursor(cursorWidth, cursorHeight, xHotspot, yHotspot, 1, buffer, null); //32x32 semble correct

//xHotspot doit être compris entre 0 (inclus) et la largeur du curseur (exclue), par défaut : 1
//yHotspot doit être compris entre 0 (inclus) et la hauteur du curseur (exclue), par défaut : cursorTexture.getHeight() - 1

//Change le curseur par défaut.
Mouse.setNativeCursor(newCursor);



2]Appeler la fonction

Dans l'exemple qui va suivre j'ai fait en sorte d'afficher l'épée en diamants comme nouveau curseur (en loccurrence la texture est en 16x)

Vous pouvez appeler la fonction dans la fonction init() du ClientProxy si vous utilisez Forge ou après l'init du Display de la fonction startGame dans la classe principale de Minecraft.

this.setCursor("minecraft", "/textures/items/diamond_sword.png", 16, 16, 3.1415926536);


3] Mais pourquoi une rotation ?

1 est la texture de base de l'itemmais le curseur devrait être dans le sens de 2, or, si on applique l'image sans modification, le curseur ressemblera à 3
0.png

Il faut donc ajouter un angle de180° converti enradian, soit3.1415926536, je vous conseil le siterapidtables.com(en anglais)pour la convertion.

Libre à vous de jouer avec les point de clic X/Y (x et yHotspot) ainsi que la rotation de la texture pour avoir un curseur dans le sens que vous voulez !



4]La classe complète et le rendu en jeu

4.1] La classe

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.IntBuffer;

import javax.imageio.ImageIO;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Cursor;
import org.lwjgl.input.Mouse;

import fr.zeamateis.tuto_ic.common.proxy.CommonProxy;

public class ClientProxy extends CommonProxy
{
  @Override
    public void init()
    {
        registerRender();
    }

    private void registerRender()
    {
        this.setCursor("minecraft", "/textures/items/diamond_sword.png", 16, 16, 3.1415926536);
    }

    private void setCursor(String modid, String path, int width, int height, double rotation)
  { 
        AffineTransform transform = new AffineTransform();

        try
        {
            BufferedImage cursorTexture = ImageIO.read(getClass().getResource("/assets/" + modid + path));
          transform.rotate(rotation, cursorTexture.getWidth()/2, cursorTexture.getHeight()/2);
 
          AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
          cursorTexture = op.filter(cursorTexture, null);

        int[] rgbs = new int[cursorTexture.getWidth() * cursorTexture.getHeight()];
   
        IntBuffer buffer = IntBuffer.wrap(cursorTexture.getRGB(0, 0, cursorTexture.getWidth(), cursorTexture.getHeight(), rgbs, 0, cursorTexture.getHeight()));     
  
        buffer.rewind();
   
        Cursor newCursor = new Cursor(width, height, 1, cursorTexture.getHeight() - 1, 1, buffer, null);
        Mouse.setNativeCursor(newCursor);
        }
        catch (LWJGLException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.2]Le rendu

1.png


Tutoriel inspiré de MinecraftForgeFrance et réédité par Dren

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Encore un tuto Forge ! Il est en forme le bonhomme ! C'est plutôt une bonne chose, on en manque.

Bien rédigé, complet, parfaitement bien expliqué, continue comme ça, tu assures ! :D

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×