合計 昨日 今日

レバー二回ダッシュが反応しない。

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月14日(火) 20:06
No: 1
(OFFLINE)

 レバー二回ダッシュが反応しない。

ジャンプの距離調整が以外にも簡単すぎて驚きが隠せない人です。レバーを二回入れるとダッシュする機能をhttp://www48.atpages.jp/happynetwork/dash.htmlを参考にして実装しようとしているのですが、何故か、反応せずに通常の歩きのような速度になってしまいます。(具体的にはRunButtonがTRUEのときに、8.0Fになる感じです。)
コード[C++]: 全て選択
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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
#include "DxLib.h"
 
#define SCREEN_WIDTH (320)      //画面の横幅
#define SCREEN_HEIGHT (240)     //画面の縦幅
#define STAGE_WIDTH  (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16)          //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
HANDLE Stdout;
 
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
char MapData[MAP_HEIGHT][MAP_WIDTH]
{
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1,
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
 
float PlayerX, PlayerY;
float SaveX, SaveY;
float MoveX, MoveY;
float VectX;
float DropPower, Grav;
float MaxVect;
char JumpFlag, Dir, AirFlag, NonVertJump;
 
int DashCnt,  JumpTimer;
int Input, EdgeInput, Pad;
int FreamStartTime;
int CameraX = 0;
int CameraY = 0;
float CharX, CharY, ViewCharX, ViewCharY;
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
 
//将来の開発で使う予定の関数。
//押されたか?
bool IsPush(int PadHandle) {
    if (((EdgeInput&PadHandle) > PAD_INPUT_ON)) {
        return true;
    }
    return false;
}
 
//押されていないか?
bool IsFree (int PadHandle) {
    if ((Input&PadHandle) == PAD_INPUT_OFF) {
        return true;
    }
    return false;
}
 
//離されたか?
bool IsPull(int PadHandle) {
    if ((EdgeInput&PadHandle) == PAD_INPUT_OFF) {
        return true;
    }
    return false;
}
 
//押されているか?
bool IsHold (int PadHandle) {
    if ((Input&PadHandle) > PAD_INPUT_ON) {
        return true;
    }
    return false;
}
//マップチップのデータ獲得
int MapChipParam(float X, float Y) {
    int x, y;
 
    x = (int)X / CHIP_SIZE;
    y = (int)Y / CHIP_SIZE;
 
    if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
 
    return MapData[y][x];
}
 
//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) {
    float afX, afY;
    afX = X + *MoveX;
    afY = Y + *MoveY;
    float blx, brx, bby, bty;
    blx = (float)((int)afX / Size)*Size;
    brx = (float)((int)afX / Size + 1)*Size;
    bty = (float)((int)afY / Size)*Size;
    bby = (float)((int)afY / Size + 1)*Size;
    if (MapChipParam(afX, afY) == 1) {
        if (*MoveY > 0.0F) {
            printf("\n下に当たりました。");
            //移動量を補正する
            *MoveY = bty - Y - 1.0F;
            //上の壁に当たったと判定する
            return 3;
        }
        if (*MoveY < 0.0F) {
            printf("\n上に当たりました。");
            //移動量を補正する
            *MoveY = bby - Y + 1.0F;
            //下の壁に当たったと判定する
            return 4;
        }
        //右の当たり判定
        if (*MoveX > 0.0F) {
            printf("\n右に当たりました。");
            //移動量を補正する
            *MoveX = blx - X - 1.0F;
            //右の壁に当たったと判定する
            return 1;
        }
        //左の当たり判定
        if (*MoveX < 0.0F) {
            printf("\n左に当たりました。");
            //移動量を補正する
            *MoveX = brx - X + 1.0F;
            //左の壁に当たったと判定する
            return 2;
        }
        //ここに来たら適当な値を返す
        return 4;
    }
    return 0;
}
 
//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size){
    float Dummy = 0.0F;
    float hsize;
    //直前フレーム
    float PrevX = *X + MoveX;
    float PrevY = *Y + MoveY;
    //ベクトルのバックアップ
    float SaveMoveX = MoveX;
    float SaveMoveY = MoveY;
 
    hsize = Size * 0.5F;
    //上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
    {
        //左下
        if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::左下");
        //右下
        if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::右下");
        //左上
        if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::左上");
        //右上
        if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::右上");
        //問題ないのなら移動させる
        PrevY = *Y + MoveY;
        *Y = PrevY;
    }
    //左右の当たり判定チェック
    {
        //左下
        if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左下");
        //右上
        if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右下");
        //左上
        if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左上");
        //右上
        if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右上");
        //問題ないのなら移動させる
        PrevX = *X + MoveX;
        *X = PrevX;
    }
    //着地判定
    {
        if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
            *Air = TRUE;
            *G = 0.5F;
        }
        else {
            *JumpT = 0;
            *Drop = 0.0F;
            *G = 0.0F;
            *Air = FALSE;
            *Vert = FALSE;
            *Jump = FALSE;
        }
    }
    return 0;
}
 
//カメラの位置計算
int CameraCheck(float X, float Y) {
    //カメラのチェック
    CharX = X;
    CharY = Y;
    //カメラの位置を計算する
    CameraX = (int)CharX - SCREEN_WIDTH / 2;
    CameraY = (int)CharY - SCREEN_HEIGHT / 2;
    //カメラの補正
    if (CameraX < 0)CameraX = 0;
    if (CameraX >(STAGE_WIDTH - SCREEN_WIDTH))CameraX = (STAGE_WIDTH - SCREEN_WIDTH);
    if (CameraY < 0)CameraY = 0;
    if (CameraY >(STAGE_HEIGHT - SCREEN_HEIGHT))CameraY = (STAGE_HEIGHT - SCREEN_HEIGHT);
    ViewCharX = CharX - CameraX;
    ViewCharY = CharY - CameraY;
    return 0;
}
 
int init(void) {
    ChangeWindowMode(TRUE),SetGraphMode(320,240,32),printf("初期化しています…");
    if (DxLib_Init() == -1) { return -1; }
    PlayerX = 240.0F, PlayerY = 200.0F, MoveX = 0.0F, MoveY = 0.0F;
    JumpFlag = FALSE, DropPower = 0.0F, Grav = 0.5F, Dir = TRUE;
    Input = 0, EdgeInput = 0, FreamStartTime = GetNowCount();
    DashCnt = 0,MaxVect = 0.0F, NonVertJump = FALSE;
    return 0;
}
 
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
    printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
    printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
    printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        int DashTime = 8;
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        {
            //レバー二段ダッシュの判定を行う
            if ((Input&PAD_INPUT_2) > PAD_INPUT_ON) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
                if ((Input&PAD_INPUT_RIGHT) == PAD_INPUT_ON) {
                    if (DashCnt < DashTime && NonVertJumpFlag == 1) {
                        RunButton = TRUE;
                    }
                    if (NonVertJumpFlag == 2) {
                        RunButton = FALSE;
                    }
                    RunButton = TRUE;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                Dir = TRUE;
                NonVertJumpFlag = 1;
                DashCnt = 0;
            }
            //左に移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
                if (RunButton == TRUE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
                Dir = FALSE;
                NonVertJumpFlag = 2;
                DashCnt = 0;
            }
            DashCnt++;
        }
        //ジャンプボタンが押されているフレームを格納する。
        if ((Input&PAD_INPUT_1) > PAD_INPUT_ON) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        //長押しで重力が弱く、離せば、重力が強く。
        if (JumpTimer > 0) {
            if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = 8.0F;
                    MaxVect = 8.0F;
                }
                else {
                    VectX = 5.0F;
                    MaxVect = 5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                    MaxVect = -8.0F;
                }
                else {
                    VectX = -5.0F;
                    MaxVect = -5.0F;
                }
                NonVertJump = TRUE;
 
            }
            Grav = 0.25F;
        }
        else {
            if (JumpFlag == TRUE) {
                Grav = 0.5F;
            }
        }
    }
    //空中での移動を解禁する
        if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
            VectX = 0.0F;
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            //マリオ3以降よろしく、方向転換する。
            Dir = FALSE;
            VectX -= 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        //マリオ3のように加速
        if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)>PAD_INPUT_ON) {
            Dir = TRUE;
            VectX += 1.0F;
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            //マリオ3以降よろしく、方向転換する。
            Dir = TRUE;
            VectX += 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)>PAD_INPUT_ON) {
            Dir = FALSE;
            VectX -= 1.0F;
            MoveX = VectX;
        }
        //落下処理
        DropPower += Grav;
        MoveY = DropPower;
        //移動量に基づいて移動する。
        CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
    //マップの描画
    {
        int i, j;
        for (i = 0; i < MAP_HEIGHT; i++) {
            for (j = 0; j < MAP_WIDTH; j++) {
                if (MapData[i][j] == 1) {
                    DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
                }
            }
        }
    }
    //キャラの描画
    DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    init();
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
        main();
    }
    DxLib_End(); fclose(out); FreeConsole();
    return 0;
}

Name: みけCAT
[URL]
伝説なるハッカー(655,541 ポイント)
Date: 2017年3月14日(火) 21:34
No: 2
(ONLINE)

 Re: レバー二回ダッシュが反応しない。

keito940 さんが書きました:ジャンプの距離調整が以外にも簡単すぎて驚きが隠せない人です。レバーを二回入れるとダッシュする機能をhttp://www48.atpages.jp/happynetwork/dash.htmlを参考にして実装しようとしているのですが、何故か、反応せずに通常の歩きのような速度になってしまいます。(具体的にはRunButtonがTRUEのときに、8.0Fになる感じです。)

へー、そうなんですね。
現状の報告はわかりましたが、質問は書かれていないように見えます。
ソースコードが比較的長いので、質問が無いのであればあまり読みたくありません。
何か質問はありますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月15日(水) 13:18
No: 3
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

みけCAT さんが書きました:ソースコードが比較的長いので、質問が無いのであればあまり読みたくありません。
何か質問はありますか?

右に二回で右へダッシュを実装しているのに、右に二回押しても、ダッシュが出ないので、どうしたらダッシュできるのかを教えて下さい。

Name: みけCAT
[URL]
伝説なるハッカー(655,541 ポイント)
Date: 2017年3月15日(水) 22:09
No: 4
(ONLINE)

 Re: レバー二回ダッシュが反応しない。

keito940 さんが書きました:右に二回で右へダッシュを実装しているのに、右に二回押しても、ダッシュが出ないので、どうしたらダッシュできるのかを教えて下さい。

バグをみつけて修正し、コンパイルして実行すればいいと思います。
例えば、実行していないし理解も足りないと思いますが、290行目からの
keito940 さんが書きました:
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
                if ((Input&PAD_INPUT_RIGHT) == PAD_INPUT_ON) {
                    if (DashCnt < DashTime && NonVertJumpFlag == 1) {
                        RunButton = TRUE;
                    }
                    if (NonVertJumpFlag == 2) {
                        RunButton = FALSE;
                    }
                    RunButton = TRUE;
                }
という部分は、
  • NonVertJumpFlagを0で初期化し、更新しないままNonVertJumpFlag == 1やNonVertJumpFlag == 2の判定をしているので、
    これらは普通は(デバッガ、チートツール、宇宙線などの外部の力で値が書き変わらなければ)常に偽になります。
  • そもそも、内側のif文で判定してRunButtonに値を代入しても、その後で結局RunButton = TRUE;を実行しているので、
    条件文に副作用も無いし、内側のif文がある意味が無いです。
という性質があり、怪しいように見えます。

「右に二回」というのは、「右を押す→離す→十分短い間にもう一度右を押す」という操作のことですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: みけCAT
[URL]
伝説なるハッカー(655,541 ポイント)
Date: 2017年3月15日(水) 22:20
No: 5
(ONLINE)

 Re: レバー二回ダッシュが反応しない。

keito940 さんが書きました:
コード[C++]: 全て選択
1
                if ((Input&PAD_INPUT_RIGHT) == PAD_INPUT_ON) {

そもそも、PAD_INPUT_RIGHTはDXライブラリ Ver 3.17eにおいては0x00000004と定義されており、
(Input&PAD_INPUT_RIGHT)は0か4になるでしょう。
従って、このファイルの先頭の方で1と定義されているPAD_INPUT_ONと比較すると、常に不一致になり、
この条件式は常に偽になるでしょう。

そもそも、ある特定の値との比較によって真かどうかを判定しようとするのが間違いです。
ボタンが押されているかは (Input & 判定したいボタンを表す定数)
ボタンが押されていないかは !(Input & 判定したいボタンを表す定数)
のようにするといいでしょう。
似た問題について、ポインタの話(おまけ) - C言語 - 碧色工房
の「真偽値 FALSE」の所に書かれています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月16日(木) 16:04
No: 6
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

みけCATさんの言うとおりにしてみました。このコードはレバー二回ダッシュを実装しているように見えますが、ソニックみたいに、ダッシュが常に出た状態になってしまいます。どこに原因がありますか?
コード[C++]: 全て選択
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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
    printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
    printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
    printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        int DashTime = 8;
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        {
 
            if ((Input&PAD_INPUT_2)) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
                NonVertJumpFlag = 1;
                //レバー二段ダッシュの判定を行う
                if ((Input&PAD_INPUT_RIGHT)) {
                    if (DashCnt < DashTime && dir == 1) {
                        RunButton = TRUE;
                    }
                    if (dir == 2) {
                        RunButton = FALSE;
                    }
                    dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                Dir = TRUE;
                DashCnt = 0;
            }
            //左に移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
                NonVertJumpFlag = 2;
                if ((Input&PAD_INPUT_LEFT)) {
                    if (DashCnt < DashTime && dir == 2) {
                        RunButton = TRUE;
                    }
                    if (dir == 1) {
                        RunButton = FALSE;
                    }
                    dir = 2;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
                Dir = FALSE;
                DashCnt = 0;
            }
                DashCnt++;
            }
        //ジャンプボタンが押されているフレームを格納する。
        if ((Input&PAD_INPUT_1)) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        //長押しで重力が弱く、離せば、重力が強く。
        if (JumpTimer > 0) {
            if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = 8.0F;
                    MaxVect = 8.0F;
                }
                else {
                    VectX = 5.0F;
                    MaxVect = 5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                    MaxVect = -8.0F;
                }
                else {
                    VectX = -5.0F;
                    MaxVect = -5.0F;
                }
                NonVertJump = TRUE;
 
            }
            Grav = 0.25F;
        }
        else {
            if (JumpFlag == TRUE) {
                Grav = 0.5F;
            }
        }
    }
    //空中での移動を解禁する
        if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
            VectX = 0.0F;
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = FALSE;
            VectX -= 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        //マリオ3のように加速
        if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
            Dir = TRUE;
            VectX += 1.0F;
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = TRUE;
            VectX += 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
            Dir = FALSE;
            VectX -= 1.0F;
            MoveX = VectX;
        }
        //落下処理
        DropPower += Grav;
        MoveY = DropPower;
        //移動量に基づいて移動する。
        CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
    //マップの描画
    {
        int i, j;
        for (i = 0; i < MAP_HEIGHT; i++) {
            for (j = 0; j < MAP_WIDTH; j++) {
                if (MapData[i][j] == 1) {
                    DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
                }
            }
        }
    }
    //キャラの描画
    DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}

Name: Math
[URL]
Date: 2017年3月16日(木) 21:16
No: 7
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。


取り合えずソースを2分割。g1.cpp,g2/cpp
g1.cpp
コード[C++]: 全て選択
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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
///
#include "DxLib.h"
///
#define SCREEN_WIDTH (320)      //画面の横幅
#define SCREEN_HEIGHT (240)     //画面の縦幅
#define STAGE_WIDTH  (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16)          //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
HANDLE Stdout;
 
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
char MapData[MAP_HEIGHT][MAP_WIDTH]
{
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1,
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
 
float PlayerX, PlayerY;
float SaveX, SaveY;
float MoveX, MoveY;
float VectX;
float DropPower, Grav;
float MaxVect;
char JumpFlag, Dir, AirFlag, NonVertJump;
 
int DashCnt,  JumpTimer;
int Input, EdgeInput, Pad;
int FreamStartTime;
int CameraX = 0;
int CameraY = 0;
float CharX, CharY, ViewCharX, ViewCharY;
 
/////
int main();/////<<<===================================================== main
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
 
//将来の開発で使う予定の関数。
//押されたか?
bool IsPush(int PadHandle) {
    if (((EdgeInput&PadHandle) > PAD_INPUT_ON)) {
        return true;
    }
    return false;
}
 
//押されていないか?
bool IsFree (int PadHandle) {
    if ((Input&PadHandle) == PAD_INPUT_OFF) {
        return true;
    }
    return false;
}
 
//離されたか?
bool IsPull(int PadHandle) {
    if ((EdgeInput&PadHandle) == PAD_INPUT_OFF) {
        return true;
    }
    return false;
}
 
//押されているか?
bool IsHold (int PadHandle) {
    if ((Input&PadHandle) > PAD_INPUT_ON) {
        return true;
    }
    return false;
}
//マップチップのデータ獲得
int MapChipParam(float X, float Y) {
    int x, y;
 
    x = (int)X / CHIP_SIZE;
    y = (int)Y / CHIP_SIZE;
 
    if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
 
    return MapData[y][x];
}
 
//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) {
    float afX, afY;
    afX = X + *MoveX;
    afY = Y + *MoveY;
    float blx, brx, bby, bty;
    blx = (float)((int)afX / Size)*Size;
    brx = (float)((int)afX / Size + 1)*Size;
    bty = (float)((int)afY / Size)*Size;
    bby = (float)((int)afY / Size + 1)*Size;
    if (MapChipParam(afX, afY) == 1) {
        if (*MoveY > 0.0F) {
            printf("\n下に当たりました。");
            //移動量を補正する
            *MoveY = bty - Y - 1.0F;
            //上の壁に当たったと判定する
            return 3;
        }
        if (*MoveY < 0.0F) {
            printf("\n上に当たりました。");
            //移動量を補正する
            *MoveY = bby - Y + 1.0F;
            //下の壁に当たったと判定する
            return 4;
        }
        //右の当たり判定
        if (*MoveX > 0.0F) {
            printf("\n右に当たりました。");
            //移動量を補正する
            *MoveX = blx - X - 1.0F;
            //右の壁に当たったと判定する
            return 1;
        }
        //左の当たり判定
        if (*MoveX < 0.0F) {
            printf("\n左に当たりました。");
            //移動量を補正する
            *MoveX = brx - X + 1.0F;
            //左の壁に当たったと判定する
            return 2;
        }
        //ここに来たら適当な値を返す
        return 4;
    }
    return 0;
}
 
//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size){
    float Dummy = 0.0F;
    float hsize;
    //直前フレーム
    float PrevX = *X + MoveX;
    float PrevY = *Y + MoveY;
    //ベクトルのバックアップ
    float SaveMoveX = MoveX;
    float SaveMoveY = MoveY;
 
    hsize = Size * 0.5F;
    //上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
    {
        //左下
        if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::左下");
        //右下
        if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::右下");
        //左上
        if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::左上");
        //右上
        if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::右上");
        //問題ないのなら移動させる
        PrevY = *Y + MoveY;
        *Y = PrevY;
    }
    //左右の当たり判定チェック
    {
        //左下
        if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左下");
        //右上
        if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右下");
        //左上
        if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左上");
        //右上
        if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右上");
        //問題ないのなら移動させる
        PrevX = *X + MoveX;
        *X = PrevX;
    }
    //着地判定
    {
        if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
            *Air = TRUE;
            *G = 0.5F;
        }
        else {
            *JumpT = 0;
            *Drop = 0.0F;
            *G = 0.0F;
            *Air = FALSE;
            *Vert = FALSE;
            *Jump = FALSE;
        }
    }
    return 0;
}
 
//カメラの位置計算
int CameraCheck(float X, float Y) {
    //カメラのチェック
    CharX = X;
    CharY = Y;
    //カメラの位置を計算する
    CameraX = (int)CharX - SCREEN_WIDTH / 2;
    CameraY = (int)CharY - SCREEN_HEIGHT / 2;
    //カメラの補正
    if (CameraX < 0)CameraX = 0;
    if (CameraX >(STAGE_WIDTH - SCREEN_WIDTH))CameraX = (STAGE_WIDTH - SCREEN_WIDTH);
    if (CameraY < 0)CameraY = 0;
    if (CameraY >(STAGE_HEIGHT - SCREEN_HEIGHT))CameraY = (STAGE_HEIGHT - SCREEN_HEIGHT);
    ViewCharX = CharX - CameraX;
    ViewCharY = CharY - CameraY;
    return 0;
}
 
int init(void) {
    ChangeWindowMode(TRUE),SetGraphMode(320,240,32),printf("初期化しています…");
    if (DxLib_Init() == -1) { return -1; }
    PlayerX = 240.0F, PlayerY = 200.0F, MoveX = 0.0F, MoveY = 0.0F;
    JumpFlag = FALSE, DropPower = 0.0F, Grav = 0.5F, Dir = TRUE;
    Input = 0, EdgeInput = 0, FreamStartTime = GetNowCount();
    DashCnt = 0,MaxVect = 0.0F, NonVertJump = FALSE;
    return 0;
}
///// main ---テスト用---
/*
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
    printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
    printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
    printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
 
 
    DrawString(10, 10, "DxLib: Hello World!", GetColor(255, 255, 255)); // 文字を書く
    return 0;
}
*/
////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout);
    Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    init();
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
        main();
    }
    DxLib_End(); fclose(out); FreeConsole();
    return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////

g2.cpp
コード[C++]: 全て選択
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
///
#include "DxLib.h"
///
#define SCREEN_WIDTH (320)      //画面の横幅
#define SCREEN_HEIGHT (240)     //画面の縦幅
#define STAGE_WIDTH  (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16)          //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
extern HANDLE Stdout;
 
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
extern char MapData[MAP_HEIGHT][MAP_WIDTH];
 
extern float PlayerX, PlayerY;
extern float SaveX, SaveY;
extern float MoveX, MoveY;
extern float VectX;
extern float DropPower, Grav;
extern float MaxVect;
extern char JumpFlag, Dir, AirFlag, NonVertJump;
 
extern int DashCnt,  JumpTimer;
extern int Input, EdgeInput, Pad;
extern int FreamStartTime;
extern int CameraX;
extern int CameraY;
extern float CharX, CharY, ViewCharX, ViewCharY;
/////
int main();
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
/////
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
    printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
    printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
    printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        int DashTime = 8;
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        {
 
            if ((Input&PAD_INPUT_2)) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
                NonVertJumpFlag = 1;
                //レバー二段ダッシュの判定を行う
                if ((Input&PAD_INPUT_RIGHT)) {
                    if (DashCnt < DashTime && Dir == 1) {
                        RunButton = TRUE;
                    }
                    if (Dir == 2) {
                        RunButton = FALSE;
                    }
                    Dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                Dir = TRUE;
                DashCnt = 0;
            }
            //左に移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
                NonVertJumpFlag = 2;
                if ((Input&PAD_INPUT_LEFT)) {
                    if (DashCnt < DashTime && Dir == 2) {
                        RunButton = TRUE;
                    }
                    if (Dir == 1) {
                        RunButton = FALSE;
                    }
                    Dir = 2;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
                Dir = FALSE;
                DashCnt = 0;
            }
                DashCnt++;
            }
        //ジャンプボタンが押されているフレームを格納する。
        if ((Input&PAD_INPUT_1)) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        //長押しで重力が弱く、離せば、重力が強く。
        if (JumpTimer > 0) {
            if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = 8.0F;
                    MaxVect = 8.0F;
                }
                else {
                    VectX = 5.0F;
                    MaxVect = 5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                    MaxVect = -8.0F;
                }
                else {
                    VectX = -5.0F;
                    MaxVect = -5.0F;
                }
                NonVertJump = TRUE;
 
            }
            Grav = 0.25F;
        }
        else {
            if (JumpFlag == TRUE) {
                Grav = 0.5F;
            }
        }
    }
    //空中での移動を解禁する
        if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
            VectX = 0.0F;
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = FALSE;
            VectX -= 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        //マリオ3のように加速
        if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
            Dir = TRUE;
            VectX += 1.0F;
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = TRUE;
            VectX += 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
            Dir = FALSE;
            VectX -= 1.0F;
            MoveX = VectX;
        }
        //落下処理
        DropPower += Grav;
        MoveY = DropPower;
        //移動量に基づいて移動する。
        CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
    //マップの描画
    {
        int i, j;
        for (i = 0; i < MAP_HEIGHT; i++) {
            for (j = 0; j < MAP_WIDTH; j++) {
                if (MapData[i][j] == 1) {
                    DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
                }
            }
        }
    }
    //キャラの描画
    DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}

エラー!が出て
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        cl /c /TP /EHsc /D "_MBCS" /MT  /Id:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp g2.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.
 
g1.cpp
g2.cpp
g2.cpp(94): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(97): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(100): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(118): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(121): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(124): error C2065: 'dir': 定義されていない識別子です。
コードを生成中...
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.

dir--->Dirとして直る!。コンパイルしてますか?


g.mak
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
TARGETNAME=g1
 
C_FLAGS=/c /TP /EHsc /D "_MBCS" /MT  /Id:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3
 
LINK_FLAGS=/SUBSYSTEM:WINDOWS /LIBPATH:"d:\DxLib_VC\プロジェクトに追加すべきファイル_VC用" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"
 
ALL:
    cl $(C_FLAGS) $(TARGETNAME).cpp g2.cpp
    link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj g2.obj
    $(TARGETNAME).exe


Name: Math
[URL]
Date: 2017年3月16日(木) 21:27
No: 8
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。


[訂正]g.mak
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
TARGETNAME=g1
 
C_FLAGS=/c /TP /EHsc /D "_MBCS" /MT  /Id:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3
 
LINK_FLAGS=/SUBSYSTEM:WINDOWS /LIBPATH:d:\DxLib "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"
 
ALL:
    cl $(C_FLAGS) $(TARGETNAME).cpp g2.cpp
    link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj g2.obj
    $(TARGETNAME).exe



Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月17日(金) 13:36
No: 9
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

すいません、しっかりコンパイルしたいと思います~。
ところで何か問題な点はありますか?
コード[C++]: 全て選択
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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
    printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
    printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
    printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        int DashTime = 8;
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        {
 
            if ((Input&PAD_INPUT_2)) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
                NonVertJumpFlag = 1;
                DashCnt = 0;
                //レバー二段ダッシュの判定を行う
                if ((Input&PAD_INPUT_RIGHT)) {
                    if (DashCnt < DashTime && dir == 1) {
                        RunButton = TRUE;
                    }
                    if (dir == 2) {
                        RunButton = FALSE;
                    }
                    dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
            }
            //左に移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
                NonVertJumpFlag = 2;
                DashCnt = 0;
                if ((Input&PAD_INPUT_LEFT)) {
                    if (DashCnt < DashTime && dir == 2) {
                        RunButton = TRUE;
                    }
                    if (dir == 1) {
                        RunButton = FALSE;
                    }
                    dir = 2;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
            }
                DashCnt++;
            }
        //ジャンプボタンが押されているフレームを格納する。
        if ((Input&PAD_INPUT_1)) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        //長押しで重力が弱く、離せば、重力が強く。
        if (JumpTimer > 0) {
            if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = 8.0F;
                    MaxVect = 8.0F;
                }
                else {
                    VectX = 5.0F;
                    MaxVect = 5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                    MaxVect = -8.0F;
                }
                else {
                    VectX = -5.0F;
                    MaxVect = -5.0F;
                }
                NonVertJump = TRUE;
 
            }
            Grav = 0.25F;
        }
        else {
            if (JumpFlag == TRUE) {
                Grav = 0.5F;
            }
        }
    }
    //空中での移動を解禁する
        if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
            VectX = 0.0F;
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = FALSE;
            VectX -= 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        //マリオ3のように加速
        if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
            Dir = TRUE;
            VectX += 1.0F;
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = TRUE;
            VectX += 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
            Dir = FALSE;
            VectX -= 1.0F;
            MoveX = VectX;
        }
        //落下処理
        DropPower += Grav;
        MoveY = DropPower;
        //移動量に基づいて移動する。
        CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
    //マップの描画
    {
        int i, j;
        for (i = 0; i < MAP_HEIGHT; i++) {
            for (j = 0; j < MAP_WIDTH; j++) {
                if (MapData[i][j] == 1) {
                    DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
                }
            }
        }
    }
    //キャラの描画
    DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}

Name: みけCAT
[URL]
伝説なるハッカー(655,541 ポイント)
Date: 2017年3月17日(金) 16:08
No: 10
(ONLINE)

 Re: レバー二回ダッシュが反応しない。

keito940 さんが書きました:
コード[C++]: 全て選択
1
                    if (DashCnt < DashTime && dir == 1) {

DashCntは0を代入、DashTimeは8で初期化し、その値をそのまま比較しているので、
DashCnt < DashTimeは(デバッガなどによる外部からの値の書き替えや処理系の不都合などがなければ)常に真となる、怪しい式ですね。
「左に移動」の方にも同様の怪しい式があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月17日(金) 19:31
No: 11
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

指摘してくれてありがとうございます。
さっきの式が常に真になるのなら、どうすればいいのですか?
レバー二回ダッシュのアルゴリズムは、今のサイトのであってますか?

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月18日(土) 14:40
No: 12
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

コードの構成を、参考にしたサイトのとおりにしてみました。
中身は変わらないと思います。
コード[C++]: 全て選択
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
//移動処理
    {
        int DashTime = 8;
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        {
 
            if ((Input&PAD_INPUT_2)) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
                NonVertJumpFlag = 1;
                //レバー二段ダッシュの判定を行う
                if ((Input&PAD_INPUT_RIGHT)) {
                    if (DashCnt < DashTime && dir == 1) {
                        RunButton = TRUE;
                    }
                    if (dir == 2) {
                        RunButton = FALSE;
                    }
                    dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                DashCnt = 0;
            }
            //左に移動
            else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
                NonVertJumpFlag = 2;
                if ((Input&PAD_INPUT_LEFT)) {
                    if (DashCnt < 8 && dir == 2) {
                        RunButton = TRUE;
                    }
                    if (dir == 1) {
                        RunButton = FALSE;
                    }
                    dir = 2;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
                DashCnt = 0;
            }
            else {
                RunButton = FALSE;
            }
            DashCnt++;
        }

みけCAT さんが書きました:DashCnt < DashTimeは(デバッガなどによる外部からの値の書き替えや処理系の不都合などがなければ)常に真となる、怪しい式ですね。

サイトにそう書かれてたからこの式が正しいかと思ってました。ダッシュのサンプルを誰か書いてくれませんか?
僕にはなんのことやらさっぱりなので…。

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月19日(日) 10:44
No: 13
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

ボタンを離せば、ダッシュのカウンターが始動するようにしてみましたが、やっぱり変わりません。
どこがおかしいのでしょうか?
コード[C++]: 全て選択
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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
    printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
    printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
    printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        {
            int DashTime = 8;
            if ((Input&PAD_INPUT_2)) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
                NonVertJumpFlag = 1;
                //レバー二段ダッシュの判定を行う
                if ((Input&PAD_INPUT_RIGHT)) {
                    if (DashCnt < DashTime && dir == 1) {
                        RunButton = TRUE;
                    }
                    if (dir == 2) {
                        RunButton = FALSE;
                    }
                    dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                DashCnt = 0;
            }
            //左に移動
            else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
                NonVertJumpFlag = 2;
                if ((Input&PAD_INPUT_LEFT)) {
                    if (DashCnt < 8 && dir == 2) {
                        RunButton = TRUE;
                    }
                    if (dir == 1) {
                        RunButton = FALSE;
                    }
                    dir = 2;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
                DashCnt = 0;
            }
            else {
                RunButton = FALSE;
            }
            if (!(Input&PAD_INPUT_LEFT) || !(Input&PAD_INPUT_RIGHT)) {
                DashCnt++;
            }
        }
        //ジャンプボタンが押されているフレームを格納する。
        if ((Input&PAD_INPUT_1)) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        //長押しで重力が弱く、離せば、重力が強く。
        if (JumpTimer > 0) {
            if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = 8.0F;
                    MaxVect = 8.0F;
                }
                else {
                    VectX = 5.0F;
                    MaxVect = 5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                    MaxVect = -8.0F;
                }
                else {
                    VectX = -5.0F;
                    MaxVect = -5.0F;
                }
                NonVertJump = TRUE;
 
            }
            Grav = 0.25F;
        }
        else {
            if (JumpFlag == TRUE) {
                Grav = 0.5F;
            }
        }
    }
    //空中での移動を解禁する
        if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
            VectX = 0.0F;
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = FALSE;
            VectX -= 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        //マリオ3のように加速
        if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
            Dir = TRUE;
            VectX += 1.0F;
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = TRUE;
            VectX += 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
            Dir = FALSE;
            VectX -= 1.0F;
            MoveX = VectX;
        }
        //落下処理
        DropPower += Grav;
        MoveY = DropPower;
        //移動量に基づいて移動する。
        CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
    //マップの描画
    {
        int i, j;
        for (i = 0; i < MAP_HEIGHT; i++) {
            for (j = 0; j < MAP_WIDTH; j++) {
                if (MapData[i][j] == 1) {
                    DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
                }
            }
        }
    }
    //キャラの描画
    DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月19日(日) 18:08
No: 14
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

なんとなくではありますが、それらしい判定ができたので。とは言っても1フレームだけで、右にしか使えないのですが…。
後は、どうやってダッシュを維持させるかです…。
なお、コード全体の最初の、char型が宣言されている部分に部分にDirTを宣言してください。
コード[C++]: 全て選択
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
//移動処理
    {
        int DashT;
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        //左右に押されているか確認する。
        if ((Input&PAD_INPUT_LEFT) || (Input&PAD_INPUT_RIGHT)) {
            DirT = TRUE;
        }
        else {
            DirT = FALSE;
        }
        //ダッシュのトリガーをチェックする
        if (DashCnt == 1 && DirT == TRUE) {
            DashT = 0;
        }
        else {
            DashT = 1;
        }
        {
            int DashTime = 8;
            if ((Input&PAD_INPUT_2)) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
                NonVertJumpFlag = 1;
                //レバー二段ダッシュの判定を行う
                if ((Input&PAD_INPUT_RIGHT)) {
                    if (DashT == 1 && DashCnt < DashTime && dir == 1) {
                        RunButton = TRUE;
                    }
                    if (dir == 2) {
                        RunButton = FALSE;
                    }
                    dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                DashCnt = 0;
            }

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月20日(月) 15:38
No: 15
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

二段ダッシュの判定らしきものを実装することはできました。(とは言っても、右だけですけど)
ですが、どういうわけか、コンソールによると1Fだけしかダッシュせず、実質歩いている状態になってしまいます。
どうすればいいのでしょうか?何か原因があるのでしょうか。
コード[C++]: 全て選択
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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
#include "DxLib.h"
 
#define SCREEN_WIDTH (320)      //画面の横幅
#define SCREEN_HEIGHT (240)     //画面の縦幅
#define STAGE_WIDTH  (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16)          //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
HANDLE Stdout;
 
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
char MapData[MAP_HEIGHT][MAP_WIDTH]
{
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,0,1,
 
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
    1,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1,
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
 
float PlayerX, PlayerY;
float SaveX, SaveY;
float MoveX, MoveY;
float VectX;
float DropPower, Grav;
float MaxVect;
char JumpFlag, Dir, AirFlag, NonVertJump, dir, DirT, DashB;
 
int DashCnt,  JumpTimer;
int Input, EdgeInput, Pad;
int FreamStartTime;
int CameraX = 0;
int CameraY = 0;
float CharX, CharY, ViewCharX, ViewCharY;
 
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
 
//将来の開発で使う予定の関数。
//押されたか?
bool IsPush(int PadHandle) {
    if (((EdgeInput&PadHandle) > PAD_INPUT_ON)) {
        return true;
    }
    return false;
}
 
//押されていないか?
bool IsFree (int PadHandle) {
    if ((Input&PadHandle) == PAD_INPUT_OFF) {
        return true;
    }
    return false;
}
 
//離されたか?
bool IsPull(int PadHandle) {
    if ((EdgeInput&PadHandle) == PAD_INPUT_OFF) {
        return true;
    }
    return false;
}
 
//押されているか?
bool IsHold (int PadHandle) {
    if ((Input&PadHandle) > PAD_INPUT_ON) {
        return true;
    }
    return false;
}
//マップチップのデータ獲得
int MapChipParam(float X, float Y) {
    int x, y;
 
    x = (int)X / CHIP_SIZE;
    y = (int)Y / CHIP_SIZE;
 
    if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
 
    return MapData[y][x];
}
 
//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) {
    float afX, afY;
    afX = X + *MoveX;
    afY = Y + *MoveY;
    float blx, brx, bby, bty;
    blx = (float)((int)afX / Size)*Size;
    brx = (float)((int)afX / Size + 1)*Size;
    bty = (float)((int)afY / Size)*Size;
    bby = (float)((int)afY / Size + 1)*Size;
    if (MapChipParam(afX, afY) == 1) {
        if (*MoveY > 0.0F) {
            printf("\n下に当たりました。");
            //移動量を補正する
            *MoveY = bty - Y - 1.0F;
            //上の壁に当たったと判定する
            return 3;
        }
        if (*MoveY < 0.0F) {
            printf("\n上に当たりました。");
            //移動量を補正する
            *MoveY = bby - Y + 1.0F;
            //下の壁に当たったと判定する
            return 4;
        }
        //右の当たり判定
        if (*MoveX > 0.0F) {
            printf("\n右に当たりました。");
            //移動量を補正する
            *MoveX = blx - X - 1.0F;
            //右の壁に当たったと判定する
            return 1;
        }
        //左の当たり判定
        if (*MoveX < 0.0F) {
            printf("\n左に当たりました。");
            //移動量を補正する
            *MoveX = brx - X + 1.0F;
            //左の壁に当たったと判定する
            return 2;
        }
        //ここに来たら適当な値を返す
        return 4;
    }
    return 0;
}
 
//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size){
    float Dummy = 0.0F;
    float hsize;
    //直前フレーム
    float PrevX = *X + MoveX;
    float PrevY = *Y + MoveY;
    //ベクトルのバックアップ
    float SaveMoveX = MoveX;
    float SaveMoveY = MoveY;
 
    hsize = Size * 0.5F;
    //上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
    {
        //左下
        if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::左下");
        //右下
        if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::右下");
        //左上
        if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::左上");
        //右上
        if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::右上");
        //問題ないのなら移動させる
        PrevY = *Y + MoveY;
        *Y = PrevY;
    }
    //左右の当たり判定チェック
    {
        //左下
        if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左下");
        //右上
        if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右下");
        //左上
        if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左上");
        //右上
        if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右上");
        //問題ないのなら移動させる
        PrevX = *X + MoveX;
        *X = PrevX;
    }
    //着地判定
    {
        if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
            *Air = TRUE;
            *G = 0.5F;
        }
        else {
            *JumpT = 0;
            *Drop = 0.0F;
            *G = 0.0F;
            *Air = FALSE;
            *Vert = FALSE;
            *Jump = FALSE;
        }
    }
    return 0;
}
 
//カメラの位置計算
int CameraCheck(float X, float Y) {
    //カメラのチェック
    CharX = X;
    CharY = Y;
    //カメラの位置を計算する
    CameraX = (int)CharX - SCREEN_WIDTH / 2;
    CameraY = (int)CharY - SCREEN_HEIGHT / 2;
    //カメラの補正
    if (CameraX < 0)CameraX = 0;
    if (CameraX >(STAGE_WIDTH - SCREEN_WIDTH))CameraX = (STAGE_WIDTH - SCREEN_WIDTH);
    if (CameraY < 0)CameraY = 0;
    if (CameraY >(STAGE_HEIGHT - SCREEN_HEIGHT))CameraY = (STAGE_HEIGHT - SCREEN_HEIGHT);
    ViewCharX = CharX - CameraX;
    ViewCharY = CharY - CameraY;
    return 0;
}
 
int init(void) {
    ChangeWindowMode(TRUE),SetGraphMode(320,240,32),printf("初期化しています…");
    if (DxLib_Init() == -1) { return -1; }
    PlayerX = 240.0F, PlayerY = 200.0F, MoveX = 0.0F, MoveY = 0.0F;
    JumpFlag = FALSE, DropPower = 0.0F, Grav = 0.5F, Dir = TRUE;
    Input = 0, EdgeInput = 0, FreamStartTime = GetNowCount();
    DashCnt = 0,MaxVect = 0.0F, NonVertJump = FALSE, dir = 0,DirT = FALSE;
    DashB = FALSE;
    return 0;
}
 
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
    printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
    printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
    printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
    printf("\nDashT=%d,DashB=%d", DirT, DashB);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        int DashT;
        int ContTimer = 8;
        //ベクトルを初期化し、加減速処理を行う。
        if (NonVertJump == FALSE) {
            MoveX = 0.0F;
            VectX = 0.0F;
            MaxVect = 0.0F;
        }
        else {
            MoveX = VectX;
        }
        MoveY = 0.0F;
        char RunButton;
        //0なら移動していない、1なら右へ移動中、2なら左へ移動中
        char NonVertJumpFlag = 0;
        //左右に押されているか確認する。
        if ((Input&PAD_INPUT_LEFT) || (Input&PAD_INPUT_RIGHT)) {
            DirT = TRUE;
        }
        else {
            DirT = FALSE;
        }
        //ダッシュのトリガーをチェックする
        if (DashCnt == 1 && DirT == TRUE) {
            DashT = 0;
        }
        else {
            DashT = 1;
        }
        {
            int DashTime = 8;
            if ((Input&PAD_INPUT_2)) {
                RunButton = TRUE;
            }
            else {
                RunButton = FALSE;
            }
            //右へ移動
            if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
                NonVertJumpFlag = 1;
                //レバー二段ダッシュの判定を行う
                if ((Input&PAD_INPUT_RIGHT)) {
                    if ((DashT == 1 && DashCnt < DashTime) && dir == 1) {
                        DashB = TRUE;
                        if (DashB == TRUE) {
                            RunButton = TRUE;
                        }
                    }
                    if (dir == 2) {
                        DashB = FALSE;
                        RunButton = FALSE;
                    }
                    dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                DashCnt = 0;
            }
            //左に移動
            else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
                NonVertJumpFlag = 2;
                if ((Input&PAD_INPUT_LEFT)) {
                    if (DashCnt < DashTime && dir == 2) {
                        RunButton = TRUE;
                    }
                    if (dir == 1) {
                        RunButton = FALSE;
                    }
                    dir = 2;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
                DashCnt = 0;
            }
            else {
                DashB = FALSE;
                RunButton = FALSE;
            }
            DashCnt++;
        }
        //ジャンプボタンが押されているフレームを格納する。
        if ((Input&PAD_INPUT_1)) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        //長押しで重力が弱く、離せば、重力が強く。
        if (JumpTimer > 0) {
            if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = 8.0F;
                    MaxVect = 8.0F;
                }
                else {
                    VectX = 5.0F;
                    MaxVect = 5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                    MaxVect = -8.0F;
                }
                else {
                    VectX = -5.0F;
                    MaxVect = -5.0F;
                }
                NonVertJump = TRUE;
 
            }
            Grav = 0.25F;
        }
        else {
            if (JumpFlag == TRUE) {
                Grav = 0.5F;
            }
        }
    }
    //空中での移動を解禁する
        if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
            VectX = 0.0F;
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = FALSE;
            VectX -= 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        //マリオ3のように加速
        if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
            Dir = TRUE;
            VectX += 1.0F;
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
            //マリオ3以降よろしく、方向転換する。
            Dir = TRUE;
            VectX += 1.0F;
            DropPower += 0.1F;
            MoveX = VectX;
        }
        if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
            Dir = FALSE;
            VectX -= 1.0F;
            MoveX = VectX;
        }
        //落下処理
        DropPower += Grav;
        MoveY = DropPower;
        //移動量に基づいて移動する。
        CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
    //マップの描画
    {
        int i, j;
        for (i = 0; i < MAP_HEIGHT; i++) {
            for (j = 0; j < MAP_WIDTH; j++) {
                if (MapData[i][j] == 1) {
                    DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
                }
            }
        }
    }
    //キャラの描画
    DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    init();
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
        main();
    }
    DxLib_End(); fclose(out); FreeConsole();
    return 0;
}

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月21日(火) 17:56
No: 16
(OFFLINE)

 Re: レバー二回ダッシュが反応しない。

[解決!]

移動処理を以下のようなコードにしたら、ちゃんとしたものが出るようになりました。
コード[C++]: 全て選択
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
{
        int DashTime = 8;
        if ((Input&PAD_INPUT_2)) {
            RunButton = TRUE;
        }
        else {
            RunButton = FALSE;
        }
        //右へ移動
        if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
            NonVertJumpFlag = 1;
            Dir = TRUE;
            //レバー二段ダッシュの判定を行う
            if ((Input&PAD_INPUT_RIGHT)) {
                if ((DashT == TRUE && DashCnt < DashTime) && dir == 1) {
                    DashB = TRUE;
                }
                if (DashB == TRUE) {
                    RunButton = TRUE;
                }
                if (dir == 2) {
                    DashB = FALSE;
                    RunButton = FALSE;
                }
                dir = 1;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = 8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = 5.0F;
                }
                else {
                    MoveX = 3.0F;
                }
                DashCnt = 0;
            }
        //左に移動
            else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
                NonVertJumpFlag = 2;
                Dir = FALSE;
                if ((Input&PAD_INPUT_LEFT)) {
                    if ((DashT == TRUE && DashCnt < DashTime)  && dir == 2) {
                        DashB = TRUE;
                    }
                    if (DashB == TRUE) {
                        RunButton = TRUE;
                    }
                    if (dir == 1) {
                        RunButton = FALSE;
                    }
                    dir = 2;
                }
                if (RunButton == TRUE && JumpFlag == FALSE) {
                    MoveX = -8.0F;
                }
                else if (RunButton == FALSE && JumpFlag == FALSE) {
                    MoveX = -5.0F;
                }
                else {
                    MoveX = -3.0F;
                }
                DashCnt = 0;
            }
            else {
                DashB = FALSE;
                RunButton = FALSE;
            }
            DashCnt++;
        }


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[11人]