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文の中でコメントにしている方法ではできませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/17 09:13