Partage
  • Partager sur Facebook
  • Partager sur Twitter

Collision avec Slick

    20 septembre 2011 à 21:10:01

    Bonjour à tous, (et à toutes :D )
    Je me suis récemment lancé dan Slick, une merveilleuse bibliothèque, ( ;) ), et j'aimerais pouvoir faire une action si le curseur de la souris se trouve dans le rayon d'action d'un objet de type Image et que l'on clique dessus. :o
    Avez-vous s'il vous plaît une petite idée de l'architecture ? :D
    Merci. :)
    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2011 à 21:50:36

      Salut, en effet, Slick est une très bonne bibliothèque.
      Tu trouveras surement ton bonheur dans ce tuto.
      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2011 à 23:19:38

        J'ai déjà essayé. ^^ Par contre, je n'arrive pas avec une fonction collision de faire une sorte de image.getX(); image.getY(); avec des objets de type Image. :(
        • Partager sur Facebook
        • Partager sur Twitter
          21 septembre 2011 à 7:43:09

          Plop,
          Je te confirme, slick est capable de faire ça presque automatiquement

          dans un vieux code que je ne saurais expliquer, j'avais fais ça :

          public class ChoixPerso extends BasicGameState implements ComponentListener{
          @Override
          	public void init(GameContainer gc, StateBasedGame sb) throws SlickException {
          
          		int k = 1;
          		int  imageParLigne = 4;
          		Log.debug("eeeee");
          		for (int i = 1; i <= NOMBREPERSOS; i++){
          			perso = new Image("sprites/choixPersos/"+i+".png");
          			areas[i] = new MouseOverArea(gc, perso, (i % imageParLigne)*150 + 200, k * 150, this);
          			areas[i].setNormalColor(new Color(1,1,1,0.5f));
          			areas[i].setMouseOverColor(new Color(1,1,1,3.9f));
          			if (i % imageParLigne == 0){
          				k++;
          			}
          		}
          	}
          
          	@Override
          	public void render(GameContainer gc, StateBasedGame sb, Graphics g) throws SlickException {
          		for (int i=1;i<=NOMBREPERSOS;i++) {
          			areas[i].render(gc, g);
          		}
          	}
          
          public void componentActivated(AbstractComponent source) {
          		for (int i=1;i<=NOMBREPERSOS;i++) {
          			if (source == areas[i]) {
          				Log.debug("Perso "+(i)+" cliqué !");
          				persoChoisi=true;
          				hero.setChoix(i);
          			}
          		}
          	}
          }
          


          et en gros j'avais des minis images cliquable qui s'illuminait quand je passais la souris dessus

          (je m'étais servis du fichier exemple fournit par slick : GUITest.java, je te le copie colle au cas ou tu ne l'ai pas )

          import org.newdawn.slick.AngelCodeFont;
          import org.newdawn.slick.AppGameContainer;
          import org.newdawn.slick.BasicGame;
          import org.newdawn.slick.Color;
          import org.newdawn.slick.Font;
          import org.newdawn.slick.GameContainer;
          import org.newdawn.slick.Graphics;
          import org.newdawn.slick.Image;
          import org.newdawn.slick.Input;
          import org.newdawn.slick.SlickException;
          import org.newdawn.slick.gui.AbstractComponent;
          import org.newdawn.slick.gui.ComponentListener;
          import org.newdawn.slick.gui.MouseOverArea;
          import org.newdawn.slick.gui.TextField;
          import org.newdawn.slick.util.Log;
          
          /**
           * A test for the GUI components available in Slick. Very simple stuff
           *
           * @author kevin
           */
          public class GUITest extends BasicGame implements ComponentListener {
          	/** The image being rendered */
          	private Image image;
          	/** The areas defined */
          	private MouseOverArea[] areas = new MouseOverArea[4];
          	/** The game container */
          	private GameContainer container;
          	/** The message to display */
          	private String message = "Demo Menu System with stock images";
          	/** The text field */
          	private TextField field;
          	/** The text field */
          	private TextField field2;
          	/** The background image */
          	private Image background;
          	/** The font used to render */
          	private Font font;
          	/** The container */
          	private AppGameContainer app;
          	
          	/**
          	 * Create a new test of GUI  rendering
          	 */
          	public GUITest() {
          		super("GUI Test");
          	}
          	
          	/**
          	 * @see org.newdawn.slick.BasicGame#init(org.newdawn.slick.GameContainer)
          	 */
          	public void init(GameContainer container) throws SlickException {
          		if (container instanceof AppGameContainer) {
          			app = (AppGameContainer) container;
          			app.setIcon("testdata/icon.tga");
          		}
          		
          		font = new AngelCodeFont("testdata/demo2.fnt","testdata/demo2_00.tga");
          		field = new TextField(container, font, 150,20,500,35, new ComponentListener() {
          			public void componentActivated(AbstractComponent source) {
          				message = "Entered1: "+field.getText();
          				field2.setFocus(true);
          			}
          		});
          		field2 = new TextField(container, font, 150,70,500,35,new ComponentListener() {
          			public void componentActivated(AbstractComponent source) {
          				message = "Entered2: "+field2.getText();
          				field.setFocus(true);
          			}
          		});
          		field2.setBorderColor(Color.red);
          		
          		this.container = container;
          		
          		image = new Image("testdata/logo.tga");
          		background = new Image("testdata/dungeontiles.gif");
          		container.setMouseCursor("testdata/cursor.tga", 0, 0);
          		
          		for (int i=0;i<4;i++) {
          			areas[i] = new MouseOverArea(container, image, 300, 100 + (i*100), 200, 90, this);
          			areas[i].setNormalColor(new Color(1,1,1,0.8f));
          			areas[i].setMouseOverColor(new Color(1,1,1,0.9f));
          		}
          	}
          
          	/**
          	 * @see org.newdawn.slick.BasicGame#render(org.newdawn.slick.GameContainer, org.newdawn.slick.Graphics)
          	 */
          	public void render(GameContainer container, Graphics g) {
          		background.draw(0, 0, 800, 500);
          		
          		for (int i=0;i<4;i++) {
          			areas[i].render(container, g);
          		}
          		field.render(container, g);
          		field2.render(container, g);
          		
          		g.setFont(font);
          		g.drawString(message, 200, 550);
          	}
          
          	/**
          	 * @see org.newdawn.slick.BasicGame#update(org.newdawn.slick.GameContainer, int)
          	 */
          	public void update(GameContainer container, int delta) {
          	}
          
          	/**
          	 * @see org.newdawn.slick.BasicGame#keyPressed(int, char)
          	 */
          	public void keyPressed(int key, char c) {
          		if (key == Input.KEY_ESCAPE) {
          			System.exit(0);
          		}
          		if (key == Input.KEY_F2) {
          			app.setDefaultMouseCursor();
          		}
          		if (key == Input.KEY_F1) {
          			if (app != null) {
          				try {
          					app.setDisplayMode(640,480,false);		
          				} catch (SlickException e) {
          					Log.error(e);
          				}
          			}
          		}
          	}
          	
          	/**
          	 * Entry point to our test
          	 * 
          	 * @param argv The arguments passed to the test
          	 */
          	public static void main(String[] argv) {
          		try {
          			AppGameContainer container = new AppGameContainer(new GUITest());
          			container.setDisplayMode(800,600,false);
          			container.start();
          		} catch (SlickException e) {
          			e.printStackTrace();
          		}
          	}
          
          	/**
          	 * @see org.newdawn.slick.gui.ComponentListener#componentActivated(org.newdawn.slick.gui.AbstractComponent)
          	 */
          	public void componentActivated(AbstractComponent source) {
          		System.out.println("ACTIVL : "+source);
          		for (int i=0;i<4;i++) {
          			if (source == areas[i]) {
          				Log.debug("Option "+(i+1)+" pressed!");
          			}
          		}
          		if (source == field2) {
          		}
          	}
          }
          
          • Partager sur Facebook
          • Partager sur Twitter
            27 septembre 2011 à 22:24:47

            Essaye de te renseigner sur l'objet MouseOverArea sur la doc, moi je ne le connaissais pas.
            Sinon, la classe Image ne stocke pas sa position. Je te conseille d'utiliser un vector2f pour stocker la position d'une image. C'est une classe simple avec deux attribut x et y public.

            L'algorithme ressemblerait a sa :


            Vector2f positionImage = new Vector2f(x, y);
            Image image = new Image(chemin);
            
            // Récupère la position du curseur puis stocke le dans un autre vector.
            
            Vector2f positionSouris = new Vector2f(sourisX, sourisY);
            
            if(positionSouris.x >= positionImage.x && positionSouris.x <= positionImage.x + image.getWidht()
                && positionSouris.y >= positionImage.x && positionSouris.y <= positionImage.y + image.getHeigth()){
            
                // alors c'est dedans
            }
            



            Comme tu peux le voir, la classe Vector2f est facile a utiliser ;)
            getHeight te permet de récupérer la hauteur de l'image et getWidht la largeur.
            Si tu ne comprends pas l'algorithme, go tuto ;)
            • Partager sur Facebook
            • Partager sur Twitter

            Collision avec Slick

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown