トップページ > 過去ログ > 記事閲覧
サンプルプログラム パーティクル基本について
名前:SD 日時: 2008/06/25 14:59

初めまして。 ゲームがだんだんとできてきたので、 そろそろエフェクト?でも出してみようと思いました。 サンプルプログラムのパーティクル基本を参考にしようと思い、 コピペし、起動しても起動せず真っ暗な画面のまま止まってしまいます。 ソースのどこが間違ってるのかがよくわからなかったので、 どなたかご指摘お願い致します。

Page: 1 |

Re: サンプルプログラム パーティクル基本について ( No.1 )
名前: 日時:2008/06/25 18:50

とりあえず、そのソースを張ってもらわないと 指摘のしようが無いとおもうのですが。。。
Re: サンプルプログラム パーティクル基本について ( No.2 )
名前:SD 日時:2008/06/28 09:24

こちらのサンプルプログラムなので必要ないと思い・・ すみません // パーティクル基本 #include "DxLib.h" // ショットとパーティクルの最大数 #define MAX_SHOT 4 #define MAX_SPARK 800 // ショットデータ型 typedef struct tagSHOT { int Valid ; // このデータが使用中か、フラグ int X ,Y ; // ショットの位置 } SHOT ; // 火花データ型 typedef struct tagSPARK { int Valid ; // このデータが使用中か、フラグ int X ,Y ; // 火花の位置 int Sx , Sy ; // 火花の移動力 int G ; // 火花の重さ int Bright ; // 火花の明るさ } SPARK ; int PlayerX , PlayerY ; // プレイヤーの位置 SHOT Shot[ MAX_SHOT ] ; // ショットデータ SPARK Spark[ MAX_SPARK ] ; // 火花データ void CreateSpark( int x , int y ) ; // 火花を出す処理 void MoveSpark( void ) ; // 火花移動処理 void CreateShot( void ) ; // ショットを撃つ処理 void MoveShot( void ) ; // ショットの移動処理 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Key ; int OldKey ; // 前のキー入力状態 int i , j ; SetGraphMode( 640 , 480 , 16 ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 描画先画面を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; // プレイヤーの初期位置をセット PlayerX = 320 ; PlayerY = 400 ; // ショットの存在を初期化する for( i = 0 ; i < MAX_SHOT ; i ++ ) Shot[ i ].Valid = 0 ; // 火花の存在を初期化する for( i = 0 ; i < MAX_SPARK ; i ++ ) Spark[ i ].Valid = 0 ; // ループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // キー入力取得 OldKey = Key ; Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; if( Key & PAD_INPUT_RIGHT ) PlayerX += 3 ; // 右を押していたら右に進む if( Key & PAD_INPUT_LEFT ) PlayerX -= 3 ; // 左を押していたら左に進む // ショットの移動処理 MoveShot() ; // 火花の移動処理 MoveSpark() ; // ショットボタンを押していたらショットを出す if( ( Key & ~OldKey ) & PAD_INPUT_A ) CreateShot() ; // 画面を初期化する ClearDrawScreen() ; // プレイヤーを描画する DrawBox( PlayerX , PlayerY ,PlayerX + 48 , PlayerY + 48 , GetColor( 255 , 0 , 0 ) , TRUE ) ; // ショットを描画する for( j = 0 ; j < MAX_SHOT ; j ++ ) { // ショットデータが有効な時のみ描画 if( Shot[ j ].Valid == 1 ) DrawBox( Shot[j].X , Shot[j].Y , Shot[j].X + 16 , Shot[j].Y + 16 , GetColor( 255 , 255 , 255 ) , TRUE ) ; } // 火花を描画する for( j = 0 ; j < MAX_SPARK ; j ++ ) { // 火花データが有効な時のみ描画 if( Spark[ j ].Valid == 1 ) DrawPixel( Spark[j].X / 100 , Spark[j].Y / 100 , GetColor( Spark[j].Bright , Spark[j].Bright , Spark[j].Bright ) ) ; } // 裏画面の内容を表画面に反映させる ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } // 火花を出す処理 void CreateSpark( int x , int y ) { int i ; // 使われていない火花データを探す for( i = 0 ; i < MAX_SPARK ; i ++ ) { if( Spark[ i ].Valid == 0 ) break ; } // もし使われていない火花データがあったら火花を出す if( i != MAX_SPARK ) { // 火花の位置を設定 Spark[ i ].X = x * 100 ; Spark[ i ].Y = y * 100 ; // 移動力を設定 Spark[ i ].Sx = GetRand( 1000 ) - 500 ; Spark[ i ].Sy = -GetRand( 500 ) ; // 火花の重さをセット Spark[ i ].G = GetRand( 10 ) ; // 火花の明るさセット Spark[ i ].Bright = 255 ; // 火花データを使用中にセット Spark[ i ].Valid = 1 ; } } // 火花移動処理 void MoveSpark( void ) { int i ; // 火花の移動処理 for( i = 0 ; i < MAX_SPARK ; i ++ ) { // 火花データが無効だったらスキップ if( Spark[ i ].Valid == 0 ) continue ; // 位置を移動力に応じてずらす Spark[ i ].Y += Spark[ i ].Sy ; Spark[ i ].X += Spark[ i ].Sx ; // 移動力を変更 Spark[ i ].Sy += Spark[ i ].G ; // 火花の明るさを下げる Spark[ i ].Bright -= 2 ; // 火花の明るさが0以下になったら火花データを無効にする if( Spark[ i ].Bright < 0 ) Spark[ i ].Valid = 0 ; } } // ショットを撃つ処理 void CreateShot( void ) { int i ; // 使われていないショットデータを探す for( i = 0 ; i < MAX_SHOT ; i ++ ) { if( Shot[ i ].Valid == 0 ) break ; } // もし使われていないショットデータがあったらショットを出す if( i != MAX_SHOT ) { // ショットの位置を設定 Shot[ i ].X = PlayerX + 16 ; Shot[ i ].Y = PlayerY ; // ショットデータを使用中にセット Shot[ i ].Valid = 1 ; } } // ショットの移動処理 void MoveShot( void ) { int i , j , R ; // ショットの移動処理 for( i = 0 ; i < MAX_SHOT ; i ++ ) { // ショットデータが無効だったらスキップ if( Shot[ i ].Valid == 0 ) continue ; // 位置を上にずらす Shot[ i ].Y -= 8 ; // 画面外に出ていたら火花を出したあとショットデータを無効にする if( Shot[ i ].Y < 150 ) { // 火花を出す数をセット R = GetRand( 60 ) ; for( j = 0 ; j < R ; j ++ ) { // 火花を生成 CreateSpark( Shot[ i ].X + 8 , Shot[ i ].Y + 8 ) ; } // ショットデータを無効にする Shot[ i ].Valid = 0 ; } } }
Re: サンプルプログラム パーティクル基本について ( No.3 )
名前:L.H.@文林 日時:2008/06/29 00:13

 ↑のソースをそのまま張ってビルドすると、KeyとOldKeyが初期化されずに代入されてる旨の警告がでました。  それを修正したらビルド通りました。  僕は常に警告をエラーとみなす設定でコード組んでるので、初期化しない状態でどうなるのかは分かりません。  ちゃんと四角い自機と、ボタンを押すとショット&火花が描画されます。  というわけで、僕の環境では問題ないです。 WindowsXP VS2005 RAM 3.2GB(4GB) GeForce8800GT
Re: サンプルプログラム パーティクル基本について ( No.4 )
名前:管理人 日時:2008/06/29 17:49

 L.H.@文林さんのご指摘にあるように、未初期化の変数を参照するコードとなって いましたので、修正してみました。  動作に支障を来たすものではありませんが、VisualC++ 2005 辺りから未初期化の 変数を参照すると警告と共にプログラムの動作が止まるようになっているので、 恐らくこれが原因だと思います。(フルスクリーンモードだと警告が出ていても 画面には表示されないので単純にプログラムがフリーズしたように見える)  お手数ですがもう一度サンプルプログラムをコピーして、実行してみて下さい。m(_ _)m
Re: サンプルプログラム パーティクル基本について ( No.5 )
名前:SD 日時:2008/06/30 13:24

やり直してみたところ、無事に実行することができました。 ありがとうございました。 参考にさせて頂きます。

Page: 1 |