-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfence.cpp
More file actions
245 lines (206 loc) · 6.22 KB
/
Copy pathfence.cpp
File metadata and controls
245 lines (206 loc) · 6.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
//==========================================
//
//落下防止フェンスプログラム[fence.cpp]
//Author:石原颯馬 平澤詩苑
//
//==========================================
#include "main.h"
#include "fence.h"
#include "model.h"
#include "camera.h"
#include "meshfield.h"
//マクロ
#define FENCE_MARGIN_SPACE (10.0f) //フェンスが倒れる際の後ろの余裕スペース
#define FENCE_DESTROY_POS (-800.0f) //フェンスを消す位置
#define FENCE_DROP_SPEED (1.3f) //フェンスの落下加速度
#define FENCE_FALL_SPEED (0.005f) //フェンスの倒れる加速度
#define FENCE_LIMIT_FALL (3.1f) //フェンスの倒れる限界回転値
#define FENCE_SHIFT_LENGTH (1.0f) //フェンスが倒れる時の奥にずらす移動量
//グローバル
Fence g_aFence[MAX_USE_FENCE];
//========================
//初期化処理
//========================
void InitFence(void)
{
//基本の半径の大きさを格納
float fRadius = FENCE_RADIUS;
//変数初期化
for (int nCntfence = 0; nCntfence < MAX_USE_FENCE; nCntfence++)
{
//情報初期化
g_aFence[nCntfence] = {};
g_aFence[nCntfence].fRadius = fRadius; //半径設定
//フェンスを設置
SetFence(fRadius, FIX_ROT(((float)nCntfence / MAX_USE_FENCE) * 2 * D3DX_PI));
}
}
//========================
//終了処理
//========================
void UninitFence(void)
{
}
//========================
//更新処理
//========================
void UpdateFence(void)
{
//フェンスのポインタを取得
Fence *pFence = &g_aFence[0];
//フィールドの半径取得
float FieldRadius = GetMeshField()->fRadius;
for (int nCntFence = 0; nCntFence < MAX_USE_FENCE; nCntFence++, pFence++)
{
//対象のフェンスが使われていなかったら、次のフェンスまで処理を飛ばす
if (pFence->bUse == false)
{
continue;
}
//フェンスの倒れる処理
FallFence(pFence, FieldRadius);
//フェンスの落下処理
DropFence(pFence, FieldRadius);
}
}
//フェンスの落下処理
void DropFence(Fence *pFence, float FieldRadius)
{
//フェンスの位置が、フィールドの半径以下
if (FieldRadius <= pFence->fRadius)
{
pFence->bCollision = true; //後の当たり判定を行わない
pFence->fDropSpeed += FENCE_DROP_SPEED; //落下速度をどんどん上げる
pFence->pos.y -= pFence->fDropSpeed; //落下させる
//消滅ポイントまで落ちた
if (pFence->pos.y <= FENCE_DESTROY_POS)
{
//使用しない
pFence->bUse = false;
}
}
}
//フェンスの倒れる処理
void FallFence(Fence *pFence, float FieldRadius)
{
//フェンスの当たり判定が残っていたら、処理を飛ばす
if (pFence->bCollision)
{
return;
}
pFence->fFallSpeed += FENCE_FALL_SPEED; //倒れる速度をどんどん上げる
pFence->rot.x += pFence->fFallSpeed; //回転値を加算
//フェンスの置かれている位置+余裕を持たせたスペース より フィールドの半径がでかい
if (pFence->fRadius + FENCE_MARGIN_SPACE <= FieldRadius)
{
//真横以上にまで倒れた
if (D3DX_PI * RIGHT < pFence->rot.x)
{
pFence->rot.x = D3DX_PI * RIGHT; //真横に戻す
pFence->fFallSpeed = 0.0f; //倒れるスピードを0にする
}
}
//余裕を持たせたスペースよりフィールドの半径が小さかった場合、最大限まで倒れさせる
//フェンスが逆さまになりかけるくらい、倒れた
else
{
//少しずつ奥にずらす
pFence->fRadius += FENCE_SHIFT_LENGTH;
//最大限まで倒れた
if (FENCE_LIMIT_FALL < pFence->rot.x)
{
pFence->bUse = false; //フェンスを使わない
}
//位置設定
SetFencePos(&pFence->pos, pFence->fRadius, pFence->rot.y);
}
}
//========================
//描画処理
//========================
void DrawFence(void)
{
LPDIRECT3DDEVICE9 pDevice = GetDevice(); //デバイスの取得
D3DXMATRIX mtxScall, mtxRot, mtxTrans, mtxTexture; //計算用
D3DXMATRIX mtxInvNor; //法線用
D3DMATERIAL9 matDef; //現在のマテリアル保存用
D3DXMATERIAL *pMat; //マテリアルデータへのポインタ
//フェンスモデル取得
Model fenceModel = GetXObject(OBJECTTYPE_FENCE);
//現在のマテリアル取得
pDevice->GetMaterial(&matDef);
for (int nCount = 0; nCount < MAX_USE_FENCE; nCount++)
{
if (g_aFence[nCount].bUse == true)
{
//ワールドマトリックス初期化
D3DXMatrixIdentity(&g_aFence[nCount].mtxWorld);
//拡縮を反映
D3DXMatrixScaling(&mtxScall, FENCE_SCALE, FENCE_SCALE, FENCE_SCALE);
D3DXMatrixMultiply(&g_aFence[nCount].mtxWorld, &g_aFence[nCount].mtxWorld, &mtxScall);
//向きを反映
D3DXMatrixRotationYawPitchRoll(&mtxRot, g_aFence[nCount].rot.y, g_aFence[nCount].rot.x, g_aFence[nCount].rot.z);
D3DXMatrixMultiply(&g_aFence[nCount].mtxWorld, &g_aFence[nCount].mtxWorld, &mtxRot);
//位置反映
D3DXMatrixTranslation(&mtxTrans, g_aFence[nCount].pos.x, g_aFence[nCount].pos.y, g_aFence[nCount].pos.z);
D3DXMatrixMultiply(&g_aFence[nCount].mtxWorld, &g_aFence[nCount].mtxWorld, &mtxTrans);
//ワールドマトリックス設定
pDevice->SetTransform(D3DTS_WORLD, &g_aFence[nCount].mtxWorld);
//テクスチャ拡縮
D3DXMatrixScaling(&mtxTexture, FENCE_SCALE, FENCE_SCALE, 1.0f);
pDevice->SetTransform(D3DTS_TEXTURE0, &mtxTexture);
//マテリアルデータへのポインタ取得
pMat = (D3DXMATERIAL*)fenceModel.aParts[0].pBuffMat->GetBufferPointer();
for (int nCntMat = 0; nCntMat < (int)fenceModel.aParts[0].dwNumMatModel; nCntMat++)
{
//マテリアル設定
pDevice->SetMaterial(&pMat[nCntMat].MatD3D);
//テクスチャ設定
pDevice->SetTexture(0, fenceModel.aParts[0].apTexture[nCntMat]);
//モデル描画
fenceModel.aParts[0].pMesh->DrawSubset(nCntMat);
}
}
}
//マテリアルを戻す
pDevice->SetMaterial(&matDef);
}
//========================
//設定処理
//========================
void SetFence(float fRadius, float rotY)
{
//対象のフェンスのポインタを取得
Fence *pFence = &g_aFence[0];
for (int nCntObj = 0; nCntObj < MAX_USE_FENCE; nCntObj++, pFence++)
{
//対象のフェンスが使われていない
if (pFence->bUse == false)
{
//引数の情報を追加
SetFencePos(&pFence->pos, fRadius, rotY); //位置設定
pFence->pos.y = 0.0f; //初期位置設定
pFence->posOld = pFence->pos; //初期位置設定
pFence->fRadius = fRadius; //半径設定
pFence->rot = D3DXVECTOR3(0.0f, rotY, 0.0f); //角度を設定
pFence->fDropSpeed = pFence->fFallSpeed = 0.0f; //落下・倒れる速度を初期化
//使用していることにする
pFence->bUse = true;
pFence->bCollision = true;
break; //抜ける
}
}
}
//位置設定
void SetFencePos(D3DXVECTOR3 *pPos, float fRadius, float rotY)
{
pPos->x = fRadius * sinf(rotY); //Ⅹ位置設定
pPos->z = fRadius * cosf(rotY); //Z位置設定
}
//========================
//取得処理
//========================
Fence *GetFence(void)
{
return &g_aFence[0];
}