スクロールゲームについて
Posted: 2010年3月23日(火) 16:03
こんにちは。鴨と申します。C言語歴2年です。(1年:独学、もう1年:学校にて)
私は今、マリオみたいな横スクロールゲームを制作中でプログラム例を参考にしながらも「歩きながらジャンプさせる」ことに成功(①)し、次に地形を追加しようと考えています。
しかし、どうしても「ジャンプして目の前の壁を飛び越える」事が出来ません。プログラムを作ると、どうしても空中で静止してしまいます。そもそも背景を一次元か二次元のどちらにすればよいかも分かりません。
①のプログラムは以下の通りです。これにどんなことを付け足したら上手く「ジャンプして目の前の壁を飛び越える」事が出来るでしょうか。よろしくお願いします。(見づらくて申し訳ありません。。)
#include "DxLib.h"
#include <math.h>
#define g 9.8067
#define y_max 0.500
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[16],y,time1,time2,flag=0;
char Key[256];
double t;
ch_t ch;
if(ChangeWindowMode(TRUE)!=DX_CHANGESCREEN_OK||DxLib_Init()==-1)return -1;//ウィンドウ化と初期化処理
ch.x =0;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
if(ch.x%32==0){ //座標がで割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if ( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if(ch.muki==1) //左向きならch.x座標を減らす
ch.x = ch.x - 2;
else if (ch.muki==3) //右向きならch.x座標を増やす
ch.x = ch.x + 2;
}
ch.img=image[ch.x%32/8 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , 32*10 , ch.img , TRUE ) ;//画像を描画
if( Key[ KEY_INPUT_RETURN ] == 1 ){ //エンターが押されたら
time1 = GetNowCount();//time1にエンターが押された時の時間を格納
flag=1; //飛び上がりフラグを立てる。
}
if(flag==1){
ClearDrawScreen(); // 画面をクリア
time2 = GetNowCount() ; // 現在経過時間を得る
t = (double)(time2 - time1) / 1000.000; // ミリ秒を秒に変換して、エンターが押されてからの経過時間を計算
y = (int)((sqrt(2.000*g*y_max)*t-0.500*g*t*t)*160.000/y_max);//y座標を計算
if(y>=0)
DrawGraph( ch.x , 32*10-y , ch.img , TRUE );// 画像を描画
else
flag=0; // 飛び上がりフラグを戻す
}
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
私は今、マリオみたいな横スクロールゲームを制作中でプログラム例を参考にしながらも「歩きながらジャンプさせる」ことに成功(①)し、次に地形を追加しようと考えています。
しかし、どうしても「ジャンプして目の前の壁を飛び越える」事が出来ません。プログラムを作ると、どうしても空中で静止してしまいます。そもそも背景を一次元か二次元のどちらにすればよいかも分かりません。
①のプログラムは以下の通りです。これにどんなことを付け足したら上手く「ジャンプして目の前の壁を飛び越える」事が出来るでしょうか。よろしくお願いします。(見づらくて申し訳ありません。。)
#include "DxLib.h"
#include <math.h>
#define g 9.8067
#define y_max 0.500
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[16],y,time1,time2,flag=0;
char Key[256];
double t;
ch_t ch;
if(ChangeWindowMode(TRUE)!=DX_CHANGESCREEN_OK||DxLib_Init()==-1)return -1;//ウィンドウ化と初期化処理
ch.x =0;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
if(ch.x%32==0){ //座標がで割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if ( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if(ch.muki==1) //左向きならch.x座標を減らす
ch.x = ch.x - 2;
else if (ch.muki==3) //右向きならch.x座標を増やす
ch.x = ch.x + 2;
}
ch.img=image[ch.x%32/8 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , 32*10 , ch.img , TRUE ) ;//画像を描画
if( Key[ KEY_INPUT_RETURN ] == 1 ){ //エンターが押されたら
time1 = GetNowCount();//time1にエンターが押された時の時間を格納
flag=1; //飛び上がりフラグを立てる。
}
if(flag==1){
ClearDrawScreen(); // 画面をクリア
time2 = GetNowCount() ; // 現在経過時間を得る
t = (double)(time2 - time1) / 1000.000; // ミリ秒を秒に変換して、エンターが押されてからの経過時間を計算
y = (int)((sqrt(2.000*g*y_max)*t-0.500*g*t*t)*160.000/y_max);//y座標を計算
if(y>=0)
DrawGraph( ch.x , 32*10-y , ch.img , TRUE );// 画像を描画
else
flag=0; // 飛び上がりフラグを戻す
}
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}