Description

Cette librairie vous permet de dessiner facilement sur une fenêtre graphique. Vous pouvez télécharger la dernière version ici :

  fungraphics-v1.5.4.jar (68,9 KiB, 2 149 hits)

Installation

Les étapes suivantes doivent être réalisées avant de pouvoir exécuter les programmes d’exemple ci-dessous:

  1. Une fois téléchargé, copier le fichier fungraphics_<version>.jar dans le dossier racine de votre projet (au même niveau que le dossier « src » et « bin »).
  2. Dans Eclipse, sélectionner le dossier du projet, puis appuyer sur F5 (ou File->Refresh) pour rendre visible le fichier ajouté.
  3. Bouton droite sur le fichier fungraphics_<version>.jar, puis sélectionner Build Path->Add to Build Path.

Documentation

Vous pouvez accéder à la documentation électronique (la Javadoc) ici : FunGraphics Javadoc.

Un exemple simple

Vous trouverez de nombreux exemples dans le répertoire hevs.samples de l’archive jar. Pour information, une manière très simple de créer une fenêtre est de suivre le code suivant :

import hevs.graphics.FunGraphics;

import java.awt.Color;

/**
 * Draws a simple circle on the screen
 * @author Pierre-André Mudry
 */
public class SimpleShapes {

  public static void main(String[] args) {
    // Instantiate a new window
    FunGraphics s = new FunGraphics(300, 300, "Test drawing simple shapes");
    
    // Draw simple shapes
    s.setColor(Color.black);
    s.drawCircle(100, 100, 10);
    s.setColor(Color.blue);
    s.drawFillRect(20, 20, 10, 10);
  }
}

Liaison avec les touches

Si vous désirez réaliser une application graphique qui réagisse à l’appui de touches comme la barre d’espacement ou les flèches de direction, vous pouvez suivre l’exemple suivant :

import hevs.graphics.FunGraphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * This class demonstrate how to implement keyboard events
*  using the FunGraphics library.
 */
public class Demo {

  int offset = 0;

  FunGraphics funGraphics;

  public Demo() {
    // Inits the graphic window
    funGraphics = new FunGraphics(640, 480);

    // Do something when a key has been pressed
    funGraphics.setKeyManager(new KeyAdapter() {

      // Will be called when a key has been pressed
      public void keyPressed(KeyEvent e) {
        if(e.getKeyChar() == 'a'){
          System.out.println("a pressed");
        }

        if(e.getKeyCode() == KeyEvent.VK_RIGHT){
          offset++;
        }
      }
    });

    while(true)
    {
      funGraphics.clear();

      //draw our object
      funGraphics.drawRect(50+offset*2, 50+offset*2, 75, 75);

      //refresh the screen at 60 FPS
      funGraphics.syncGameLogic(60);
    }
  }

  public static void main(String[] args) {
    Demo d = new Demo();
  }
}

Liaison avec la souris

Si vous désirez réaliser une application graphique qui réagisse à l’appui de touches comme la barre d’espacement ou les flèches de direction, vous pouvez suivre l’exemple suivant :

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import hevs.graphics.FunGraphics;

public class MouseDemo {
  FunGraphics fg = new FunGraphics(300, 300);

  MouseDemo(){
    fg.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        super.mouseClicked(e);
        MouseEvent event = e;
        int posx = event.getX();
        int posy = event.getY();
        
        // We have to give an offset here because the position
        // returned under Windows contains the borders as well
        fg.drawFilledCircle(posx-10, posy - 35, 5);
      }
    });
  }
  
  public static void main(String[] args) {
    new MouseDemo();
  }
}

Eviter le clignotement

Si vous avez une animation dans votre jeu, il est possible que votre affichage clignote un peu. Pour éviter ce souci (que je ne peux pas expliquer simplement malheureusement), il faut rajouter dans votre boucle d’affichage le code suivant qui utilise synchronized :

while (true) {
      // Rendering (note the synchronized)
      synchronized (fg.frontBuffer) {
        fg.clear(Color.white);
        
        // Do your drawing in there
        fg.draw...
      }

      /**
       * Pause for constant frame rate Note how with the rendering thread the method			 
       **/
      fg.syncGameLogic(60);
}

Afficher une image, exemple complet

Il est très facile d’ajouter des images à différents formats (par exemple JPG ou PNG) à l’aide du code suivant. Merci de noter que votre image doit impérativement se trouver dans le dossier SRC et pas ailleurs (le chemin pour instancier le GraphicsBitmap est relatif au dossier SRC).

public class ImageAnimation {

  static void gameloopSample() {
    FunGraphics fg = new FunGraphics(300, 300, "With thread", true);
    GraphicsBitmap bm = new GraphicsBitmap("/mandrill.jpg");

    double angle = 0.1;
    double scale = 0.25;
    double offset = 0.01;

    while (true) {
      // Rendering (note the synchronized)
      synchronized (fg.frontBuffer) {
        fg.clear(Color.white);
        int x = fg.getFrameWidth()/2;
        int y = fg.getFrameHeight()/2-25;
        
        // Coordinates X and Y are where to draw the center of the image
        fg.drawTransformedPicture(x,y, angle, scale, bm);
      }

      /**
       * Pause for constant frame rate Note how with the rendering thread the method
       * render() should not be called explicitly
       **/
      fg.syncGameLogic(60);

      // Logic
      angle += offset;
      if (angle > Math.PI / 4 || angle <= -Math.PI / 4) {
        offset *= -1;
      }
    }
  }

  public static void main(String[] args) {
    gameloopSample();
  }
}

Jouer de la musique

Pour player des sons, vous pouvez utiliser la méthode suivante qui permet d’accéder à des fichier WAV uniquement.

import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class AudioPlayer {
  public Clip audioClip;

  AudioPlayer(String path) {
    try {
      // Create audio input
          URL url = this.getClass().getClassLoader().getResource(path);
      AudioInputStream audioStream = AudioSystem.getAudioInputStream(url);
      // Obtain clip
      audioClip = (Clip) AudioSystem.getClip();
      audioClip.open(audioStream);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  void play() {
    // Open stream and play
    try {
      if(!audioClip.isOpen())
        audioClip.open();
      audioClip.stop();
      audioClip.setMicrosecondPosition(0);
      audioClip.start();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}