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

回答編集履歴

4

参考情報を追記

2018/05/03 10:17

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -9,7 +9,10 @@
9
9
 
10
10
  あと変数の型を`double`型ではなく`float`型で宣言するのは、
11
11
  宗教上の理由などがある場合を除き、`float`型の精度に起因する余計なトラブルを持ち込みむため、避けたほうが無難です。
12
+ この精度についての問題について、日本語で体系的に纏まっている情報としては2008年に出版された本ですが、「ゲームプログラマになる前に覚えておきたい技術」が纏まっています。
13
+ 「ゲームプログラマになる前に覚えておきたい技術 float 中途半端な数による誤差」でキーワード検索してみてくださいな。
12
14
 
15
+
13
16
  サンプルコードです。ご参考まで。
14
17
  ```Java
15
18
  Bullet bullet;

3

コードを変更

2018/05/03 10:17

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  `Boss`クラスは任意のタイミングで、弾幕を貼る。そのようなコードになります。
6
6
 
7
7
  発射した弾の生存管理方法はいろいろな手法がありますが、
8
- 描画範囲外になったら生存フラグをgalseにして、描画時にリストから削除する形が楽かと。
8
+ 描画範囲外になったら生存フラグを`false`にして、描画時にリストから削除する形が楽かと。
9
9
 
10
10
  あと変数の型を`double`型ではなく`float`型で宣言するのは、
11
11
  宗教上の理由などがある場合を除き、`float`型の精度に起因する余計なトラブルを持ち込みむため、避けたほうが無難です。
@@ -13,8 +13,8 @@
13
13
  サンプルコードです。ご参考まで。
14
14
  ```Java
15
15
  Bullet bullet;
16
- Boss boss;
16
+ private Boss boss = new Boss(100, 150);
17
- ArrayList<Bullet> danmaku;
17
+ private ArrayList<Bullet> danmaku = new ArrayList<Bullet>();
18
18
 
19
19
  void setup() {
20
20
  size(320, 480);
@@ -24,8 +24,6 @@
24
24
  noCursor(); // clear mouse cursor
25
25
 
26
26
  bullet = new Bullet(width/2, height/2, 10, 0, 0 ); //クラスからインスタンスを生成
27
- boss = new Boss(100, 200);
28
- danmaku = new ArrayList<Bullet>();
29
27
 
30
28
  }
31
29
  // my ship function
@@ -43,15 +41,24 @@
43
41
  }
44
42
  }
45
43
  class Boss {
46
- int tx, ty;
44
+ private int tx, ty;
45
+ private int dx, dy;
47
- long routine = 0;
46
+ private long routine = 0;
48
47
  Boss(int x, int y) {
49
48
  tx = x;
50
49
  ty = y;
50
+ dx = 1;
51
+ dy = -5;
51
52
  }
52
53
  void move(){
53
- tx += 1;
54
+ tx += dx;
54
- ty += 1;
55
+ ty += dy;
56
+ if(tx < 0 || tx > width){
57
+ dx*= -1;
58
+ }
59
+ if(ty < 0 || ty > height){
60
+ dy*= -1;
61
+ }
55
62
  }
56
63
  void doShinking(){
57
64
  routine++;
@@ -60,13 +67,14 @@
60
67
  }
61
68
  if(routine % 30 == 0){
62
69
  danmaku.addAll(this.shot());
70
+ println("#shot!!" +routine + ":" + tx + "," + ty);
63
71
  }
64
72
  }
65
73
  ArrayList<Bullet> shot() {
66
74
  ArrayList<Bullet> danmaku = new ArrayList();
67
75
  for (int i = 0; i < 360; i+= 10) {
68
- float rad = radians(i);
76
+ double rad = radians(i);
69
- danmaku.add(new Bullet(this.tx, this.tx, 10, cos(rad), sin(rad)));
77
+ danmaku.add(new Bullet(this.tx, this.ty, 10, Math.cos(rad), Math.sin(rad)));
70
78
  }
71
79
  return danmaku;
72
80
  }
@@ -75,9 +83,11 @@
75
83
 
76
84
  class Bullet {
77
85
 
86
+ private double tx, ty;
87
+ private final double tr;
78
- float tx, ty, tr, dx, dy;
88
+ private double dx, dy;
79
- boolean isalive = true;
89
+ private boolean is_alive = true;
80
- Bullet(float x, float y, float r, float temp_dx, float temp_dy ) {
90
+ Bullet(double x, double y, double r, double temp_dx, double temp_dy ) {
81
91
  tx = x;
82
92
  ty = y;
83
93
  tr = r;
@@ -85,24 +95,23 @@
85
95
  dy = temp_dy;
86
96
  }
87
97
  boolean isAlive(){
88
- return isalive;
98
+ return is_alive;
89
99
  }
90
100
  void update() {
91
101
  tx += dx;
92
102
  ty += dy;
93
103
  if(Math.min(tx, ty) < 0){
94
- isalive = false;
104
+ is_alive = false;
95
105
  //println("#" + tx + "," + ty);
96
106
  return ;
97
107
  }
98
108
  if(tx > width || ty > height){
99
- isalive = false;
109
+ is_alive = false;
100
- println("#" + tx + "," + ty);
101
110
  return ;
102
111
  }
103
112
  stroke(255, 0, 0);
104
113
 
105
- ellipse(tx, ty, tr, tr);
114
+ ellipse((float)tx, (float)ty, (float)tr, (float)tr);
106
115
  }
107
116
  }
108
117
  void draw() {

2

4枠の範囲を追加

2018/05/02 21:36

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -15,6 +15,7 @@
15
15
  Bullet bullet;
16
16
  Boss boss;
17
17
  ArrayList<Bullet> danmaku;
18
+
18
19
  void setup() {
19
20
  size(320, 480);
20
21
 
@@ -42,9 +43,9 @@
42
43
  }
43
44
  }
44
45
  class Boss {
45
- float tx, ty;
46
+ int tx, ty;
46
47
  long routine = 0;
47
- Boss(float x, float y) {
48
+ Boss(int x, int y) {
48
49
  tx = x;
49
50
  ty = y;
50
51
  }
@@ -89,11 +90,16 @@
89
90
  void update() {
90
91
  tx += dx;
91
92
  ty += dy;
92
- if(tx < 0 || ty < 0){
93
+ if(Math.min(tx, ty) < 0){
93
94
  isalive = false;
95
+ //println("#" + tx + "," + ty);
94
96
  return ;
95
97
  }
96
-
98
+ if(tx > width || ty > height){
99
+ isalive = false;
100
+ println("#" + tx + "," + ty);
101
+ return ;
102
+ }
97
103
  stroke(255, 0, 0);
98
104
 
99
105
  ellipse(tx, ty, tr, tr);

1

追記

2018/05/02 12:58

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  こういう場合(文章中に主語が出てきた場合)は専用のクラスを作成するとコードの管理が楽になります。
4
4
  今回の場合は`Boss`クラスになるかと。
5
- `Boss`クラスは任意のタイミングで、弾幕を貼る。
5
+ `Boss`クラスは任意のタイミングで、弾幕を貼る。そのようなコードになります。
6
6
 
7
7
  発射した弾の生存管理方法はいろいろな手法がありますが、
8
8
  描画範囲外になったら生存フラグをgalseにして、描画時にリストから削除する形が楽かと。
9
9
 
10
10
  あと変数の型を`double`型ではなく`float`型で宣言するのは、
11
- 宗教上の理由などがある場合を除き、`float`型の精度に起因する余計なトラブルを持ち込みやすいため、避けたほうが無難です。
11
+ 宗教上の理由などがある場合を除き、`float`型の精度に起因する余計なトラブルを持ち込みため、避けたほうが無難です。
12
12
 
13
13
  サンプルコードです。ご参考まで。
14
14
  ```Java