背景画像が表示できない

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

背景画像が表示できない

#1

投稿記事 by AB » 14年前

#include "DxLib.h"
#include <math.h>

#define SHOT 20

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int BallX , BallY , BallGraph ;
int Bw, Bh, Sw, Sh ;
int SikakuX , SikakuY , SikakuMuki , SikakuGraph ;
int Sikaku2X , Sikaku2Y , Sikaku2Muki , Sikaku2Graph ;
int SikakuDamageFlag , SikakuDamageCounter , SikakuDamageGraph ;
int ShotX[SHOT] , ShotY[SHOT] , ShotFlag[SHOT] , ShotGraph ;
int SikakuW , SikakuH , ShotW , ShotH ;
int Sikaku2W , Sikaku2H ;
int ShotBFlag ;
int i ;
double ETamaX , ETamaY ;
double ETama2X , ETama2Y ;
int ETamaFlag ;
double ETamaSx, ETamaSy ;
double ETama2Sx, ETama2Sy ;
int ETamaW , ETamaH , ETamaGraph ;
int ETama2W , ETama2H , ETama2Graph ;
int ETamaCounter ;


// 画面に絵を表示
LoadGraphScreen( 0, 0, "背景.bmp", TRUE ); // 画像を描画する
// 画面モードの設定
SetGraphMode( 640 , 480 , 16 ) ;


// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1;

// グラフィックの描画先を裏画面にセット
SetDrawScreen( DX_SCREEN_BACK ) ;

// ボール君のグラフィックをメモリにロード&表示座標をセット
BallGraph = LoadGraph( "小人1.png" ) ;
BallX = 288 ; BallY = 400 ;

// 四角君のグラフィックをメモリにロード&表示座標をセット
SikakuGraph = LoadGraph( "悪者2.png" ) ;
SikakuX = 0 ; SikakuY = 50 ;

// 四角君2のグラフィックをメモリにロード&表示座標をセット
Sikaku2Graph = LoadGraph( "悪者1.png" ) ;
Sikaku2X = 200 ; Sikaku2Y = 50 ;

// 四角君のダメージ時のグラフィックをメモリにロード
SikakuDamageGraph = LoadGraph( "悪者アクション.png" ) ;

// 四角君が顔を歪めているかどうかの変数に『歪めていない』を表す0を代入
SikakuDamageFlag = 0 ;

// 敵の弾のグラフィックをロード
ETamaGraph = LoadGraph( "ごみ.png" ) ;

// 敵の弾のグラフィックをロード
ETama2Graph = LoadGraph( "ごみ.png" ) ;

// 敵の弾のグラフィックのサイズを得る
GetGraphSize( ETamaGraph , &ETamaW , &ETamaH ) ;

// 敵の弾のグラフィックのサイズを得る
GetGraphSize( ETama2Graph , &ETama2W , &ETama2H ) ;

// 敵の弾が飛んでいるかどうかを保持する変数に『飛んでいない』を表す0を代入
ETamaFlag = 0 ;

// 敵が弾を撃つタイミングを取るための計測用変数に0を代入
ETamaCounter = 0 ;

// 弾のグラフィックをメモリにロード
ShotGraph = LoadGraph( "ごみ.png" ) ;

// 弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく
for( i = 0 ; i < SHOT ; i ++ )
{
ShotFlag = 0 ;
}

// ショットボタンが前のフレームで押されたかどうかを保存する変数に0(押されいない)を代入
ShotBFlag = 0 ;

// 四角君の移動方向をセット
SikakuMuki = 1 ;

// 四角君の移動方向をセット
Sikaku2Muki = 1 ;

// 弾のグラフィックのサイズをえる
GetGraphSize( ShotGraph , &ShotW , &ShotH ) ;

// 四角君のグラフィックのサイズを得る
GetGraphSize( SikakuGraph , &SikakuW , &SikakuH ) ;

// 四角君のグラフィックのサイズを得る
GetGraphSize( Sikaku2Graph , &Sikaku2W , &Sikaku2H ) ;

// ボール君と弾の画像のサイズを得る
GetGraphSize( BallGraph , &Bw , &Bh ) ;
GetGraphSize( ShotGraph , &Sw , &Sh ) ;

// 移動ルーチン
while( 1 )
{

// 画面を初期化(真っ黒にする)
ClearDrawScreen() ;

// ボール君の操作ルーチン
{
// ↑キーを押していたらボール君を上に移動させる
if( CheckHitKey( KEY_INPUT_UP ) == 1 ) BallY -= 3 ;

// ↓キーを押していたらボール君を下に移動させる
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) BallY += 3 ;

// ←キーを押していたらボール君を左に移動させる
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) BallX -= 3 ;

// →キーを押していたらボール君を右に移動させる
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) BallX += 3 ;

// スペースキーを押した場合は処理を分岐
if( CheckHitKey( KEY_INPUT_SPACE ) )
{
// 前フレームでショットボタンを押したかが保存されている変数が0だったら弾を発射
if( ShotBFlag == 0 )
{
// 画面上にでていない弾があるか、弾の数だけ繰り返して調べる
for( i = 0 ; i < SHOT ; i ++ )
{
// 弾iが画面上にでていない場合はその弾を画面に出す
if( ShotFlag == 0 )
{
// 弾iの位置をセット、位置はボール君の中心にする
ShotX = ( Bw - Sw ) / 2 + BallX ;
ShotY = ( Bh - Sh ) / 2 + BallY ;

// 弾iは現時点を持って存在するので、存在状態を保持する変数に1を代入する
ShotFlag = 1 ;

// 一つ弾を出したので弾を出すループから抜けます
break ;

}
}
}
// 前フレームでショットボタンを押されていたかを保存する変数に1(おされていた)を代入
ShotBFlag = 1 ;
}
else
{
// ショットボタンが押されていなかった場合は
// 前フレームでショットボタンが押されていたかを保存する変数に0(おされていない)を代入
ShotBFlag = 0 ;
}

// ボール君が画面左端からはみ出そうになっていたら画面内の座標に戻してあげる
if( BallX < 0 ) BallX = 0 ;

// ボール君が画面右端からはみ出そうになっていたら画面内の座標に戻してあげる
if( BallX > 640 - 64 ) BallX = 640 - 64 ;

// ボール君が画面上端からはみ出そうになっていたら画面内の座標に戻してあげる
if( BallY < 0 ) BallY = 0 ;

// ボール君が画面下端からはみ出そうになっていたら画面内の座標に戻してあげる
if( BallY > 480 - 64 ) BallY = 480 - 64 ;

// ボール君を描画
DrawGraph( BallX , BallY , BallGraph , FALSE ) ;
}

// 弾の数だけ弾を動かす処理を繰り返す
for( i = 0 ; i < SHOT ; i ++ )
{
// 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
if( ShotFlag[ i ] == 1 )
{
// 弾iを16ドット上に移動させる
ShotY[ i ] -= 16 ;

// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
if( ShotY[ i ] < -80 )
{
ShotFlag[ i ] = 0 ;
}

// 画面に弾iを描画する
DrawGraph( ShotX[ i ] , ShotY[ i ] , ShotGraph , FALSE ) ;
}
}

// 四角君の移動ルーチン
{
// 顔を歪めているかどうかで処理を分岐
if( SikakuDamageFlag == 1 )
{
// 顔を歪めている場合はダメージ時のグラフィックを描画する
DrawGraph( SikakuX , SikakuY , SikakuDamageGraph , FALSE ) ;

// 顔を歪めている場合はダメージ時のグラフィックを描画する
DrawGraph( Sikaku2X , Sikaku2Y , SikakuDamageGraph , FALSE ) ;

// 顔を歪めている時間を測るカウンターに1を加算する
SikakuDamageCounter ++ ;

// もし顔を歪め初めて 30 フレーム経過していたら顔の歪んだ状態から
// 元に戻してあげる
if( SikakuDamageCounter == 30 )
{
// 『歪んでいない』を表す0を代入
SikakuDamageFlag = 0 ;
}
}
else
{
// 歪んでいない場合は今まで通りの処理

// 四角君の座標を移動している方向に移動する
if( SikakuMuki == 1 ) SikakuX += 3 ;
if( SikakuMuki == 0 ) SikakuX -= 3 ;

if( Sikaku2Muki == 1 ) Sikaku2X += 3 ;
if( Sikaku2Muki == 0 ) Sikaku2X -= 3 ;

// 四角君が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
if( SikakuX > 576 )
{
SikakuX = 576 ;
SikakuMuki = 0 ;
}

// 四角君2が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
if( Sikaku2X > 576 )
{
Sikaku2X = 576 ;
Sikaku2Muki = 0 ;
}

// 四角君が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
if( SikakuX < 0 )
{
SikakuX = 0 ;
SikakuMuki = 1 ;
}

// 四角君が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
if( Sikaku2X < 0 )
{
Sikaku2X = 0 ;
Sikaku2Muki = 1 ;
}

// 四角君を描画
DrawGraph( SikakuX , SikakuY , SikakuGraph , FALSE ) ;

// 四角君を描画
DrawGraph( Sikaku2X , Sikaku2Y , Sikaku2Graph , FALSE ) ;

// 弾を撃つタイミングを計測するためのカウンターに1を足す
ETamaCounter ++ ;

// もしカウンター変数が60だった場合は弾を撃つ処理を行う
if( ETamaCounter == 60 )
{
// もし既に弾が『飛んでいない』状態だった場合のみ発射処理を行う
if( ETamaFlag == 0 )
{
// 弾の発射位置を設定する
ETamaX = SikakuX + SikakuW / 2 - ETamaW / 2 ;
ETamaY = SikakuY + SikakuH / 2 - ETamaH / 2 ;

// 弾の発射位置を設定する
ETama2X = Sikaku2X + Sikaku2W / 2 - ETama2W / 2 ;
ETama2Y = Sikaku2Y + Sikaku2H / 2 - ETama2H / 2 ;

// 弾の移動速度を設定する
{
double sb, sbx, sby, bx, by, sx, sy ;
double sb2, sbx2, sby2, sx2, sy2 ;

sx = ETamaX + ETamaW / 2 ;
sy = ETamaY + ETamaH / 2 ;

sx2 = ETama2X + ETama2W / 2 ;
sy2 = ETama2Y + ETama2H / 2 ;

bx = BallX + Bw / 2 ;
by = BallY + Bh / 2 ;

sbx = bx - sx ;
sby = by - sy ;

sbx2 = bx - sx2 ;
sby2 = by - sy2 ;

// 平方根を求めるのに標準関数の sqrt を使う、
// これを使うには math.h をインクルードする必要がある
sb = sqrt( sbx * sbx + sby * sby ) ;

sb2 = sqrt( sbx2 * sbx2 + sby2 * sby2 ) ;

// 1フレーム当たり8ドット移動するようにする
ETamaSx = sbx / sb * 8 ;
ETamaSy = sby / sb * 8 ;

ETama2Sx = sbx2 / sb2 * 8 ;
ETama2Sy = sby2 / sb2 * 8 ;
}

// 弾の状態を保持する変数に『飛んでいる』を示す1を代入する
ETamaFlag = 1 ;
}

// 弾を打つタイミングを計測するための変数に0を代入
ETamaCounter = 0 ;
}
}
}

// 敵の弾の状態が『飛んでいる』場合のみ弾の移動処理を行う
if( ETamaFlag == 1 )
{
// 弾を移動させる
ETamaX += ETamaSx ;
ETamaY += ETamaSy ;

// 弾を移動させる
ETama2X += ETama2Sx ;
ETama2Y += ETama2Sy ;

// もし弾が画面からはみ出てしまった場合は弾の状態を『飛んでいない』
// を表す0にする
if( ETamaY > 480 || ETamaY < 0 ||
ETamaX > 640 || ETamaX < 0 ) ETamaFlag = 0 ;

if( ETama2Y > 480 || ETama2Y < 0 ||
ETama2X > 640 || ETama2X < 0 ) ETamaFlag = 0 ;

// 画面に描画する( ETamaGraph : 敵の弾のグラフィックのハンドル )
DrawGraph( ( int )ETamaX , ( int )ETamaY , ETamaGraph , FALSE ) ;

// 画面に描画する( ETamaGraph : 敵の弾のグラフィックのハンドル )
DrawGraph( ( int )ETama2X , ( int )ETama2Y , ETama2Graph , FALSE ) ;
}

// 弾と敵の当たり判定、弾の数だけ繰り返す
for( i = 0 ; i < SHOT ; i ++ )
{
// 弾iが存在している場合のみ次の処理に映る
if( ShotFlag[ i ] == 1 )
{
// 四角君との当たり判定
if( ( ( ShotX > SikakuX && ShotX < SikakuX + SikakuW ) ||
( SikakuX > ShotX && SikakuX < ShotX + ShotW ) ) &&
( ( ShotY > SikakuY && ShotY[i] < SikakuY + SikakuH ) ||
( SikakuY > ShotY[i] && SikakuY < ShotY[i] + ShotH ) ) )
{
// 接触している場合は当たった弾の存在を消す
ShotFlag[ i ] = 0 ;

// 四角君の顔を歪めているかどうかを保持する変数に『歪めている』を表す1を代入
SikakuDamageFlag = 1 ;

// 四角君の顔を歪めている時間を測るカウンタ変数に0を代入
SikakuDamageCounter = 0 ;
}
}
}

// 裏画面の内容を表画面にコピーする
ScreenFlip() ;

// Windows 特有の面倒な処理をDXライブラリにやらせる
// -1 が返ってきたらループを抜ける
if( ProcessMessage() < 0 ) break ;

// もしESCキーが押されていたらループから抜ける
if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ;
}

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

// ソフトの終了
return 0 ;
}


このプログラムで実行したのですが上手く実行できません
DXライブラリを用いて背景画像もフォルダにしっかりいれています。

原因が分かる方教えてください。
// 画面に絵を表示
LoadGraphScreen( 0, 0, "背景.bmp", TRUE ); // 画像を描画する
この配置場所のミスかもしれません。。。
良い返事を待っています。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

Re: 背景画像が表示できない

#2

投稿記事 by naohiro19 » 14年前

DXライブラリのリファレンスを見てください。

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

Re: 背景画像が表示できない

#3

投稿記事 by 沖 滉均 » 14年前

フォーラムルールにあるようにコードを貼る場合はcodeタグを使用してください。
長いコードなので非常に見づらいです。
AB さんが書きました:LoadGraphScreen( 0, 0, "背景.bmp", TRUE ); // 画像を描画する
この配置場所のミスかもしれません。。。
はい、その通りです。
その配置ですと、最初に1度だけ読み込んで表示した後に、移動ルーチンと書かれたループ処理の先頭で
ご自分がコメントをつけられている通り

コード:

// 画面を初期化(真っ黒にする)
ClearDrawScreen() ;
画面クリアを行っているため、もちろん背景もクリアされ再描画していないため表示されることはありません。

背景を表示するためには他の画像(キャラクタなど)と同様に毎回描画してあげる必要があります。
ただし、その際にLoadGraphScreen関数は使用せずに他のキャラクタ画像などと同様に
LoadGraph関数で読み込んだグラフィックハンドルを使用するようにしないと、非常に
処理が遅くなりますのでご注意ください。
There is no royal road to learning.
codeタグで指定できる言語
画像

閉鎖

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