DXライブラリの透過処理について

このQ&Aのポイント
  • #DXライブラリ #透過処理 #ペイント #PNGファイル形式
  • DXライブラリを使用してmura.pngの透過処理を行おうとしていますが、うまくいきません。Win10のペイントで作ったpngファイル形式に対応していない可能性があります。原因を教えてください。
  • DrawGraph関数の引数に渡しているmura.pngの左上のカラーキーを使用して透過処理を行おうとしていますが、期待通りの結果が得られません。可能性としては、Win10のペイントで作成したpngファイル形式に対応していない可能性があります。詳細な原因を教えてください。
回答を見る
  • ベストアンサー

DXライブラリの透過処理について

#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { ChangeWindowMode(TRUE); SetDrawScreen(DX_SCREEN_BACK); if(DxLib_Init()==1) { return -1; } char key[256]; // int haikei; int mapchip[2][152]; int i,j; //int x = 0, y = 0; //haikei = LoadGraph("haikei/草原.jpg"); LoadDivGraph("03.png",5,1,5,32,32,mapchip[0]); LoadDivGraph("mura.png",1,1,1,32,32,mapchip[1]); while(ScreenFlip()==0 && ProcessMessage() == 0 && GetHitKeyStateAll(key)==0) { // ClearDrawScreen(); // DrawGraph(x,y,haikei,FALSE); for(i = 0; i<15;i++) { for(j=0;j<20;j++) { DrawGraph(j*32,i*32,mapchip[0][4],FALSE); } } DrawGraph(32,32,mapchip[1][0],TRUE); /* if(CheckHitKey(KEY_INPUT_RIGHT) == 1) x+=10; if(CheckHitKey(KEY_INPUT_LEFT) == 1) x-=10; if(CheckHitKey(KEY_INPUT_UP) == 1) y-=10; if(CheckHitKey(KEY_INPUT_DOWN) == 1) y+=10; */ if(key[KEY_INPUT_ESCAPE] == 1) { DxLib_End(); return 0; } } } 「DrawGraph(32,32,mapchip[1][0],TRUE);」という処理でmura.pngの左上のカラーキーで透過するはずですがしません。 Win10のペイントで作ったpngファイル形式に対応してないかと思うのですが、よくわかりまえん。 なぜ?

noname#229433
noname#229433

質問者が選んだベストアンサー

  • ベストアンサー
  • heburusu
  • ベストアンサー率85% (140/164)
回答No.3

bmpでは正しく動くとなると、ちょっと原因がわからないですね・・・。 Windows10のペイントでpng形式で保存すると、使用はしていないければアルファ情報が含まれていたりするのかもしれないですね(完全に推測です…)。 画像サイズが大きくても問題ないのでしたら、 ひとまずはbmp形式でプログラム進めていったほうが良いかもしれないですね。 原因特定は時間かかりそうですし・・・。

noname#229433
質問者

お礼

原因がわかるまでBMP形式でやってみようと思います。 気分次第いろいろやったら原因が特定できるかもしれません。 また詰まったらよろしくです。

その他の回答 (2)

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.2

試して頂きありがとうございます。 >SetTransColor( 255, 0, 0 ) ; >それも試してみましたが、無理でした、泣。 一応ですが、(255,0,0)をそのまま指定してもできないと思います。 >LoadDivGraph("mura.png",1,1,1,32,32,mapchip[1]); mura.pngで左上(透過させたい色)のRGBをSetTransColorする必要があります。 mura.pngの左上のRGBを指定しても透過できませんか?

noname#229433
質問者

お礼

>mura.pngの左上のRGBを指定しても透過できませんか? (255,0,0)赤でも(255,242,0)黄色でもダメでした。 前のプログラムに戻って SetTransColor(255, 242, 0); gazo = LoadGraph("mura.png"); にしても、この前は透過したのですが、しませんでした。 何かファイル設定等が問題あるかもしれません。

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.1

LoadDivGraphで画像を読み込む前に、SetTransColorで透過させる色を指定する必要があるような気がします。 デフォルトは黒(0, 0, 0)が指定されているようです。 >例えばある画像ファイルの真っ赤( R = 255, G = 0, B = 0 )な部分を透過色としたい場合は、 > その画像ファイルを LoadGraph などで読み込む前に SetTransColor( 255, 0, 0 ) ; を実行しておきます。

参考URL:
http://dxlib.o.oo7.jp/function/dxfunc_graph1.html#R15N7
noname#229433
質問者

お礼

SetTransColor( 255, 0, 0 ) ; それも試してみましたが、無理でした、泣。 以前のステップの SetTransColor(255, 242, 0); gazo = LoadGraph("敵画像/b.png"); では透過するのです。 LoadDivGraphではなぜか透過しません。

noname#229433
質問者

補足

新たにa.bmpというbmpファイルを作って、 SetTransColor(255, 242, 0); LoadDivGraph("a.bmp",1,1,1,32,32,mapchip[1]); と書き直して透過に成功しました。 pngにこだわらなくてもbmpでもいいのですが、ファイルの何かの構造で失敗したりするかもしれません。 原因は不明です。

関連するQ&A

  • DXライブラリでマップが作れません・・・。

    今DXライブラリとVisualC++2008を使ってゲーム(アクション)を作っているのですがマップが作れません・・・、構造体?をつかってマップの描写は成功したのですが、0のところに判定を持たせることができません・・・。どのようにすればいいのでしょうか?色々試してみてもできず困っています。 ソースの一部 #include"DxLib.h" #define MAP_SIZE 64 // マップチップ一つのドットサイズ #define MAP_WIDTH 10 // マップの幅 #define MAP_HEIGHT 8 // マップの縦長さ int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } ; void HYOUZI(void); void SYOKIKA(void); struct dousa{ int power; int flag; }; struct dousa jump; struct zahyou { int x,y; int img; int flag; int muki_y; int muki_x; int x1; int x2; int x3; int x4; int y1; int y2; int y3; int y4; }; struct zahyou haikei; struct charcter { int x,y; int img; int flag; }; struct charcter ziki; struct map; //初期化 void SYOKIKA(void){ jump.flag=0; ziki.x=100; ziki.y=100; ziki.img=LoadGraph("red_player.bmp"); } //背景 void HYOUZI(void){ int i,j; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { if( MapData[ i ][ j ] == 0 ) { DrawBox( j * MAP_SIZE , i * MAP_SIZE , j * MAP_SIZE + MAP_SIZE , i * MAP_SIZE + MAP_SIZE , GetColor( 255 , 0 , 0 ) , TRUE ) ; } } } DrawGraph(ziki.x,ziki.y,ziki.img,TRUE); ScreenFlip(); } //動き void ugoki(void){ int OldX , OldY ; OldX = ziki.x ; OldY = ziki.y ; if (CheckHitKey(KEY_INPUT_RIGHT) == 1){ ziki.x=ziki.x+4; } if (CheckHitKey(KEY_INPUT_RIGHT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x+8; } if (CheckHitKey(KEY_INPUT_LEFT) == 1){ ziki.x=ziki.x-4; } if (CheckHitKey(KEY_INPUT_LEFT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x-8; } if(ziki.x>640){ ziki.x=-10; } if(ziki.x<-10){ ziki.x=640; } //ジャンプ jump.power-=1; ziki.y -=jump.power; if(ziki.y>400){ jump.power=0; ziki.y=400; jump.flag=0; } if (CheckHitKey(KEY_INPUT_DOWN) == 1 && jump.flag == 0){ jump.power=30; jump.flag=1; } if (CheckHitKey(KEY_INPUT_UP) == 1 && jump.flag == 0){ jump.power=20; jump.flag=1; } if( MapData[ ziki.x ][ ziki.y ] == 0 ) { ziki.x = OldX ; ziki.y = OldY ; } } int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1) { return -1; } SYOKIKA(); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){ HYOUZI(); ugoki(); ClearDrawScreen(); } DxLib_End(); return(0); } 分かる人がいたらぜひ教えてください(o_ _)o

  • C言語 DXライブラリ

    #include <math.h> #include "DxLib.h" #define PI 3.1415926f int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); int Handle[3]; LoadDivGraph( "画像/弾01.png", 3, 3, 1, 14, 16, Handle ); float x=320,y=240,angle=0,speed=1; while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){ x += cos( angle ) * speed; DrawRotaGraph( x, y, 1.0, angle+PI/2, Handle[0], TRUE ); } DxLib_End(); return 0; } これを実行すると画像が右に動いていくのですが、なぜ動くのかわかりません。 x += cos( angle ) * speed; の部分はx=320+0*1という事だと思っているのですが、これだとxはずっと320のままで画像が右に動いて行かないと思います。 教えてくださいm(_ _ )m

  • 三段ギリ

    最終的にロックマンゼロの三段ギリのようにしたいのですが、 一段目でつまづいています。 お聞きしたい点は2つです。 1つは「if(state == 1 && count>=0 && count<60){」 の部分の画像が実行しても真っ黒になってしまうところ。 ちなみに、ほかの画像で試したところちゃんとできました。 なぜか、画像の4つ目だけうつりません。 2つは「DrawFormatString(0,0,cr,"%d",count);」 がなぜか機能しないというところです。 初心者なので、無駄な部分も見つかるかもしれませんので、 指摘していただけるとありがたいです。 よろしくお願いします。 #include "DxLib.h" struct CharaData{ int x; int y; }Player; int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){ ChangeWindowMode(TRUE); if(DxLib_Init() == -1) return 0; int image[4],image2[3],state=0; float count =0; int cr = GetColor(255,0,0); int Pad; Player.x = 296; Player.y = 224; SetDrawScreen(DX_SCREEN_BACK); LoadDivGraph("画像ファイル5枚.png",5,3,2,90,60,image); while(ProcessMessage() == 0 && ScreenFlip() == 0 ){  Pad = GetJoypadInputState(DX_INPUT_KEY_PAD1); ClsDrawScreen(); if(count > 0){ count--; } if(count == 0){ state =0; } if(count==0){ DrawGraph(Player.x,Player.y,image[2],TRUE); } DrawFormatString(0,0,cr,"%d",count); //残り秒数 if(Pad & PAD_INPUT_A && state == 0){ state =1; count =240; DrawFormatString(0,0,cr,"%d",count); } if(state == 1&& count>=180&& count<240){ ClsDrawScreen(); DrawGraph(Player.x,Player.y,image[0],TRUE); DrawFormatString(0,0,cr,"%d",count); } if(state == 1&& count>=120 && count<180){ ClsDrawScreen(); DrawGraph(Player.x,Player.y,image[1],TRUE); DrawFormatString(0,0,cr,"%d",count); } if(state == 1 && count>=60&& count<120){ ClsDrawScreen(); DrawGraph(Player.x,Player.y,image[3],TRUE); DrawFormatString(0,0,cr,"%d",count); } if(state == 1 && count>=0 && count<60){ ClsDrawScreen(); DrawGraph(Player.x,Player.y,image[4],TRUE); DrawFormatString(0,0,cr,"%d",count); } if(Pad & PAD_INPUT_DOWN) Player.y+=4; if(Pad & PAD_INPUT_UP) Player.y-=4; if(Pad & PAD_INPUT_LEFT) Player.x-=4; if(Pad & PAD_INPUT_RIGHT) Player.x+=4; if(Pad & PAD_INPUT_Z){ break; } } DxLib_End(); return 0; }

  • DXライブラリでの画像表示

    ゲームプログラミング初心者です。 DXライブラリを用いて画像を表示させようと以下のプログラムを組んで実行してみたのですが、ウィンドウは表示されるのに画像が表示されません。 使用しているのはBorland C++ 5.5.,BCC Developer,DXライブラリです。 ちゃんと画像もプロジェクトファイルの中に入っていると思います。 OSはwindows8です。 考えられる原因を教えてもらえないでしょうか。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) { return -1; } LoadGraphScreen(0,0,"image.png",TRUE); WaitKey(); DxLib_End(); return 0; }

  • ブロック崩し

    大学でプログラム習ってるんですが、全然できないのでこのままじゃまずいと思って勉強がてらゲームを作ってみる事にしました。ブロック崩しを作ろうとしたのですが、球を動かす機能を関数化する所とブロックの配置をどうすればいいかで悩んでます。どうすればよろしいでしょうか。DXライブラリで作ってます。 #include "DxLib.h" typedef struct _racket{ int g_racket; int g_x; int g_y; }racket; typedef struct _block{ int stone; int x; int y; }block; typedef struct _tama{ int ball; int x; int y; int vx; int vy; }tama; int Key; tama ta; void ball_attack() { ta.x = 300; ta.y = 450; ta.vx = 4; ta.vy = 4; ta.ball = LoadGraph("ball.bmp"); DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //tama ta; racket ra; //ta.x = 300; //ta.y = 450; //ta.vx = 4; //ta.vy = 4; ra.g_x = 300; ra.g_y = 420; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); // 透過色を変更 SetTransColor( 255 , 255 , 255 ) ; ra.g_racket = LoadGraph("ziki.bmp"); //ta.ball = LoadGraph("ball.bmp"); while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0) { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } ClearDrawScreen(); ball_attack(); /* DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy*/; // キー入力取得 Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; // 右を押していたら右に進む if( Key & PAD_INPUT_RIGHT ) ra.g_x += 3 ; // 左を押していたら左に進む if( Key & PAD_INPUT_LEFT ) ra.g_x -= 3 ; // 読みこんだグラフィックを画面左上に描画 DrawGraph( ra.g_x , ra.g_y , ra.g_racket , TRUE ) ; ScreenFlip(); } WaitKey(); DxLib_End(); return 0; }

  • DXライブラリによるパズルゲーム制作について

     今、私はDXライブラリによるパズルゲーム制作に取り掛かっています。 そこで、画像をランダムに表示する際のプログラムの書き方に詰まってしまったので、教えていただければと思い投稿しました。 LoadDivGraph( "BLOCK.png" , 16 , 4 , 4 , 32 , 32 , Block ); for(int i=0;i<15;i++) {     for(int j=0;j<20;j++)     {         int n =GetRand(14);   if(i==0||i==14||j==0||j==19)   { DrawGraph( j*32, i*32 , Block[7], TRUE );   }   else   { DrawGraph( j*32, i*32 , Block[n], TRUE );   }     } } ※インデントに関してはご容赦ください。 かなり端折っていますが、上記のような感じで打ってしまうと、(ここには書いていませんが)while文があるおかげで、一秒間に60回のペースでBlock[n]の中身が変化してしまいます。 これを解消したいのですが、かといって、いちいち変数を用意してコピーするのでは効率が悪いですよね。あと、パズルゲームですので、この先、表示した画像を入れ替えたり消したりといった処理があることを念頭に入れたうえでのベストな書き方を教えていただければと思います。 ちなみに、C言語・C++の書き方でお願いします。

  • DXライブラリを使用した画像表示について

    ゲームプログラミングを始めたいと考えている初心者です。 Borland C++ 5.5.1,BCC Developer,DXライブラリを使用しています。 下記のプログラムをメイクして実行すると、ウィンドウは表示されるのですが、画像が表示されません。画像の保存場所はプロジェクトの中のDebugフォルダです。どんな原因が考えられるでしょうか?ウィンドウは表示されていて実行できているのでプログラムの記述の問題ではないと考えます。 使用しているOSがMeです。Meではできないのでしょうか? お詳しい方、ぜひご回答お願いします。 ---------------------------------------------------------------- #include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1 ; // エラーが起きたら直ちに終了 } /*--ここから下に処理を記述--*/ LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ; /*--ここまでが処理--*/ WaitKey() ; // キー入力待ち DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

  • 世界一周について

    現在RPGのマップを表示するプログラムを作成しているのですが 世界一周が出来ません LINE_Xの最大の長さが30,LINE_Yの最大の長さが25として 画面に表示する範囲はx(横)が20,y(縦)が15です。 キャラを画面の中心に表示し、キー入力された方向の逆にマップを 移動させていくことでキャラが入力された方向に移動する方法です。 お聞きしたいのは、マップのLINE_Xの最大値やLINE_Yの最大値に近づいたときに歩いている方向の先にマップのLINE_XやLINE_Yの最小値から移動した分を表示する記述方法です。 聞きたいことをうまく記述できなくて申し分けないのですがよろしくお願いしますm(_ _)m また、おかしな記述があったら注意・改善等よろしくおねがいします 例) LINE_X=30(横),LINE_Y=25(縦)で x = 20,y = 9としたとき 右に5歩移動したときに表示されているマップが 横が11~30,縦が1~15 の範囲としたとき y=0まで移動したとき上半分にLINE_Yの移動した分の(25-移動距離)~25を表示したい (ドラクエみたいにマップの端まで言ったらマップの反対を表示してエンドレスにマップ表示が終わらない) ソース> #include "DxLib.h" int WINAPI WinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTR lpCmdLine,int nCmdShow){ ChangeWindowMode(true); if( DxLib_Init() == -1)return -1; int i,j; int x,y,chx,chy,ax,ay; int UD,LR,wf,muki,chd,chd2,houkou,gi,flg; int keyL,keyR,keyU,keyD; int map[25][30],ch[12],fi,white; char key[256]; LoadDivGraph("char.bmp",12,3,4,32,32,ch); fi = LoadGraph("ftest.bmp"); ↑読み込んでいるのは自作画像です↓ white = LoadGraph("画像\\white.bmp"); SetDrawScreen(DX_SCREEN_BACK); ClearDrawScreen(); for(i=0;i<25;i++){ for(j=0;j<30;j++){ map[i][j] = 0; if(i==0||j==0||i==24||j==29) map[i][j] = 1; } } flg = chd2 = houkou = UD = LR = wf = 0; muki = chy = chx = 0; chd = 1; x = 640 / 2; y = (480 / 2) - 16; chx = (x / 32); chy = (y / 32); while(1){ GetHitKeyStateAll(key); ax = ay = 0; for(i=UD;i<25+UD;i++){ for(j=LR;j<30+LR;j++){ if((i<0 || j<0) || (i>24 || j>29)){ DrawGraph(ax,ay,white,false); }else DrawGraph(ax,ay,fi,false); ax += 32; } ax = 0; ay +=32; } if(x%32==0 && y%32==0){ wf = 1; keyU = keyD = keyL = keyR = 0; houkou = muki; if(key[ KEY_INPUT_UP] == 1){ muki = 0; keyU = 1; }else if(key[KEY_INPUT_RIGHT] == 1){ muki = 1; keyR = 1; }else if(key[ KEY_INPUT_DOWN] == 1){ muki = 2; keyD = 1; }else if(key[KEY_INPUT_LEFT] == 1){ muki = 3; keyL = 1; }else wf = 0; } if((keyU + keyD + keyL + keyR )!= 0){ chx = (x / 32); chy = (y / 32); if(keyU == 1){ if(map[(chy+UD)-1][chx+LR] != 0)UD -= 1; }else if(keyD == 1){ if(map[(chy+UD)+1][chx+LR] != 0)UD += 1; }else if(keyL == 1){ if(map[chy+UD][(chx+LR)-1] != 0)LR -= 1; }else if(keyR == 1){ if(map[chy+UD][(chx+LR)+1] != 0)LR += 1; } } if(wf==1){ if(muki == houkou){ if(chd == 1){ gi = ch[(muki*3) + chd]; if(chd2 == 0){ chd++; }else if(chd2 == 2){ chd--; } }else if(chd == 2){ gi = ch[(muki*3) + chd]; chd--; chd2 = 2; }else if(chd == 0){ gi = ch[(muki*3) + chd]; chd++; chd2 = 0; } } }else if(wf == 0){ if(chd == 1 && flg == 0){ gi = ch[(muki*3) + chd]; if(chd2 == 0){ chd++; }else if(chd2 == 2){ chd--; } flg = 1; }else if(chd == 2 && flg == 0){ gi = ch[(muki*3) + chd]; chd--; chd2 = 2; flg = 1; }else if(chd == 0 && flg == 0){ gi = ch[(muki*3) + chd]; chd++; chd2 = 0; flg = 1; }else if(flg == 1)flg = 0; } if(key[KEY_INPUT_ESCAPE] == 1)break; if(ProcessMessage() == -1)break; Sleep(100); DrawGraph(x,y,gi,true); ScreenFlip(); } DxLib_End(); return 0; } 上記のソースでは移動方向の先から反対側のエリアは出てきません 表示した範囲内でのみ移動可能になっていて端の0は移動エリアの限定と終端の確認のためです 参考サイトはhttp://l.huu.cc/g/#0です DxLib.hもここのリンクからDLしました

  • 当たり判定の処理がわかりません。

    CとDXライブラリでSTGを作っているのですが、あたり判定がわかりません。前、斜め右上、斜め右下の3方向に飛ぶ弾の処理を行いたいのですが、どうすればいいのでしょうか? 画面に出力することはできたのですが、ななめに飛ぶ弾だけ判定できずに困っています。 ―――――――――ソースの一部――――――――――― //拡散する弾 void JitamaMove2(){ //弾の発射 int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); if( (key & PAD_INPUT_A) && (trigger == 0) ) { for( int i = 0; i < 3; i++ ){ if (jitama[i].life == 0){ jitama[i].life = 1; jitama[i].x = jikidata.x+24; jitama[i].y = jikidata.y+8; jitama[i].y1 = jikidata.y+8; jitama[i].y2 = jikidata.y+8; float dy = jikidata.y; float d = sqrt(dy*dy); jitama[i].yobi = dy/d*idouryou[4]*10; break; } } trigger = 20; } if(trigger>0) trigger = trigger - 1; //弾の移動 for(int i=0; i<3; i=i+1){ if(jitama[i].life > 0){ jitama[i].x = jitama[i].x + idouryou[10]; DrawGraph(jitama[i].x, jitama[i].y,*(jitama[i].ghandle), TRUE); float idouy = (float)jitama[i].yobi / 10; jitama[i].y2 = jitama[i].y2 - idouy; DrawGraph(jitama[i].x, jitama[i].y2 - 10, *(jitama[i].ghandle), TRUE); //斜め下に対する弾の描写 jitama[i].y1 = jitama[i].y1 + idouy; DrawGraph(jitama[i].x, jitama[i].y1 + 10, *(jitama[i].ghandle), TRUE); //斜め上に対する弾の描写 //画面外に出たときの処理 if(jitama[i].x>640) jitama[i].life = 0; } } } /*当たり判定を計算する関数*/ int IsAtari(CharaData *a, CharaData *b){ int retval = 0; int ax1 = a->x + (a->image_w - a->bounds_w)/2; int ay1 = a->y + (a->image_h - a->bounds_h)/2; int ax2 = a->x + (a->image_w + a->bounds_w)/2; int ay2 = a->y + (a->image_h + a->bounds_h)/2; int bx1 = b->x + (b->image_w - b->bounds_w)/2; int by1 = b->y + (b->image_h - b->bounds_h)/2; int bx2 = b->x + (b->image_w + b->bounds_w)/2; int by2 = b->y + (b->image_h + b->bounds_h)/2; if( (ax1<bx2) && (bx1<ax2) && (ay1<by2) && (by1<ay2) ){ switch (a->amode){ case A_NORMAL: //キャラ消滅 a->life = 0; break; case A_HARD: //耐久力-1 a->life = a->life -1; break; } switch (b->amode){ case A_NORMAL: //キャラ消滅 b->life = 0; break; case A_HARD: //耐久力-1 b->life = b->life -1; if(b->life > 0) SetHanten(b->x, b->y, b->image_w, b->image_h); break; } if(b->life == 0) SetBakuen(b->x, b->y); retval = 1; } return(retval); } //当たり判定の処理 int AtariHantei(){ for(int i=0; i<50; i=i+1){ if(tekidata[i].life > 0 && tekidata[i].amode != A_GHOST){//A_GHOS・・・判定なし //自機と敵の判定 if(IsAtari(&jikidata, &tekidata[i])==1) return(1); //弾と敵の判定 for(int j=0; j<3; j=j+1){ if(jitama[j].life > 0 && jitama[j].amode != A_GHOST){ IsAtari(&jitama[j], &tekidata[i]); } } } } for( int i = 0; i < 50; i++ ){ if(tekitama[i].life > 0){ if(IsAtari(&jikidata, &tekitama[i]) == 1) return(1); } } return(0); }

  • error C2664

    error C2664 int * x; int * y; SetMouseDispFlag( TRUE ); GetMousePoint( x,y ); int siro; siro= GetColor(255,255,255); if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) == 0 ) { DrawPixel( x , y , siro ) ; error C2664: 'DxLib::DrawPixel' : 1 番目の引数を 'int *' から 'int' に変換できません。 どうすりゃいいの?

専門家に質問してみよう