[至急]背景、切り替え、特殊効果について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aaa1458
記事: 5
登録日時: 9年前

[至急]背景、切り替え、特殊効果について

#1

投稿記事 by aaa1458 » 9年前

現在DxLibを使ってブロック崩しを作っている者です。
質問が多いので1つだけ答えていただくだけでも結構です。
また解説と一緒にこのプログラムに合ったソースコードを載せてくれるとありがたいです。

質問は3つあって1つ目はゲーム背景を描画したいのですがどこにどのように入れたらいいか分かりません。

コード:

DrawGraph(480, 640, LoadGraph("ゲーム背景.jpg"), TRUE);
2つ目はHキーを押したらハイパーマンに切り替わるようにしたいのですが、押し続けないと画像がハイパーマンの状態になりません。
どうしたら一回で切り替わりますか?

コード:

if (CheckHitKey(KEY_INPUT_H) != 0)
		{
			DrawGraph(bx, by, LoadGraph("ハイパーマン.jpg"), TRUE); // バー絵画 
		}
3つ目は主人公に特殊効果としてAキーを押すと主人公の長さが2倍に、Sキーを押すと長さが1/2倍になるようにしたいです。
画像ファイルは主人公が2倍の長さのときを”スーパーマン2.jpg”、1/2倍のときを”スーパーマン1/2.jpg”としています。

下記がソースコード全体です。

コード:

#include "DxLib.h"
#include "SceneMgr.h"
#include "Keyboard.h"
#include "Start.h"
#include "End.h"

typedef struct
{
	int x; //ボールX座標 
	int y; //ボールY座標 
	int dx; //Xスピード 
	int dy; //Yスピード 
	int r; //円の直半径 
	int flag; //発射フラグ 
}ch_t;


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定


	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {//画面更新 & メッセージ処理 & 画面消去

		Keyboard_Update();    //キーボードの更新

		SceneMgr_Update();  //更新
		SceneMgr_Draw();    //描画

		if (CheckHitKey(KEY_INPUT_S) != 0 || CheckHitKey(KEY_INPUT_H) != 0)//SかHキーでループ回避
		{
			break;
		}

	}

	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	ch_t ball;
	ball.dx = 0;//ボールXスピード
	ball.dy = 0;//ボールYスピード
	ball.r = 5;//
	ball.flag = 0;

	int blocksum = 0; //壊したブロック合計 
	int blockflag[4][8], blockcolor[4][8];//ブロック表示のための配列 
	int bx = 270; //バーX座標
	int by = 455; //バーY座標 
	int blong = 100; //バーの長さ 
	int color = GetColor(255, 255, 255); //ボールの色 
	char key[256]; //キー入力の配列 
	int ballmax = 0, wcount = 0, scount = 0; //ボール発射関係 
	ball.x = 320; //ボールX座標 
	ball.y = 450; //ボールY座標 
	int i, j; //for文用 


	//ブロックの色設定 
	for (i = 0; i<4; i++) {
		for (j = 0; j<8; j++) {
			blockcolor[i][j] = GetColor(GetRand(255), GetRand(255), GetRand(255));
		}
	}
	//ブロック初期化 表示フラグを1に 
	for (i = 0; i<4; i++) {
		for (j = 0; j<8; j++) {
			blockflag[i][j] = 1;
		}
	}

	while (ProcessMessage() != -1)
	{
		ClearDrawScreen();
		GetHitKeyStateAll(key);
		SetDrawBright(255, 255, 255);


		if (key[KEY_INPUT_ESCAPE])
		{
			break;
		}

		// 発射 
		if (key[KEY_INPUT_SPACE] && scount == 0)
		{
			ball.flag = 1;
			ball.dx = 7;
			ball.dy = -7;
			scount = 1;
			wcount = 0;
		}


		// バー移動と発射前ボール移動 
		if (key[KEY_INPUT_RIGHT])
		{
			if (ball.flag == 0) ball.x += 8;
			bx += 8;
		}
		if (key[KEY_INPUT_LEFT])
		{
			if (ball.flag == 0) ball.x -= 8;
			bx -= 8;
		}

		// バー移動範囲と発射前ボール範囲 
		if (bx > 640 - blong)
		{
			if (ball.flag == 0) ball.x = 640 - blong / 2;
			bx = 640 - blong;

		}
		if (bx < 0)
		{
			if (ball.flag == 0) ball.x = blong / 2;
			bx = 0;
		}


		//特殊効果 Sキーでバーの長さを伸ばす
		if (key[KEY_INPUT_S] == 1) DrawGraph(bx, by, LoadGraph("NEW主人公.png"), TRUE); // バー絵画;

		//特殊効果 Aキーでバーの長さを短くする 
		if (key[KEY_INPUT_A] == 1) {
			blong = 30;
			bx = 280;
		}
		//特殊効果 Dキーでバーの長さを元に戻す 
		if (key[KEY_INPUT_D] == 1) blong = 100;

		//特殊効果 ZとX同時押しでボール数リセット 
		if (key[KEY_INPUT_Z] == 1 && key[KEY_INPUT_X] == 1) {
			ballmax = 0;
			SetDrawBright(255, 255, 0);
		}


		// ボールの移動 壁との当たり判定 
		if (ball.flag == 1)
		{
			// 移動距離計算 
			ball.x += ball.dx;
			ball.y += ball.dy;
			// 移動範囲 
			if (ball.x < 5 || ball.x > 640 - 5)
			{
				ball.dx *= -1;
			}
			if (ball.y < 0)
			{
				ball.dy *= -1;
			}
			if (by <= ball.y && by + 10 >= ball.y && bx <= ball.x && bx + blong >= ball.x)
			{
				ball.dy *= -1;
			}

		}

		//ブロックとの当たり判定 
		for (i = 0; i<4; i++) {
			for (j = 0; j<8; j++) {
				if (blockflag[i][j] == 1 && ball.y - 5 <= i * 30 + 30 && ball.y - 5 >= i * 30 && ball.x >= j * 82 && ball.x <= j * 82 + 64) {
					blockflag[i][j] = 0;
					ball.dy *= -1;
					blocksum += 1;
				}
			}
		}


		//ボールが下に落ちた時 
		if (ball.y>480 && wcount == 0 && ballmax<3) {
			ballmax += 1;
			wcount = 1;
			ball.flag = 0;
			ball.y = 455;
			ball.x = bx + blong / 2;
			scount = 0;
		}
		if (ball.y>480 && wcount == 0 && ballmax == 3) ballmax += 1;


		//ブロック絵画 
		for (i = 0; i<4; i++) {
			for (j = 0; j<8; j++) {
				if (blockflag[i][j] == 1) {
					DrawBox(j * 82 + 5, i * 30 + 10, j * 82 + 64, i * 30 + 30, blockcolor[i][j], TRUE);
				}
			}
		}
		
		DrawGraph(bx, by, LoadGraph("スーパーマン.jpg"), TRUE); // バー絵画 


		if (CheckHitKey(KEY_INPUT_H) != 0)
		{
			DrawGraph(bx, by, LoadGraph("ハイパーマン.jpg"), TRUE); // バー絵画 
		}


		//その他絵画

		DrawCircle(ball.x, ball.y, ball.r, color, TRUE); // ボール絵画 

		if (ballmax <= 3)DrawFormatString(0, 460, color, "ボール残り%d", 3 - ballmax);//ボール残り数表示 

		if (ballmax == 4 && blocksum != 32)
		{
			DrawString(0, 460, "GAME OVER  続ける→Z+X 終了→Esc", color, TRUE);
		}
		if (blocksum == 32) {
			ClearDrawScreen();
			DrawString(250, 230, "ゲームクリア", color, TRUE);
		}
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]背景、切り替え、特殊効果について

#2

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:1つ目はゲーム背景を描画したいのですがどこにどのように入れたらいいか分かりません。

コード:

DrawGraph(480, 640, LoadGraph("ゲーム背景.jpg"), TRUE);
このコードはリソースリークを起こすので、どこにも入れてはいけません。
初期化時に1回だけ画像をロードしてそのハンドルを変数に格納し、格納したハンドルを用いて描画しましょう。
aaa1458 さんが書きました:2つ目はHキーを押したらハイパーマンに切り替わるようにしたいのですが、押し続けないと画像がハイパーマンの状態になりません。
どうしたら一回で切り替わりますか?

コード:

if (CheckHitKey(KEY_INPUT_H) != 0)
		{
			DrawGraph(bx, by, LoadGraph("ハイパーマン.jpg"), TRUE); // バー絵画 
		}
状態を示す変数を用意し、切り替えるといいでしょう。
aaa1458 さんが書きました:3つ目は主人公に特殊効果としてAキーを押すと主人公の長さが2倍に、Sキーを押すと長さが1/2倍になるようにしたいです。
画像ファイルは主人公が2倍の長さのときを”スーパーマン2.jpg”、1/2倍のときを”スーパーマン1/2.jpg”としています。
「スーパーマン1/2.jpg」はWindowsにおいてファイル名として使用できない文字/を含んでいます。
「スーパーマン1」というディレクトリに入った「2.jpg」(拡張子がなぜか全角)というファイルですか?
aaa1458 さんが書きました:下記がソースコード全体です。
まずは最初の無駄と思われるDXライブラリの初期化処理とループを消すべきではないでしょうか?
また、標準ではないヘッダがインクルードされているので、これはソースコード全体ではないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa1458
記事: 5
登録日時: 9年前

Re: [至急]背景、切り替え、特殊効果について

#3

投稿記事 by aaa1458 » 9年前

このコードはリソースリークを起こすので、どこにも入れてはいけません。
初期化時に1回だけ画像をロードしてそのハンドルを変数に格納し、格納したハンドルを用いて描画しましょう。

コード:

int backscreen = LoadGraph("ゲーム背景.jpg");
と宣言して

コード:

DrawGraph(480, 640, backscreen, TRUE);
とすればよろしいでしょうか???

状態を示す変数を用意し、切り替えるといいでしょう。
ソースコードも載せてもらってもよろしいでしょうか???

「スーパーマン1/2.jpg」はWindowsにおいてファイル名として使用できない文字/を含んでいます。
「スーパーマン1」というディレクトリに入った「2.jpg」(拡張子がなぜか全角)というファイルですか?
本当にすみません。ミスです。半分になるほうを"スーパーマン1.jpg"、二倍になる方を"スーパーマン2.jpg"でお願いします。

まずは最初の無駄と思われるDXライブラリの初期化処理とループを消すべきではないでしょうか?
また、標準ではないヘッダがインクルードされているので、これはソースコード全体ではないでしょう。
はい。すみません。おっしゃる通りです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]背景、切り替え、特殊効果について

#4

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:

コード:

int backscreen = LoadGraph("ゲーム背景.jpg");
と宣言して

コード:

DrawGraph(480, 640, backscreen, TRUE);
とすればよろしいでしょうか???
読み込み方はいいですが、座標がおかしい気がします。

[hr]
とりあえず、このプログラムに合っているかはあまり気にせずにサンプルを作ってみました。

コード:

#include <DxLib.h>

const int HERO_SUPERMAN = 0;
const int HERO_SUPERMAN_DOUBLE = 1;
const int HERO_SUPERMAN_HALF = 2;
const int HERO_HIPERMAN = 3;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() != 0) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	int backImg = LoadGraph("ゲーム背景.jpg");
	int heroImg[4];
	heroImg[HERO_SUPERMAN] = LoadGraph("スーパーマン.jpg");
	heroImg[HERO_SUPERMAN_DOUBLE] = LoadGraph("スーパーマン2.jpg");
	heroImg[HERO_SUPERMAN_HALF] = LoadGraph("スーパーマン1.jpg");
	heroImg[HERO_HIPERMAN] = LoadGraph("ハイパーマン.jpg");

	int bx = 240, by = 400;
	int heroStatus = HERO_SUPERMAN;

	char key[256], prevKey[256] = {0}, edgeKey[256];

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		// 描画
		DrawGraph(0, 0, backImg, FALSE); // 背景の描画
		DrawGraph(bx, by, heroImg[heroStatus], FALSE); // 主人公の描画

		// 操作
		GetHitKeyStateAll(key);
		for (int i = 0; i < 256; i++) {
			edgeKey[i] = key[i] && !prevKey[i]; // キーがこのフレームで押され始めたかを取得
			prevKey[i] = key[i];
		}
		if (edgeKey[KEY_INPUT_H]) {
			heroStatus = HERO_HIPERMAN;
		} else if (edgeKey[KEY_INPUT_A]) {
			heroStatus = HERO_SUPERMAN_DOUBLE;
		} else if (edgeKey[KEY_INPUT_S]) {
			heroStatus = HERO_SUPERMAN_HALF;
		}

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
添付ファイル
images.zip
適当に作った画像データ
(6.51 KiB) ダウンロード数: 123 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa1458
記事: 5
登録日時: 9年前

Re: [至急]背景、切り替え、特殊効果について

#5

投稿記事 by aaa1458 » 9年前

読み込み方はいいですが、座標がおかしい気がします。

コード:

DrawGraph(0, 0, backscreen, FALSE);//背景描画
x座標、y座標を0にすることでゲーム背景.jpgが全画面に描画されるのですか?

プログラムありがとうございます。
下記は変数宣言を省略し、(上記のソースコードに記していいるため)みけCATさんが載せてくれたものを使ってスーパーマンの伸び縮みを試みましたが、スーパーマンが表示されなくなりました。
どこか間違えているところがあると思うので教えてください。

コード:


const int HERO_SUPERMAN = 0;
const int HERO_SUPERMAN_DOUBLE = 1;
const int HERO_SUPERMAN_HALF = 2;
const int HERO_HIPERMAN = 3;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定


	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {//画面更新 & メッセージ処理 & 画面消去

		Keyboard_Update();    //キーボードの更新

		SceneMgr_Update();  //更新
		SceneMgr_Draw();    //描画

		if (CheckHitKey(KEY_INPUT_S) != 0 || CheckHitKey(KEY_INPUT_H) != 0)//SかHキーでループ回避
		{
			break;
		}

	}

	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);



	int backscreen = LoadGraph("ゲーム背景.jpg");
	
	int heroImg[4];
	heroImg[HERO_SUPERMAN] = LoadGraph("スーパーマン.jpg");
	heroImg[HERO_SUPERMAN_DOUBLE] = LoadGraph("スーパーマン2.jpg");
	heroImg[HERO_SUPERMAN_HALF] = LoadGraph("スーパーマン1.jpg");
	heroImg[HERO_HIPERMAN] = LoadGraph("ハイパーマン.jpg");
	int heroStatus = HERO_SUPERMAN;

	char prevKey[256] = { 0 }, edgeKey[256];

	//ブロックの色設定 
	for (i = 0; i<4; i++) {
		for (j = 0; j<8; j++) {
			blockcolor[i][j] = GetColor(GetRand(255), GetRand(255), GetRand(255));
		}
	}
	//ブロック初期化 表示フラグを1に 
	for (i = 0; i<4; i++) {
		for (j = 0; j<8; j++) {
			blockflag[i][j] = 1;
		}
	}

	while (ProcessMessage() != -1)
	{
		ClearDrawScreen();
		GetHitKeyStateAll(key);
		SetDrawBright(255, 255, 255);


		if (key[KEY_INPUT_ESCAPE])
		{
			break;
		}

		// 発射 
		if (key[KEY_INPUT_SPACE] && scount == 0)
		{
			ball.flag = 1;
			ball.dx = 7;
			ball.dy = -7;
			scount = 1;
			wcount = 0;
		}


		// バー移動と発射前ボール移動 
		if (key[KEY_INPUT_RIGHT])
		{
			if (ball.flag == 0) ball.x += 8;
			bx += 8;
		}
		if (key[KEY_INPUT_LEFT])
		{
			if (ball.flag == 0) ball.x -= 8;
			bx -= 8;
		}

		// バー移動範囲と発射前ボール範囲 
		if (bx > 640 - blong)
		{
			if (ball.flag == 0) ball.x = 640 - blong / 2;
			bx = 640 - blong;

		}
		if (bx < 0)
		{
			if (ball.flag == 0) ball.x = blong / 2;
			bx = 0;
		}

		/*
		//特殊効果 Sキーでバーの長さを伸ばす
		if (key[KEY_INPUT_S] == 1) DrawGraph(bx, by, LoadGraph("NEW主人公.png"), TRUE); // バー絵画;

		//特殊効果 Aキーでバーの長さを短くする 
		if (key[KEY_INPUT_A] == 1) {
			blong = 30;
			bx = 280;
		}
		//特殊効果 Dキーでバーの長さを元に戻す 
		if (key[KEY_INPUT_D] == 1) blong = 100;
		*/

		
		//特殊効果 ZとX同時押しでボール数リセット 
		if (key[KEY_INPUT_Z] == 1 && key[KEY_INPUT_X] == 1) {
			ballmax = 0;
			SetDrawBright(255, 255, 0);
		}


		// ボールの移動 壁との当たり判定 
		if (ball.flag == 1)
		{
			// 移動距離計算 
			ball.x += ball.dx;
			ball.y += ball.dy;
			// 移動範囲 
			if (ball.x < 5 || ball.x > 640 - 5)
			{
				ball.dx *= -1;
			}
			if (ball.y < 0)
			{
				ball.dy *= -1;
			}
			if (by <= ball.y && by + 10 >= ball.y && bx <= ball.x && bx + blong >= ball.x)
			{
				ball.dy *= -1;
			}

		}

		//ブロックとの当たり判定 
		for (i = 0; i<4; i++) {
			for (j = 0; j<8; j++) {
				if (blockflag[i][j] == 1 && ball.y - 5 <= i * 30 + 30 && ball.y - 5 >= i * 30 && ball.x >= j * 82 && ball.x <= j * 82 + 64) {
					blockflag[i][j] = 0;
					ball.dy *= -1;
					blocksum += 1;
				}
			}
		}


		//ボールが下に落ちた時 
		if (ball.y>480 && wcount == 0 && ballmax<3) {
			ballmax += 1;
			wcount = 1;
			ball.flag = 0;
			ball.y = 455;
			ball.x = bx + blong / 2;
			scount = 0;
		}
		if (ball.y>480 && wcount == 0 && ballmax == 3) ballmax += 1;


		//ブロック絵画 
		for (i = 0; i<4; i++) {
			for (j = 0; j<8; j++) {
				if (blockflag[i][j] == 1) {
					DrawBox(j * 82 + 5, i * 30 + 10, j * 82 + 64, i * 30 + 30, blockcolor[i][j], TRUE);
				}
			}
		}

		DrawGraph(0, 0, backscreen, FALSE);//背景描画

		// 操作
		GetHitKeyStateAll(key);
		for (int i = 0; i < 256; i++) {
			edgeKey[i] = key[i] && !prevKey[i]; // キーがこのフレームで押され始めたかを取得
			prevKey[i] = key[i];
		}
		if (edgeKey[KEY_INPUT_H]) {
			heroStatus = HERO_HIPERMAN;
		}
		else if (edgeKey[KEY_INPUT_A]) {
			heroStatus = HERO_SUPERMAN_DOUBLE;
		}
		else if (edgeKey[KEY_INPUT_S]) {
			heroStatus = HERO_SUPERMAN_HALF;
		}

		

		//その他絵画

		DrawCircle(ball.x, ball.y, ball.r, color, TRUE); // ボール絵画 

		if (ballmax <= 3)DrawFormatString(0, 460, color, "ボール残り%d", 3 - ballmax);//ボール残り数表示 

		if (ballmax == 4 && blocksum != 32)
		{
			DrawString(0, 460, "GAME OVER  続ける→Z+X 終了→Esc", color, TRUE);
		}
		if (blocksum == 32) {
			ClearDrawScreen();
			DrawString(250, 230, "ゲームクリア", color, TRUE);
		}
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]背景、切り替え、特殊効果について

#6

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:

コード:

DrawGraph(0, 0, backscreen, FALSE);//背景描画
x座標、y座標を0にすることでゲーム背景.jpgが全画面に描画されるのですか?
左上から描画されますが、全画面に描画されるとは限りません。ゲーム背景.jpgと画面の大きさによります。
aaa1458 さんが書きました:下記は変数宣言を省略し、(上記のソースコードに記していいるため)みけCATさんが載せてくれたものを使ってスーパーマンの伸び縮みを試みましたが、スーパーマンが表示されなくなりました。
どこか間違えているところがあると思うので教えてください。
スーパーマンを表示するコードを消したからスーパーマンが表示されなくなっただけではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa1458
記事: 5
登録日時: 9年前

Re: [至急]背景、切り替え、特殊効果について

#7

投稿記事 by aaa1458 » 9年前

スーパーマンを表示するコードを消したからスーパーマンが表示されなくなっただけではないでしょうか?
すみません。間違えて消していたようです。

コード:

DrawGraph(bx, by, LoadGraph("スーパーマン.jpg"), TRUE); // バー絵画 
このコードを足して普通のスーパーマンの表示はできますが、倍になったり半分になったりなりません。どこがいけないのか分かりません。何度もすみません。お願いします。

だんごさん
記事: 273
登録日時: 13年前

Re: [至急]背景、切り替え、特殊効果について

#8

投稿記事 by だんごさん » 9年前

DXライブラリ 関数リファレンスページは御覧になられましたか?
各関数の使い方が詳しく書いてあります。

画像の大きさを変えるにはDrawGraphとは違い、DrawExtendGraphやDrawModiGraphなどを使用するとよいと思います。
またLoadGraphは初期化時に一度だけ呼び出します。毎フレーム呼び出すと都度メモリに読み込むためそのうちメモリが足らなくなるか落ちます。
 Dango San

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]背景、切り替え、特殊効果について

#9

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:

コード:

DrawGraph(bx, by, LoadGraph("スーパーマン.jpg"), TRUE); // バー絵画 
このコードを足して普通のスーパーマンの表示はできますが、倍になったり半分になったりなりません。どこがいけないのか分かりません。
明らかに倍になったり半分になったりの情報を保持する変数の情報を利用していないのがいけないでしょう。
「分かりません」と言う前に、少しは考えていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa1458
記事: 5
登録日時: 9年前

Re: [至急]背景、切り替え、特殊効果について

#10

投稿記事 by aaa1458 » 9年前

コード:

// 操作
		GetHitKeyStateAll(key);
		for (int i = 0; i < 256; i++) {
			edgeKey[i] = key[i] && !prevKey[i]; // キーがこのフレームで押され始めたかを取得
			prevKey[i] = key[i];
		}
		if (edgeKey[KEY_INPUT_H]) {
			heroStatus = HERO_HIPERMAN;
			DrawGraph(bx, by, LoadGraph("スーパーマン.jpg"), TRUE); // バー絵画 
		}
		else if (edgeKey[KEY_INPUT_A]) {
			heroStatus = HERO_SUPERMAN_DOUBLE;
			DrawGraph(bx, by, LoadGraph("スーパーマン2.jpg"), TRUE); // バー絵画

		}
		else if (edgeKey[KEY_INPUT_S]) {
			heroStatus = HERO_SUPERMAN_HALF;
			DrawGraph(bx, by, LoadGraph("スーパーマン1.jpg"), TRUE); // バー絵画
		}
このようにしたのですがSやAを押しても一瞬しか表示されません。
すぐif分から抜けてしまいます。何か他の方法があるのでしょうか、、、

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]背景、切り替え、特殊効果について

#11

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:このようにしたのですがSやAを押しても一瞬しか表示されません。
すぐif分から抜けてしまいます。何か他の方法があるのでしょうか、、、
もちろんあります。
私のサンプルで書きました。
オフトピック
ところで、なぜこんな露骨に全力でリソースリークするコードを書き続けるのでしょうか?
こんな気持ち悪いコードを書くくらいならLoadGraphScreen関数を使った方がマシでしょう。
(あくまでマシというだけで、本当はLoadGraphScreen関数もいけません)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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