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

質問編集履歴

2

更新

2020/08/24 08:04

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -342,6 +342,8 @@
342
342
  }
343
343
  **↓ヘッダー**
344
344
  ```c
345
+ ```c
346
+ ```c
345
347
 
346
348
  #include "../PlayScene/Utility.h"
347
349
  #include "Database.h"
@@ -536,11 +538,9 @@
536
538
  //自機の表示
537
539
  mSprite.Draw();
538
540
  }
539
- コード
541
+
540
542
  ```
541
- ```
542
- ```
543
- ```
544
543
 
544
+
545
545
  ```### 前提・実現したいこと
546
546
  シューティングを作っているのですが誘導弾のやり方がわかりません。わかりやすくお願いします。

1

ミス

2020/08/24 08:04

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,25 +1,546 @@
1
- ### 前提・実現したいこと
1
+ ```c
2
- シューティングを作っているですが誘導弾のやり方がわかりません。わかりやすくお願いします。
2
+ #include<math.h> //計算h
3
- ここに質問の内容を詳しく書いてください。
4
- (例)PHP(CakePHP)で●●なシステムを作っています。
5
- ■■な機能を実装中に以下のエラーメッセージが発生しました。
6
3
 
7
- ### 発生している問題・エラーメッセージ
4
+ #include "Player.h"
8
5
 
9
- ```
10
- エラーメッセージ
6
+ #include"../GameMain.h"
11
- ```
12
7
 
13
- ### 該当のソースコード
14
8
 
9
+ //プレイヤーの状態
15
- ```ここに言語名を入力
10
+ enum PLAYER_STATE
16
- ソースコード
11
+ {
12
+ PLAYER_STATE_ACTIVE, //操作できる状態
13
+ PLAYER_STATE_BOMB, //やられ状態
17
- ```
14
+ };
18
15
 
19
- ### 試したこと
16
+ //飛行機の画像切り取り情報
17
+ #define PLAYER_RECT_X1 0
18
+ #define PLAYER_RECT_Y1 0
19
+ #define PLAYER_RECT_X2 32
20
+ #define PLAYER_RECT_Y2 32
20
21
 
22
+ //移動スピード
21
- ここに問題に対して試したことを記載してください。
23
+ #define PLAYER_VEL 3.0f
22
24
 
23
- ### 補足情報(FW/ツールバージョンなど)
25
+ //弾発射感覚
26
+ #define PLAYER_BULLET_INTERVAL 5
24
27
 
28
+ //初期の残機
29
+ #define PLAYER_STOCK_DEFAULT 3
30
+
31
+ //プレイヤーの当たり判定
32
+ #define PLAYER_RADIUS 5.0f
33
+
34
+ // プレイヤーのジャンプ力
35
+ #define PLAYER_JUMP -15.0f;
36
+
37
+ // プレイヤーの偽重力
38
+ #define PLAYER_GRAVITY 0.1f
39
+
40
+
41
+ /*---------------------------
42
+ 初期化
43
+ ----------------------------*/
44
+ void Player::Initialize(int textureHandle, BulletManager* pBulletManager)
45
+ {
46
+ //状態の初期化
47
+ mState = PLAYER_STATE_ACTIVE;
48
+
49
+ //画像の設定
50
+ /*mSprite.SetTexture(textureHandle);
51
+ mSprite.src.x = PLAYER_RECT_X1;
52
+ mSprite.src.y = PLAYER_RECT_Y1;
53
+ mSprite.size.x = PLAYER_RECT_X2;
54
+ mSprite.size.y = PLAYER_RECT_Y2;*/
55
+
56
+
57
+ mSprite.SetTexture(textureHandle);
58
+
59
+ mSprite.src.x = 0;
60
+ mSprite.src.y = 64;
61
+ mSprite.size.x = PLAYER_RECT_X2;
62
+ mSprite.size.y = PLAYER_RECT_Y2;
63
+
64
+
65
+ mSprite.scale.x = 1.0f;
66
+ mSprite.scale.y = 1.0f;
67
+
68
+ mSprite.alpha = 1.0f;
69
+
70
+
71
+
72
+
73
+
25
- ここより詳細な情報記載してください。
74
+ //画像座標反映
75
+ mSprite.pos.x = mPos.x;
76
+ mSprite.pos.y = mPos.y;
77
+
78
+ //弾の管理者のポインタ(連絡先)を保存
79
+ mpBulletManager = pBulletManager;
80
+
81
+
82
+ //弾の発射感覚管理用タイマーの初期化
83
+ mShootIntervalTimer = 0;
84
+
85
+ //残機の初期化
86
+ mStock = PLAYER_STOCK_DEFAULT;
87
+
88
+ //爆破用タイマーの初期化
89
+ mBombTimer = 0;
90
+
91
+ //pleyer無敵時間用のタイマー
92
+ mPTimer = 0;
93
+
94
+ //モーションタイマー
95
+ mMotionTimer = 0;
96
+
97
+ //当たり判定の初期化
98
+ mCollision.mRadius = PLAYER_RADIUS;
99
+ mCollision.mPos.x = mPos.x;
100
+ mCollision.mPos.y = mPos.y;
101
+
102
+
103
+ ////初期座標の設定
104
+ mPos.x = SCREEN_LEFT - 100;
105
+ mPos.y = 240;
106
+
107
+ //mPosX = SCREEN_CENTER_X;
108
+ //mPosY = SCREEN_CENTER_X; // 適当な数字
109
+
110
+
111
+ mVelX = 0.0f;
112
+ mVelY = 0.0f;
113
+
114
+ mIsJump = FALSE;
115
+
116
+ }
117
+
118
+ /*--------------------------------
119
+ 更新
120
+ -------------------------------*/
121
+ void Player::Update(void)
122
+ {
123
+ switch (mState)
124
+ {
125
+ //操作できる状態 =============
126
+ case PLAYER_STATE_ACTIVE:
127
+ {
128
+ if (mMotionTimer <= 20) //タイマーが20より上になるまでタイマーを進める
129
+ {
130
+ mMotionTimer++;
131
+ mPos.x += mMotionTimer; //プレイヤーのx座標を増やす
132
+ }
133
+
134
+ else if (mMotionTimer >= 20)
135
+ {
136
+
137
+ }
138
+
139
+
140
+ //タイマー処理
141
+ ++mShootIntervalTimer %= PLAYER_BULLET_INTERVAL;
142
+
143
+ // 移動処理
144
+ Move();
145
+
146
+ //弾の発射処理
147
+ if (mShootIntervalTimer == 1 && IsButtonDown(PAD_INPUT_1) == TRUE)
148
+ {
149
+
150
+ mpBulletManager->Shot(BULLET_TYPE_PLAYER_NORMAL,
151
+ SHOOTER_TYPE_PLAYER, mPos);
152
+
153
+
154
+ PlaySoundMem(mShooting1, DX_PLAYTYPE_BACK); //弾発射で音再生
155
+
156
+ }
157
+
158
+ if (mShootIntervalTimer == 0 && IsButtonDown(PAD_INPUT_2) == TRUE)//
159
+ {
160
+
161
+ mpBulletManager->Shot(BULLET_TYPE_PLAYER_POWER_LEFT, //
162
+ SHOOTER_TYPE_PLAYER, mPos);
163
+
164
+ PlaySoundMem(mShooting2, DX_PLAYTYPE_BACK); //弾発射で音再生//
165
+
166
+ }
167
+
168
+ if (mShootIntervalTimer == 0 && IsButtonDown(PAD_INPUT_3) == TRUE)//
169
+ {
170
+
171
+ mpBulletManager->Shot(BULLET_TYPE_PLAYER_POWER_RIGHT, //
172
+ SHOOTER_TYPE_PLAYER, mPos);
173
+
174
+ PlaySoundMem(mShooting2, DX_PLAYTYPE_BACK); //弾発射で音再生//
175
+
176
+ }
177
+ break;
178
+
179
+
180
+ }
181
+ //やられ状態 =====================
182
+ case PLAYER_STATE_BOMB:
183
+ {
184
+
185
+ //タイマーをすすめる
186
+ mBombTimer++;
187
+
188
+
189
+ if (mBombTimer == 5)
190
+ {
191
+ mSprite.src.x = 48; //切り取り座標のx
192
+ }
193
+ else if (mBombTimer == 10)
194
+ {
195
+ mSprite.src.x = 64;
196
+ }
197
+ else if (mBombTimer == 15)
198
+ {
199
+ mSprite.src.x = 80;
200
+ }
201
+
202
+ else if (mBombTimer == 20)
203
+ {
204
+ mSprite.alpha = 0.0f;
205
+ }
206
+ else if (mBombTimer >= 40)//mSprite.alpha=0.0f
207
+ {
208
+ mSprite.src.x = PLAYER_RECT_X1;
209
+ mSprite.src.y = PLAYER_RECT_Y1;
210
+ mSprite.size.x = PLAYER_RECT_X2;
211
+ mSprite.size.y = PLAYER_RECT_Y2;
212
+
213
+ mSprite.scale.x = 1.0f;
214
+ mSprite.scale.y = 1.0f;
215
+
216
+ mSprite.alpha = 1.0f;
217
+
218
+ //爆発タイマーの初期化
219
+ mBombTimer = 0;
220
+
221
+ //操作可能状態へ
222
+ mState = PLAYER_STATE_ACTIVE;
223
+ }
224
+
225
+ break;
226
+ }
227
+ }
228
+
229
+ //画像に座標を反映
230
+ mSprite.pos.x = mPos.x;
231
+ mSprite.pos.y = mPos.y;
232
+
233
+ //当たり判定に座標を反映
234
+ mCollision.mPos.x = mPos.x;
235
+ mCollision.mPos.y = mPos.y;
236
+ }
237
+
238
+ /*-----------------------------------------
239
+ 描画
240
+ ----------------------------------------*/
241
+ void Player::Draw(void)
242
+ {
243
+
244
+ //自機の表示
245
+ mSprite.Draw();
246
+ }
247
+ /*----------------------------------
248
+ プレイヤーの移動処理
249
+ ----------------------------------*/
250
+ void Player::Move(void)
251
+ {
252
+ /*if (IsButtonDown(PAD_INPUT_10) == TRUE)
253
+ {
254
+ mPos.x = 0.0f;
255
+ mPos.y = 0.0f;
256
+ }*/
257
+
258
+ // 移動処理
259
+ if (IsButtonDown(PAD_INPUT_LEFT) == TRUE)
260
+ {
261
+ mPTimer++;
262
+
263
+ if (mPTimer == 0) {
264
+
265
+ mSprite.src.x = 32;
266
+ mSprite.src.y = 32;
267
+ }
268
+ else if (mPTimer == 15) {
269
+ mSprite.src.x = 64;
270
+ mSprite.src.y = 32;
271
+ }
272
+ else if (mPTimer >= 30) {
273
+ mSprite.src.x = 0;
274
+ mSprite.src.y = 32;
275
+ mSprite.size.x = PLAYER_RECT_X2;
276
+ mSprite.size.y = PLAYER_RECT_Y2;
277
+
278
+
279
+ mSprite.scale.x = 1.0f;
280
+ mSprite.scale.y = 1.0f;
281
+
282
+ mSprite.alpha = 1.0f;
283
+ mPTimer = 0;
284
+
285
+ }
286
+
287
+
288
+
289
+ mVelX = -PLAYER_VEL;
290
+ }
291
+ else if (IsButtonDown(PAD_INPUT_RIGHT) == TRUE)
292
+ {
293
+ mPTimer++;
294
+
295
+ if(mPTimer==0)
296
+ mSprite.src.x =32;
297
+
298
+ else if (mPTimer == 15)
299
+ mSprite.src.x = 64;
300
+
301
+ else if (mPTimer >= 30) {
302
+ mSprite.src.x = 0;
303
+ mSprite.src.y = 64;
304
+ mSprite.size.x = PLAYER_RECT_X2;
305
+ mSprite.size.y = PLAYER_RECT_Y2;
306
+
307
+
308
+ mSprite.scale.x = 1.0f;
309
+ mSprite.scale.y = 1.0f;
310
+
311
+ mSprite.alpha = 1.0f;
312
+ mPTimer = 0;
313
+
314
+ }
315
+
316
+
317
+ mVelX = PLAYER_VEL;
318
+
319
+
320
+ }
321
+ else if (IsButtonDown(PAD_INPUT_UP) == TRUE) //上キーが押されているときは重力を0にする
322
+ {
323
+ mPos.y += -PLAYER_VEL;
324
+ mVelY = 0;
325
+
326
+ }
327
+ else if (IsButtonDown(PAD_INPUT_UP) == FALSE) //上キーが押されていないときに重力をかける
328
+ {
329
+ mVelY += PLAYER_GRAVITY;
330
+
331
+ }
332
+
333
+
334
+ else if (IsButtonDown(PAD_INPUT_DOWN) == TRUE)
335
+ {
336
+ mPos.y += PLAYER_VEL;
337
+
338
+ }
339
+ else
340
+ {
341
+ mVelX = 0.0f;
342
+ }
343
+ **↓ヘッダー**
344
+ ```c
345
+
346
+ #include "../PlayScene/Utility.h"
347
+ #include "Database.h"
348
+ #include "Collision.h"
349
+
350
+ //前方宣言
351
+ struct Player; //
352
+
353
+
354
+ //弾を発射した対象
355
+ enum SHOOTER_TYPE
356
+ {
357
+ SHOOTER_TYPE_PLAYER, //プレイヤー
358
+ SHOOTER_TYPE_ENEMY, //敵
359
+
360
+ SHOOTER_TYPE_NUM, //発射対象の総数
361
+ };
362
+
363
+ struct Bullet
364
+ {
365
+ //変数=========================-
366
+
367
+ //弾の種類
368
+ int mBulletType;
369
+
370
+ //発射対象
371
+ int mShooterType;
372
+
373
+ //画像描画構造体
374
+ SpriteData mSprite;
375
+
376
+ //座標
377
+ Float2 mPos;
378
+
379
+ //速度
380
+ Float2 mVel;
381
+
382
+ //使用されているかのフラグ
383
+ BOOL mIsActive;
384
+
385
+ //威力
386
+ int mPower;
387
+
388
+ //円の当たり判定情報
389
+ CircleCollider mCollision;
390
+
391
+
392
+
393
+
394
+
395
+
396
+ //関数======================
397
+
398
+ //初期化
399
+ void Initialize(int textureHandle, int bulletType, int shooterType, Float2
400
+ pos);
401
+
402
+ //更新
403
+ void Update(void);
404
+
405
+ //描画
406
+ void Draw(void);
407
+ };
408
+ ```c
409
+
410
+ #include "Bullet.h"
411
+
412
+ #include "../GameMain.h"
413
+
414
+ #include "../PlayScene/Player.h"//
415
+
416
+
417
+
418
+ // 弾が生存している画面外プラスαの範囲
419
+ #define BULLET_ALIVE_AREA 50
420
+ #define SECOND 2
421
+ /*-----------------------------------
422
+ 初期化
423
+ 引数 :int textureHandle(弾の画像ハンドル)、 int bulletType(弾の種類),
424
+ Float2 pos(弾の座標)
425
+ ---------------------------------*/
426
+ void Bullet::Initialize(int textureHandle, int bulletType, int shooterType,
427
+ Float2 pos)
428
+ {
429
+ //弾の種類を保存
430
+ mBulletType = bulletType;
431
+
432
+ //発射対象の保存
433
+ mShooterType = shooterType;
434
+
435
+ //弾の情報を取得
436
+ const BulletData data = Database::msBulletdata[bulletType];
437
+
438
+ //画像の設定
439
+ mSprite.SetTexture(textureHandle);
440
+ mSprite.src.x = data.mRectX1;
441
+ mSprite.src.y = data.mRectY1;
442
+ mSprite.size.x = data.mRectX2;
443
+ mSprite.size.y = data.mRectY2;
444
+
445
+ //初期座標の設定
446
+ mPos.x = pos.x;
447
+ mPos.y = pos.y;
448
+
449
+ //画像に座標を反映
450
+ mSprite.pos.x = mPos.x;
451
+ mSprite.pos.y = mPos.y;
452
+
453
+ //使用状態とする
454
+ mIsActive = TRUE;
455
+
456
+ //威力の設定
457
+ mPower = data.mPower;
458
+
459
+ //当たり判定情報の初期化
460
+ mCollision.mRadius = data.mRadius;
461
+ mCollision.mPos.x = pos.x;
462
+ mCollision.mPos.y = pos.y;
463
+ }
464
+
465
+ /*----------------------
466
+ 更新
467
+ -----------------------*/
468
+ void Bullet::Update(void)
469
+ {
470
+ //使用中でなければ処理しない
471
+ if (mIsActive==FALSE)
472
+ {
473
+ return;
474
+ }
475
+
476
+ //弾の情報を取得
477
+ const BulletData data = Database::msBulletdata[mBulletType];
478
+
479
+
480
+ //弾の種類に応じた移動処理
481
+ switch (mBulletType)
482
+ {
483
+ case BULLET_TYPE_PLAYER_NORMAL: //プレイヤー通常弾
484
+ {
485
+ //mPos.y -= data.mVel;
486
+ mPos.x +=data.mVel;
487
+
488
+
489
+ break;
490
+ }
491
+
492
+
493
+
494
+ case BULLET_TYPE_ENEMY_NORMAL: //敵通常弾
495
+ {
496
+ //mPos.y += data.mVel;
497
+ mPos.x -= data.mVel;
498
+
499
+ break;
500
+ }
501
+
502
+
503
+
504
+ }
505
+
506
+ //画面外に出たら弾を未使用状態にする
507
+ if (
508
+ mPos.x < SCREEN_LEFT - BULLET_ALIVE_AREA ||
509
+ mPos.x > SCREEN_RIGHT + BULLET_ALIVE_AREA ||
510
+ mPos.y < SCREEN_TOP - BULLET_ALIVE_AREA ||
511
+ mPos.y > SCREEN_BOTTOM + BULLET_ALIVE_AREA
512
+ )
513
+ {
514
+ mIsActive = FALSE;
515
+ }
516
+
517
+ // 画像に座標を反映
518
+ mSprite.pos.x = mPos.x;
519
+ mSprite.pos.y = mPos.y;
520
+
521
+ //当たり判定に座標を反映
522
+ mCollision.mPos.x = mPos.x;
523
+ mCollision.mPos.y = mPos.y;
524
+ }
525
+
526
+ /*----------------------------
527
+ 描画
528
+ ----------------------------*/
529
+ void Bullet::Draw(void)
530
+ {
531
+ //使用中でなければ処理しない
532
+ if (mIsActive == FALSE)
533
+ {
534
+ return;
535
+ }
536
+ //自機の表示
537
+ mSprite.Draw();
538
+ }
539
+ コード
540
+ ```
541
+ ```
542
+ ```
543
+ ```
544
+
545
+ ```### 前提・実現したいこと
546
+ シューティングを作っているのですが誘導弾のやり方がわかりません。わかりやすくお願いします。