トップページ > 過去ログ > 記事閲覧
背景
名前:yk 日時: 2010/10/17 23:14

どうも。何かとお騒がせしているykです。 早速ですがプログラムに背景( "back.png" )を加えたのですが駄目でした。 <駄目だったプログラム> #include"DxLib.h" #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define DANSU 10 #define DANSU2 10 #define ENEMY_COUNT 20 #define ENEMY_COUNT2 10 #define ENEMY_COUNT3 1 int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdThow ) { //自機のx y座標、自機のグラフィックハンドルを作成 int x , y, w , h , Graph; //弾のx,y座標、弾のフラグ、弾のグラフィックハンドルを作成 int Tx[DANSU] , Ty[DANSU], TFlag[DANSU], Tw, Th, TGraph; //弾のx,y座標、弾のフラグ、弾のグラフィックハンドルを作成 int TTx[DANSU2] , TTy[DANSU2], TTFlag[DANSU2], TTw, TTh, TTGraph; //スペースキーを押しているか押していないかをチェックするフラグ int TCFlag; //Bキーを押しているか押していないかをチェックするフラグ int TTCFlag; //敵のx,y座標、敵のグラフ、敵のグラフィックハンドルを作成 int Ex[ENEMY_COUNT], Ey[ENEMY_COUNT], EFlag[ENEMY_COUNT], Ew, Eh, EGraph; //敵のx,y座標、敵のグラフ、敵のグラフィックハンドルを作成 int EEx[ENEMY_COUNT2], EEy[ENEMY_COUNT2], EEFlag[ENEMY_COUNT2], EEw, EEh, EEGraph; //敵のx,y座標、敵のグラフ、敵のグラフィックハンドルを作成 int EEEx[ENEMY_COUNT3], EEEy[ENEMY_COUNT3], EEEFlag[ENEMY_COUNT3], EEEw, EEEh, EEEGraph; //背景 int BackGraph , Backw , Backh , Backx , Backy , BackFlag; //for文用 int i , j , k ; //撃墜数 int count= 0; //残機数 int life = 50; //ゲームオーバーフラグ int isGameOver = 0; //画面モードの設定 SetGraphMode( SCREEN_WIDTH , SCREEN_HEIGHT , 16 ); //画面モードをウインドウモードに変更 ChangeWindowMode(TRUE); //ウインドウのタイトルを変更 SetMainWindowText("しゅーてぃんぐげーむ"); // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1 ; //描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); //自機のグラフィックをメモリーにロード Graph = LoadGraph( "windows.png"); //弾のグラフィックをメモリーにロード TGraph = LoadGraph( "tama.png"); //弾のグラフィックをメモリーにロード TTGraph = LoadGraph( "killer shot.png"); //敵のグラフィックメモリにロード EGraph = LoadGraph( "te-ki-.png" ) ; //敵のグラフィックメモリにロード EEGraph = LoadGraph( "te-ki-2.png" ) ; //敵のグラフィックメモリにロード EEEGraph = LoadGraph( "te-ki-3.png" ) ; //背景のグラフィックをロード BackGraph = LoadGraph( "back.png" ); //自機のx,y座標を初期化 x = 300; y =400; // 弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく for(i=0;i<DANSU;i++){ TFlag[i] = 0 ; } //ショットボタンが前のフレームで押されたかどうかを保存する変数荷0(押されていない)を代入 TCFlag = 0 ; for (i = 0 ; i < ENEMY_COUNT ; i++){ EFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT2 ; i++){ EEFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT3 ; i++){ EEEFlag[i] = 0; } // 弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく for(k=0;k<DANSU2;k++){ TTFlag[k] = 0 ; } //ショットボタンが前のフレームで押されたかどうかを保存する変数荷0(押されていない)を代入 TTCFlag = 0 ; for (i = 0 ; i < ENEMY_COUNT ; i++){ EFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT2 ; i++){ EEFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT3 ; i++){ EEEFlag[i] = 0; } // 自機、弾、敵のグラフィックのサイズを得る GetGraphSize( Graph , &w , &h ) ; GetGraphSize( TGraph , &Tw , &Th ) ; GetGraphSize( TTGraph , &TTw , &TTh ) ; GetGraphSize( EGraph , &Ew , &Eh ) ; GetGraphSize( EEGraph , &EEw , &EEh ) ; GetGraphSize( EEEGraph , &EEEw , &EEh ) ; GetGraphSize( BackGraph , &Backw , &Backh ) ; //移動処理 while(!isGameOver){ //画面に描かれているのもを一回全部消す ClsDrawScreen(); //上下左右のキー入力に対応して x,yの座標値を変更する if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) x -= 8; if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) x += 8; if( CheckHitKey( KEY_INPUT_UP ) == 1 ) y -= 8; if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) y += 8; // スペースキーを押していて、かつ弾が撃ち出されていなかったら弾を発射する if( CheckHitKey( KEY_INPUT_SPACE ) == 1) { // 前フレームでショットボタンを押したかが保存されている変数が0だったら弾を発射 if(TCFlag == 0){ //@(if(TCFlag == 0){)を//(if(TCFlag == 0){)にして // 画面上にでていない弾があるか、弾の数だけ繰り返して調べる for(i=0;i<DANSU;i++){ // 弾iが画面上にでていない場合はその弾を画面に出す if(TFlag[i] == 0){ // 弾の位置をセット、位置は位置の中心にする Tx[i] = ( w - Tw ) / 2 + x ; Ty[i] = ( h - Th ) / 2 + y ; // 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する TFlag[i] = 1 ; // 一つ弾を出したので弾を出すループから抜けます //抜けないと1回押しただけで全部の弾が次々と出てしまう break; } } } //A}を//}にする // 前フレームでショットボタンを押されていたかを保存する変数に1(おされていた)を代入 TCFlag = 1; } else{ // ショットボタンが押されていなかった場合は // 前フレームでショットボタンが押されていたかを保存する変数に0(おされていない)を代入 TCFlag = 0 ; } // Lキーを押していて、かつ弾が撃ち出されていなかったら弾を発射する if( CheckHitKey( KEY_INPUT_L ) == 1){ // 前フレームでショットボタンを押したかが保存されている変数が0だったら弾を発射 if(TTCFlag == 0){ // 画面上にでていない弾があるか、弾の数だけ繰り返して調べる for(k=0;k<DANSU2;k++){ // 弾iが画面上にでていない場合はその弾を画面に出す if(TTFlag[k] == 0){ // 弾の位置をセット、位置は位置の中心にする TTx[k] = ( w - TTw ) / 2 + x ; TTy[k] = ( h - TTh ) / 2 + y ; // 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する TTFlag[k] = 1 ; // 一つ弾を出したので弾を出すループから抜けます //抜けないと1回押しただけで全部の弾が次々と出てしまう break; } } // 前フレームでショットボタンを押されていたかを保存する変数に1(おされていた)を代入 TTCFlag = 1; } } else{ // 前フレームでショットボタンが押されていたかを保存する変数に0(おされていない)を代入 TTCFlag = 0 ; } for (i = 0 ; i < ENEMY_COUNT; i++){ if (GetRand(100) == 0) { //GetRandの()内の数字を変えると敵の量を調節すろことが可能。少なくすると、いっぱい出てくる //敵iが画面上に出ていない場合はその弾を画面に出す if (EFlag[i] == 0){ //敵の画像ファイルを得る GetGraphSize(EGraph, &Ew, &Eh); //敵の位置をセット、位置はランダムに Ex[i] = GetRand(SCREEN_WIDTH - Ew); Ey[i] = -Eh; //敵は現時点をもって存在するので、存在状態を保持する変数に1を代入する EFlag[i] = 1; //一つ敵を出したので敵を出すループから抜けます //抜けないと1回押しただけで全部の敵が次々と出てしまう break; } } } for (i = 0 ; i < ENEMY_COUNT2; i++){ if (GetRand(100) == 0) { //GetRandの()内の数字を変えると敵の量を調節すろことが可能。少なくすると、いっぱい出てくる //敵iが画面上に出ていない場合はその弾を画面に出す if (EEFlag[i] == 0){ //敵の画像ファイルを得る GetGraphSize(EEGraph, &EEw, &EEh); //敵の位置をセット、位置はランダムに EEx[i] = GetRand(SCREEN_WIDTH - Ew); EEy[i] = -Eh; //敵は現時点をもって存在するので、存在状態を保持する変数に1を代入する EEFlag[i] = 1; //一つ敵を出したので敵を出すループから抜けます //抜けないと1回押しただけで全部の敵が次々と出てしまう break; } } } for (i = 0 ; i < ENEMY_COUNT3; i++){ if (GetRand(1000) == 0) { //GetRandの()内の数字を変えると敵の量を調節すろことが可能。少なくすると、いっぱい出てくる //敵iが画面上に出ていない場合はその弾を画面に出す if (EEEFlag[i] == 0){ //敵の画像ファイルを得る GetGraphSize(EEEGraph, &EEEw, &EEEh); //敵の位置をセット、位置はランダムに EEEx[i] = GetRand(SCREEN_WIDTH - EEEw); EEEy[i] = -Eh; //敵は現時点をもって存在するので、存在状態を保持する変数に1を代入する EEEFlag[i] = 1; //一つ敵を出したので敵を出すループから抜けます //抜けないと1回押しただけで全部の敵が次々と出てしまう break; } } } //自機が画面左端からはみ出そうになっていてら画面内の座標に戻してあげる if( x < 0 ) x = 0 ; //自機が画面右端からはみ出そうになっていてら画面内の座標に戻してあげる if( x > SCREEN_WIDTH - 64 ) x = SCREEN_WIDTH - 64 ; //自機が画面上端からはみ出そうになっていてら画面内の座標に戻してあげる if( y < 0) y = 0 ; //自機が画面端からはみ出そうになっていてら画面内の座標に戻してあげる if( y > SCREEN_HEIGHT - 64 ) y = SCREEN_HEIGHT - 64 ; // x , y が示す画像座標にGraphを描画する DrawGraph( x , y , Graph , TRUE ); // 弾の数だけ弾を動かす処理を繰り返す for(i=0;i<DANSU;i++){ // 自機の弾の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( TFlag[i] == 1 ) { // 弾を16ドット上に移動させる Ty[i] -= 16 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( Ty[i] < -80 ) { TFlag[i] = 0 ; } // 画面に弾を描画する DrawGraph( Tx[i] , Ty[i] , TGraph , TRUE ) ; } } // 弾の数だけ弾を動かす処理を繰り返す for(k=0;k<DANSU2;k++){ // 自機の弾の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( TTFlag[k] == 1 ) { // 弾を16ドット上に移動させる TTy[k] -= 30 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( TTy[k] < -80 ) { TTFlag[k] = 0 ; } // 画面に弾を描画する DrawGraph( TTx[k] , TTy[k] , TTGraph , TRUE ) ; } } //敵の数だけ敵を動かす処理を繰り返す for(i = 0; i < ENEMY_COUNT; i++) { //敵の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う) if (EFlag[i] == 1) { //敵を6ドット上に移動させる Ey[i] += 6; //画面外に出てしまった場合は存在状態を保持している変数に0を代入する if (Ey[i] > 500) { EFlag[i] = 0; } //画面に敵を描画する DrawGraph( Ex[i] , Ey[i] , EGraph , TRUE ); } } //敵の数だけ敵を動かす処理を繰り返す for(i = 0; i < ENEMY_COUNT2; i++) { //敵の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う) if (EEFlag[i] == 1) { //敵を6ドット上に移動させる EEy[i] += 6; //画面外に出てしまった場合は存在状態を保持している変数に0を代入する if (EEy[i] > 500) { EEFlag[i] = 0; } //画面に敵を描画する DrawGraph( EEx[i] , EEy[i] , EEGraph , TRUE ); } } //敵の数だけ敵を動かす処理を繰り返す for(i = 0; i < ENEMY_COUNT3; i++) { //敵の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う) if (EEEFlag[i] == 1) { //敵を6ドット上に移動させる EEEy[i] += 6; //画面外に出てしまった場合は存在状態を保持している変数に0を代入する if (EEEy[i] > 500) { EEEFlag[i] = 0; } //画面に敵を描画する DrawGraph( EEEx[i] , EEEy[i] , EEEGraph , TRUE ); } } //弾と敵の当たり判定、それぞれの弾について検証する for( i = 0 ; i < DANSU; i++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT ; j++){ //弾iが存在している場合のみ次の処理に映る if( TFlag[i] == 1 && EFlag[j] == 1 ) { //敵と当たり判定 int tx = Tx[i]; int ty = Ty[i]; int ex = Ex[j]; int ey = Ey[j]; if (( tx < ex + Ew ) && ( tx + Tw > ex ) && ( ty < ey + Eh ) && ( ty + Th > ey)) { //接触している場合は当たった弾の存在を消す TFlag[i] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する for( i = 0 ; i < DANSU; i++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT2 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TFlag[i] == 1 && EEFlag[j] == 1 ) { //敵と当たり判定 int tx = Tx[i]; int ty = Ty[i]; int Eex = EEx[j]; int Eey = EEy[j]; if (( tx < Eex + EEw ) && ( tx + Tw > Eex ) && ( ty < Eey + EEh ) && ( ty + Th > Eey)) { //接触している場合は当たった弾の存在を消す TFlag[i] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する /*for( i = 0 ; i < DANSU; i++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT3 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TFlag[i] == 1 && EEEFlag[j] == 1 ) { //敵と当たり判定 int tx = Tx[i]; int ty = Ty[i]; int EEex = EEEx[j]; int EEey = EEEy[j]; if (( tx < EEex + EEEw ) && ( tx + Tw > EEex ) && ( ty < EEey + EEEh ) && ( ty + Th > EEey)) { //接触している場合は当たった弾の存在を消す TFlag[i] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } }*/ //弾と敵の当たり判定、それぞれの弾について検証する for( k = 0 ; k < DANSU2; k++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT ; j++){ //弾iが存在している場合のみ次の処理に映る if( TTFlag[k] == 1 && EFlag[j] == 1 ) { //敵と当たり判定 int Ttx = TTx[k]; int Tty = TTy[k]; int ex = Ex[j]; int ey = Ey[j]; if (( Ttx < ex + Ew ) && ( Ttx + TTw > ex ) && ( Tty < ey + Eh ) && ( Tty + TTh > ey)) { //接触している場合は当たった弾の存在を消す TTFlag[k] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する for( k = 0 ; k < DANSU2; k++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT2 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TTFlag[k] == 1 && EEFlag[j] == 1 ) { //敵と当たり判定 int Ttx = TTx[k]; int Tty = TTy[k]; int Eex = EEx[j]; int Eey = EEy[j]; if (( Ttx < Eex + EEw ) && ( Ttx + TTw > Eex ) && ( Tty < Eey + EEh ) && ( Tty + TTh > Eey)) { //接触している場合は当たった弾の存在を消す TTFlag[k] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する /*for( k = 0 ; k < DANSU2; k++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT3 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TTFlag[k] == 1 && EEEFlag[j] == 1 ) { //敵と当たり判定 int Ttx = TTx[k]; int Tty = TTy[k]; int EEex = EEEx[j]; int EEey = EEEy[j]; if (( Ttx < EEex + EEEw ) && ( Ttx + TTw > EEex ) && ( Tty < EEey + EEEh ) && ( Tty + TTh > EEey)) { //接触している場合は当たった弾の存在を消す TTFlag[k] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } }*/ //自機と敵との当たり判定 for( i = 0 ; i < ENEMY_COUNT ; i++ ) { if (EFlag[i] == 1) { int ex = Ex[i]; int ey = Ey[i]; if((x < ex + Ew) && (x + w > ex) && (y < ey + Eh) && (y + h > ey)) { EFlag[i] = 0; life--; if(life <= 0) { //残機が0以下になったらループ脱出 isGameOver = 1; } } } } //自機と敵との当たり判定 for( i = 0 ; i < ENEMY_COUNT2 ; i++ ) { if (EEFlag[i] == 1) { int Eex = EEx[i]; int Eey = EEy[i]; if((x < Eex + EEw) && (x + w > Eex) && (y < Eey + EEh) && (y + h > Eey)) { EEFlag[i] = 0; life--; if(life <= 0) { //残機が0以下になったらループ脱出 isGameOver = 1; } } } } //自機と敵との当たり判定 for( i = 0 ; i < ENEMY_COUNT3 ; i++ ) { if (EEEFlag[i] == 1) { int EEex = EEEx[i]; int EEey = EEEy[i]; if((x < EEex + EEEw) && (x + w > EEex) && (y < EEey + EEEh) && (y + h > EEey)) { EEFlag[i] = 0; //EEFlag[i] = 0;をEEEFlag[i] = 0 にする。 life--; if(life <= 0) { //残機が0以下になったらループ脱出 isGameOver = 1; } } } } if( CheckHitKey( KEY_INPUT_HOME ) == 1) (life++); //撃墜数を設定 DrawFormatString( 0, 0, GetColor(255,255,255),"撃墜数%d",count); //残機数を表示 DrawFormatString( 0, 20, GetColor(255,255,255),"残機数%d",life); // 裏画面の内容を表画面に反映させる ScreenFlip(); // 20分の1秒待つ WaitTimer( 20 ); // Windows システムからくる情報を処理する if( ProcessMessage() == -1 ) break; // ESCキーが押されたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break; } // DXライブラリ使用の終了処理 DxLib_End(); // ソフトの終了 return 0; } どうすれば背景をプログラムに付け足すことができるのでしょうか? お願いします。

Page: 1 |

Re: 背景 ( No.1 )
名前:いっち 日時:2010/10/17 23:43

147行目付近の ClsDrawScreen の後に以下の行を追加して見てください。(テストはしていないので問題があるかもしれません) DrawGraph( 0, 0, BackGraph, TRUE ); 余談ですが、長くて見づらいので、できればアップローダを利用して下さい。 今回のように同じ話題の続きであれば、前回のスレッドを再利用したほうが良いと思います。
Re: 背景 ( No.2 )
名前:yk 日時:2010/10/20 00:08

すみません。返信が大変遅れました。 できましたありがとうございます。 それとアップローダを利用したことが一回も無いのですが、どのアップローダを利用するのがいいのでしょうか。 それと料金はかかりますか(たぶんかからないと思いますけれど)
Re: 背景 ( No.3 )
名前:ふら 日時:2010/10/20 07:05

すでにいっちさんが解決案を提示していますが…。 えっと、分からなかったら聞くのも方法として有りなのですが、幸いDXライブラリにはリファレンスページというものがあります。 今回ykさんがつまずいた描画関数の使い方も、サンプルとしてリファレンスに掲載されているので、 もし良ければ目を通してみてはどうでしょうか。 人のソースを見るのは勉強にもなるので、一石二鳥だと思いますよ。
Re: 背景 ( No.4 )
名前:いっち 日時:2010/10/20 19:28

> それとアップローダを利用したことが一回も無いのですが、どのアップローダを利用するのがいいのでしょうか。 > それと料金はかかりますか(たぶんかからないと思いますけれど) どこでも良いと思いますが、私が良く利用するのは以下のサイトです。 広告表示はありますが、特に料金は発生しません。 > ttp://www.axfc.net/uploader/ 使い方は、板一覧から、ファイルサイズにあった板を選択して、「ファイルを投稿」するを選択すれば、あとは画面の指示通りです。 削除パスは設定しておいたほうが良いです。アップロードするファイルはまとめて圧縮して下さい。

Page: 1 |