2017-04-05 2 views
1

私は実際にJavaFXを学習していて、簡単なアプリケーションを作成しようとしています 矢印付きの画像をmooveします。JavaFX Refreshing新しい場所で画像を再ペイントするには

私は働いていて、オブジェクトの変数locationXとlocationYを変更することができましたが、画像は動きません。 "repaint()"メソッドのようなものです単純に?または私はアニメーションを使用する必要がありますか?私は今のところアニメーションを使用したくないです。

Fenetre.java

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class Fenetre extends Application{ 

    public Charac c1; 

    public void init(){ 
     c1 = new Charac(110,110); 
    } 

    public void start(Stage stage){ 
     ImageView ivChar = new ImageView(); 
     ivChar.setImage(c1.getImg()); 
     ivChar.relocate((double)c1.getLocationX(),(double)c1.getLocationY()); 

     HBox box = new HBox(); 
     box.setTranslateX((double)c1.getLocationX()); 
     box.setTranslateY((double)c1.getLocationY()); 
     box.getChildren().add(ivChar); 
     box.setFocusTraversable(true); 
     box.setOnKeyPressed(new EventHandler<KeyEvent>(){ 
      @Override 
      public void handle(KeyEvent e) { 
       switch(e.getCode()){ 
        case UP: 
         c1.goUp(); 
         break; 
        case DOWN: 
         c1.goDown(); 
         break; 
        case LEFT: 
         c1.goLeft(); 
         break; 
        case RIGHT: 
         c1.goRight(); 
         break; 
       default: 
        break; 
       } 
      } 
     }); 

     Group root = new Group(); 
     root.getChildren().add(box); 
     Scene scene = new Scene(root); 
     scene.setFill(Color.BLACK); 


     stage.setWidth(600); 
     stage.setHeight(600); 
     stage.setTitle("BBMAN"); 
     stage.setScene(scene); 
     stage.show(); 


    } 
} 

Charac.java

import javafx.scene.Parent; 
import javafx.scene.image.Image; 

public class Charac extends Parent{ 
    private int locationX=0; 
    private int locationY=0; 
    private Image img = new Image("/Images/bbfront.png"); 

    public Charac(int locationX, int locationY){ 
     this.locationY=locationY; 
     this.locationX=locationX; 


    } 


    public void setLocationX(int locationX){ 
     this.locationX=locationX; 
    } 

    public int getLocationX(){ 
     return this.locationX; 
    } 

    public int getLocationY(){ 
     return this.locationY; 
    } 
    public void setLocationY(int locationY){ 
     this.locationY=locationY; 
    } 

    public void goRight(){ 
     this.locationX+=1; 
     this.img = new Image("/Images/bbright.png"); 
    } 

    public void goLeft() { 
     this.locationX-=1; 
     this.img = new Image("/Images/bbleft.png"); 
    } 

    public void goUp(){ 
     this.locationY-=1; 
     this.img = new Image("/Images/bbup.png"); 
    } 

    public void goDown(){ 
     this.locationY+=1; 
     this.img = new Image("/Images/bbfront.png"); 

    } 

    public Image getImg(){ 
     return this.img; 
    } 
} 

私は右側のセクションに投稿していた場合、私はRLY知らない、これが私の最初の投稿です。

ありがとうございました!

+0

ボタンを押した後にHBoxの位置を更新しません。 – Steven

+0

関連する、恐らく重複:[JavaFX用のKeyListenerの書き方](http://stackoverflow.com/questions/29962395/how-to-write-a-keylistener-for-javafx)キーを押すと画面が表示されます。 – jewelsea

答えて

2

次のコードはテストされていますが、グラフィックは異なります。 (ロードをやり直してEclipseのファイル構造を操作する必要がありました)

「ルート」ノードをキーボードイベントハンドラとして使用しても構いません。主なことは、FocusTraversableにしてFocusを与えることを覚えておくことです。

Characで不要なコードを取り除き、グラフィックスを配列にプリロードして構造がスプライトのようになり、新しいグラフィックを読み込むことはありません(比較的高価です)あなたが方向を変えるたびに。

ImageViewを初期化し、KeyEvent Handlingルーチンでそれを更新する冗長コード(3行)があります。おそらく排除することができ、排除すべきである。

主なことは、ImageViewのXとYを直接設定し、ImageViewが表示する画像を更新できることです。私はImageViewが非常に便利なクラスであると判断し、その結果としてより頻繁に使用しています。不透明度とスケーリングを変更する機能は持っているのが本当にうれしいです。私はJavaFXので出始めたとき

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class CharacMove extends Application 
{ 
    public static void main(String[] args) 
    { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception 
    { 
     Group root = new Group(); 
     Scene scene = new Scene(root); 

     scene.setFill(Color.BLACK); 
     stage.setWidth(600); 
     stage.setHeight(600); 
     stage.setTitle("BBMAN"); 
     stage.setScene(scene); 

     Charac c1 = new Charac(); 
     ImageView ivChar = new ImageView(); 
     ivChar.setImage(c1.getImage()); 
     ivChar.setX(c1.getX()); 
     ivChar.setY(c1.getY()); 

     root.setFocusTraversable(true); 
     root.requestFocus(); 
     root.setOnKeyPressed(new EventHandler<KeyEvent>() 
     { 
      @Override 
      public void handle(KeyEvent e) 
      { 
       switch(e.getCode()) 
       { 
        case UP: 
         c1.goUp(); 
         break; 
        case DOWN: 
         c1.goDown(); 
         break; 
        case LEFT: 
         c1.goLeft(); 
         break; 
        case RIGHT: 
         c1.goRight(); 
         break; 
        default: 
         break; 
       } 
       ivChar.setImage(c1.getImage()); 
       ivChar.setX(c1.getX()); 
       ivChar.setY(c1.getY()); 
      } 
     }); 

     root.getChildren().add(ivChar); 
     stage.show(); 
    } 

    class Charac 
    { 
     private Image[] img; 
     private double xLoc, yLoc; 
     private int currentImg;  

     public Image getImage() { return img[currentImg]; } 
     public double getX() { return xLoc; } 
     public double getY() { return yLoc; } 

     public Charac() 
     { 
      img = new Image[4]; 
      img[0] = new Image(getClass().getResource("Images/bbright.png").toString()); 
      img[1] = new Image(getClass().getResource("Images/bbleft.png").toString()); 
      img[2] = new Image(getClass().getResource("Images/bbup.png").toString()); 
      img[3] = new Image(getClass().getResource("Images/bbfront.png").toString()); 
     } 

     public void goRight() 
     { 
      xLoc += 1; 
      currentImg = 0; 
     } 

     public void goLeft() 
     { 
      xLoc -= 1; 
      currentImg = 1; 
     } 

     public void goUp() 
     { 
      yLoc -= 1; 
      currentImg = 2; 
     } 

     public void goDown() 
     { 
      yLoc += 1; 
      currentImg = 3; 
     } 
    } 
} 

は、私が書いたとあなたがする準備ができているとき/場合、例えば、AnimationTimerを使用して、物事別のカップルの手順を、取るjava-gaming.orgで簡単なゲームのアニメーションのチュートリアルを掲載しましたそれを探索する。あなたはそれを確認することができますhere。しかし、その時点では、私はまだキーボード操作のためにGroupノードのルートを使用することができないとわかっていませんでした。

1

キーを押した後にHBox boxの位置を更新する必要があります。

box.setOnKeyPressed(new EventHandler<KeyEvent>(){ 
     @Override 
     public void handle(KeyEvent e) { 
      switch(e.getCode()){ 
       case UP: 
        c1.goUp(); 
        break; 
       case DOWN: 
        c1.goDown(); 
        break; 
       case LEFT: 
        c1.goLeft(); 
        break; 
       case RIGHT: 
        c1.goRight(); 
        break; 
      default: 
       break; 
      } 
      box.setTranslateY((double)c1.getLocationY()); 
      box.setTranslateX((double)c1.getLocationX()); 
     } 
    }); 

イメージファイルをアレイにロードした場合は、おそらく最も適しています。

関連する問題