ページ 11

スクロールゲームについて

Posted: 2010年3月23日(火) 16:03
by
こんにちは。鴨と申します。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;
}

Re:スクロールゲームについて

Posted: 2010年3月23日(火) 16:26
by
すいません、書き忘れです。

私が使っているのは「Microsoft Visual C++ 2008 Express Edition」です。

Re:スクロールゲームについて

Posted: 2010年3月24日(水) 12:09
by wint
元にしているサンプルはたぶんRPG用だと思われます。
if(ch.x%32==0){ //座標がで割り切れたら入力可能
という条件があると32単位でしかキャラが動きません。
それを直すと、すべてを書き換えなければなりません。
また、ジャンプももっとシンプルでいいと思います。

本家の「DXライブラリ置き場」に求めるようなサンプルがあります。

私もそれを元に作りました。
がんばってくださいね。

Re:スクロールゲームについて

Posted: 2010年3月24日(水) 12:33
by wing
自分の名前、間違えました。
wingです。失礼しました。

Re:スクロールゲームについて

Posted: 2010年3月24日(水) 19:21
by
wingさん、ありがとうございます。
完成しましたらまた報告させてもらいます。
頑張ります。