2017-06-28 13 views
0

Java fxを使用して2Dゲームを作成したいが、マウスが定義された境界線にマウスを置いたときに動作するため、マウスが画面の端に近づくとスクロール動作が問題になるマウスが境界線から出てくるまで、そのプロセスをループしてアプリケーションをクラッシュさせようとすると、私はそのプロセスをループします。 私はアンまでたいスクロールシステムは、多かれ少なかれなどWarcraftのか、帝国の地球のような戦略ゲームのようです...ここ は、私が一緒に働くのコードです:Java fx 2Dスクロールゲーム

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javax.swing.JScrollPane; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.input.ScrollEvent; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

/** Constructs a scene with a pannable Map background. */ 
public class PannableView extends Application { 
private Image backgroundImage; 

@Override public void init() { 
backgroundImage = new Image("http://www.narniaweb.com/wp-content/uploads/2009/08/NarniaMap.jpg"); 
} 

@Override public void start(Stage stage) { 
stage.setTitle("Drag the mouse to pan the map"); 

// construct the scene contents over a stacked background. 
StackPane layout = new StackPane(); 
layout.getChildren().setAll(
    new ImageView(backgroundImage), 
    createKillButton() 
); 

// wrap the scene contents in a pannable scroll pane. 
ScrollPane scroll = createScrollPane(layout); 

// show the scene. 
Scene scene = new Scene(scroll); 
stage.setScene(scene); 
stage.show(); 
scroll.setOnMouseMoved(e->{ 
    /* 
    * screen movement 
    * if cursor close to border: 
    * detect wich border and move in concequences 
    */ 

int marge = 10; 

    //TODO make camera move 
    //left top corner 
    if(marge > e.getX() && marge > e.getY()){ 
     scroll.setVvalue(scroll.getVvalue() -0.001); 
     scroll.setHvalue(scroll.getHvalue() -0.001); 
    }//left bottom corner 
    else if(marge > e.getX() && scroll.getHeight()-marge < e.getY()){ 
     scroll.setVvalue(scroll.getVvalue() +0.001); 
     scroll.setHvalue(scroll.getHvalue() -0.001); 
    }//right top corner 
    else if(scroll.getWidth()-marge < e.getX() && marge > e.getY()){ 
     scroll.setVvalue(scroll.getVvalue() -0.001); 
     scroll.setHvalue(scroll.getHvalue() +0.001); 
    }//right bottom corner 
    else if(scroll.getWidth()-marge < e.getX() && scroll.getHeight()-marge < e.getY()){ 
     scroll.setVvalue(scroll.getVvalue() +0.001); 
     scroll.setHvalue(scroll.getHvalue() +0.001); 
    }//top 
    else if(marge > e.getY()){ 
     scroll.setVvalue(scroll.getVvalue() -0.001); 
    }//right 
    else if(scroll.getWidth()-marge < e.getX()){ 
     scroll.setHvalue(scroll.getHvalue() +0.001); 
    }//bottom 
    else if(scroll.getHeight()-marge < e.getY()){ 
     scroll.setVvalue(scroll.getVvalue() +0.001); 
    }//left 
    else if(marge > e.getX()){ 
     scroll.setHvalue(scroll.getHvalue() -0.001); 
    } 


}); 
// bind the preferred size of the scroll area to the size of the scene. 
scroll.prefWidthProperty().bind(scene.widthProperty()); 
scroll.prefHeightProperty().bind(scene.widthProperty()); 

// center the scroll contents. 
scroll.setHvalue(scroll.getHmin() + (scroll.getHmax() - scroll.getHmin())/2); 
scroll.setVvalue(scroll.getVmin() + (scroll.getVmax() - scroll.getVmin())/2); 
} 

/** @return a control to place on the scene. */ 
private Button createKillButton() { 
final Button killButton = new Button("Kill the evil witch"); 
killButton.setStyle("-fx-base: firebrick;"); 
killButton.setTranslateX(65); 
killButton.setTranslateY(-130); 
killButton.setOnAction(new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent t) { 
    killButton.setStyle("-fx-base: forestgreen;"); 
    killButton.setText("Ding-Dong! The Witch is Dead"); 
    } 
}); 
return killButton; 
} 

/** @return a ScrollPane which scrolls the layout. */ 
private ScrollPane createScrollPane(Pane layout) { 
ScrollPane scroll = new ScrollPane(); 
scroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); 
scroll.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); 
scroll.setPannable(true); 
scroll.setPrefSize(800, 600); 
scroll.setContent(layout); 
return scroll; 
} 


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

私は誰かが私を助けることを願ってそれはありがとう!

if(marge > e.getX() && marge > e.getY()){ 
    scroll.setVvalue(scroll.getVvalue() -0.001); 
    scroll.setHvalue(scroll.getHvalue() -0.001); 
}//left bottom corner 
else if(marge > e.getX() && scroll.getHeight()-marge < e.getY()){ 
    scroll.setVvalue(scroll.getVvalue() +0.001); 
    scroll.setHvalue(scroll.getHvalue() -0.001); 
}//right top corner 
else if(scroll.getWidth()-marge < e.getX() && marge > e.getY()){ 
    scroll.setVvalue(scroll.getVvalue() -0.001); 
    scroll.setHvalue(scroll.getHvalue() +0.001); 
}//right bottom corner 
else if(scroll.getWidth()-marge < e.getX() && scroll.getHeight()-marge < e.getY()){ 
    scroll.setVvalue(scroll.getVvalue() +0.001); 
    scroll.setHvalue(scroll.getHvalue() +0.001); 
}//top 
else if(marge > e.getY()){ 
    scroll.setVvalue(scroll.getVvalue() -0.001); 
}//right 
else if(scroll.getWidth()-marge < e.getX()){ 
    scroll.setHvalue(scroll.getHvalue() +0.001); 
}//bottom 
else if(scroll.getHeight()-marge < e.getY()){ 
    scroll.setVvalue(scroll.getVvalue() +0.001); 
}//left 
else if(marge > e.getX()){ 
    scroll.setHvalue(scroll.getHvalue() -0.001); 
} 

私はwhileループを試してみましたが、私は単にそれは単に動作を停止し、コンソール上の任意のJava例外なくクラッシュするアプリを取得:ここ

は私がループしてみてください一部です。

+0

私が提供したコードを試しましたが、クラッシュすることなく正常に実行されました。マウスが境界線にあると、スクロールが表示されます。あなたは、プロセスをループしようとしたコードに私を指摘することができます..また、あなたが持っている例外スタックトレースを提供します。 。 – karna

+0

ありがとうございました 詳細を編集しました –

答えて

0

私もあなたのコードを試してみましたが、うまく動作していたようです。あなたはそれを新しいファイルに入れて再実行して、 "ファイルパスをリセットする"ことができます。興味深いことにスタックトレースがないことです。それはあなたのループでメモリリークの問題になる可能性があることを私に伝えます。 NetBeansを使用している場合、NetBeans:StatusLine Memory Usageをインストールして、whileループが無限に実行されているかどうかを調べることができます。あるいは、ループごとにテキストを出力して、実行中の回数を確認することもできます。

ループにメモリの問題が発生した場合は、アクションが実行されたときにループに入る一連の状況を作成してから、アクションが実行された後に終了してください。お役に立てれば。

関連する問題