hit   今日   昨日

マリオ風のジャンプについて

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

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ボラ天神
[URL]
Date: 2012年8月19日(日) 23:29
No: 1
(OFFLINE)

 マリオ風のジャンプについて

私は今DxライブラリとC言語を使ってマリオ風のアクションゲームを作っています。
作成手順として背景の表示、移動、加速、減速、ジャンプ、とやってきたのですが、マリオみたく長くボタンを押すと大きくジャンプするみたいなことができません。
色々なサイトのコードを参考にさせてもらっていて頑張ってみたのですが、そのジャンプの処理は実装することができませんでした。
C言語は少し前から授業で触った程度です。Dxライブラリも同時期に使い始めました。

どのようにしたら私が望んでいるようにできるのか教えていただけると助かります。

コード[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
#include "DxLib.h"
 
int count=0;
char Key[256];
 
void wait_fanc();
void fps();
void GetKeyInput(int *KeyBuf);
 
struct Chara {
    double x;
    double y;
    int g;
    double spdX;
    double spdY;
};
   
 
struct Chara mario;
 
 
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1) return(-1);
 
    SetDrawScreen(DX_SCREEN_BACK);
    mario.x = (double)0;
    mario.y = (double)32;//480 - 32 * 2;
    mario.g = LoadGraph("media\\test001.png");
    mario.spdX = (double)0;
    mario.spdY = (double)0;
 
    while(ProcessMessage() == 0&& CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
        ClsDrawScreen();
        int Bg_flag = 0;
        int count_flag = 0;
        int  grav = 10;
        int Buf[256];
        GetKeyInput(Buf);
 
        if(Bg_flag == 0){
            DrawBox(0,0,640,480,GetColor(105,122,243),TRUE);    //背景を水色に1 - 1
            Bg_flag = 1;
        }
        fps();
        count++;
        //-------------------------------------------------------------------------
 
 
 
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX -= 1.0;
            }else {
                mario.spdX -= 0.3;
            }
            mario.x += mario.spdX;
        }
        if(((CheckHitKey(KEY_INPUT_RIGHT)) == false) &&(CheckHitKey(KEY_INPUT_LEFT) == false) && (mario.spdX > 0)){
            mario.spdX -= 0.3;
            mario.x += mario.spdX;
            count_flag += 1;
        }
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX += 1.0;
            }else {
                mario.spdX += 0.3;
            }
            mario.x += mario.spdX;         
        }
        if((CheckHitKey(KEY_INPUT_LEFT) == false) && ((CheckHitKey(KEY_INPUT_RIGHT)) == false) && (mario.spdX < 0)){
            mario.spdX += 0.3;
            mario.x += mario.spdX;
            count_flag += 1;       
        }
 
 
 
 
        mario.y -= mario.spdY;
        mario.spdY -= 1;
 
        if(mario.x < 0) mario.x = 0;
        //if(mario.x > 640 - 32) mario.x = 640 - 32;
        if((CheckHitKey(KEY_INPUT_Z))) {
            if(mario.spdX > 8.0) mario.spdX = 8.0;
            if(mario.spdX < -8.0) mario.spdX = -8.0;
        }else {
            if(mario.spdX > 5.0) mario.spdX = 5.0;
            if(mario.spdX < -5.0) mario.spdX = -5.0;
        }
        if(count_flag > 1)  {count_flag = 0;    mario.spdX = 0;}
        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0;}
        if(mario.spdY > 30.0) mario.spdY = 30.0;
 
 
        if(((CheckHitKey(KEY_INPUT_C)) == TRUE && mario.y == 480 -32) && (Buf[KEY_INPUT_C] > 0 && Buf[KEY_INPUT_C] < 10)) {
            mario.spdY = 15;
        }else if((CheckHitKey(KEY_INPUT_C)) == TRUE && mario.y == 480 -32 && (Buf[KEY_INPUT_C] >= 10)) {
            mario.spdY = 20;
        }
 
        DrawGraph((int)mario.x, (int)mario.y, mario.g, TRUE);
 
 
        //-------------------------------------------------------------------------
        ScreenFlip();
        wait_fanc();
    }
    DxLib_End();
    return(0);
}
 
 
 
void wait_fanc(){
    int term;
    static int t=0;
    term = GetNowCount()-t;
    if(16-term>0)
            Sleep(16-term);
    t=GetNowCount();
    return;
}
 
void fps(){
    int i;
    static int t=0,ave=0,f[60];
 
    f[count%60]=GetNowCount()-t;
    t=GetNowCount();
    if(count%60==59){
        ave=0;
        for(i=0;i<60;i++)
            ave+=f[i];
        ave/=60;
    }
    if(ave!=0){
        DrawFormatString(0, 0,GetColor(0,0,0),"%.1fFPS",1000.0/(double)ave);
        DrawFormatString(0,20,GetColor(0,0,0),"%dms"  ,ave);
    }
    return;
}
 
void GetKeyInput( int *KeyBuf ){
    char damy[256];
    GetHitKeyStateAll( damy ) ;
    for( int i=0 ; i<256 ; i++ ){
        if( damy[i] == 1 )
            KeyBuf[i]++;
        else
            KeyBuf[i] = 0;
    }
 
}


コード汚くて本当にすみません。

Name: ボラ天神
[URL]
Date: 2012年8月19日(日) 23:51
No: 2
(OFFLINE)

 Re: マリオ風のジャンプについて

追伸:キーボードの右と左を同時に押すとおかしな挙動をするのも気になるので教えていただけると助かります。

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月20日(月) 00:42
No: 3
(OFFLINE)

 Re: マリオ風のジャンプについて

ジャンプに関しては完全に検証してませんが、構造体にJumpCountを追加して初期化。
そのあとの処理は、こんな感じです。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount=0; }
        if(mario.spdY > 30.0) mario.spdY = 30.0;
 
        if( mario.JumpCount == 0 ) {
            if( Buf[KEY_INPUT_C] > 0  ) {
                mario.JumpCount++;
            }
        } else {
            if( Buf[KEY_INPUT_C] > mario.JumpCount  ) {
                if( mario.JumpCount == 10 ) {
                    mario.spdY = 20;
                } else if( mario.JumpCount < 10 ) {
                    mario.spdY = 15;
                }
            }
            mario.JumpCount++;
        }


左右キーの同時押しは、同時に押され倒されていない時のみの右キーとキー左の処理を書いてください。同時に押されたら押されていないと同じ扱いに成るようにします。
by softya(ソフト屋)

Name: ボラ天神
[URL]
Date: 2012年8月20日(月) 00:55
No: 4
(OFFLINE)

 Re: マリオ風のジャンプについて

>> softya(ソフト屋) さん
ありがとうございます!!
今組み込んでみたいと思います!!

Name: ボラ天神
[URL]
Date: 2012年8月20日(月) 01:12
No: 5
(OFFLINE)

 Re: マリオ風のジャンプについて

ジャンプは一応成功しましたがやはりプログラムの順番的に
コード[C++]: 全て選択
1
2
3
4
5
6
7
if( Buf[KEY_INPUT_C] > mario.JumpCount) {
    if(mario.JumpCount == 10) {
        mario.spdY = 15;
    }else if(mario.JumpCount < 10) {
        mario.spdY = 10;
    }
}

Cボタンを押し続けると10を代入してから15を代入する形になるので長押しした場合スムーズにジャンプせずにグイン・グインと二段階に分かれてジャンプしてしまいます。
これはどうしようもないことなのでしょうか?

それと左右の挙動についてですが変更してみたのですがもちろん動きませんでしたw
自分でもおかしいと思いながら直したのですがどこが間違ってるのでしょうか?
コード[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
if(CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0){
    if(CheckHitKey(KEY_INPUT_LEFT) == 1){
        if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
            mario.spdX -= 1.0;
        }else {
            mario.spdX -= 0.3;
        }
        mario.x += mario.spdX;
    }
    if(((CheckHitKey(KEY_INPUT_RIGHT)) == false) &&(CheckHitKey(KEY_INPUT_LEFT) == false) && (mario.spdX > 0)){
        mario.spdX -= 0.3;
        mario.x += mario.spdX;
        count_flag += 1;
    }
}
if(CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0){
    if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
        if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
            mario.spdX += 1.0;
        }else {
            mario.spdX += 0.3;
        }
        mario.x += mario.spdX;         
    }
    if((CheckHitKey(KEY_INPUT_LEFT) == false) && ((CheckHitKey(KEY_INPUT_RIGHT)) == false) && (mario.spdX < 0)){
        mario.spdX += 0.3;
        mario.x += mario.spdX;
        count_flag += 1;       
    }
}

Name: ボラ天神
[URL]
Date: 2012年8月20日(月) 01:13
No: 6
(OFFLINE)

 Re: マリオ風のジャンプについて

すみません/コードで閉じるの忘れてました!!

Name: 涼雅
[URL]
プログラマー(26,715 ポイント)
Date: 2012年8月20日(月) 10:57
No: 7
(OFFLINE)

 Re: マリオ風のジャンプについて

10か15に統一すればいいです

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月20日(月) 11:00
No: 8
(OFFLINE)

 Re: マリオ風のジャンプについて

涼雅 さんが書きました:10か15に統一すればいいです


10から15の間を計算で求めて多段階に分解するって方法もありますね。
【追記】気持ちよくなるポイントを色々調整する必要があります。
by softya(ソフト屋)

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月20日(月) 12:57
No: 9
(OFFLINE)

 Re: マリオ風のジャンプについて

左右の問題について

if(CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0){
だとif条件がRIGHTがOFFでかつLEFTがOFFの時にしか成立しないので、この中のif文でRIGHTがONか聞いても無駄です。

私が書いたのは、「左右が同時に押されたら押されていないと同じ扱いに成るようにします。」なので、
CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0

CheckHitKey(KEY_INPUT_RIGHT) == 1 && CheckHitKey(KEY_INPUT_LEFT) == 1
の時は何もしない様に素直に書くだけです。elseをうまく使ってください。

あとキーが押されていなくても動作する必要のある処理をCheckHitKeyのあるif文の中に書いてはいけません。
キーが押された時だけする処理とキーが押された後で起こる反応はかき分けてください。
by softya(ソフト屋)

Name: ISLe
[URL]
ハッカー(214,618 ポイント)
Date: 2012年8月20日(月) 16:10
No: 10
(OFFLINE)

 Re: マリオ風のジャンプについて

マリオジャンプは、跳び上がる初速は同じで、ボタンを押していないとき落下加速度が大きくなるようにするのだったかと。

Name: ボラ天神
[URL]
Date: 2012年8月20日(月) 22:31
No: 11
(OFFLINE)

 Re: マリオ風のジャンプについて

涼雅 さんが書きました:10か15に統一すればいいです

実際のマリオにできるだけ近づけたいのでISLeさんの意見を採用してみたいと思います。しかし、返信はとても為になりますし、本物のマリオに近づくための一歩だと思うのでどしどし書いていただけると本当に嬉しく思います。

あと左右の件なのですが、説明していただいていることはよくわかるのですが、経験が足りないためか、どこにその処理をいれたらいいかわかりません。試しに色々変えてみたのですがうまくいかないのでもう少し教えていただけると幸いです。

ISLe さんが書きました:マリオジャンプは、跳び上がる初速は同じで、ボタンを押していないとき落下加速度が大きくなるようにするのだったかと。

このような本物のマリオの動作について返信していただけるととてもありがたいと思います。具体的にはジャンプボタンを押したら上限は決まっていて、そこまで飛び、私たちが高く飛んでいるように見えるのは落下速度が遅くなるからなのですか?
実際に高く飛んでいるように見えたのは目の錯覚なのでしょうかww

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月20日(月) 22:43
No: 12
(OFFLINE)

 Re: マリオ風のジャンプについて

ボラ天神 さんが書きました:あと左右の件なのですが、説明していただいていることはよくわかるのですが、経験が足りないためか、どこにその処理をいれたらいいかわかりません。試しに色々変えてみたのですがうまくいかないのでもう少し教えていただけると幸いです。


こんな感じでしょうか?
条件は素直に書くのが一番です。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    //  左右を押していないか同時押しは押していないのと同じ。
    if( (CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0) ||
        (CheckHitKey(KEY_INPUT_RIGHT) == 1 && CheckHitKey(KEY_INPUT_LEFT) == 1)     ) {
        //  左右のスピードの摩擦・慣性処理。キーを離すとしばらくして停止。
            :
            :
       
       
    } else {
        //  右キーの処理。移動・ダッシュ。
            :
            :
       
        //  左キーの処理。移動・ダッシュ。
            :
            :
    }



ボラ天神 さんが書きました:
ISLe さんが書きました:マリオジャンプは、跳び上がる初速は同じで、ボタンを押していないとき落下加速度が大きくなるようにするのだったかと。

このような本物のマリオの動作について返信していただけるととてもありがたいと思います。具体的にはジャンプボタンを押したら上限は決まっていて、そこまで飛び、私たちが高く飛んでいるように見えるのは落下速度が遅くなるからなのですか?
実際に高く飛んでいるように見えたのは目の錯覚なのでしょうかww


ISLeさんの方式だと上方向の速度は同じでも下方向の加速度を減らすので当然ながらジャンプ頂点は高くなります。
by softya(ソフト屋)

Name: ボラ天神
[URL]
Date: 2012年8月20日(月) 22:56
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
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
#include "DxLib.h"
 
/*        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount=0; }
        if(mario.spdY > 30.0) mario.spdY = 30.0;
 
        if( mario.JumpCount == 0 ) {
            if( Buf[KEY_INPUT_C] > 0  ) {
                mario.JumpCount++;
            }
        } else {
            if( Buf[KEY_INPUT_C] > mario.JumpCount  ) {
                if( mario.JumpCount == 10 ) {
                    mario.spdY = 20;
                } else if( mario.JumpCount < 10 ) {
                    mario.spdY = 15;
                }
            }
            mario.JumpCount++;
        }
        */
 
int count=0;
char Key[256];
 
void wait_fanc();
void fps();
void GetKeyInput(int *KeyBuf);
 
struct Chara {
    double x;
    double y;
    int g;
    double spdX;
    double spdY;
    int JumpCount;
};
   
 
struct Chara mario;
 
 
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1) return(-1);
 
    SetDrawScreen(DX_SCREEN_BACK);
    mario.x = (double)0;
    mario.y = (double)32;//480 - 32 * 2;
    mario.g = LoadGraph("media\\test001.png");
    mario.spdX = (double)0;
    mario.spdY = (double)0;
 
    while(ProcessMessage() == 0&& CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
        ClsDrawScreen();
        int Bg_flag = 0;
        int count_flag = 0;
        int  grav = 10;
        int Buf[256];
        GetKeyInput(Buf);
 
        if(Bg_flag == 0){
            DrawBox(0,0,640,480,GetColor(105,122,243),TRUE);    //背景を水色に1 - 1
            Bg_flag = 1;
        }
        fps();
        count++;
        //-------------------------------------------------------------------------
 
        /*
 
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX -= 1.0;
            }else {
                mario.spdX -= 0.3;
            }
            mario.x += mario.spdX;
        }
        if(((CheckHitKey(KEY_INPUT_RIGHT)) == false) &&(CheckHitKey(KEY_INPUT_LEFT) == false) && (mario.spdX > 0)){
            mario.spdX -= 0.3;
            mario.x += mario.spdX;
            count_flag += 1;
        }
   
 
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX += 1.0;
            }else {
                mario.spdX += 0.3;
            }
            mario.x += mario.spdX;         
        }
        if((CheckHitKey(KEY_INPUT_LEFT) == false) && ((CheckHitKey(KEY_INPUT_RIGHT)) == false) && (mario.spdX < 0)){
            mario.spdX += 0.3;
            mario.x += mario.spdX;
            count_flag += 1;       
        }
 
        */
       
     if( (CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0) || (CheckHitKey(KEY_INPUT_RIGHT) == 1 && CheckHitKey(KEY_INPUT_LEFT) == 1)     ) {
        //  左右のスピードの摩擦・慣性処理。キーを離すとしばらくして停止。
        if(mario.spdX > 0) {
            mario.spdX -= 0.3;
            mario.x += mario.spdX;
            count_flag += 1;
        }
        if(mario.spdX < 0){
            mario.spdX += 0.3;
            mario.x += mario.spdX;
            count_flag += 1;   
         }
       
    } else {
        //  右キーの処理。移動・ダッシュ。
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX += 1.0;
            }else {
                mario.spdX += 0.3;
            }
            mario.x += mario.spdX;         
        }
        //  左キーの処理。移動・ダッシュ。
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX -= 1.0;
            }else {
                mario.spdX -= 0.3;
            }
            mario.x += mario.spdX;
        }
    }
 
 
 
        mario.y -= mario.spdY;
        mario.spdY -= 1;
 
        if(mario.x < 0) mario.x = 0;
        //if(mario.x > 640 - 32) mario.x = 640 - 32;
        if((CheckHitKey(KEY_INPUT_Z))) {
            if(mario.spdX > 8.0) mario.spdX = 8.0;
            if(mario.spdX < -8.0) mario.spdX = -8.0;
        }else {
            if(mario.spdX > 5.0) mario.spdX = 5.0;
            if(mario.spdX < -5.0) mario.spdX = -5.0;
        }
        if(count_flag > 1)  {count_flag = 0;    mario.spdX = 0;}
        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount = 0;}
        if(mario.spdY > 30.0 ) mario.spdY = 30.0;
 
        if( mario.JumpCount == 0) {
            if( Buf[KEY_INPUT_C] > 0) {
                mario.JumpCount++;
            }
        }else{
            if( Buf[KEY_INPUT_C] > mario.JumpCount) {
                if(mario.JumpCount < 10) {
                    mario.spdY = 10;
                }else if(mario.JumpCount == 10) {
                    mario.spdY = 15;
                }
            }
            mario.JumpCount++;
        }
 
 
 
 
 
        DrawGraph((int)mario.x, (int)mario.y, mario.g, TRUE);
 
 
        //-------------------------------------------------------------------------
        ScreenFlip();
        wait_fanc();
    }
    DxLib_End();
    return(0);
}
 
 
 
void wait_fanc(){
    int term;
    static int t=0;
    term = GetNowCount()-t;
    if(16-term>0)
            Sleep(16-term);
    t=GetNowCount();
    return;
}
 
void fps(){
    int i;
    static int t=0,ave=0,f[60];
 
    f[count%60]=GetNowCount()-t;
    t=GetNowCount();
    if(count%60==59){
        ave=0;
        for(i=0;i<60;i++)
            ave+=f[i];
        ave/=60;
    }
    if(ave!=0){
        DrawFormatString(0, 0,GetColor(0,0,0),"%.1fFPS",1000.0/(double)ave);
        DrawFormatString(0,20,GetColor(0,0,0),"%dms"  ,ave);
    }
    return;
}
 
void GetKeyInput( int *KeyBuf ){
    char damy[256];
    GetHitKeyStateAll( damy ) ;
    for( int i=0 ; i<256 ; i++ ){
        if( damy[i] == 1 )
            KeyBuf[i]++;
        else
            KeyBuf[i] = 0;
    }
 
}


これで左右の変な挙動は治りました!!!
さすがですねww
コードを素直にかつ単純に綺麗に書く事が大切ということをまた思い知らされましたw

それとジャンプについてですが、上方向にジャンプしているがジャンプした瞬間から下方向への力も働いているということですか?

Name: ISLe
[URL]
ハッカー(214,618 ポイント)
Date: 2012年8月20日(月) 23:17
No: 14
(OFFLINE)

 Re: マリオ風のジャンプについて

ボラ天神 さんが書きました:このような本物のマリオの動作について返信していただけるととてもありがたいと思います。具体的にはジャンプボタンを押したら上限は決まっていて、そこまで飛び、私たちが高く飛んでいるように見えるのは落下速度が遅くなるからなのですか?
実際に高く飛んでいるように見えたのは目の錯覚なのでしょうかww

高さの上限ではなくて、跳び上がる強さといいましょうか。
例えば、月の重力は地球の6分の1しかないので、月面では地球よりも高く飛べるわけです。

簡単なサンプルコードを書いてみました。
アルゴリズムはとてもシンプルです。
コード[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
#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    ChangeWindowMode(TRUE);
    if (DxLib_Init() != 0) return 0;
    SetDrawScreen(DX_SCREEN_BACK);
 
    const int SCREEN_W = 640;
    const int SCREEN_H = 480;
    const int CHARA_W = 64;
    const int CHARA_H = 64;
 
    int x, y;
    bool jumping = false;
    float vy, ga;
    x = (SCREEN_W-CHARA_W)/2;
    y = SCREEN_H-CHARA_H;
 
    while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0) {
        if (CheckHitKey(KEY_INPUT_C) != 0) {
            if (!jumping) {
                vy = -16.0f; // 初速
                jumping = true;
            }
            ga = 0.5f; // ジャンプボタンを押しているときの落下加速度
        }
        else {
            ga = 3.0f; // ジャンプボタンを離しているときの落下加速度
        }
        y += vy;
        vy += ga;
        if (y > SCREEN_H-CHARA_H) {
            y = SCREEN_H-CHARA_H;
            vy = ga = 0.0f;
            jumping = false;
        }
        DrawBox(x, y, x+CHARA_W, y+CHARA_H, GetColor(255,255,255), TRUE);
    }
 
    DxLib_End();
    return 0;
}

Cキーで白い箱がジャンプします。
ジャンプ中にキーを離しているあいだ落下速度が速くなります。
見た目にはボタンを離したところでストンと落下するように見えます。

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月20日(月) 23:18
No: 15
(OFFLINE)

 Re: マリオ風のジャンプについて

ボラ天神 さんが書きました:それとジャンプについてですが、上方向にジャンプしているがジャンプした瞬間から下方向への力も働いているということですか?


ご自分で毎フレーム
mario.spdY -= 1;
されてますよね?これが下方向の加速度です。
つまり、マイナスなので下方向に速度が毎フレーム1づつ増える(加速度)処理です。
by softya(ソフト屋)

Name: ISLe
[URL]
ハッカー(214,618 ポイント)
Date: 2012年8月20日(月) 23:25
No: 16
(OFFLINE)

 Re: マリオ風のジャンプについて

落下加速度をもっと小さくすると、水中ステージでマリオが手で掻いたあとゆっくり下降するのを表現できます。
つまり、ジャンプと水中の動きはパラメータが違うだけだということです。

Name: ボラ天神
[URL]
Date: 2012年8月20日(月) 23:38
No: 17
(OFFLINE)

 Re: マリオ風のジャンプについて

お二人方が言っていることが分かりました!!
しかし何故かサンプルプログラムが私の環境で動きませんでした。しかしサンプルプログラムを上げていただいたおかげで更に理解を深めることができました!

内容は理解できたと思うのですが、実際に組み込んでないので今から頑張ってみたいと思います!
できたらまたあげたいと思います。

Name: ボラ天神
[URL]
Date: 2012年8月21日(火) 00:59
No: 18
(OFFLINE)

 Re: マリオ風のジャンプについて

本当に申し訳ありません。私はわかったつもりだったのかもしれませんww

今まで組み込んでみていたのですが、やってみると難しく成功しません。
ISLeさんのサンプルコードを参考に作ってみたのですがどうもうまくいきません。
ゲームプログラミングではなく基礎C言語でつまづいている可能性もありますが、どのように組み込めばよいでしょうか?

教えていただけるととても助かります。

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月21日(火) 01:09
No: 19
(OFFLINE)

 Re: マリオ風のジャンプについて

ボラ天神 さんが書きました:本当に申し訳ありません。私はわかったつもりだったのかもしれませんww

今まで組み込んでみていたのですが、やってみると難しく成功しません。
ISLeさんのサンプルコードを参考に作ってみたのですがどうもうまくいきません。
ゲームプログラミングではなく基礎C言語でつまづいている可能性もありますが、どのように組み込めばよいでしょうか?

教えていただけるととても助かります。


現状のコードを提示してください。
その方が自分で考えたものですから問題点を指摘された時の理解度が高いと思います。
by softya(ソフト屋)

Name: ボラ天神
[URL]
Date: 2012年8月21日(火) 01:21
No: 20
(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
#include "DxLib.h"
 
/*        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount=0; }
        if(mario.spdY > 30.0) mario.spdY = 30.0;
 
        if( mario.JumpCount == 0 ) {
            if( Buf[KEY_INPUT_C] > 0  ) {
                mario.JumpCount++;
            }
        } else {
            if( Buf[KEY_INPUT_C] > mario.JumpCount  ) {
                if( mario.JumpCount == 10 ) {
                    mario.spdY = 20;
                } else if( mario.JumpCount < 10 ) {
                    mario.spdY = 15;
                }
            }
            mario.JumpCount++;
        }
        */
 
int count=0;
char Key[256];
 
void wait_fanc();
void fps();
void GetKeyInput(int *KeyBuf);
 
struct Chara {
    double x;
    double y;
    int g;
    double spdX;
    double spdY;
    int JumpCount;
};
   
 
struct Chara mario;
 
 
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1) return(-1);
 
    SetDrawScreen(DX_SCREEN_BACK);
    mario.x = (double)0;
    mario.y = (double)32;//480 - 32 * 2;
    mario.g = LoadGraph("media\\test001.png");
    mario.spdX = (double)0;
    mario.spdY = (double)0;
 
    while(ProcessMessage() == 0&& CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
        ClsDrawScreen();
        int Bg_flag = 0;
        int count_flag = 0;
        int  grav = 10;
        int Buf[256];
        bool jumpflag = false;
        double oti;
        GetKeyInput(Buf);
 
        if(Bg_flag == 0){
            DrawBox(0,0,640,480,GetColor(105,122,243),TRUE);    //背景を水色に1 - 1
            Bg_flag = 1;
        }
        fps();
        count++;
        //-------------------------------------------------------------------------
 
        /*
 
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX -= 1.0;
            }else {
                mario.spdX -= 0.3;
            }
            mario.x += mario.spdX;
        }
        if(((CheckHitKey(KEY_INPUT_RIGHT)) == false) &&(CheckHitKey(KEY_INPUT_LEFT) == false) && (mario.spdX > 0)){
            mario.spdX -= 0.3;
            mario.x += mario.spdX;
            count_flag += 1;
        }
   
 
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX += 1.0;
            }else {
                mario.spdX += 0.3;
            }
            mario.x += mario.spdX;         
        }
        if((CheckHitKey(KEY_INPUT_LEFT) == false) && ((CheckHitKey(KEY_INPUT_RIGHT)) == false) && (mario.spdX < 0)){
            mario.spdX += 0.3;
            mario.x += mario.spdX;
            count_flag += 1;       
        }
 
        */
       
     if( (CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0) || (CheckHitKey(KEY_INPUT_RIGHT) == 1 && CheckHitKey(KEY_INPUT_LEFT) == 1)     ) {
        //  左右のスピードの摩擦・慣性処理。キーを離すとしばらくして停止。
        if(mario.spdX > 0) {
            mario.spdX -= 0.3;
            mario.x += mario.spdX;
            count_flag += 1;
        }
        if(mario.spdX < 0){
            mario.spdX += 0.3;
            mario.x += mario.spdX;
            count_flag += 1;   
         }
       
    } else {
        //  右キーの処理。移動・ダッシュ。
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX += 1.0;
            }else {
                mario.spdX += 0.3;
            }
            mario.x += mario.spdX;         
        }
        //  左キーの処理。移動・ダッシュ。
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX -= 1.0;
            }else {
                mario.spdX -= 0.3;
            }
            mario.x += mario.spdX;
        }
    }
 
 
 
 
 
        if(mario.x < 0) mario.x = 0;
        //if(mario.x > 640 - 32) mario.x = 640 - 32;
        if((CheckHitKey(KEY_INPUT_Z))) {
            if(mario.spdX > 8.0) mario.spdX = 8.0;
            if(mario.spdX < -8.0) mario.spdX = -8.0;
        }else {
            if(mario.spdX > 5.0) mario.spdX = 5.0;
            if(mario.spdX < -5.0) mario.spdX = -5.0;
        }
        if(count_flag > 1)  {count_flag = 0;    mario.spdX = 0;}
        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount = 0;}
        if(mario.spdY > 30.0 ) mario.spdY = 30.0;
 
        /*xxx:if( mario.JumpCount == 0) {
            if( Buf[KEY_INPUT_C] > 0) {
                mario.JumpCount++;
            }
        }else{
            if( Buf[KEY_INPUT_C] > mario.JumpCount) {
                if(mario.JumpCount < 10) {
                    mario.spdY = 10;
                }else if(mario.JumpCount == 10) {
                    mario.spdY = 15;
                }
            }
            mario.JumpCount++;
        }
        xxx:*/
        if(KEY_INPUT_C == 1) {
            if(!jumpflag) {
                mario.spdY = 15;
                jumpflag = true;
            }
            oti = 0.5;
        }else{
            if(!jumpflag){
                oti = 3.0;
            }
        }
 
 
        mario.y -= mario.spdY;
        mario.spdY -= oti;
 
        DrawGraph((int)mario.x, (int)mario.y, mario.g, TRUE);
 
 
        //-------------------------------------------------------------------------
        ScreenFlip();
        wait_fanc();
    }
    DxLib_End();
    return(0);
}
 
 
 
void wait_fanc(){
    int term;
    static int t=0;
    term = GetNowCount()-t;
    if(16-term>0)
            Sleep(16-term);
    t=GetNowCount();
    return;
}
 
void fps(){
    int i;
    static int t=0,ave=0,f[60];
 
    f[count%60]=GetNowCount()-t;
    t=GetNowCount();
    if(count%60==59){
        ave=0;
        for(i=0;i<60;i++)
            ave+=f[i];
        ave/=60;
    }
    if(ave!=0){
        DrawFormatString(0, 0,GetColor(0,0,0),"%.1fFPS",1000.0/(double)ave);
        DrawFormatString(0,20,GetColor(0,0,0),"%dms"  ,ave);
    }
    return;
}
 
void GetKeyInput( int *KeyBuf ){
    char damy[256];
    GetHitKeyStateAll( damy ) ;
    for( int i=0 ; i<256 ; i++ ){
        if( damy[i] == 1 )
            KeyBuf[i]++;
        else
            KeyBuf[i] = 0;
    }
 
}


です。
さっき消してしまって作り直したのですが、更に別な挙動になってしまいましたが、結果的におかしいです。

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月21日(火) 10:31
No: 21
(OFFLINE)

 Re: マリオ風のジャンプについて

分析力を身につけるためにも、おかしい状態を出来るだけ正確・具体的に説明してくださいね。
それと、自分でで調べたほうが良いと思いますので方法を教えます。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
blog.php?u=114&b=982&c=2

まず、自分で調べてみて何処が悪かったか報告をお待ちしています。
by softya(ソフト屋)

Name: ボラ天神
[URL]
Date: 2012年8月21日(火) 22:57
No: 22
(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
#include "DxLib.h"
 
/*        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount=0; }
        if(mario.spdY > 30.0) mario.spdY = 30.0;
 
        if( mario.JumpCount == 0 ) {
            if( Buf[KEY_INPUT_C] > 0  ) {
                mario.JumpCount++;
            }
        } else {
            if( Buf[KEY_INPUT_C] > mario.JumpCount  ) {
                if( mario.JumpCount == 10 ) {
                    mario.spdY = 20;
                } else if( mario.JumpCount < 10 ) {
                    mario.spdY = 15;
                }
            }
            mario.JumpCount++;
        }
        */
 
int count=0;
char Key[256];
 
void wait_fanc();
void fps();
void GetKeyInput(int *KeyBuf);
 
struct Chara {
    double x;
    double y;
    int g;
    double spdX;
    double spdY;
    int JumpCount;
};
   
 
struct Chara mario;
 
 
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
    AllocConsole();
    freopen("CONOUT$", "w",stdout);
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1) return(-1);
 
    SetDrawScreen(DX_SCREEN_BACK);
    mario.x = (double)0;
    mario.y = (double)32;//480 - 32 * 2;
    mario.g = LoadGraph("media\\test001.png");
    mario.spdX = (double)0;
    mario.spdY = (double)0;
    bool jumpflag = false;
    while(ProcessMessage() == 0&& CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
        ClsDrawScreen();
        int Bg_flag = 0;
        int count_flag = 0;
        int  grav = 10;
        int Buf[256];
       
        double oti;
        GetKeyInput(Buf);
 
        if(Bg_flag == 0){
            DrawBox(0,0,640,480,GetColor(105,122,243),TRUE);    //背景を水色に1 - 1
            Bg_flag = 1;
        }
        fps();
        count++;
        //-------------------------------------------------------------------------
 
        /*
 
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX -= 1.0;
            }else {
                mario.spdX -= 0.3;
            }
            mario.x += mario.spdX;
        }
        if(((CheckHitKey(KEY_INPUT_RIGHT)) == false) &&(CheckHitKey(KEY_INPUT_LEFT) == false) && (mario.spdX > 0)){
            mario.spdX -= 0.3;
            mario.x += mario.spdX;
            count_flag += 1;
        }
   
 
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX += 1.0;
            }else {
                mario.spdX += 0.3;
            }
            mario.x += mario.spdX;         
        }
        if((CheckHitKey(KEY_INPUT_LEFT) == false) && ((CheckHitKey(KEY_INPUT_RIGHT)) == false) && (mario.spdX < 0)){
            mario.spdX += 0.3;
            mario.x += mario.spdX;
            count_flag += 1;       
        }
 
        */
       
     if( (CheckHitKey(KEY_INPUT_RIGHT) == 0 && CheckHitKey(KEY_INPUT_LEFT) == 0) || (CheckHitKey(KEY_INPUT_RIGHT) == 1 && CheckHitKey(KEY_INPUT_LEFT) == 1)     ) {
        //  左右のスピードの摩擦・慣性処理。キーを離すとしばらくして停止。
        if(mario.spdX > 0) {
            mario.spdX -= 0.3;
            mario.x += mario.spdX;
            count_flag += 1;
        }
        if(mario.spdX < 0){
            mario.spdX += 0.3;
            mario.x += mario.spdX;
            count_flag += 1;   
         }
       
    } else {
        //  右キーの処理。移動・ダッシュ。
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX += 1.0;
            }else {
                mario.spdX += 0.3;
            }
            mario.x += mario.spdX;         
        }
        //  左キーの処理。移動・ダッシュ。
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            if(CheckHitKey(KEY_INPUT_Z) == TRUE) {
                mario.spdX -= 1.0;
            }else {
                mario.spdX -= 0.3;
            }
            mario.x += mario.spdX;
        }
    }
 
        if(Buf[KEY_INPUT_C] > 0) {
            if(!jumpflag) {
                mario.spdY = 16;
                jumpflag = true;
            }else{
                oti = 0.7;
            }
        }else{
           
            oti = 1.2;
           
        }
        printf("%d",jumpflag);
 
 
        mario.y -= mario.spdY;
        mario.spdY -= oti;
 
 
 
        if(mario.x < 0) mario.x = 0;
        //if(mario.x > 640 - 32) mario.x = 640 - 32;
        if((CheckHitKey(KEY_INPUT_Z))) {
            if(mario.spdX > 8.0) mario.spdX = 8.0;
            if(mario.spdX < -8.0) mario.spdX = -8.0;
        }else {
            if(mario.spdX > 5.0) mario.spdX = 5.0;
            if(mario.spdX < -5.0) mario.spdX = -5.0;
        }
        if(count_flag > 1)  {count_flag = 0;    mario.spdX = 0;}
        if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount = 0; jumpflag = false;}
        if(mario.spdY > 30.0 ) mario.spdY = 30.0;
 
        /*xxx:
        mario.y += mario.spdY;
        mario.spdY += oti;
 
        if( mario.JumpCount == 0) {
            if( Buf[KEY_INPUT_C] > 0) {
                mario.JumpCount++;
            }
        }else{
            if( Buf[KEY_INPUT_C] > mario.JumpCount) {
                if(mario.JumpCount < 10) {
                    mario.spdY = 10;
                }else if(mario.JumpCount == 10) {
                    mario.spdY = 15;
                }
            }
            mario.JumpCount++;
        }
        xxx:*/
 
        DrawFormatString(300,0,GetColor(0,0,0),"X : %f"  ,mario.x);
        DrawFormatString(300,20,GetColor(0,0,0),"Y : %f"  ,mario.y);
 
        DrawGraph((int)mario.x, (int)mario.y, mario.g, TRUE);
 
 
        //-------------------------------------------------------------------------
        ScreenFlip();
        wait_fanc();
    }
    DxLib_End();
    return(0);
}
 
 
 
void wait_fanc(){
    int term;
    static int t=0;
    term = GetNowCount()-t;
    if(16-term>0)
            Sleep(16-term);
    t=GetNowCount();
    return;
}
 
void fps(){
    int i;
    static int t=0,ave=0,f[60];
 
    f[count%60]=GetNowCount()-t;
    t=GetNowCount();
    if(count%60==59){
        ave=0;
        for(i=0;i<60;i++)
            ave+=f[i];
        ave/=60;
    }
    if(ave!=0){
        DrawFormatString(0, 0,GetColor(0,0,0),"%.1fFPS",1000.0/(double)ave);
        DrawFormatString(0,20,GetColor(0,0,0),"%dms"  ,ave);
    }
    return;
}
 
void GetKeyInput( int *KeyBuf ){
    char damy[256];
    GetHitKeyStateAll( damy ) ;
    for( int i=0 ; i<256 ; i++ ){
        if( damy[i] == 1 )
            KeyBuf[i]++;
        else
            KeyBuf[i] = 0;
    }
 
}


一応出来ました!!
悪かった点が確かなのかわからないので変えたところを書きたいと思います。
まず、if(mario.y > 480 - 32) {mario.y = 480 - 32; mario.spdY = 0; mario.JumpCount = 0; jumpflag = false;}
を書いたあとにジャンプの処理をしていたので、その前にジャンプの処理を書きました。
これにより、カクカクする動作が消えました。

次に地面についた時にjumpflagをfalseにしていなかったので追加しました。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
if(Buf[KEY_INPUT_C] > 0) {
    if(!jumpflag) {
        mario.spdY = 16;
        jumpflag = true;
    }else{
        oti = 0.7;
    }
}else{         
    oti = 1.2;     
}

これですが、直した点は、まずKEY_INPUT_C == 1を上記のに変えました。これはなぜできなかったのかわかないです。
次にCkeyを押している時にjumpflagがtrueのときだけoti = 0.7を実行するようにしました。最初はprintfデバッグで確認したらここにプログラムの流れがこなかったので色々試したら簡単にまとまってしまいました。
次はCkeyが押されていない時にjumpflagがfalseの場合のみ oti = 1.2を実行していたので、それを取り除きました。これにより地面より上にいる場合はキーに触れていなくても必ず下に落ちてくるようになりました。

おそらく以上のことを変えました。
久しぶりに昔のマリオをやってみたのですが、なかなかジャンプの綺麗さが違って驚きましたww
意外とジャンプが低く、大きいジャンプと低いジャンプの差がキャラ1つ分位ありました。
色々数値をいじってみたのですがなかなか本物に近づけません。
これ以外にも何らかの処理があるのでしょうか?
謎ですww

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月21日(火) 23:15
No: 23
(OFFLINE)

 Re: マリオ風のジャンプについて

KEY_INPUT_C == 1がうまくいかない理由はKEY_INPUT_CとBuf[KEY_INPUT_C]をprintfして比べてみると分かると思います。

問題のジャンプですが、調べてみると面白い方法で計算しているみたいです。
「マリオのジャンプ実装法とVerlet積分 - Gemmaの日記」
http://d.hatena.ne.jp/Gemma/20080517/1211010942

出てくる言葉はややこしく見えますが、やっていることは簡単ですね。
by softya(ソフト屋)

Name: ボラ天神
[URL]
Date: 2012年8月21日(火) 23:30
No: 24
(OFFLINE)

 Re: マリオ風のジャンプについて

出てくる言葉が難しくてわからない今日この頃ですねwww

一体どういうふうになっているのですかね

Name: softya(ソフト屋)
(副管理人)
[URL]
伝説なるハッカー(987,514 ポイント)
Date: 2012年8月21日(火) 23:40
No: 25
(OFFLINE)

 Re: マリオ風のジャンプについて

ボラ天神 さんが書きました:出てくる言葉が難しくてわからない今日この頃ですねwww

一体どういうふうになっているのですかね


「マリオのジャンプ実装法とVerlet積分(実践編) - Gemmaの日記」
http://d.hatena.ne.jp/Gemma/20080801/1217559803

まぁ、やって見たほうが早いと思います。
by softya(ソフト屋)

Name: ISLe
[URL]
ハッカー(214,618 ポイント)
Date: 2012年8月22日(水) 00:39
No: 26
(OFFLINE)

 Re: マリオ風のジャンプについて

ボラ天神 さんが書きました:久しぶりに昔のマリオをやってみたのですが、なかなかジャンプの綺麗さが違って驚きましたww
意外とジャンプが低く、大きいジャンプと低いジャンプの差がキャラ1つ分位ありました。
色々数値をいじってみたのですがなかなか本物に近づけません。
これ以外にも何らかの処理があるのでしょうか?
謎ですww

スーパーマリオブラザーズのジャンプは大小の2種類ではないですよね。
#まさか最近のスーパーマリオは違うとか?

小マリオと大マリオで背の高さが違うので、足元を基準にします。
  • 一瞬ボタンを押してすぐに離しても最低1ブロック(小マリオの高さ)分はジャンプする。
  • ボタン押しっぱなしで垂直に飛ぶと4ブロック分ジャンプする。
  • 移動しながらだとジャンプの高さは上がる。Bダッシュ最高速で5ブロック分に到達
実際の映像では押しっぱなしで上半分は等速に見えますね。

Name: ボラ天神
[URL]
Date: 2012年8月27日(月) 22:09
No: 27
(OFFLINE)

 Re: マリオ風のジャンプについて

[解決!]

皆さん返信遅れてすみませんでした。

softya(ソフト屋) さん
URLありがとうございます!!
早速試してみたいと思います!!

ISLe さん
めっちゃ参考になりますww
実際のプログラムはどうなのでしょうかねww
頑張って試してみたいと思います。

ジャンプは一応これで解決としますが、今後もマリオ関係の質問をするかもしれませんのでよろしくお願いします。


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

オンラインデータ

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