合計 昨日 今日

マリオ風のジャンプが出ない。(意図したとおりにならない)

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

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

 マリオ風のジャンプが出ない。(意図したとおりにならない)

viewtopic.php?f=3&t=18906の続きです。
前回は加減速を(めり込むという問題点はあるもの)なんとか実装させたのですが、今度は小ジャンプを実装しようと思います。
…ですが、何故か何もしないとジャンプしてしまい、左右に入れると落下してしまいます。
前回から変更したコードは以下のとおりです。
コード[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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.1f,DropPower=%8.1f", (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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        if (JumpTimer < 0) {
            if ((Input&PAD_INPUT_1) > PAD_INPUT_ON) {
                JumpTimer++;
            }
        }
        else {
            if (JumpTimer < 10 && NonVertJumpFlag == 0) {
                Grav = 0.5F;
                DropPower = -5.0F;
                JumpFlag = TRUE;
            }
            //垂直大ジャンプ
            if (JumpTimer == 10 && NonVertJumpFlag == 0) {
                Grav = 0.5F;
                DropPower = -9.5F;
                JumpFlag = TRUE;
            }
            //斜めへジャンプ
            if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = 8.0F;
                    MaxVect = 8.0F;
                }
                else {
                    VectX = 5.0F;
                    MaxVect = 5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
            }
            if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                    Grav = 0.5F;
                    DropPower = -9.5F;
                    if (RunButton == TRUE) {
                        VectX = -8.0F;
                    }
                    else {
                        VectX = -5.0F;
                    }
                    //斜めに飛んでいることを確認
                    NonVertJump = TRUE;
                    JumpFlag = TRUE;
                    //コントロールカウントをリセット
                    ContCnt = 0;
                    }
            }
        }
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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);
}
最後に編集したユーザー keito940 [ 2017年3月11日(土) 20:47 ], 累計 2 回

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

 Re: マリオ風のジャンプが出ない。

何かと思えば、ちょっとしたミスだったんですね。すいませんでした。前のスレにも書いたように viewtopic.php?f=3&t=11328 を参考にして、ジャンプを実装しようとしているのですが、ジャンプボタンを押しているつもりなのに何故か出ません。コンソールによれば、JumpTimerが、0のままなことにあるようです。コードは以下のとおりです。
コード[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
 
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.1f,DropPower=%8.1f", (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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        if (JumpTimer == 0 && JumpFlag == FALSE && (Input&PAD_INPUT_1) > PAD_INPUT_ON) {
            JumpTimer++;
        }
        if (JumpTimer == 10 && NonVertJumpFlag == 0) {
            Grav = 0.5F;
            DropPower = -9.5F;
            JumpFlag = TRUE;
        }
        if (JumpTimer > 10 && NonVertJumpFlag == 0) {
            Grav = 0.5F;
            DropPower = -5.0F;
            JumpFlag = TRUE;
        }
            //斜めへジャンプ
        if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
            Grav = 0.5F;
            DropPower = -9.5F;
            if (RunButton == TRUE) {
                VectX = 8.0F;
                MaxVect = 8.0F;
            }
            else {
                VectX = 5.0F;
                MaxVect = 5.0F;
            }
            //斜めに飛んでいることを確認
            NonVertJump = TRUE;
            JumpFlag = TRUE;
            //コントロールカウントをリセット
            ContCnt = 0;
        }
        if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
                }
        }
 
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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月11日(土) 17:05
No: 3
(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
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
//衝突のテストプログラム(だった)
//アクションゲームのテストシステムを作る前に、
//めり込み防止のアルゴリズムを初心者なりに作らざるをえない。
//(完成しました)
//でも現在はアクションゲーム全般のテストプログラムになりつつある…。
//現在マリオで使われるジャンプの加減速で悪戦苦闘中…。
//サンプルコードのジョイパッドのやつは欠陥だらけらしいことに気づき、ちょっと書き直し中…。
//(やっぱり、これでよかったのか…。)
//しかしどうしたら加減速ができるんだ?
//そうか!スピードを保存して、移動している方向を決めればいいんだ!
//Create 2017/02/10
#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,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,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;
char JumpFlag, Dir, AirFlag, NonVertJump;
 
int DashCnt, ContCnt, 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, float 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,float 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();
    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.1f,DropPower=%8.1f", (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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        if (JumpTimer == 0 && JumpFlag == FALSE && (Input&PAD_INPUT_1) > PAD_INPUT_ON) {
            JumpTimer++;
        }
        if (JumpTimer == 10 && NonVertJumpFlag == 0) {
            Grav = 0.5F;
            DropPower = -9.5F;
            JumpFlag = TRUE;
        }
        if (JumpTimer > 10 && NonVertJumpFlag == 0) {
            Grav = 0.5F;
            DropPower = -5.0F;
            JumpFlag = TRUE;
        }
            //斜めへジャンプ
        if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
            Grav = 0.5F;
            DropPower = -9.5F;
            if (RunButton == TRUE) {
                VectX = 8.0F;
                MaxVect = 8.0F;
            }
            else {
                VectX = 5.0F;
                MaxVect = 5.0F;
            }
            //斜めに飛んでいることを確認
            NonVertJump = TRUE;
            JumpFlag = TRUE;
            //コントロールカウントをリセット
            ContCnt = 0;
        }
        if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
                }
        }
 
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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月11日(土) 17:11
No: 4
(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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.1f,DropPower=%8.1f", (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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        if (JumpTimer == 0 && JumpFlag == FALSE && (Input&PAD_INPUT_1) > PAD_INPUT_ON) {
            JumpTimer++;
        }
        if ((Input&PAD_INPUT_1) == PAD_INPUT_OFF && JumpTimer == 10 && NonVertJumpFlag == 0) {
            Grav = 0.5F;
            DropPower = -9.5F;
            JumpFlag = TRUE;
        }
        if ((Input&PAD_INPUT_1) == PAD_INPUT_OFF && JumpTimer > 10 && NonVertJumpFlag == 0) {
            Grav = 0.5F;
            DropPower = -5.0F;
            JumpFlag = TRUE;
        }
            //斜めへジャンプ
        if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
            Grav = 0.5F;
            DropPower = -9.5F;
            if (RunButton == TRUE) {
                VectX = 8.0F;
                MaxVect = 8.0F;
            }
            else {
                VectX = 5.0F;
                MaxVect = 5.0F;
            }
            //斜めに飛んでいることを確認
            NonVertJump = TRUE;
            JumpFlag = TRUE;
            //コントロールカウントをリセット
            ContCnt = 0;
        }
        if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
                }
        }
 
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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月11日(土) 17:29
No: 5
(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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.1f,DropPower=%8.1f", (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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        JumpTimer = 0;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        if (JumpTimer > 0 && JumpFlag == FALSE) {
            if ((Input&PAD_INPUT_1) > PAD_INPUT_ON) {
                JumpTimer++;
            }
        }
        else {
            if ((Input&PAD_INPUT_1) > PAD_INPUT_OFF) {
                if (JumpTimer == 10 && NonVertJumpFlag == 0) {
                    Grav = 0.5F;
                    DropPower = -9.5F;
                    JumpFlag = TRUE;
                }
                else if (JumpTimer < 10 && NonVertJumpFlag == 0) {
                    Grav = 1.0F;
                    DropPower = -5.0F;
                    JumpFlag = TRUE;
                }
            }
            JumpTimer++;
        }
        //斜めへジャンプ
        if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
            Grav = 0.5F;
            DropPower = -9.5F;
            if (RunButton == TRUE) {
                VectX = 8.0F;
                MaxVect = 8.0F;
            }
            else {
                VectX = 5.0F;
                MaxVect = 5.0F;
            }
            //斜めに飛んでいることを確認
            NonVertJump = TRUE;
            JumpFlag = TRUE;
            //コントロールカウントをリセット
            ContCnt = 0;
        }
        if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
                }
        }
 
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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);
}
最後に編集したユーザー keito940 [ 2017年3月11日(土) 17:52 ], 累計 1 回

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

 Re: マリオ風のジャンプが出ない。

いや解決じゃなかった、ジェットみたいなジャンプになっているんだった!!どうしたら、ジャンプボタンを離したと同時にジャンプできるんだろうか…

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月11日(土) 18:03
No: 7
(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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.1f,DropPower=%8.1f", (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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        //ジャンプの処理について:押している間はJumpTimerが加算され、離れたらジャンプする。
        //今のコードのジャンプは押している間もジャンプして長く押していたら大ジャンプするというとんでも仕様。
        if (JumpTimer > 0 && JumpFlag == FALSE) {
            if ((Input&PAD_INPUT_1) > PAD_INPUT_ON) {
                JumpTimer++;
            }
        }
        else {
            if ((Input&PAD_INPUT_1) > JumpTimer) {
                if (JumpTimer == 10 && NonVertJumpFlag == 0) {
                    Grav = 0.5F;
                    DropPower = -9.5F;
                    JumpFlag = TRUE;
                }
                else if (JumpTimer < 10 && NonVertJumpFlag == 0) {
                    Grav = 1.0F;
                    DropPower = -5.0F;
                    JumpFlag = TRUE;
                }
            }
            JumpTimer++;
        }
        //斜めへジャンプ
        if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
            Grav = 0.5F;
            DropPower = -9.5F;
            if (RunButton == TRUE) {
                VectX = 8.0F;
                MaxVect = 8.0F;
            }
            else {
                VectX = 5.0F;
                MaxVect = 5.0F;
            }
            //斜めに飛んでいることを確認
            NonVertJump = TRUE;
            JumpFlag = TRUE;
            //コントロールカウントをリセット
            ContCnt = 0;
        }
        if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
                }
        }
 
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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月11日(土) 23:30
No: 8
(OFFLINE)

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

 Re: マリオ風のジャンプが出ない。(意図したとおりにならない)

Math さんが書きました:http://dixq.net/forum/viewtopic.php?f=3&t=18930に載せたコードは参考になりませんか?)

確かに参考にはなるんですが…。僕が考えているのとは違うと思います。

Name: usao
[URL]
ハッカー(138,194 ポイント)
Date: 2017年3月12日(日) 12:59
No: 10
(OFFLINE)

 Re: マリオ風のジャンプが出ない。(意図したとおりにならない)

Offtopic :
まず,「マリオ風のジャンプ」…って何ですか? っていう具体的定義が不明.


>どうしたら、ジャンプボタンを離したと同時にジャンプできるんだろうか…

「ボタンを離すまではジャンプしない」という挙動(タメ的な?)にしたいのでしょうか.
(私の知っているマリオとは違うけども)

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

 Re: マリオ風のジャンプが出ない。(意図したとおりにならない)

usao さんが書きました:まず,「マリオ風のジャンプ」…って何ですか? っていう具体的定義が不明.

usaoさん、ちょっと僕の説明が不適切でしたね…。僕の言うマリオ風と言うのは、「押す時間によってジャンプする距離が異なる」がわかりやすいでしょうか?でも、今のコードで押し続けていると、ジャンプし続けてしまうからこの質問をしているのです。
(私の知っているマリオとは違うけども)

一時期、ボタンを離すまではジャンプしないのかと思っていました。ごめんなさい。

Name: Math
[URL]
Date: 2017年3月12日(日) 18:19
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
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    ChangeWindowMode(TRUE);SetGraphMode(320,240,32);///////
    DxLib_Init();SetDrawScreen(DX_SCREEN_BACK);////////////
 
    int x;      //x座標
    int y;      //y座標
    int size;   //プレイヤーのサイズ 今回は正方形とする。
    double vx;  //x方向への加速度
    double vy;  //y方向への加速度
 
    int cnt_z;  //Zキーの押されたフレーム数
 
    const double JUMP_P = 16;   //プレイヤーのジャンプパワー
    const double G_on = 0.4;    //キーが押されているときの重力
    const double G_off = 1.6;   //キーが押されていないときの重力
    const int W_WIDTH = 320;    //ウィンドウの高さ
    const int W_HEIGHT = 240;   //ウィンドウの幅
 
    //ゲーム初期化
    x = W_WIDTH / 2;
    y = W_HEIGHT / 2;
    vx = 0;
    vy = 0;
    cnt_z = 0;
    size = 16;
 
    // ループ
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
 
        //Zキーの押されたフレーム数を格納する。
        if (CheckHitKey(KEY_INPUT_Z) != 0){
            cnt_z++;
        }else{
            cnt_z = 0;
        }
 
        //Zキーが押されている間
        if (cnt_z > 0){
            //Zキーが押された瞬間、かつ地面に接していたら
            if (cnt_z == 1 && y == W_HEIGHT - size){
                vy = JUMP_P;    //ジャンプ力を与える
            }
            vy -= G_on;//押されてる間は重力を弱めに
        }else{
            vy -= G_off;//そうでないときは重力を強めに
        }
 
        y = y - vy;     //実際に座標に対して計算
 
        //めり込み防止
        if (y > W_HEIGHT - size){
            y = W_HEIGHT - size;
            vy = 0;
        }
 
        //描画
        DrawBox(x, y, x + size, y + size, GetColor(255, 255, 255), true);
    }
 
    DxLib_End();return 0;////////////////////////
}

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

 Re: マリオ風のジャンプが出ない。(意図したとおりにならない)

Mathさん、いつもありがとうございます。ですが、今のコードでは、小ジャンプしか出ません。
10F押せば、大ジャンプが出るのですが…。コードは以下のとおりです。
コード[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
int main(void) {
    FreamStartTime = GetNowCount();
    while (GetNowCount() - FreamStartTime < 1000 / 60) {}
    system("cls");
    printf("メインループ開始\n");
    printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.1f,DropPower=%8.1f", (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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        if ((Input&PAD_INPUT_1) > PAD_INPUT_ON) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        if (JumpTimer > 0) {
            if (JumpFlag == FALSE && JumpTimer == 10 && NonVertJumpFlag == 0) {
                Grav = 0.5F;
                DropPower = -9.5F;
                JumpFlag = TRUE;
            }
            else if (JumpFlag == FALSE && JumpTimer < 10 && NonVertJumpFlag == 0) {
                Grav = 1.0F;
                DropPower = -5.0F;
                JumpFlag = TRUE;
            }
        }
        //斜めへジャンプ
        if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
            Grav = 0.5F;
            DropPower = -9.5F;
            if (RunButton == TRUE) {
                VectX = 8.0F;
                MaxVect = 8.0F;
            }
            else {
                VectX = 5.0F;
                MaxVect = 5.0F;
            }
            //斜めに飛んでいることを確認
            NonVertJump = TRUE;
            JumpFlag = TRUE;
            //コントロールカウントをリセット
            ContCnt = 0;
        }
        if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
                }
        }
 
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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月12日(日) 21:16
No: 14
(OFFLINE)

 Re: マリオ風のジャンプが出ない。(意図したとおりにならない)

サンプルは単独でテストして頂きましたでしょうか。
どのような問題点があるのでしょう?
[開発環境なVS2015でしょうか?開発者コマンドプロンプトはお使いですか?。(短いサンプルはコマンドプロンプトが便利だし一瞬で立ち上がる。沢山のサンプルをうまく組み合わせて大きなプログラムにしないとbugった時面倒ですね]

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月13日(月) 18:28
No: 15
(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
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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        //ジャンプボタンが押されているフレームを格納する。
        if ((Input&PAD_INPUT_1) > PAD_INPUT_ON) {
            JumpTimer++;
        }
        else {
            JumpTimer = 0;
        }
        //問題となるところ
        //長押しで重力が弱く、離せば、重力が強く。
        if (JumpTimer > 0) {
            if (JumpTimer == 1 && NonVertJumpFlag == 0) {
                DropPower = -9.50F;
            }
            JumpFlag == TRUE;
            Grav = 0.25F;
        }
        else {
            if (JumpFlag == TRUE) {
                Grav = 0.5F;
            }
        }
        //斜めへジャンプ
        if (JumpFlag == FALSE && NonVertJumpFlag == 1 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
            Grav = 0.5F;
            DropPower = -9.5F;
            if (RunButton == TRUE) {
                VectX = 8.0F;
                MaxVect = 8.0F;
            }
            else {
                VectX = 5.0F;
                MaxVect = 5.0F;
            }
            //斜めに飛んでいることを確認
            NonVertJump = TRUE;
            JumpFlag = TRUE;
            //コントロールカウントをリセット
            ContCnt = 0;
        }
        if (JumpFlag == FALSE && NonVertJumpFlag == 2 && (EdgeInput&PAD_INPUT_1) > PAD_INPUT_ON) {
                Grav = 0.5F;
                DropPower = -9.5F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -5.0F;
                }
                //斜めに飛んでいることを確認
                NonVertJump = TRUE;
                JumpFlag = TRUE;
                //コントロールカウントをリセット
                ContCnt = 0;
                }
        }
 
        if (NonVertJump == TRUE && VectX == 0) {
            NonVertJump = FALSE;
        }
        //右へジャンプしているときに左で減速
        if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
            VectX -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            else {
                DropPower -= 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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月14日(火) 08:34
No: 16
(OFFLINE)

 Re: マリオ風のジャンプが出ない。(意図したとおりにならない)

キーは押し続けると連続入力になります。[例]a aaaaaaaaaaaaa.....プログラム例はそれを抑止します。
開発者コマンドプロンプトが見つかったら最新のDxLibを設定します。
http://dxlib.o.oo7.jp/dxdload.htmlここからVer3.17eをダウンロードしてその中の
プロジェクトに追加すべきファイル_VC用”をD:\ドライブがにコピーして”名前をdxlibにかえます。これで最新のDxLibの設定は終わりです。
---
d:\ドライブにgmフォルダーを作りその中にg1フォルダーを作ります。その中にg.batをつくります。
d:\gm\g.bat
コード[C++]: 全て選択
1
nmake -f g.mak

次にd:\gm\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
    link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj
    $(TARGETNAME).exe

次にc:\gm\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
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    ChangeWindowMode(TRUE);SetGraphMode(320,240,32);///////
    DxLib_Init();SetDrawScreen(DX_SCREEN_BACK);////////////
 
    int x;      //x座標
    int y;      //y座標
    int size;   //プレイヤーのサイズ 今回は正方形とする。
    double vx;  //x方向への加速度
    double vy;  //y方向への加速度
 
    int cnt_z;  //Zキーの押されたフレーム数
    const double JUMP_P = 16;   //プレイヤーのジャンプパワー
 
    const double G_on = 0.4;    //キーが押されているときの重力
    const double G_off = 1.6;   //キーが押されていないときの重力
    const int W_WIDTH = 320;    //ウィンドウの高さ
    const int W_HEIGHT = 240;   //ウィンドウの幅
 
    //ゲーム初期化
    x = W_WIDTH / 2;
    y = W_HEIGHT / 2;
    vx = 0;
    vy = 0;
    cnt_z = 0;
    size = 16;
 
    // ループ
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
 
        //Zキーの押されたフレーム数を格納する。
        if (CheckHitKey(KEY_INPUT_Z) != 0){
            cnt_z++;
        }else{
            cnt_z = 0;
        }
 
        //Zキーが押されている間
        if (cnt_z > 0){
            //Zキーが押された瞬間、かつ地面に接していたら
            if (cnt_z == 1 && y == W_HEIGHT - size){
                vy = JUMP_P;    //ジャンプ力を与える
            }
            vy -= G_on;//押されてる間は重力を弱めに
        }else{
            vy -= G_off;//そうでないときは重力を強めに
        }
 
        y = y - vy;     //実際に座標に対して計算
 
        //めり込み防止
        if (y > W_HEIGHT - size){
            y = W_HEIGHT - size;
            vy = 0;
        }
 
        //描画
        DrawBox(x, y, x + size, y + size, GetColor(255, 255, 255), true);
    }
 
    DxLib_End();return 0;////////////////////////
}

これで完了しました。
開発者コマンドプロンプトを立ち上げ

コード[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
C:\Program Files (x86)\Microsoft Visual Studio 14.0>d:
 
D:\>cd gm
 
D:\gm>cd g1
 
D:\gm\g1>g
 
D:\gm\g1>nmake -f g.mak
 
Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.
 
        cl /c /TP /EHsc /D "_MBCS" /MT  /Id:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.
 
g1.cpp
g1.cpp(50): warning C4244: '=': 'double' から 'int' への変換です。データが失われる可能性があります 。
        link /out:g1.exe /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" g1.obj
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.
 
        g1.exe
 
D:\gm\g1>g


(動かない場合私のホームページhttp://cswin10.nisinippon.com/cs/cs1/vs2015/comm/cpp/DxLib/001/dx01.htmlをみてください。

Name: keito940
[URL]
熟練のプログラマー(59,919 ポイント)
Date: 2017年3月14日(火) 16:13
No: 17
(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
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
#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;
char JumpFlag, Dir, AirFlag, NonVertJump;
 
int DashCnt, ContCnt, 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();
    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", Dir, NonVertJump, VectX,JumpTimer);
    //カメラの処理を行う
    CameraCheck(PlayerX, PlayerY);
    //入力状態を更新
    {
        int i;
        i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
        EdgeInput = i & ~Input;
        Input = i;
    }
    //移動処理
    {
        float MaxVect;
        int DashTimer = 8;
        int ContTimer = 8;
        DashCnt = 0;
        ContCnt = 0;
        //ベクトルを初期化し、加減速処理を行う。
        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) {
            Dir = TRUE;
            NonVertJumpFlag = 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) > PAD_INPUT_ON) {
            Dir = FALSE;
            NonVertJumpFlag = 2;
            if (RunButton == TRUE) {
                MoveX = -8.0F;
            }
            else if (RunButton == FALSE && JumpFlag == FALSE) {
                MoveX = -5.0F;
            }
            else {
                MoveX = -3.0F;
            }
        }
        //ジャンプボタンが押されているフレームを格納する。
        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;
 
                //コントロールカウントをリセット
                ContCnt = 0;
            }
            if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
                JumpFlag = TRUE;
                DropPower = -7.0F;
                if (RunButton == TRUE) {
                    VectX = -8.0F;
                }
                else {
                    VectX = -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 -= 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            MoveX = VectX;
        }
        //左へジャンプしているときに右で減速
        if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
            //マリオ3以降よろしく、方向転換する。
            Dir = TRUE;
            VectX += 0.5F;
            if (DropPower < 0) {
                DropPower += 0.1F;
            }
            MoveX = VectX;
        }
        ContCnt++;
        //落下処理
        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;
}

追記:バグが有ったみたいなので少し修正いたしました。


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

オンラインデータ

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