ただいまスーパーマリオブラザーズぽいものを

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよこ

ただいまスーパーマリオブラザーズぽいものを

#1

投稿記事 by ひよこ » 16年前

ただいまスーパーマリオブラザーズぽいものを作っているのですが。
DXライブラリのジャンプの改良で作っているのですが。
スーパーマリオブラザーズは穴があって上にいったら落ちるじゃないですか。
しかしおちるようなプログラムを書くと落ちてくる位置がちがったりしてうまくいきません。
どうすればいいでしょうか?私的にはif( 200<=PlayerX<=240 && PlayerY==355 ){PlayerY = 355 ;JumpPower = -1 ;}のところだと思っているのですが。PlayerYの値を変更したら落ちてくる位置がちがくなってしまうんです。どうすればいいでしょうか?
// ジャンプ
#include "DxLib.h"
int PlayerX , PlayerY ;
int JumpPower ;
int PlayerGraph ;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    ChangeWindowMode(TRUE);
    if (DxLib_Init() == -1) return -1;
       
    char Key[256];
  
	SetGraphMode( 640,480,16 ) ;
     // 描画先画面を裏画面にセット
	SetDrawScreen( DX_SCREEN_BACK ) ;
   	// グラフィックのロード
	PlayerGraph = LoadGraph( "star1.bmp" ) ;

	// キャラクターの初期データをセット
	PlayerX = 0 ;
	PlayerY = 0 ;
	JumpPower = 0 ;
	 int White;
 
        White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
       
      
	// ループ
	 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])

	{
//↑メッセージ処理         ↑画面をクリア           ↑キーボード入力状態取得        ↑ESCが押されていない

	    if (Key[KEY_INPUT_UP]== 1)  PlayerY -= 3; // 上を押していたら上に進む
	    if (Key[KEY_INPUT_DOWN]== 1)  PlayerY += 3 ;	// 下を押していたら下に進む
		if (Key[KEY_INPUT_RIGHT]== 1)  PlayerX += 3 ;	// 右を押していたら右に進む
		if (Key[KEY_INPUT_LEFT]== 1)  PlayerX -= 3 ;	// 左を押していたら左に進む

		
		PlayerY -= JumpPower ;// 落下処理

		JumpPower -= 1 ;// 落下加速度を加える
		

		// もし地面についていたら止まる
		if( PlayerY > 355 )
		{
			PlayerY = 355 ;
			JumpPower = 0 ;
		}
		
		if( 200<=PlayerX<=240 && PlayerY==355 )
		{
			PlayerY = 355 ;
			JumpPower = -1 ;
		}
		
		// ジャンプボタンを押していて、地面についていたらジャンプ
		if ((Key[KEY_INPUT_A]==1) && PlayerY == 355 ) JumpPower = 20 ;
 
		
		ClearDrawScreen() ;// 画面を初期化する

		
		DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;// プレイヤーを描画する
       DrawBox   (  0 , 384 , 200 , 480 , White , TRUE ) ; 
       DrawBox   ( 240, 384 , 640 , 480 , White , TRUE ) ; 
		// 裏画面の内容を表画面に反映させる
		ScreenFlip() ;
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了

  }
よろしくお願いします。

Mist

Re:ただいまスーパーマリオブラザーズぽいものを

#2

投稿記事 by Mist » 16年前

いや、だからC言語の基本勉強しましょうよ。

> if( 200<=PlayerX<=240 && PlayerY==355 )

範囲を書きたいのなら

if (200<= PlayerX && PlayerX<=240 && PlayerY==355 )

だよ。

kazuoni

Re:ただいまスーパーマリオブラザーズぽいものを

#3

投稿記事 by kazuoni » 16年前

質問の前にまずコンパイルしてみてください。
通らない→質問
ではなく、
通らない→どこの行で違っているのか→どう違うのかを自分なりに調べる

これをやらないとなかなか身にならないですよ。

ひよこ

Re:ただいまスーパーマリオブラザーズぽいものを

#4

投稿記事 by ひよこ » 16年前

おちるようにはなりましたが、処理が止まって→いきなり落下
これをゆっくりおとしていくにはどうすればいいでしょうか?
ソースはif( 200<=PlayerX<=240 && PlayerY==355 ){PlayerY = 355 ;JumpPower = -1 ;}から
if(200<= PlayerX && PlayerX<=240 && PlayerY==355 ) {for(PlayerY=355; PlayerY<=480;PlayerY-= 2);}
にしか変更していません。

kazuoni

Re:ただいまスーパーマリオブラザーズぽいものを

#5

投稿記事 by kazuoni » 16年前

理由はif文内で
PlayerY = 355 ;
としているからです。表示は変わらず、加速度だけ変化していってます

Mist

Re:ただいまスーパーマリオブラザーズぽいものを

#6

投稿記事 by Mist » 16年前

> for(PlayerY=355; PlayerY<=480;PlayerY-= 2)

この式理解出来てますか?
「PlayerYを355から始めて、PlayerYが480以下ならループを継続して、1ループごとにPlayerYから2を引く」

これはひよこさんが意図するものと合っていますか?


前にも言いましたがC言語の基礎を勉強して、元のプログラムがどのように処理しているのかをきちんと理解してからでないと、改造するのは無理です。
耳に痛い意見は聞こえない人っぽいけど。

ひよこ

Re:ただいまスーパーマリオブラザーズぽいものを

#7

投稿記事 by ひよこ » 16年前

わかりました。1度勉強してきます。
答えてくださったみなさんありがとうございます。

s-rush

Re:ただいまスーパーマリオブラザーズぽいものを

#8

投稿記事 by s-rush » 16年前

見た感じ、あまり基本的なことを理解していないのではないですか??
という私もまだまだ未熟ですが^^;

スーパーマリオブラザーズっぽいゲームを作っていらっしゃるようですが、
まだ知識的にも手を出すのは早いような気がします。

今までひよこさんがどれだけ勉強してきたのかは分からないですが、
もうちょっと基本的なことをしっかりマスターしたうえで
ゲームを作るようにされた方がいいと思いますよ。

参考書に書かれているような課題からまず始めてみてはいかがでしょう?

前々から見ていて少し気になったので、一言だけ言わせていただきました。

閉鎖

“C言語何でも質問掲示板” へ戻る