DXライブラリ プログラムのどこが間違っているのかわからずお手上げです。助けてください!
Posted: 2014年10月05日(日) 18:49
マップ上にいくつか宝石のアイテムが置いてあって、青、黄色、ピンク、紫、赤の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),つまり黄色のフィルタしか機能しません。
紫の宝石を取得しても、青の宝石を取得しても、黄色のフィルターが掛かってしまいます。
宝石自体の色は正しく描画されています。
自分では何度見ても間違っている部分が見付けられません。どこが間違っているのか、どこを直せば良いのか教えてください。
しかし、
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 ; // ソフトの終了
}