Dixqさんサンプルですが

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

Dixqさんサンプルですが

#1

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

Dixqさんサンプルですがマリオっぽいができたので、レベル低いです。とても
あとこの掲示板を見ている人にどう思ってもらえるか・・と思ったので公開しちゃいます。
Zipのなかには絵が2枚、効果音1個、マリオっぽいのプロジェクトとソースが入っています。
DXライブラリのVisualC++用のサンプルプログラムのフォルダで実行してください。
感想、ご意見待ってます。

kazuoni

Re:Dixqさんサンプルですが

#2

投稿記事 by kazuoni » 16年前

公開の際には、Releseで作成された実行ファイルを入れておいたほうが
親切かと思います。

全体の書き方ですが・・・
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
がステージごとに書かれていて
このままだとステージが増えるとものすごい管理が面倒になりそうです。
この記述は一つにして、ステージを分割していったほうがいいかと。
ステージを直接コードに書くのもよし、外部ファイルから読み込むのもよし
っと思います。

あとは敵判定をつけることですかね^^;
思いっきり上から踏みつけようとして死んだ・・・orz
上からはやっつけれるってのはマリオでは結構重要だと思うのですが・・・。

でもゲームとしてなりたていました!
制作お疲れ様です!
この拡張版に期待してます!

ひよこ

Re:Dixqさんサンプルですが

#3

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

遊んでくださりありがとうございます。
あとで拡張版を作ってみたいと思います。
あと、まだまだ感想・ご意見お待ちしております。

Dixq (管理人)

Re:Dixqさんサンプルですが

#4

投稿記事 by Dixq (管理人) » 16年前

遊んでみました。制作お疲れ様です。
ゲームとして出来かけていますね。
今が楽しい時期だと思います。

ソースコードについてですが、まずは、キレイに書く必要がありそうです。
最初のうちは効率よく書いたり、関数にわけたりするのが難しいかもしれませんが、

・字下げをきちんとする。
・括弧の対応を解り易いように書く

などは出来ると思います。
自分が読むのに苦労もするでしょうし、バグの元にもなりますし、
公開するなら、人が読みやすいコードにする必要があると思います。

VC++で書いているのならちゃんと字下げしながら改行して書いていけば自動的に字下げされます。
字下げが出来ていない部分はタブキーでそろえましょう。
また、

・ProcessMessage()
・ClearDrawScreen()
・GetHitKeyStateAll()
・ScreenFlip()

これらの関数は最初のうちは一度しか書かないでおきましょう。
プログラムコード全体で、どこかに2度書いてる部分があれば、それは非効率プログラムになっている証拠です。
慣れてきて、それを理解した上で重複させるのはありだと思いますが、
とにかく似たようなコードをコピペを繰り返すと無駄に長く読みにくいコードになりがちです。

後、全部一つの関数に処理が入っているのも気になるので、
もしステージを増やしたりしていくなら、是非自作関数についての知識をつけて下さい。
#include <stdio.h>

void show(){
    printf("func");
}

int main(){
    show();
}
 
この意味はわかるでしょうか?

機能別に処理を分けて関数を作ることで、ソースコードの可読性も上がりますし、
似たようなコードを使いまわせるようになります。

・・・ということで、

・ソースコードの字下げをきちんとする
・括弧の対応を解りやすく書く
・2度以上呼ぶべきではないコードを2度以上書かずに処理できるように工夫する
・処理を機能別に関数わけする。

この辺を挑戦してみるとグッとレベルアップ出来ると思います。
後、現在Aボタン押しながら右を押しっぱなしにすると、段差に落ちないようです。

ひよこ

Re:Dixqさんサンプルですが

#5

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

自作関数ですか、void ○○{処理}でint main()でメインの部分で{○○;}で使うんですか?
main()はint WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )と同じと考えていいでしょうか?

kazuoni

Re:Dixqさんサンプルですが

#6

投稿記事 by kazuoni » 16年前

http://www9.plala.or.jp/sgwr-t/
関数等基礎はこのあたりで勉強してみてください。

>main()はint WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )と同じ
Windowsプログラミングではそうです。

ひよこ

Re:Dixqさんサンプルですが

#7

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

関数の基礎にいろいろ書いてありましたがintとvoidはどうちがうのでしょうか

やそ

Re:Dixqさんサンプルですが

#8

投稿記事 by やそ » 16年前

void main
でググれば答えは見つかるんじゃないかな?

kazuoni

Re:Dixqさんサンプルですが

#9

投稿記事 by kazuoni » 16年前

変数の型
http://www9.plala.or.jp/sgwr-t/c/sec02.html
関数のreturn型
http://www9.plala.or.jp/sgwr-t/c/sec11.html
に書いてあります。

void main()はたかぎさんのサイトにある、
http://www.kijineko.co.jp/tech/supersti ... -main.html
に詳しく書いてありますよ。

ひよこ

Re:Dixqさんサンプルですが

#10

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

さっそく自作関数を作って1面を作ってみたのですがデバッグがうまくいきません。
ソースですが
// マリオっぽい
#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 ) ; // 白色の値を取得
       
	int Sound;      
	Sound= LoadSoundMem("test.wav");
    void Draw(){
		 DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;// プレイヤーを描画する
	     DrawBox   (0, 384 , 200 , 480 , White , TRUE ) ; 
         DrawBox   (259,384 , 640 , 480 , White , TRUE ) ; 
         DrawLine  (350,300 , 450 ,  0 , White ) ;
		 DrawLine  (450,0 , 550 ,  300 , White ) ;
		 DrawLine  (350,300 , 550 , 300 , White ) ;
		 DrawLine  (450,300 , 350 ,  384 , White ) ;
		 DrawLine  (450,300 , 550 ,  384 , White ) ;
		 DrawLine  (600,0,600,480,White ) ;
			   }
//1面
//****************************************************************************************************************// 
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
	{
		  //↑メッセージ処理         ↑画面をクリア           ↑キーボード入力状態取得       ↑ESCが押されていない

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

		
		 PlayerY -= JumpPower ;// 落下処理

		JumpPower -= 1;// 落下加速度を加える
	//左に行きすぎないように{	
		if( PlayerX < 0 )
		{
			PlayerX = 0 ;	
		}
	//ひだりに行きすぎないように}
	//次の面へ{
		if( PlayerX > 600 ){
		if(CheckSoundMem(Sound)==0) //現在ショット音が再生されていなければ 
           PlaySoundMem(Sound,DX_PLAYTYPE_BACK);  //test.wavのバックグラウンド演奏
		break;	
		} 
	//次の面へ}
		if( PlayerX > 610 )
		{
			PlayerX = 610 ;	
		}
	// もし地面についていたら止まる
		if( PlayerY > 355 )
		{
			PlayerY = 355 ;
			JumpPower = 0 ;
		}
	//落下ゾーン//*******************************************************************************//
		if (200<= PlayerX && PlayerX<240 && PlayerY==355 ) {
	//PlayerYの値
		for(PlayerY=355; PlayerY<=470;PlayerY+= 5)
        { 
		 ClearDrawScreen(); 
         if( ProcessMessage() == -1 ) break ;//エラーが起きたら終了
		 DrawBox   (  0 , 384 , 200 , 480 , White , TRUE ) ; 
		 DrawBox   ( 259, 384 , 640 , 480 , White , TRUE ) ; 
		 DrawLine  (  350 ,  300 , 450 ,  0 , White ) ;
		 DrawLine  (  450 ,  0 , 550 ,  300 , White ) ;
		 DrawLine  (  350 ,  300 , 550 , 300 , White ) ;
		 DrawLine  (  450 ,  300 , 350 ,  384 , White ) ;
		 DrawLine  (  450 ,  300 , 550 ,  384 , White ) ;
		 DrawLine  (  600 ,  0 , 600 ,  480 , White ) ;
                DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;// プレイヤーを描画する
                ScreenFlip() ;                                // 裏画面データを表画面へ反映
        }
	//PlayerYの値
	//ゲームオーバ
		if(PlayerY=475){
		if(CheckSoundMem(Sound)==0) //現在ショット音が再生されていなければ 
        PlaySoundMem(Sound,DX_PLAYTYPE_BACK);  //test.wavのバックグラウンド演奏
		PlayerX=0; PlayerY=355;}
	//ゲームオーバ
		}
	//落下ゾーン*************************************************************************************//
		
		

		
		// ジャンプボタンを押していて、地面についていたらジャンプ
		if ((Key[KEY_INPUT_A]==1) && PlayerY == 355 ) JumpPower = 20 ;
		Draw();
		ClearDrawScreen() ;// 画面を初期化する
		// 裏画面の内容を表画面に反映させる
		ScreenFlip() ;
	}
//*********************************************************************************************************//
	//1面
	
		DxLib_End() ;				// DXライブラリ使用の終了処理
		return 0 ;					// ソフトの終了
		}
でエラーが
1>------ ビルド開始: プロジェクト: mario, 構成: Debug Win32 ------
1>コンパイルしています...
1>marioppoi.cpp
1>c:\program files\microsoft platform sdk\include\mmreg.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
1>c:\users\マリオっぽい改良\marioppoi.cpp(29) : error C2601: 'Draw' : ローカル関数の定義が正しくありません。
1>        c:\users\マリオっぽい改良\marioppoi.cpp(7): この行は '{' を含んでいますが、これに対応するものがありません。
1>c:\users\マリオっぽい改良\marioppoi.cpp(31) : error C2065: 'White' : 定義されていない識別子です。
1>ビルドログは "file://c:\Users\マリオっぽい改良\Debug\BuildLog.htm" に保存されました。
1>mario - エラー 2、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

kazuoni

Re:Dixqさんサンプルですが

#11

投稿記事 by kazuoni » 16年前

まずコンパイルが通るようにしてみてください。
{}の数がおかしくないですか?
とりあえず消せるエラーは消してみてください。

ひよこ

Re:Dixqさんサンプルですが

#12

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

まちがえました すみません。
自作関数使ってませんでした

ひよこ

Re:Dixqさんサンプルですが

#13

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

よく見たら自作関数ありました。
前のものは無視してください。

やそ

Re:Dixqさんサンプルですが

#14

投稿記事 by やそ » 16年前

エラーメッセージにあるとおりです。

kazuoniさんも言われていますが、まずは字下げを整理して{ }がきちんと対応しているか確認してください。

また、
void Draw()
を自作しておりますが、宣言はしましたか?関数を各場所はそこでいいですか?
またDraw()内でWhiteを使用してますが、宣言がありませんよ。
そのあたりを確認してみてください。

やそ

Re:Dixqさんサンプルですが

#15

投稿記事 by やそ » 16年前

>関数を場所はそこでいいですか?


(正)書く場所はそこでいいですか?

Dixq (管理人)

Re:Dixqさんサンプルですが

#16

投稿記事 by Dixq (管理人) » 16年前

関数は関数の中に書くんじゃなく、外に書きます。
まずは基本的な関数をリンク先を参考に作ってみてはどうでしょう?
コンソール画面でいいので、基本的な書き方がしっかり出来るようになってから、
ゲーム制作に適用してやった方がわかりやすいのでは無いかと思います。
後、字下げはきちんと出来ていますか?
ここの掲示板はタブスペースがスペース4つと同じ大きさで表示されるので、
タブスペースをスペース4つで置換して、ずれがないか確認してから投稿すると、
ずれなく投稿することが出来ます。

ひよこ

Re:Dixqさんサンプルですが

#17

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

わかりました。
もうすこし勉強してきます。

ひよこ

Re:Dixqさんサンプルですが

#18

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

ごめんなさい。解決押し忘れました。

閉鎖

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