当たり判定後にその場での一定時間画像の表示の仕方がわかりません
Posted: 2015年4月16日(木) 21:22
http://homepage2.nifty.com/natupaji/DxL ... re1_6.html
ここのサンプルプログラムを使っています。
OS はWindousです。
visual studio2013 のc++、DXライブラリを使っています。
下記のプログラムを実行すると弾丸が画像にあたるとヒットエフェクトが一瞬だけ表示されます。
このヒットエフェクトの画像を2秒間その場に表示するにはどうしたらいいでしょうか?
C言語理解度は制御文がどのような処理をするのか理解している程度です。
ここのサンプルプログラムを使っています。
OS はWindousです。
visual studio2013 のc++、DXライブラリを使っています。
下記のプログラムを実行すると弾丸が画像にあたるとヒットエフェクトが一瞬だけ表示されます。
このヒットエフェクトの画像を2秒間その場に表示するにはどうしたらいいでしょうか?
C言語理解度は制御文がどのような処理をするのか理解している程度です。
#include "DxLib.h"
#define SHOT 20
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
int buX, buY, busterGraph;
int leafX, leafY,leafmuki, leafGraph;
int ShotX[SHOT],ShotY[SHOT],ShotFlag[SHOT],ShotGraph;
int ShotBFlag,i;
int leafW, leafH, shotW, shotH;
int backgraph,StartTime;
int hitgraph,hitflag;
int count=0;
char buf[256];
//画面モードの設定
SetGraphMode(640, 480, 16);
StartTime = GetNowCount();
//DXライブラリの初期化処理
if (DxLib_Init() == -1) return -1;
//グラフィックの描画先を裏画面にセット
SetDrawScreen(DX_SCREEN_BACK);
//背景の設定
backgraph= LoadGraph("forest1.jpg");
//ヒットエフェクトの画像
hitgraph = LoadGraph("ヒットエフェクト.png");
//ヒットエフェクトが出ていないというフラグに0を代入
hitflag = 0;
//グラフィック1をメモリにロード&表示座保養をセット
busterGraph = LoadGraph("ブースター.png");
buX = 400; buY = 300;
//グラフィック2をメモリにロード&表示座標をセット
leafGraph = LoadGraph("リーフィア2.png");
leafX = 0; leafY = 50;
//弾丸のグラフィックをメモリにロード
ShotGraph = LoadGraph("Shot.png");
//弾丸が画面上に存在しているか保持する変数に「存在していない」という意味の0を代入
for (i = 0; i < SHOT; i++)
{
ShotFlag[i] = 0;
}
//ショットボタンが前のフレームで押されたかどうかを保存する変数に0(押されていない)を代入
ShotBFlag = 0;
//グラフィック2の移動方向をセット
leafmuki = 1;
//弾丸のグラフィックのサイズを得る
GetGraphSize(ShotGraph, &shotW, &shotH);
//グラフィック2のサイズを得る
GetGraphSize(leafGraph, &leafW, &leafH);
//移動ルーチン
while (1){
//画面を初期化
ClearDrawScreen();
DrawGraph(0, 0, backgraph, FALSE);
{
GetHitKeyStateAll(buf);
//↑キー移動
if (buf[KEY_INPUT_UP] == 1)buY -= 3;
//←キー移動
if (buf[KEY_INPUT_LEFT] == 1)buX -= 3;
//→キー移動
if (buf[KEY_INPUT_RIGHT] == 1)buX += 3;
//zキーで↓移動
if (buf[KEY_INPUT_Z] == 1)buY += 3;
//スペースキーを押していて、且つ弾丸が打ち出されていなかったら弾丸を発射する
if (buf[KEY_INPUT_SPACE] == 1)
{
if (ShotBFlag == 0)
{
//画面上にでていない弾丸があるか、弾丸の数だけ繰り返しで調べる
for (i = 0; i < SHOT; i++)
{
//弾丸が画面上にでていない場合はその弾丸を画面に出す
if (ShotFlag[i] == 0){
int bw, bh, sw, sh;
//グラフィック1と弾の画像のサイズを得る
GetGraphSize(busterGraph, &bw, &bh);
GetGraphSize(ShotGraph, &sw, &sh);
//弾丸の位置をセット、位置はグラフィック1の中心にする
ShotX[i] = (bw - sw) / 2 + buX-10;
ShotY[i] = (bh - sh) / 2 + buY+20;
//弾丸を現時点を持って存在するので、存在状態を保持するのに変数1を代入
ShotFlag[i] = 1;
break;
}
}
}
ShotBFlag = 1;
}
else
{
ShotBFlag = 0;
}
//グラフィック1が画面左からはみ出そうになったら画面内に移動
if (buX < 0) buX = 0;
//グラフィック1が画面右からはみでそうになったら画面内に移動
if (buX>640 - 120)buX = 640 - 120;
//グラフィック1が画面↑からはみ出そうになったら画面内に移動
if (buY < 0)buY = 0;
//グラフィック1が画面↓からはみ出そうになったら画面内に移動
if (buY>480 - 120)buY = 480 - 120;
//グラフィック1描画
DrawGraph(buX, buY, busterGraph, TRUE);
}
for (i = 0; i < SHOT; i++){
//自機の弾丸1の移動ルーチン(存在状態を保持している変数の内容が1の場合のみ行う)
if (ShotFlag[i] == 1){
//弾丸を16ドット上に移動させる
ShotX[i] -= 16;
if (ShotX[i] < -80){
ShotFlag[i] = 0;
}
DrawGraph(ShotX[i], ShotY[i], ShotGraph, TRUE);
}
}
//グラフィック2の移動ルーチン
{
//グラフィック2の座標を移動している方向に移動する
if (leafmuki == 1)leafY += 3;
if (leafmuki == 0)leafY -= 3;
//グラフィック2が画面→から出そうになったら画面内に移動
if (leafY > 360)
{
leafY = 360;
leafmuki = 0;
}
//グラフィック2が画面←から出そうになったら画面内に移動
if (leafY < 0)
{
leafY = 0;
leafmuki = 1;
}
//グラフィック2を描画
DrawTurnGraph(leafX+40, leafY, leafGraph, TRUE);
}
//弾丸とグラフィック2のあたり判定、弾丸の数だけ繰り返す
for (i = 0; i < SHOT; i++){
//弾丸iが存在している場合のみ次処理
if (ShotFlag[i] == 1){
//あたり判定
if (((ShotX[i]>leafX && ShotX[i]<leafX + leafW)
|| (leafX>ShotX[i] && leafX<ShotX[i] + shotW))
&& ((ShotY[i]>leafY &&ShotY[i]<leafY + leafH)
|| (leafY>ShotY[i] && leafY < ShotY[i] + shotH)))
{
//接触している場合は当たった弾丸の存在を消す
ShotFlag[i] = 0;
//ヒットエフェクトを表示
DrawRectGraph(ShotX[i], ShotY[i] - 10, 224, 32, 32, 32, hitgraph, TRUE, FALSE);
}
}
}
//裏画面の内容を表画面にコピーする
ScreenFlip();
//Windouws特有の面倒な処理をDxライブラリにやらせる
//-1が帰ってきたらループを抜ける
if (ProcessMessage() < 0) break;
//escキーが押されたらループから抜ける
if (CheckHitKey(KEY_INPUT_ESCAPE))break;
}
//Dxライブラリの使用の終了の処理
DxLib_End();
//ソフトの終了
return 0;
}