DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!

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

DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!

#1

投稿記事 by メロンくん » 10年前

マップ上にいくつか宝石のアイテムが置いてあって、青、黄色、ピンク、紫、赤の5色があります。それぞれの色のジュエルを入手すると、その色に応じて青い宝石なら青、黄色い宝石なら黄色のフィルタが画面に一瞬だけ掛かれば成功です。
しかし、
Jewel(55,28,1,5);//引数は左からx座標、y座標、個別のジュエルの番号、ジュエルの種類(1が青、2が黄色、3がピンク、4が紫、5が赤)
Jewel(62,29,2,3);
Jewel(54,26,3,1);
の部分で宝石を描画しますが、この中の一番上に書いてある関数の引数の色のフィルタしか機能しません(ジュエルの種類と書いてある引数の事)。つまりこれだと5番の赤いフィルタしか掛からないです。これはこの部分の引数を変更して、たとえば
Jewel(55,28,1,2);//引数は左からx座標、y座標、個別のジュエルの番号、ジュエルの種類(1が青、2が黄色、3がピンク、4が紫、5が赤)
Jewel(62,29,2,4);
Jewel(54,26,3,1);
とした場合は、一番上の引数(2),つまり黄色のフィルタしか機能しません。
紫の宝石を取得しても、青の宝石を取得しても、黄色のフィルターが掛かってしまいます。
宝石自体の色は正しく描画されています。

コード:

#include "DxLib.h"
typedef struct{
        int img,muki;
}ch_t;

#define MAP_SIZE	40			// マップチップ一つのドットサイズ

#define MAP_WIDTH	64			// マップの幅
#define MAP_HEIGHT	32			// マップの縦長さ


// マップのデータ
int MapData[MAP_HEIGHT][MAP_WIDTH] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1 },
{ 1,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,0,0,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1 },
{ 1,0,1,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1 },
{ 1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1 },
{ 1,0,1,0,0,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1 },
{ 1,0,1,0,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,0,1 },
{ 1,0,1,0,0,0,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1 },
{ 1,0,1,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1,0,1 },
{ 1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,0,0,1,0,0,0,0,1,0,1 },
{ 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,1,0,1,0,0,0,0,1,1,1,0,0,1,1,1,0,1,0,1 },
{ 1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,0,0,1,1,0,1,0,1 },
{ 1,0,1,0,1,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,0,1,0,0,0,1,0,1,1,0,1,0,1 },
{ 1,0,1,0,1,1,0,1,1,0,0,0,1,1,1,1,0,0,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,1 },
{ 1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,1,1,1,0,1 },
{ 1,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,0,0,0,0,1,1,1,0,1 },
{ 1,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,1,1,1,0,0,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,1,0,1 },
{ 1,0,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1,1,0,0,1,0,1,0,1 },
{ 1,0,1,0,1,0,1,1,1,1,0,0,0,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,0,1,1,0,0,0,1,1,0,1,0,1 },
{ 1,0,1,0,1,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1 },
{ 1,0,1,0,1,1,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,0,0,1,1,0,1,1,1,1,0,1,0,0,1,0,1 },
{ 1,0,1,0,1,1,0,0,0,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,1,0,1 },
{ 1,0,1,0,1,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1,1,1,1,0,1 },
{ 1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,0,1 },
{ 1,0,1,0,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,1,0,0,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,1,1,0,1,1,0,1,1,1 },
{ 1,0,1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,1,1,1,0,1,1,1,1,0,1,1,1,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1 },
{ 1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1 },
{ 1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
{ 1,0,1,1,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,0,1 },
{ 1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

int map;

int jewel_b,jewel_y,jewel_pi,jewel_pa,jewel_r,jewel_shutoku[10] = {};

int filter_ao,filter_kiiro,filter_pinku,filter_murasaki,filter_aka,filter_tuyosa=1,filter_maxtoutatu=0,filterflg=0;//アイテムを入手した時に画面の色を一瞬変える為の変数。

// プレイヤーの位置
int PlayerX , PlayerY ;

// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
int Move ;

// 各方向に移動する量
int MoveX, MoveY ;

// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;

int ScrollX, ScrollY ;


//マップ上のジュエルを描画
void Jewel(int Jewel_DrawPointX,int Jewel_DrawPointY,int Jewel_NO,int Jewel_shurui)
{
	if(jewel_shutoku[Jewel_NO]==0)MapData[Jewel_DrawPointY][Jewel_DrawPointX]=-(Jewel_NO); //0未満の数字にしないと、当たり判定で障害物になってしまうのでマイナスを付けている。1以上の数字のものを障害物として設定。
	if(Jewel_shurui==1 && jewel_shutoku[Jewel_NO]==0)DrawGraph( ((380-MAP_SIZE * PlayerX)+ScrollX)+(Jewel_DrawPointX*MAP_SIZE)  , ((280-MAP_SIZE * PlayerY)+ScrollY) +(Jewel_DrawPointY*MAP_SIZE), jewel_b , TRUE ) ;
	else if(Jewel_shurui==2 && jewel_shutoku[Jewel_NO]==0)DrawGraph( ((380-MAP_SIZE * PlayerX)+ScrollX)+(Jewel_DrawPointX*MAP_SIZE)  , ((280-MAP_SIZE * PlayerY)+ScrollY) +(Jewel_DrawPointY*MAP_SIZE), jewel_y , TRUE ) ;
	else if(Jewel_shurui==3 && jewel_shutoku[Jewel_NO]==0)DrawGraph( ((380-MAP_SIZE * PlayerX)+ScrollX)+(Jewel_DrawPointX*MAP_SIZE)  , ((280-MAP_SIZE * PlayerY)+ScrollY) +(Jewel_DrawPointY*MAP_SIZE), jewel_pi , TRUE ) ;
	else if(Jewel_shurui==4 && jewel_shutoku[Jewel_NO]==0)DrawGraph( ((380-MAP_SIZE * PlayerX)+ScrollX)+(Jewel_DrawPointX*MAP_SIZE)  , ((280-MAP_SIZE * PlayerY)+ScrollY) +(Jewel_DrawPointY*MAP_SIZE), jewel_pa , TRUE ) ;
	else if(Jewel_shurui==5 && jewel_shutoku[Jewel_NO]==0)DrawGraph( ((380-MAP_SIZE * PlayerX)+ScrollX)+(Jewel_DrawPointX*MAP_SIZE)  , ((280-MAP_SIZE * PlayerY)+ScrollY) +(Jewel_DrawPointY*MAP_SIZE), jewel_r , TRUE ) ;

	//↓プレイヤー座標にジュエルがあった場合に、それを取得して、以降表示させない。
	if( MapData[ PlayerY][ PlayerX]<=-1){
		jewel_shutoku[-(MapData[ PlayerY][ PlayerX])]=1;
		MapData[ PlayerY][ PlayerX]=0;
		filterflg=Jewel_shurui;
	}
}


// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	char Key[256];
	int image[8],idouryou=4,hokoujoutai=1,hokouteisi_sirusi=0 ;
	
	ch_t ch;
    ch.muki=1;
	SetGraphMode( 800 , 600 , 32 ) ;
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;
	LoadDivGraph( "画像/キャラ.png" , 8 , 2 , 4 , 40 , 41 , image ) ;
	map = LoadGraph( "map/森のダンジョン 分岐B-3.png" );
	jewel_b=LoadGraph( "画像/ジュエル 青.png" );
	jewel_y=LoadGraph( "画像/ジュエル 黄.png" );
	jewel_pi=LoadGraph( "画像/ジュエル ピンク.png" );
	jewel_pa=LoadGraph( "画像/ジュエル 紫.png" );
	jewel_r=LoadGraph( "画像/ジュエル 赤.png" );
	filter_ao=LoadGraph( "画像/フィルタ 青.png" );
	filter_kiiro=LoadGraph( "画像/フィルタ 黄.png" );
	filter_pinku=LoadGraph( "画像/フィルタ ピンク.png" );
	filter_murasaki=LoadGraph( "画像/フィルタ 紫.png" );
	filter_aka=LoadGraph( "画像/フィルタ 赤.png" );
	// プレイヤーの初期位置をセット 
	PlayerX = 63 ;
	PlayerY = 28 ;


	// 最初は停止中(0)にしておく
	Move = 0 ;
	
	// ループ
	 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
	{
		SetDrawBlendMode( DX_BLENDMODE_NOBLEND,  0 );
		if(hokouteisi_sirusi==1)hokouteisi_sirusi=0;
		if(Key[ KEY_INPUT_Z]  == 1 && (MAP_SIZE - MoveCounter)%4==0)idouryou=4;
		else idouryou=2;

		if( Move == 0 )
		{



			// キー入力に応じてプレイヤーの座標を移動
			if( Key[ KEY_INPUT_LEFT ]  == 1)
			{
				Move = 1 ;
				MoveX = -1 ;
				MoveY = 0 ;
                ch.muki=1; 
			}
			if( Key[ KEY_INPUT_RIGHT]  == 1)
			{
				Move = 1 ;
				MoveX = 1 ;
				MoveY = 0 ;
                ch.muki=3;
			}
			if( Key[ KEY_INPUT_UP   ]==1 )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = -1 ;
				ch.muki=0;
			}
			if( Key[ KEY_INPUT_DOWN ]  == 1)
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = 1 ;
                ch.muki=2; 
			}
if(Key[ KEY_INPUT_C]  == 1 && (MoveCounter==40 || MoveCounter==0 ))Move = 0 ;
			// 進入不可能なマップだった場合は移動できない
			if( Move == 1 )
			{
				
				if( MapData[ PlayerY + MoveY ][ PlayerX + MoveX ] >= 1 )
				{
					Move = 0 ;
				}
				else
				{
					MoveCounter = 0 ;
				}
			}
			// 停止中は画面のスクロールは行わない
			ScrollX = 0 ;
			ScrollY = 0 ;
		}

		// 移動中の場合は移動処理を行う
		if( Move == 1 )
		{
			MoveCounter =MoveCounter+idouryou ;

			// 移動処理が終了したら停止中にする
			if( MoveCounter == MAP_SIZE )
			{
				Move = 0 ;
				hokouteisi_sirusi=1;

				// プレイヤーの位置を変更する
				PlayerX += MoveX ;
				PlayerY += MoveY ;

				// 停止中は画面のスクロールは行わない
				ScrollX = 0 ;
				ScrollY = 0 ;
			}
			else
			{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MoveCounter ) ;
				ScrollY = -( MoveY * MoveCounter ) ;
			}
		}
;

if(MoveCounter==40 || MoveCounter<=19 )hokoujoutai=0;
else hokoujoutai=1;
		ch.img=image[hokoujoutai + ch.muki*2];
		DrawGraph( (380-MAP_SIZE * PlayerX)+ScrollX  , (280-MAP_SIZE * PlayerY)+ScrollY , map , TRUE ) ;

		Jewel(55,28,1,5);//引数は左からx座標、y座標、個別のジュエルの番号、ジュエルの種類(1が青、2が黄色、3がピンク、4が紫、5が赤)
		Jewel(62,29,2,3);
		Jewel(54,26,3,1);
		DrawGraph( 380 , 280 , ch.img , TRUE ) ;//キャラを描画

//ジュエルを入手した場合、画面に色のフィルターを掛ける↓
	if(filter_tuyosa!=0 && filterflg!=0){

		SetDrawBlendMode( DX_BLENDMODE_ALPHA,  filter_tuyosa );
		if(filterflg==1)DrawGraph(   0, 0,  filter_ao, TRUE );
		if(filterflg==2)DrawGraph(   0, 0,  filter_kiiro, TRUE ); 
		if(filterflg==3)DrawGraph(   0, 0,  filter_pinku, TRUE ); 
		if(filterflg==4)DrawGraph(   0, 0,  filter_murasaki, TRUE ); 
		if(filterflg==5)DrawGraph(   0, 0,  filter_aka, TRUE ); 


		if(filter_tuyosa==181)filter_maxtoutatu=1;
		if(filter_maxtoutatu==0)filter_tuyosa=filter_tuyosa+10;	
		else filter_tuyosa=filter_tuyosa-10;
		if(filter_tuyosa==1)filter_tuyosa=0;
	}
	if(filter_tuyosa==0 && filterflg!=0){
		filter_maxtoutatu=0;
		filter_tuyosa=1;
		filterflg=0;
	}

		// 裏画面の内容を表画面に映す
		ScreenFlip() ;
	}
	DxLib_End() ;				// DXライブラリ使用の終了処理
	return 0 ;					// ソフトの終了
}
自分では何度見ても間違っている部分が見付けられません。どこが間違っているのか、どこを直せば良いのか教えてください。

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

Re: DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!

#2

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

コメントから考えても、処理の内容から考えても、
ジュエルを描画する関数にジュエルを取得する処理を入れるべきではないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

メロンくん
記事: 16
登録日時: 11年前

Re: DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!

#3

投稿記事 by メロンくん » 10年前

>>みけCATさん
回答ありがとうございます。
最初は ジュエルを描画する関数の外に書いていたのですが、それで上手くいかなくていじくった結果、現在のコードではこうなってしまっているのです。
処理の場所を移動させても上手くいかず、困っています。

メロンくん
記事: 16
登録日時: 11年前

Re: DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!

#4

投稿記事 by メロンくん » 10年前

すいません。間違えました。
ジュエルを描画する関数の外に書いていたのは、最初からフィルターを掛ける処理の部分だけでした。
Jewel関数の中にジュエルを取得する処理を入れたのは、filterflg=Jewel_shurui;という部分でジュエルの種類を取得する為で、最初からそうでした。
こう書く以外のやり方が思い付かないです。

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

Re: DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!

#5

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

Jewel関数内の

コード:

if( MapData[ PlayerY][ PlayerX]<=-1){
という行を

コード:

if( MapData[ PlayerY][ PlayerX]==-Jewel_NO){
としてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

メロンくん
記事: 16
登録日時: 11年前

Re: DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!

#6

投稿記事 by メロンくん » 10年前

>>みけCATさん

できました!
ちゃんと問題なく動作しました。
本当に助かりました。ありがとうございました。

閉鎖

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