2017-09-14 9 views
0

Voici mon code suivant:Comment ne pas laisser mon image sortir de scène

public void start(Stage primaryStage) throws Exception { 
    Pane root = new Pane(); 
    Scene scene = new Scene(root, 500, 500, Color.RED); 

    ImageView dice = new ImageView(new Image(getClass().getResourceAsStream("dice.jpeg"))); 
    dice.setX(0); 
    dice.setY(300); 
    root.getChildren().add(dice); 

    scene.setOnKeyPressed(e -> { 
     if (dice.getX() >= 0 && dice.getX() <= 500) { 
      switch (e.getCode()) { 

       case RIGHT: 
        dice.setX(dice.getX() + KEYBOARD_MOVEMENT_DELTA); 
        break; 

       case LEFT: 
        dice.setX(dice.getX() - KEYBOARD_MOVEMENT_DELTA); 
        break; 
      } 
      } 
    }); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

Dans mon code, mon image dice peut se déplacer à gauche et à droite, mais je ne veux pas aller à l'extérieur de la scène. Je veux qu'il ne bouge pas une fois qu'il a atteint la fin de la scène à la fois à gauche et à droite. J'ai essayé de le faire avec l'instruction if, mais cela ne fonctionne pas. Est-il possible que je peux arrêter mon image dice pour ne pas sortir de la scène? Toute aide est appréciée!

+0

où vous avez la x.pos() <500 et que les tests que vous avez fait besoin d'ajouter la largeur de x sur le côté gauche de l'inégalité –

+0

@BenWebb vous peut me montrer comment s'il vous plaît de le faire? Je n'ai pas obtenu –

+0

Je ne suis pas vraiment sûr sur la base de code de JavaScript mais ce serait quelque chose comme dice.getX() + dice.width()/2> = 500. C'est parce que dice.getX() ne le fait pas renvoie le point sur l'image la plus proche de la bordure. Je ne suis pas sûr de la direction exacte des inégalités (>) et de l'ordre des opérations, vous devrez donc essayer de changer les côtés des expressions. Cela devrait trouver la réponse que vous cherchez –

Répondre

0

Vous avez quelques problèmes dans votre réponse. Premièrement, la façon dont vous vérifiez les limites. Si la condition est remplie, vos touches ne contrôlent plus le ImageView. Deuxièmement, en utilisant dice.getX() dans votre condition de test. Il est préférable d'utiliser dice.getLayoutBounds().getMaxX() et dice.getLayoutBounds().getMinX(). En outre, je recommande d'utiliser scene.getWidth() au lieu de coder en dur la largeur du Scene, car la largeur Scene peut être modifiée. < - (dans votre code affiché).

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

/** 
* 
* @author blj0011 
*/ 
public class JavaFxTestingGround extends Application { 

    double KEYBOARD_MOVEMENT_DELTA = 5; 

    @Override 
    public void start(Stage primaryStage) throws IOException { 
     Pane root = new Pane(); 
     Scene scene = new Scene(root, 500, 500, Color.RED); 

     ImageView dice = new ImageView(createImage("https://cdn.discordapp.com/attachments/250163910454280192/296377451599364107/Untitled.png")); 
     dice.setFitHeight(100); 
     dice.setFitWidth(100); 
     dice.setX(0); 
     dice.setY(300); 
     root.getChildren().add(dice); 

     scene.setOnKeyPressed(e -> {  
      System.out.println(dice.getLayoutBounds().getMinX() + " : " + dice.getLayoutBounds().getMaxX() + " : " + scene.getWidth()); 
      switch (e.getCode()) { 
       case RIGHT: 
        dice.setX(dice.getX() + KEYBOARD_MOVEMENT_DELTA); 
        break; 

       case LEFT: 
        dice.setX(dice.getX() - KEYBOARD_MOVEMENT_DELTA); 
        break; 
      } 


      if (dice.getLayoutBounds().getMinX() < 0) 
      { 
       dice.setX(0); 
      }    
      else if(dice.getLayoutBounds().getMaxX() > scene.getWidth()) 
      { 
       dice.setX(dice.getX() - KEYBOARD_MOVEMENT_DELTA); 
      }   
     }); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    Image createImage(String url) 
    throws IOException { 
     URLConnection conn = new URL(url).openConnection(); 
     conn.setRequestProperty("User-Agent", "Wget/1.13.4 (linux-gnu)"); 

     try (InputStream stream = conn.getInputStream()) { 
      return new Image(stream); 
     } 
    } 
} 
+0

Quel est ce code dans le bas? 'Image createImage (String url) throws IOException { URLConnection conn = nouvelle URL (url) .openConnection(); conn.setRequestProperty ("User-Agent", "Wget/1.13.4 (linux-gnu)"); try (InputStream flux = conn.getInputStream()) { return new Image (stream); } ' –

+0

J'ai utilisé une image hébergée en ligne. Ce code aide le chargement de l'image. Tu n'en as pas besoin. Je voulais juste que cette réponse fonctionne immédiatement. Votre code est bon, sauf dans le gestionnaire. – Sedrick

+0

Merci! Ça marche :) –