🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Q&A

解決済

1回答

425閲覧

4×4×4の立方体のキューブを回転させて、クリックしたパーツが消えるプログラムを作りたいです。

Hdyjjof

総合スコア5

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

0グッド

0クリップ

投稿2019/12/26 02:48

編集2019/12/26 02:58

4×4×4の立方体のキューブを回転させて、クリックしたパーツが消えるプログラムを作りたいです。

javaFX

1コード 2 3import javafx.application.Application; 4import javafx.event.EventHandler; 5import javafx.geometry.*; 6import javafx.scene.*; 7import javafx.scene.input.*; 8import javafx.scene.paint.*; 9import javafx.scene.shape.*; 10import javafx.scene.transform.*; 11import javafx.stage.Stage; 12import javafx.scene.layout.*; 13import javafx.scene.control.*; 14 15 16public class App6 extends Application { 17 Scene scene = null; 18 //カメラ方向操作用 19//カメラと視点間の距離 20 double cl =-50.; 21 //カメラのXY角度 22 double cx =45.; 23 double cdx =0.; 24 double cy =45.; 25 double cdy =0.; 26 static Rotate camerarotateX = null; 27 static Rotate camerarotateY = null; 28 Translate cameratranslate = null; 29 30 public static void main(String[] args) { 31 Application.launch(args); 32 } 33 34 @Override 35 public void start(Stage stage) throws Exception { 36 scene = make3dScene(); 37 stage.setScene(scene); 38 setEvent(); 39//タイトルの表示 40 stage.setTitle("ピースを削って問題を作成しよう"); 41 stage.show(); 42 } 43 44 private Scene make3dScene(){ 45 Group group = new Group(); 46 47 Box[][][] box=new Box[4][4][4]; 48 //コンテナとノードの座標系を一致させる 49 Translate boxtranslate = new Translate(100,100,100); 50 51 for(int i=0;i<4;i++){ 52 for(int j=0;j<4;j++){ 53 for(int k=0;k<4;k++){ 54 box[i][j][k]=new Box(5,5,5); 55 box[i][j][k].getTransforms().add( boxtranslate ); 56 group.getChildren().add( box[i][j][k] ); 57 box[i][j][k].setTranslateX(i*6); 58 box[i][j][k].setTranslateY(j*6); 59 box[i][j][k].setTranslateZ(k*6); 60/* EventHandler<MouseEvent> box[i][j][k]ClickFilter=(event)->group.getChildren().remove(box[i][j][k]); 61 box[i][j][k]addEventFilter(MouseEvent.MOUSE_PRESSED,box[i][j][k]ClickFilter); 62*/ 63 } 64 } 65 } 66 EventHandler<MouseEvent>boxClickFilter=(event)->group.getChildren().remove(box[0][0][0]); 67 box[0][0][0].addEventFilter(MouseEvent.MOUSE_PRESSED,boxClickFilter); 68 69 70 71 // カメラを置く(箱をレンダリングするためのもの) 72 PerspectiveCamera camera = new PerspectiveCamera( true ); 73 //方向と位置 74 cameratranslate = new Translate(0,0,-50); 75 camerarotateX = new Rotate( cx , new Point3D( 1 , 0 , 0 ) ); 76 camerarotateY = new Rotate( cy , new Point3D( 0 , 1 , 0 ) ); 77 camera.getTransforms().add( boxtranslate ); 78 camera.getTransforms().add( camerarotateX ); 79 camera.getTransforms().add( camerarotateY ); 80 camera.getTransforms().add( cameratranslate ); 81 //視界の角度(カメラは自分の座標系を持つ、Z軸方向が視線の中心) 82 camera.setFieldOfView( 80. ); 83 group.getChildren().add( camera ); 84 //点光源を置く 85 // LightBase light = new AmbientLight(); 86 LightBase light = new PointLight(); 87 // light.setTranslateX( 30.0 ); 88 // light.setTranslateY( -30.0 ); 89 light.setTranslateZ( -30.0 ); 90 group.getChildren().add( light ); 91 92 //Sceneの設定 93 Scene s3d = new Scene(group, 320, 240); 94 s3d.setFill(Color.WHITE); 95 s3d.setCamera( camera ); 96 return s3d; 97 } 98 99 private void setEvent(){ 100 //マウスがドラッグされたときのイベント 101 scene.setOnMouseDragged(new EventHandler<MouseEvent>() { 102 @Override 103 public void handle(MouseEvent event) { 104 if( event.getButton() == MouseButton.PRIMARY ){ 105 //カメラの視線方向をマウスドラッグに合わせて変更する 106 double vddx = event.getSceneY() - App6.this.cdx ; 107 App6.this.cx = App6.this.cx - vddx/2. ; 108 double vddy = event.getSceneX() - App6.this.cdy ; 109 App6.this.cy = App6.this.cy + vddy/2. ; 110 App6.camerarotateX.setAngle( cx ); 111 App6.camerarotateY.setAngle( cy ); 112 App6.this.cdx = event.getSceneY(); 113 App6.this.cdy = event.getSceneX(); 114 } 115 } 116 }); 117 118 scene.setOnMousePressed(new EventHandler<MouseEvent>() { 119 @Override 120 public void handle(MouseEvent event) { 121 App6.this.cdx = event.getSceneY(); 122 App6.this.cdy = event.getSceneX(); 123 } 124 }); 125 scene.setOnScroll( new EventHandler<ScrollEvent>() { 126 @Override 127 public void handle(ScrollEvent event) { 128 App6.this.cl = App6.this.cl + event.getDeltaY()/2. ; 129 App6.this.cameratranslate.setZ( App6.this.cl ); 130 } 131 }); 132 return; 133 } 134} 135 136クリックしたパーツを消す部分がうまく作れません。 137ソースコードでは、パーツを一つ一つ指定して消そうとしています。(一番角の一つだけ消えるようにしています。)これを、すべてのパーツ分コードを書かずにbox[i][j][k]に対応させて消えるようにしたいです。どうしたら良いでしょうか。 138 139```javaFX 140--- 141### 試したこと 142for文の中でコメントにしている方法ではできませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

@Hdyjjofさんのコードのままでも行けるような気がしますがダメでしょうか?
ラムダ式の中から外の変数をとる場合にfinalにしておけば、
一応、自分の環境ではクリックしたブロックがポチポチ消えていきました。

コメントされている箇所を以下のようにする

javaFX

1final int _i = i; 2final int _j = j; 3final int _k = k; 4EventHandler<MouseEvent> boxClickFilter = (event) -> group.getChildren().remove(box[_i][_j][_k]); 5box[_i][_j][_k].addEventFilter(MouseEvent.MOUSE_PRESSED, boxClickFilter);

なにぶんjavaFXの経験がないので、javaFX的にパフォーマンスやメモリの使い方が良くないとかは分かりません。悪しからず。

投稿2020/01/17 08:38

storm3

総合スコア330

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hdyjjof

2020/01/17 09:13

教えていただいた方法でできました。本当にありがとうございます! ここの部分でずっと悩んでいたので助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問