• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Violet Vreath is Shooter Game for Windows XP+(個人制作シューティングゲーム)


Commit MetaInfo

Révision197d252fe47fa4cb7d67dccc66d191327d6762dd (tree)
l'heure2022-05-12 23:36:46
Auteurgecchi <gecchi@boch...>
Commitergecchi

Message de Log

自機ホーミングレーザー周りちょっと整理

Change Summary

Modification

--- a/GgafDx/include/jp/ggaf/dx/actor/supporter/GeoVehicle.h
+++ b/GgafDx/include/jp/ggaf/dx/actor/supporter/GeoVehicle.h
@@ -19,32 +19,31 @@ namespace GgafDx {
1919 class GeoVehicle : public ActorVehicle {
2020
2121 public:
22-
22+ /** [r]移動速度 */
2323 velo _velo;
24- acce _acce;
25-
26- /** [r/w]X軸方向移動速度 */
27- velo _velo_x;
28- /** [r/w]Y軸方向移動速度 */
29- velo _velo_y;
30- /** [r/w]Z軸方向移動速度 */
31- velo _velo_z;
32- /** [r/w]移動速度上限 */
24+ /** [r]移動速度上限 */
3325 velo _top_velo;
34- /** [r/w]移動速度下限 */
26+ /** [r]移動速度下限 */
3527 velo _bottom_velo;
36-
37- /** [r/w]X軸方向移動加速度 */
38- acce _acce_x;
39- /** [r/w]Y軸方向移動加速度 */
40- acce _acce_y;
41- /** [r/w]Z軸方向移動加速度 */
42- acce _acce_z;
43- /** [r/w]移動加速度上限*/
28+ /** [r]移動速度方向ベクトルX軸成分 */
29+ velo _velo_vc_x;
30+ /** [r]移動速度方向ベクトルY軸成分 */
31+ velo _velo_vc_y;
32+ /** [r]移動速度方向ベクトルZ軸成分 */
33+ velo _velo_vc_z;
34+
35+ /** [r]移動加速度 */
36+ acce _acce;
37+ /** [r]移動加速度上限*/
4438 acce _top_acce;
45- /** [r/w]移動加速度下限*/
39+ /** [r]移動加速度下限*/
4640 acce _bottom_acce;
47-
41+ /** [r]移動加速度方向ベクトルX軸成分 */
42+ acce _acce_vc_x;
43+ /** [r]移動加速度方向ベクトルY軸成分 */
44+ acce _acce_vc_y;
45+ /** [r]移動加速度方向ベクトルZ軸成分 */
46+ acce _acce_vc_z;
4847
4948 public:
5049 /**
@@ -68,23 +67,50 @@ public:
6867 void forceAcceRange(acce prm_acce01, acce prm_acce02);
6968
7069 /**
71- * X軸Y軸Z軸方向の移動速度を目標座標と移動速度で設定する。
72- * @param prm_tx 目標X座標
73- * @param prm_ty 目標Y座標
74- * @param prm_tz 目標Z座標
70+ * 移動方向を座標、移動速度を値で設定する。
71+ * @param prm_tx 移動方向X座標
72+ * @param prm_ty 移動方向Y座標
73+ * @param prm_tz 移動方向Z座標
7574 * @param prm_velo 移動速度
7675 */
7776 void setVeloTwd(coord prm_tx, coord prm_ty, coord prm_tz, velo prm_velo);
7877
78+ /**
79+ * 移動方向を軸回転(Rz, Ry)、移動速度を値で設定する。
80+ * @param prm_rz 移動方向z軸回転値
81+ * @param prm_ry 移動方向y軸回転値
82+ * @param prm_velo 移動速度
83+ */
7984 void setVeloTwd(angle prm_rz, angle prm_ry, velo prm_velo);
8085
81- void setVelo(velo prm_velo_x, velo prm_velo_y, velo prm_velo_z);
86+
87+ /**
88+ * XYZ軸ベクトル成分で、移動速度を設定する .
89+ * @param prm_velo_vc_x
90+ * @param prm_velo_vc_y
91+ * @param prm_velo_vc_z
92+ */
93+ void setVeloByVc(velo prm_velo_vc_x, velo prm_velo_vc_y, velo prm_velo_vc_z);
8294
8395 void setVeloZero();
8496
97+
98+ /**
99+ * 移動方向を座標、移動加速度を値で設定する。
100+ * @param prm_tx 移動方向X座標
101+ * @param prm_ty 移動方向Y座標
102+ * @param prm_tz 移動方向Z座標
103+ * @param prm_acce 移動加速度
104+ */
85105 void setAcceTwd(coord prm_tx, coord prm_ty, coord prm_tz, acce prm_acce);
86106
87- void setAcce(acce prm_acce_x, acce prm_acce_y, acce prm_acce_z);
107+ /**
108+ * XYZ軸ベクトル成分で、移動加速度を設定する .
109+ * @param prm_acce_vc_x
110+ * @param prm_acce_vc_y
111+ * @param prm_acce_vc_z
112+ */
113+ void setAcceByVc(acce prm_acce_vc_x, acce prm_acce_vc_y, acce prm_acce_vc_z);
88114
89115 void setAcceZero();
90116
--- a/GgafDx/include/jp/ggaf/dx/util/Util.h
+++ b/GgafDx/include/jp/ggaf/dx/util/Util.h
@@ -404,9 +404,10 @@ public:
404404 }
405405
406406 /**
407- * 距離の近似を計算 .
408- * @param x
409- * @param y
407+ * 原点からの距離(2D)の近似を計算 .
408+ * sqrt() を使用するよりも速い。
409+ * @param x X座標
410+ * @param y Y座標
410411 * @return
411412 */
412413 static int getApproxDistanceFromOrigin(int x, int y) {
@@ -420,9 +421,11 @@ public:
420421 }
421422
422423 /**
423- * 距離の近似を計算(※ 引数がすべて正と予めわかっている場合のちょい速いバージョン) .
424- * @param abs_x
425- * @param abs_y
424+ * 原点からの距離(2D)の近似を計算 .
425+ * sqrt() を使用するよりも速い。
426+ * 引数がすべて正と予めわかっている場合のちょい速いバージョン
427+ * @param abs_x 正のX座標
428+ * @param abs_y 正のY座標
426429 * @return 原点からの距離の近似
427430 */
428431 static int getApproxDistanceFromOrigin2(int abs_x, int abs_y) {
@@ -433,8 +436,20 @@ public:
433436 return (int)((d + 512) >> 10);
434437 }
435438
439+ /**
440+ * 距離近似値計算(2D) .
441+ * @param x1
442+ * @param y1
443+ * @param x2
444+ * @param y2
445+ * @return 距離の近似
446+ */
447+ static coord getApproxDistance(coord x1, coord y1, coord x2, coord y2) {
448+ return Util::getApproxDistanceFromOrigin(x2-x1, y2-y1);
449+ }
436450
437-// 引数3つバージョンは速度的にsqrt() と同じ。したがって制度が良い sqrt() を使うべき
451+// 引数3つバージョンは速度的にsqrt() と同じ。
452+// したがって精度が良い sqrt() を使うべき考えて、簡易版をいったん削除
438453
439454 // /**
440455 // * 距離の近似を計算(3D) .
@@ -458,17 +473,6 @@ public:
458473 // return Util::getApproxDistanceFromOrigin2(getApproxDistanceFromOrigin2(abs_x, abs_y), abs_z);
459474 // }
460475
461- /**
462- * 距離近似値計算(2D) .
463- * @param x1
464- * @param y1
465- * @param x2
466- * @param y2
467- * @return 距離の近似
468- */
469- static coord getApproxDistance(coord x1, coord y1, coord x2, coord y2) {
470- return Util::getApproxDistanceFromOrigin(x2-x1, y2-y1);
471- }
472476 //
473477 // /**
474478 // * 距離の近似を計算(3D) .
--- a/GgafDx/src/jp/ggaf/dx/actor/supporter/GeoVehicle.cpp
+++ b/GgafDx/src/jp/ggaf/dx/actor/supporter/GeoVehicle.cpp
@@ -5,27 +5,28 @@
55 using namespace GgafDx;
66
77 GeoVehicle::GeoVehicle(GeometricActor* prm_pActor) : ActorVehicle(prm_pActor) {
8- _velo_x = 0;
9- _velo_y = 0;
10- _velo_z = 0;
11- _acce_x = 0;
12- _acce_y = 0;
13- _acce_z = 0;
14- //移動速度上限
8+ _velo = 0;
159 _top_velo = INT_MAX;
16- //移動速度下限
1710 _bottom_velo = 0;
18- //移動加速度上限
11+ _velo_vc_x = 0;
12+ _velo_vc_y = 0;
13+ _velo_vc_z = 0;
14+ _acce = 0;
1915 _top_acce = INT_MAX;
20- //移動加速度下限
2116 _bottom_acce = 0;
22-
23- _velo = 0;
24- _acce = 0;
17+ _acce_vc_x = 0;
18+ _acce_vc_y = 0;
19+ _acce_vc_z = 0;
2520 }
2621
2722
2823 void GeoVehicle::forceVeloRange(velo prm_velo01, velo prm_velo02) {
24+#ifdef MY_DEBUG
25+ if (prm_velo01 < 0 || prm_velo02 < 0) {
26+ throwCriticalException("GeoVehicle::forceVeloRange() 負の速度を範囲設定することはできません。"
27+ " prm_velo01="<<prm_velo01<<",prm_velo02="<<prm_velo02<<"");
28+ }
29+#endif
2930 if (prm_velo01 < prm_velo02) {
3031 _top_velo = prm_velo02;
3132 _bottom_velo = prm_velo01;
@@ -33,16 +34,17 @@ void GeoVehicle::forceVeloRange(velo prm_velo01, velo prm_velo02) {
3334 _top_velo = prm_velo01;
3435 _bottom_velo = prm_velo02;
3536 }
36-#ifdef MY_DEBUG
37- if (_top_velo == 0 ) {
38- _TRACE_("【警告】GeoVehicle::forceVeloRange() 。_top_velo が 0 っておかしいのでは? prm_velo01="<<prm_velo01<<",prm_velo02="<<prm_velo02<<"");
39- }
40-#endif
4137 //再設定して範囲内に補正
42- setVelo(_velo_x, _velo_y, _velo_z);
38+ setVeloByVc(_velo_vc_x, _velo_vc_y, _velo_vc_z);
4339 }
4440
4541 void GeoVehicle::forceAcceRange(acce prm_acce01, acce prm_acce02) {
42+#ifdef MY_DEBUG
43+ if (prm_acce01 < 0 || prm_acce02 < 0) {
44+ throwCriticalException("GeoVehicle::forceAcceRange() 負の加速度を範囲設定することはできません。"
45+ " prm_acce01="<<prm_acce01<<",prm_acce02="<<prm_acce02<<"");
46+ }
47+#endif
4648 if (prm_acce01 < prm_acce02) {
4749 _top_acce = prm_acce02;
4850 _bottom_acce = prm_acce01;
@@ -51,28 +53,31 @@ void GeoVehicle::forceAcceRange(acce prm_acce01, acce prm_acce02) {
5153 _bottom_acce = prm_acce02;
5254 }
5355 //再設定して範囲内に補正
54- setAcce(_acce_x, _acce_y, _acce_z);
56+ setAcceByVc(_acce_vc_x, _acce_vc_y, _acce_vc_z);
5557 }
5658
5759
5860 void GeoVehicle::setVeloTwd(coord prm_tx, coord prm_ty, coord prm_tz, velo prm_velo) {
61+ if (prm_velo == 0) {
62+ _velo_vc_x = _bottom_velo;
63+ _velo_vc_y = 0;
64+ _velo_vc_z = 0;
65+ _velo = _bottom_velo;
66+ return;
67+ }
5968 double vx = prm_tx - _pActor->_x;
6069 double vy = prm_ty - _pActor->_y;
6170 double vz = prm_tz - _pActor->_z;
6271 double p = vx*vx + vy*vy + vz*vz;
6372 if (ZEROd_EQ(p)) {
64- if (_acce == 0) {
65- _velo_x = _bottom_velo;
66- _velo_y = 0;
67- _velo_z = 0;
68- _velo = _bottom_velo;
69- return;
70- }
71- p = 1.0*_acce_x*_acce_x + 1.0*_acce_y*_acce_y + 1.0*_acce_z*_acce_z;
73+ //速度が0になってしまったら
74+ //加速度の方向ベクトルに最低速度を設定
75+ p = 1.0*_acce_vc_x*_acce_vc_x + 1.0*_acce_vc_y*_acce_vc_y + 1.0*_acce_vc_z*_acce_vc_z;
7276 if (ZEROd_EQ(p)) {
73- _velo_x = _bottom_velo;
74- _velo_y = 0;
75- _velo_z = 0;
77+ //加速度も0なら、あきらめて _velo_vc_x に最低速度を設定
78+ _velo_vc_x = _bottom_velo;
79+ _velo_vc_y = 0;
80+ _velo_vc_z = 0;
7681 _velo = _bottom_velo;
7782 return;
7883 }
@@ -83,41 +88,30 @@ void GeoVehicle::setVeloTwd(coord prm_tx, coord prm_ty, coord prm_tz, velo prm_v
8388 } else if (prm_velo < _bottom_velo) {
8489 velo_xyz = _bottom_velo;
8590 }
86- if (velo_xyz == 0) {
87- _velo_x = _bottom_velo;
88- _velo_y = 0;
89- _velo_z = 0;
90- _velo = _bottom_velo;
91- } else {
92- double t = (velo_xyz / sqrt(p));
93- _velo_x = t * vx;
94- _velo_y = t * vy;
95- _velo_z = t * vz;
96- _velo = velo_xyz;
97- }
91+ double t = (velo_xyz / sqrt(p));
92+ _velo_vc_x = t * vx;
93+ _velo_vc_y = t * vy;
94+ _velo_vc_z = t * vz;
95+ _velo = velo_xyz;
9896 }
9997
10098 void GeoVehicle::setVeloTwd(angle prm_rz, angle prm_ry, velo prm_velo) {
10199 float vx, vy, vz;
102100 UTIL::convRzRyToVector(prm_rz, prm_ry, vx, vy, vz);
103- setVelo(vx*prm_velo, vy*prm_velo, vz*prm_velo);
101+ setVeloByVc(vx*prm_velo, vy*prm_velo, vz*prm_velo);
104102 }
105103
106-void GeoVehicle::setVelo(velo prm_velo_x, velo prm_velo_y, velo prm_velo_z) {
107- double p = 1.0*prm_velo_x*prm_velo_x + 1.0*prm_velo_y*prm_velo_y + 1.0*prm_velo_z*prm_velo_z;
104+void GeoVehicle::setVeloByVc(velo prm_velo_vc_x, velo prm_velo_vc_y, velo prm_velo_vc_z) {
105+ double p = 1.0*prm_velo_vc_x*prm_velo_vc_x + 1.0*prm_velo_vc_y*prm_velo_vc_y + 1.0*prm_velo_vc_z*prm_velo_vc_z;
108106 if (ZEROd_EQ(p)) {
109- if (_acce == 0) {
110- _velo_x = _bottom_velo;
111- _velo_y = 0;
112- _velo_z = 0;
113- _velo = _bottom_velo;
114- return;
115- }
116- p = 1.0*_acce_x*_acce_x + 1.0*_acce_y*_acce_y + 1.0*_acce_z*_acce_z;
107+ //速度が0になってしまったら
108+ //加速度の方向ベクトルに最低速度を設定
109+ p = 1.0*_acce_vc_x*_acce_vc_x + 1.0*_acce_vc_y*_acce_vc_y + 1.0*_acce_vc_z*_acce_vc_z;
117110 if (ZEROd_EQ(p)) {
118- _velo_x = _bottom_velo;
119- _velo_y = 0;
120- _velo_z = 0;
111+ //加速度も0なら、あきらめて _velo_vc_x に最低速度を設定
112+ _velo_vc_x = _bottom_velo;
113+ _velo_vc_y = 0;
114+ _velo_vc_z = 0;
121115 _velo = _bottom_velo;
122116 return;
123117 }
@@ -125,29 +119,28 @@ void GeoVehicle::setVelo(velo prm_velo_x, velo prm_velo_y, velo prm_velo_z) {
125119 double velo_xyz = sqrt(p);
126120 if (velo_xyz > _top_velo) {
127121 double t = _top_velo/velo_xyz;
128- _velo_x = t * prm_velo_x;
129- _velo_y = t * prm_velo_y;
130- _velo_z = t * prm_velo_z;
122+ _velo_vc_x = t * prm_velo_vc_x;
123+ _velo_vc_y = t * prm_velo_vc_y;
124+ _velo_vc_z = t * prm_velo_vc_z;
131125 _velo = _top_velo;
132126 return;
133127 } else if (velo_xyz < _bottom_velo) {
134128 double t = _bottom_velo/velo_xyz;
135- _velo_x = t * prm_velo_x;
136- _velo_y = t * prm_velo_y;
137- _velo_z = t * prm_velo_z;
129+ _velo_vc_x = t * prm_velo_vc_x;
130+ _velo_vc_y = t * prm_velo_vc_y;
131+ _velo_vc_z = t * prm_velo_vc_z;
138132 _velo = _bottom_velo;
139133 return;
140134 } else {
141- double t = 1.0;
142- _velo_x = t * prm_velo_x;
143- _velo_y = t * prm_velo_y;
144- _velo_z = t * prm_velo_z;
135+ _velo_vc_x = prm_velo_vc_x;
136+ _velo_vc_y = prm_velo_vc_y;
137+ _velo_vc_z = prm_velo_vc_z;
145138 _velo = velo_xyz;
146139 return;
147140 }
148141 }
149142 void GeoVehicle::setVeloZero() {
150- setVelo(0,0,0);
143+ setVeloByVc(0,0,0);
151144 }
152145
153146 void GeoVehicle::setAcceTwd(coord prm_tx, coord prm_ty, coord prm_tz, acce prm_acce) {
@@ -162,68 +155,66 @@ void GeoVehicle::setAcceTwd(coord prm_tx, coord prm_ty, coord prm_tz, acce prm_a
162155 double vz = prm_tz - _pActor->_z;
163156 double p = vx*vx + vy*vy + vz*vz;
164157 if (ZEROd_EQ(p)) {
165- _acce_x = _bottom_acce;
166- _acce_y = 0;
167- _acce_z = 0;
158+ _acce_vc_x = _bottom_acce;
159+ _acce_vc_y = 0;
160+ _acce_vc_z = 0;
168161 _acce = _bottom_acce;
169162 } else {
170163 double t = (acce_xyz / sqrt(vx*vx + vy*vy + vz*vz));
171- _acce_x = t * vx;
172- _acce_y = t * vy;
173- _acce_z = t * vz;
164+ _acce_vc_x = t * vx;
165+ _acce_vc_y = t * vy;
166+ _acce_vc_z = t * vz;
174167 _acce = acce_xyz;
175168 }
176169 }
177170
178-void GeoVehicle::setAcce(acce prm_acce_x, acce prm_acce_y, acce prm_acce_z) {
179- double p = 1.0 * prm_acce_x * prm_acce_x + 1.0 * prm_acce_y * prm_acce_y + 1.0 * prm_acce_z * prm_acce_z;
171+void GeoVehicle::setAcceByVc(acce prm_acce_vc_x, acce prm_acce_vc_y, acce prm_acce_vc_z) {
172+ double p = 1.0 * prm_acce_vc_x * prm_acce_vc_x + 1.0 * prm_acce_vc_y * prm_acce_vc_y + 1.0 * prm_acce_vc_z * prm_acce_vc_z;
180173 if (ZEROd_EQ(p)) {
181- _acce_x = _bottom_acce;
182- _acce_y = 0;
183- _acce_z = 0;
174+ _acce_vc_x = _bottom_acce;
175+ _acce_vc_y = 0;
176+ _acce_vc_z = 0;
184177 _acce = _bottom_acce;
185178 } else {
186179 double acce_xyz = sqrt(p);
187180 if (acce_xyz > _top_acce) {
188181 double t = _top_acce/acce_xyz;
189- _acce_x = t * prm_acce_x;
190- _acce_y = t * prm_acce_y;
191- _acce_z = t * prm_acce_z;
182+ _acce_vc_x = t * prm_acce_vc_x;
183+ _acce_vc_y = t * prm_acce_vc_y;
184+ _acce_vc_z = t * prm_acce_vc_z;
192185 _acce = _top_acce;
193186 } else if (acce_xyz < _bottom_acce) {
194187 double t = _bottom_acce/acce_xyz;
195- _acce_x = t * prm_acce_x;
196- _acce_y = t * prm_acce_y;
197- _acce_z = t * prm_acce_z;
188+ _acce_vc_x = t * prm_acce_vc_x;
189+ _acce_vc_y = t * prm_acce_vc_y;
190+ _acce_vc_z = t * prm_acce_vc_z;
198191 _acce = _bottom_acce;
199192 } else {
200- double t = 1.0;
201- _acce_x = t * prm_acce_x;
202- _acce_y = t * prm_acce_y;
203- _acce_z = t * prm_acce_z;
193+ _acce_vc_x = prm_acce_vc_x;
194+ _acce_vc_y = prm_acce_vc_y;
195+ _acce_vc_z = prm_acce_vc_z;
204196 _acce = acce_xyz;
205197 return;
206198 }
207199 }
208200 }
201+
209202 void GeoVehicle::setAcceZero() {
210- _acce_x = _bottom_acce;
211- _acce_y = 0;
212- _acce_z = 0;
203+ _acce_vc_x = _bottom_acce;
204+ _acce_vc_y = 0;
205+ _acce_vc_z = 0;
213206 _acce = _bottom_acce;
214207 }
215208
216-
217209 void GeoVehicle::behave() {
218210 if (_acce != 0) {
219- setVelo(_velo_x+_acce_x, _velo_y+_acce_y, _velo_z+_acce_z);
211+ setVeloByVc(_velo_vc_x+_acce_vc_x, _velo_vc_y+_acce_vc_y, _velo_vc_z+_acce_vc_z);
220212 }
221213 //Actorに反映
222- _pActor->_x += _velo_x;
223- _pActor->_y += _velo_y;
224- _pActor->_z += _velo_z;
214+ _pActor->_x += _velo_vc_x;
215+ _pActor->_y += _velo_vc_y;
216+ _pActor->_z += _velo_vc_z;
225217 }
226218
227-
228219 GeoVehicle::~GeoVehicle() {
229220 }
--- a/Mogera/src/actor/SmpActor2.cpp
+++ b/Mogera/src/actor/SmpActor2.cpp
@@ -72,7 +72,7 @@ void SmpActor2::processBehavior() {
7272
7373 if (GgafDx::Input::isPressedKey(DIK_A)) {
7474 pGeoVehicle->forceVeloRange(0, PX_C(3));
75- pGeoVehicle->setAcce(PX_C(0.01), PX_C(0.02), PX_C(0));
75+ pGeoVehicle->setAcceByVc(PX_C(0.01), PX_C(0.02), PX_C(0));
7676
7777 }
7878 _TRACE_("x,y,z="<<_x<<", "<<_y<<", "<<_z);
--- a/VioletVreath/src/jp/gecchi/VioletVreath/actor/my/Bunshin/MyBunshinWateringLaserChip001.cpp
+++ b/VioletVreath/src/jp/gecchi/VioletVreath/actor/my/Bunshin/MyBunshinWateringLaserChip001.cpp
@@ -25,10 +25,10 @@ using namespace VioletVreath;
2525
2626 const velo MyBunshinWateringLaserChip001::MAX_VELO_RENGE = PX_C(512); //この値を大きくすると、最高速度が早くなる。
2727 const double MyBunshinWateringLaserChip001::INV_MAX_VELO_RENGE = 1.0 / MAX_VELO_RENGE;
28-const int MyBunshinWateringLaserChip001::R_MAX_ACCE = 15; //この値を大きくすると、カーブが緩くなる
29-const velo MyBunshinWateringLaserChip001::INITIAL_VELO = MAX_VELO_RENGE*0.5; //レーザー発射時の初期速度
28+const int MyBunshinWateringLaserChip001::R_MAX_ACCE = 16; //この値を大きくすると、カーブが緩くなる
29+const velo MyBunshinWateringLaserChip001::INITIAL_VELO = MAX_VELO_RENGE*0.6; //レーザー発射時の初期速度
3030 const double MyBunshinWateringLaserChip001::RR_MAX_ACCE = 1.0 / R_MAX_ACCE; //計算簡素化用
31-const float MyBunshinWateringLaserChip001::MAX_ACCE_RENGE = MAX_VELO_RENGE/R_MAX_ACCE;
31+const acce MyBunshinWateringLaserChip001::MAX_ACCE_RENGE = MAX_VELO_RENGE/R_MAX_ACCE;
3232 const velo MyBunshinWateringLaserChip001::MIN_VELO_ = MyBunshinWateringLaserChip001::INITIAL_VELO/10; // ÷10 は、最低移動する各軸のINITIAL_VELOの割合
3333 GgafDx::Model* MyBunshinWateringLaserChip001::pModel_ = nullptr;
3434 int MyBunshinWateringLaserChip001::tex_no_ = 0;
@@ -95,17 +95,11 @@ void MyBunshinWateringLaserChip001::processBehavior() {
9595 double power = active_frame <= 300 ? UTIL::SHOT_POWER[active_frame] : UTIL::SHOT_POWER[300];
9696 getStatus()->set(STAT_AttackPowerRate, power);
9797 _power = power;
98-
9998 GgafDx::GeoVehicle* const pGeoVehicle = getGeoVehicle();
100-
101-// if (strcmp(getName(), "Bunshin4's LaserChip(75)") == 0 && _frame_of_life > 4413) {
102-// _TRACE_("なんでや1 "<<pGeoVehicle->_velo_x<<","<<pGeoVehicle->_velo_y<<","<<pGeoVehicle->_velo_z);
103-// }
104-
10599 MyBunshin::AimInfo* pAimInfo = pAimInfo_;
106100
107- if (active_frame >= 60*20) {
108- sayonara(); //保険のタイムアウト20秒
101+ if (active_frame >= 60*10) {
102+ sayonara(); //保険のタイムアウト10秒
109103 } else if (pAimInfo == nullptr || active_frame < 7) {
110104 //なにもしない
111105 } else {
@@ -125,17 +119,17 @@ void MyBunshinWateringLaserChip001::processBehavior() {
125119 //●Leader が t1 へ Aim
126120 if (pAimTarget->isActiveInTheTree() && active_frame < aim_time_out_t1) {
127121 //pAimTarget が存命
128- int vx1 = pGeoVehicle->_velo_x;
129- int vy1 = pGeoVehicle->_velo_y;
130- int vz1 = pGeoVehicle->_velo_z;
122+ int vx1 = pGeoVehicle->_velo_vc_x;
123+ int vy1 = pGeoVehicle->_velo_vc_y;
124+ int vz1 = pGeoVehicle->_velo_vc_z;
131125
132126 aimChip(pAimInfo->t1_x,
133127 pAimInfo->t1_y,
134128 pAimInfo->t1_z );
135129
136- int vx2 = pGeoVehicle->_velo_x;
137- int vy2 = pGeoVehicle->_velo_y;
138- int vz2 = pGeoVehicle->_velo_z;
130+ int vx2 = pGeoVehicle->_velo_vc_x;
131+ int vy2 = pGeoVehicle->_velo_vc_y;
132+ int vz2 = pGeoVehicle->_velo_vc_z;
139133
140134 int sgn_vx = SGN(vx1 - vx2);
141135 int sgn_vy = SGN(vy1 - vy2);
@@ -154,6 +148,7 @@ void MyBunshinWateringLaserChip001::processBehavior() {
154148 if (inv_cnt_ > 10) { //10回も速度の正負が入れ替わったら終了
155149 pAimInfo_->spent_frames_to_t1 = active_frame; //Aim t1 終了
156150 } else {
151+ // t1 と衝突したら終了
157152 static const coord renge = MyBunshinWateringLaserChip001::INITIAL_VELO;
158153 static const ucoord renge2 = renge*2;
159154 if ( (ucoord)(_x - pAimInfo->t1_x + renge) <= renge2) {
@@ -173,7 +168,7 @@ void MyBunshinWateringLaserChip001::processBehavior() {
173168 //●Leader が t1 へ Aim し終わったあと
174169 //t2を決める
175170 static const Spacetime* pSpaceTime = pGOD->getSpacetime();
176- static const double zf_r = UTIL::getDistance(
171+ static const double ZF_R = UTIL::getDistance(
177172 0.0, 0.0, 0.0,
178173 (double)(pSpaceTime->_x_bound_right),
179174 (double)(pSpaceTime->_y_bound_top),
@@ -187,15 +182,15 @@ void MyBunshinWateringLaserChip001::processBehavior() {
187182 }
188183 }
189184 if (pB) {
190- pAimInfo->setT2(zf_r, pB->_x, pB->_y, pB->_z, _x, _y, _z);
185+ pAimInfo->setT2(ZF_R, pB->_x, pB->_y, pB->_z, _x, _y, _z);
191186 } else {
192- pAimInfo->setT2(zf_r, pOrg_->_x, pOrg_->_y, pOrg_->_z, _x, _y, _z);
187+ pAimInfo->setT2(ZF_R, pOrg_->_x, pOrg_->_y, pOrg_->_z, _x, _y, _z);
193188 }
194189 coord t2_d = UTIL::getDistance(_x, _y, _z,
195190 pAimInfo->t2_x,
196191 pAimInfo->t2_y,
197192 pAimInfo->t2_z);
198- pAimInfo->spent_frames_to_t2 = active_frame + (frame)(t2_d*MyBunshinWateringLaserChip001::INV_MAX_VELO_RENGE); //t2到達時間概算
193+ pAimInfo->spent_frames_to_t2 = active_frame + (frame)(t2_d/MyBunshinWateringLaserChip001::MAX_VELO_RENGE); //t2到達時間概算
199194 aimChip(pAimInfo->t2_x,
200195 pAimInfo->t2_y,
201196 pAimInfo->t2_z );
@@ -206,9 +201,9 @@ void MyBunshinWateringLaserChip001::processBehavior() {
206201 pAimInfo->t2_y,
207202 pAimInfo->t2_z );
208203 } else {
209- aimChip(_x + pGeoVehicle->_velo_x*4+1,
210- _y + pGeoVehicle->_velo_y*4+1,
211- _z + pGeoVehicle->_velo_z*4+1 );
204+ aimChip(_x + pGeoVehicle->_velo_vc_x*4+1,
205+ _y + pGeoVehicle->_velo_vc_y*4+1,
206+ _z + pGeoVehicle->_velo_vc_z*4+1 );
212207 }
213208 }
214209 } else {
@@ -236,9 +231,9 @@ void MyBunshinWateringLaserChip001::processBehavior() {
236231 pAimLeaderChip->_y,
237232 pAimLeaderChip->_z );
238233 } else {
239- aimChip(pAimInfo->t1_x,
240- pAimInfo->t1_y,
241- pAimInfo->t1_z );
234+ aimChip(_x + pGeoVehicle->_velo_vc_x*4+1,
235+ _y + pGeoVehicle->_velo_vc_y*4+1,
236+ _z + pGeoVehicle->_velo_vc_z*4+1 );
242237 }
243238 } else if (active_frame <= pAimInfo->spent_frames_to_t1) {
244239 //●Leader以外が t1 が定まってから t1 到達までの動き
@@ -254,17 +249,23 @@ void MyBunshinWateringLaserChip001::processBehavior() {
254249 pAimLeaderChip->_y,
255250 pAimLeaderChip->_z );
256251 } else {
257- aimChip(_x + pGeoVehicle->_velo_x*4+1,
258- _y + pGeoVehicle->_velo_y*4+1,
259- _z + pGeoVehicle->_velo_z*4+1 );
252+ aimChip(_x + pGeoVehicle->_velo_vc_x*4+1,
253+ _y + pGeoVehicle->_velo_vc_y*4+1,
254+ _z + pGeoVehicle->_velo_vc_z*4+1 );
260255 }
261256 } else if (active_frame <= pAimInfo->spent_frames_to_t2) {
262257 //●その後 Leader以外が t2 が定まって、t2に向かうまでの動き
258+ //aimChip(pAimInfo->t2_x,
259+ // pAimInfo->t2_y,
260+ // pAimInfo->t2_z );
261+
262+ //t2 ではなくて、あえて LeaderChip を優先で追いかける。そのほうがそれっぽい動きになる。
263263 if (pAimLeaderChip) {
264264 aimChip(pAimLeaderChip->_x,
265265 pAimLeaderChip->_y,
266266 pAimLeaderChip->_z );
267267 } else {
268+ // LeaderChip がいないなら、仕方ないので本来の t2 へ
268269 aimChip(pAimInfo->t2_x,
269270 pAimInfo->t2_y,
270271 pAimInfo->t2_z );
@@ -276,9 +277,9 @@ void MyBunshinWateringLaserChip001::processBehavior() {
276277 pAimLeaderChip->_y,
277278 pAimLeaderChip->_z );
278279 } else {
279- aimChip(_x + pGeoVehicle->_velo_x*4+1,
280- _y + pGeoVehicle->_velo_y*4+1,
281- _z + pGeoVehicle->_velo_z*4+1 );
280+ aimChip(_x + pGeoVehicle->_velo_vc_x*4+1,
281+ _y + pGeoVehicle->_velo_vc_y*4+1,
282+ _z + pGeoVehicle->_velo_vc_z*4+1 );
282283 }
283284 } else {
284285 _TRACE_("【警告】ありえない");
@@ -289,23 +290,7 @@ void MyBunshinWateringLaserChip001::processBehavior() {
289290 } //if (pAimTarget)
290291
291292 }
292-
293-
294-// if (strcmp(getName(), "Bunshin4's LaserChip(75)") == 0 && _frame_of_life > 4413) {
295-// _TRACE_("なんでや3 "<<pGeoVehicle->_velo_x<<","<<pGeoVehicle->_velo_y<<","<<pGeoVehicle->_velo_z);
296-// }
297-//
298-// if (strcmp(getName(), "Bunshin4's LaserChip(75)") == 0 && _frame_of_life == 4416) {
299-// _TRACE_("きたで3 "<<pGeoVehicle->_velo_x<<","<<pGeoVehicle->_velo_y<<","<<pGeoVehicle->_velo_z);
300-// }
301-
302-
303293 pGeoVehicle->behave();
304-
305-// if (strcmp(getName(), "Bunshin4's LaserChip(75)") == 0 && _frame_of_life > 4413) {
306-//// && pGeoVehicle->_velo_x == 0 && pGeoVehicle->_velo_y == 0 && pGeoVehicle->_velo_z == 0) {
307-// _TRACE_("なんでや4 "<<pGeoVehicle->_velo_x<<","<<pGeoVehicle->_velo_y<<","<<pGeoVehicle->_velo_z);
308-// }
309294 WateringLaserChip::processBehavior();
310295
311296 tmp_x_ = _x;
@@ -316,11 +301,6 @@ void MyBunshinWateringLaserChip001::processBehavior() {
316301 void MyBunshinWateringLaserChip001::processSettlementBehavior() {
317302 //分身はFKなので、絶対座標の確定が processSettlementBehavior() 以降となるため、ここで初期設定が必要
318303 GgafDx::GeoVehicle* const pGeoVehicle = getGeoVehicle();
319-
320-// if (strcmp(getName(), "Bunshin4's LaserChip(75)") == 0 && _frame_of_life > 4413) {
321-// _TRACE_("なんでや5 "<<pGeoVehicle->_velo_x<<","<<pGeoVehicle->_velo_y<<","<<pGeoVehicle->_velo_z);
322-// }
323-
324304 if (hasJustChangedToActive()) {
325305 //チップの初期設定
326306 //ロックオン情報の引き継ぎ
@@ -345,15 +325,9 @@ void MyBunshinWateringLaserChip001::processSettlementBehavior() {
345325 pAimInfo_->pLeaderChip = this;
346326 pAimInfo_->pTarget = nullptr;
347327 }
348- pGeoVehicle->forceVeloRange(MIN_VELO_, MAX_VELO_RENGE);
349328 } else {
350329 //先端以外は前のを受け継ぐ
351330 pAimInfo_ = pF->pAimInfo_; //受け継ぐ
352-
353- pGeoVehicle->forceVeloRange(MIN_VELO_, MAX_VELO_RENGE);
354-
355-// velo v = MAX_VELO_RENGE - PX_C(1); //レーザーが弛まないように PX_C(1) 遅くした
356-// pGeoVehicle->forceVeloRange(MIN_VELO_, v);
357331 #ifdef MY_DEBUG
358332 if (pAimInfo_ == nullptr) {
359333 throwCriticalException("pAimInfo_ が引き継がれていません!"<<this<<
@@ -415,13 +389,9 @@ throwCriticalException("pAimInfo_
415389 // pGeoVehicle->_velo_z,
416390 // _rz, _ry );
417391 }
418-
419-// if (strcmp(getName(), "Bunshin4's LaserChip(75)") == 0 && _frame_of_life > 4413) {
420-// _TRACE_("なんでや6 "<<pGeoVehicle->_velo_x<<","<<pGeoVehicle->_velo_y<<","<<pGeoVehicle->_velo_z);
421-// }
422- UTIL::convVectorToRzRy(pGeoVehicle->_velo_x,
423- pGeoVehicle->_velo_y,
424- pGeoVehicle->_velo_z,
392+ UTIL::convVectorToRzRy(pGeoVehicle->_velo_vc_x,
393+ pGeoVehicle->_velo_vc_y,
394+ pGeoVehicle->_velo_vc_z,
425395 _rz, _ry );
426396 }
427397 WateringLaserChip::processSettlementBehavior();
@@ -472,44 +442,24 @@ void MyBunshinWateringLaserChip001::aimChip(int tX, int tY, int tZ) {
472442 #endif
473443
474444
475- static const coord rv = 10.0;
445+ static const coord rv = 10; // 5
476446 GgafDx::GeoVehicle* pGeoVehicle = getGeoVehicle();
477447 //自→仮、自方向ベクトル(vM)
478- coord vMx = pGeoVehicle->_velo_x;
479- coord vMy = pGeoVehicle->_velo_y;
480- coord vMz = pGeoVehicle->_velo_z;
448+ coord vMx = pGeoVehicle->_velo_vc_x;
449+ coord vMy = pGeoVehicle->_velo_vc_y;
450+ coord vMz = pGeoVehicle->_velo_vc_z;
481451 //|vM|
482-// double lvM = sqrt(vMx*vMx + vMy*vMy + vMz*vMz);
483-// coord lvM = UTIL::getDistanceFromOrigin(vMx, vMy, vMz);
484-
485452 coord lvM = pGeoVehicle->_velo;
486- //|vM|があまりに小さい場合=速度が遅すぎる場合を考慮
487-// if (lvM < MIN_VELO_) { //縮こまらないように
488-// if (ZEROd_EQ(lvM)) {
489-// //速度が殆ど0でもうどっち向いてるかわからんので、X軸方向に飛ばす
490-// pGeoVehicle->setVelo(MIN_VELO_, 0, 0);
491-// } else {
492-// //速度 MIN_VELO_ を保証する
493-// double r = (1.0*MIN_VELO_/lvM);
494-// pGeoVehicle->setVelo(vMx*r, vMy*r, vMz*r);
495-// }
496-// vMx = pGeoVehicle->_velo_x;
497-// vMy = pGeoVehicle->_velo_y;
498-// vMz = pGeoVehicle->_velo_z;
499-// lvM = MIN_VELO_;
500-// }
453+
501454 coord vVMx = vMx * rv;
502455 coord vVMy = vMy * rv;
503456 coord vVMz = vMz * rv;
504457 coord lvVM = lvM * rv;
505-
506-
507458 //自→的、方向ベクトル (vT)
508459 coord vTx = tX - _x;
509460 coord vTy = tY - _y;
510461 coord vTz = tZ - _z;
511462 //|vT|
512-// double lvT = sqrt(vTx*vTx + vTy*vTy + vTz*vTz);
513463 coord lvT = UTIL::getDistanceFromOrigin(vTx, vTy, vTz);
514464 //|仮的| を lvVM の長さに合わせて作成
515465 double rMT = (lvVM * 1.2 / lvT) ;
@@ -519,20 +469,11 @@ void MyBunshinWateringLaserChip001::aimChip(int tX, int tY, int tZ) {
519469 coord vVTy = vTy * rMT;
520470 coord vVTz = vTz * rMT;
521471 coord lvVT = lvT * rMT;
522-// double cos_th = ((vMx*vTx + vMy*vTy + vMz*vTz) / (lvT * lvM)); //なす角
523-// if (cos_th < 0.5) {
524-// cos_th = 0.5;
525-// }
526472 //vVP 仮自→仮的 の加速度設定
527473 //→vVP=( vVTx-vVMx, vVTy-vVMy, vVTz-vVMz )
528- const acce accX = (vVTx-vVMx) * RR_MAX_ACCE; // * cos_th;
529- const acce accY = (vVTy-vVMy) * RR_MAX_ACCE; // * cos_th;
530- const acce accZ = (vVTz-vVMz) * RR_MAX_ACCE; // * cos_th;
531-// double top_acce_mv = pGeoVehicle->_top_acce_x*1.05; //ちょっとずつなら拡張しちょいよみたいな
532-// if (MAX_VELO_RENGE < top_acce_mv && top_acce_mv < MAX_VELO_RENGE) {
533-// pGeoVehicle->forceAcceXYZRange(-top_acce_mv, top_acce_mv);
534-// }
535- pGeoVehicle->setAcce(accX, accY, accZ);
474+ pGeoVehicle->setAcceByVc((vVTx-vVMx) * RR_MAX_ACCE,
475+ (vVTy-vVMy) * RR_MAX_ACCE,
476+ (vVTz-vVMz) * RR_MAX_ACCE);
536477 }
537478
538479
@@ -553,8 +494,7 @@ void MyBunshinWateringLaserChip001::onHit(const GgafCore::Actor* prm_pOtherActor
553494 if (stamina <= 0) {
554495 //一撃でチップ消滅の攻撃力
555496 getStatus()->set(STAT_Stamina, default_stamina_);
556-//TODO:ここで sayonara() せずに、しばらく理想のホーミングレーザー軌跡を研究する!
557- //sayonara();
497+ sayonara();
558498 } else {
559499 //耐えれるならば、通貫し、スタミナ回復(攻撃力100の雑魚ならば通貫)
560500 getStatus()->set(STAT_Stamina, default_stamina_);
--- a/VioletVreath/src/jp/gecchi/VioletVreath/actor/my/Bunshin/MyBunshinWateringLaserChip001.h
+++ b/VioletVreath/src/jp/gecchi/VioletVreath/actor/my/Bunshin/MyBunshinWateringLaserChip001.h
@@ -42,8 +42,8 @@ public:
4242 static const velo MAX_VELO_RENGE;
4343 /** [r]計算用 */
4444 static const double INV_MAX_VELO_RENGE;
45- /** 加速度範囲(-MAX_ACCE_RENGE, MAX_ACCE_RENGE) */
46- static const float MAX_ACCE_RENGE;
45+ /** 加速度範囲(0, MAX_ACCE_RENGE) */
46+ static const acce MAX_ACCE_RENGE;
4747
4848 static const velo INITIAL_VELO;
4949
--- a/VioletVreath_launcher/.cproject
+++ b/VioletVreath_launcher/.cproject
@@ -822,7 +822,7 @@
822822 </extensions>
823823 </storageModule>
824824 <storageModule moduleId="cdtBuildSystem" version="4.0.0">
825- <configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.VCErrorParser" id="cdt.managedbuild.config.gnu.cygwin.exe.debug.2121379341.247885131.632570595.1831413570" name="DebugCdt_x64" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=" parent="cdt.managedbuild.config.gnu.cygwin.exe.debug" postannouncebuildStep="" postbuildStep="" preannouncebuildStep="" prebuildStep="pwd">
825+ <configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.VCErrorParser" id="cdt.managedbuild.config.gnu.cygwin.exe.debug.2121379341.247885131.632570595.1831413570" name="DebugCdt_x64" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=" parent="cdt.managedbuild.config.gnu.cygwin.exe.debug" postannouncebuildStep="" postbuildStep="" preannouncebuildStep="" prebuildStep="pwd">
826826 <folderInfo id="cdt.managedbuild.config.gnu.cygwin.exe.debug.2121379341.247885131.632570595.1831413570." name="/" resourcePath="">
827827 <toolChain errorParsers="" id="cdt.managedbuild.toolchain.gnu.mingw.base.1846276466" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
828828 <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE;org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="cdt.managedbuild.target.gnu.platform.mingw.base.1860135973" name="デバッグ・プラットフォーム" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>