回答編集履歴
4
参考情報を追記
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
コードを変更
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
`Boss`クラスは任意のタイミングで、弾幕を貼る。そのようなコードになります。
|
6
6
|
|
7
7
|
発射した弾の生存管理方法はいろいろな手法がありますが、
|
8
|
-
描画範囲外になったら生存フラグを
|
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 +=
|
54
|
+
tx += dx;
|
54
|
-
ty +=
|
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
|
-
|
76
|
+
double rad = radians(i);
|
69
|
-
danmaku.add(new Bullet(this.tx, this.
|
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
|
-
|
88
|
+
private double dx, dy;
|
79
|
-
boolean
|
89
|
+
private boolean is_alive = true;
|
80
|
-
Bullet(
|
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
|
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
|
-
|
104
|
+
is_alive = false;
|
95
105
|
//println("#" + tx + "," + ty);
|
96
106
|
return ;
|
97
107
|
}
|
98
108
|
if(tx > width || ty > height){
|
99
|
-
|
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枠の範囲を追加
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
|
-
|
46
|
+
int tx, ty;
|
46
47
|
long routine = 0;
|
47
|
-
Boss(
|
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
|
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
追記
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
|