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例外なくクラッシュするアプリを取得:ここ
は私がループしてみてください一部です。
私が提供したコードを試しましたが、クラッシュすることなく正常に実行されました。マウスが境界線にあると、スクロールが表示されます。あなたは、プロセスをループしようとしたコードに私を指摘することができます..また、あなたが持っている例外スタックトレースを提供します。 。 – karna
ありがとうございました 詳細を編集しました –