teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

ソースコードの補足

2017/10/26 17:50

投稿

3_pyon
3_pyon

スコア12

title CHANGED
File without changes
body CHANGED
@@ -19,8 +19,108 @@
19
19
 
20
20
  ###該当のソースコード
21
21
  [こちらの質問](https://teratail.com/questions/96061)で示したソースコードに,教えて頂いたTimelineの処理を実装したものです.
22
+ ```Java
22
- 座標の再計算、描画処理のメソッドの呼び出しはTimelineのevent内で行っています.
23
+ //FXTest2.fxml
23
24
 
25
+ <?xml version="1.0" encoding="UTF-8"?>
26
+
27
+ <?import javafx.scene.canvas.Canvas?>
28
+ <?import javafx.scene.layout.AnchorPane?>
29
+
30
+ <AnchorPane xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sim.FXTest2Controller">
31
+ <children>
32
+ <AnchorPane layoutX="-98.0" layoutY="-90.0" prefHeight="500.0" prefWidth="500.0">
33
+ <children>
34
+ <Canvas fx:id="Canvas" height="348.0" layoutX="115.0" layoutY="109.0" width="270.0" AnchorPane.leftAnchor="115.0" AnchorPane.topAnchor="109.0" />
35
+ </children>
36
+ </AnchorPane>
37
+ </children>
38
+ </AnchorPane>
39
+
40
+ ```
41
+
42
+ ```Java
43
+ //FXTest2Controller.java
44
+
45
+ package sim;
46
+
47
+
48
+ import javafx.fxml.FXML;
49
+ import javafx.fxml.Initializable;
50
+ import java.net.URL;
51
+ import java.util.ResourceBundle;
52
+ import javafx.scene.paint.Color;
53
+ import javafx.scene.canvas.GraphicsContext;
54
+ import javafx.scene.canvas.Canvas;
55
+
56
+ public class FXTest2Controller implements Initializable {
57
+ @FXML Canvas Canvas;
58
+ GraphicsContext gc;
59
+
60
+ public void initialize(URL location, ResourceBundle resources) {
61
+
62
+ gc = Canvas.getGraphicsContext2D();
63
+
64
+ Timeline timeline = new Timeline(
65
+ new KeyFrame(
66
+ Duration.millis(30)),
67
+ (event) -> {
68
+
69
+ //ここで物体の座標計算をしたとみてください
70
+
71
+ draw();
72
+ })
73
+ );
74
+ timeline.setCycleCount(Timeline.INDEFINITE); // 無限に繰り返す
75
+ timeline.start(); // 開始
76
+ }
77
+
78
+ public void draw() {
79
+
80
+ //ここで描画処理を行っています
81
+
82
+ }
83
+ }
84
+
85
+
86
+ ```
87
+
88
+ ```Java
89
+ //Main.java
90
+
91
+ package sim;
92
+
93
+ import javafx.application.Application;
94
+ import javafx.stage.Stage;
95
+ import javafx.scene.Scene;
96
+ import javafx.scene.canvas.Canvas;
97
+ import javafx.scene.canvas.GraphicsContext;
98
+ import javafx.scene.layout.AnchorPane;
99
+ import javafx.scene.paint.Color;
100
+ import javafx.fxml.FXMLLoader;
101
+ import javafx.fxml.FXML;
102
+
103
+ public class Main extends Application {
104
+
105
+ @Override
106
+ public void start(Stage primaryStage) {
107
+
108
+ try {
109
+ AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("FXTest2.fxml"));
110
+ Scene scene = new Scene(root,400,400);
111
+ scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
112
+ primaryStage.setScene(scene);
113
+ primaryStage.show();
114
+ } catch(Exception e) {
115
+ e.printStackTrace();
116
+ }
117
+ }
118
+
119
+ public static void main(String[] args) {
120
+ launch(args);
121
+ }
122
+ }
123
+ ```
24
124
  ###試したこと
25
125
  ひとまずTimelineのループ時間を十分長く取れば処理落ちは起こりませんでした.
26
126
  ただ,プログラム内部のループ時間によって処理落ちが発生するのはあまり望ましくないと思っていますので,この方法以外での手法をお聞きしたいです…

1

補足

2017/10/26 17:50

投稿

3_pyon
3_pyon

スコア12

title CHANGED
File without changes
body CHANGED
@@ -19,6 +19,7 @@
19
19
 
20
20
  ###該当のソースコード
21
21
  [こちらの質問](https://teratail.com/questions/96061)で示したソースコードに,教えて頂いたTimelineの処理を実装したものです.
22
+ 座標の再計算、描画処理のメソッドの呼び出しはTimelineのevent内で行っています.
22
23
 
23
24
  ###試したこと
24
25
  ひとまずTimelineのループ時間を十分長く取れば処理落ちは起こりませんでした.