ページ 1 / 1
マップエディタ
Posted: 2010年2月24日(水) 15:56
by ★
RPG○クールのような、
マップエディタを
VC++2008、windowsXP
で、作りたいと考えています。
画像の表示方法はわかっているのですが、
クリックしたところに応じて
画像を上書きする?
みたいなのは、できますか?
どうかよろしくお願いします。
Re:マップエディタ
Posted: 2010年2月24日(水) 16:09
by バグ
画像の表示方法は分かっているんですよね?
それならば、画像の表示場所をマウスカーソルの位置へ変更してやれば良いですよ。
マウスに関する事は下記URL参照で…
http://www.geocities.jp/ky_webid/win32c/007.html
Re:マップエディタ
Posted: 2010年2月24日(水) 16:34
by ★
わかりました。
早速やってみます
Re:マップエディタ
Posted: 2010年2月25日(木) 23:02
by ★
いきなり画像を表示しようとすると
なかなかうまくいきそうにないと思ったので、
とりあえず、ドット(点)を
クリックした位置に表示してみようとしました。
とりあえずこんな感じで作ってみたのですが・・・・・・
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int MouseX , MouseY ;
int Cr ;
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 )
{
return -1;
}
SetMouseDispFlag( TRUE ) ;
Cr = GetColor( 255 , 255 , 255 ) ;
while( CheckHitKeyAll() == 0 )
{
GetMousePoint( &MouseX , &MouseY ) ;
DrawPixel( MouseX , MouseY , Cr ) ;
if( ProcessMessage() == -1 )
{
break ;
}
}
DxLib_End() ;
return 0 ;
}
これでは、
『クリックした場所』
ではなく、
『マウスカーソルがある位置』
にドット(点)が表示されるようになってしまいます。
どうすればいいですか?
よろしくお願いします。
Re:マップエディタ
Posted: 2010年2月25日(木) 23:17
by kazuoni
if(左クリックがあったら)
DrawPixel();
とすればよいです。
Re:マップエディタ
Posted: 2010年2月25日(木) 23:20
by ★
すいません、
どこに入れればいいのでしょうか?
詳しく教えていただけませんか?
似たようなことは何度かやってみたのですが・・・・・・

Re:マップエディタ
Posted: 2010年2月26日(金) 04:39
by kazuoni
本家をご覧ください。
ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_input.html#R5N8
Re:マップエディタ
Posted: 2010年2月26日(金) 16:47
by ★
返事が遅れてすいません
時間がなかったもので・・・・・・
おかげでできました!
ありがとうございます。
今、別のウィンドウを開いて画像を表示しようと
思っているのですが、本体とは別のウィンドウを表示するには、
どうすればいいのでしょうか?
連続で質問してすいません。
どうかよろしくお願いいたします。
Re:マップエディタ
Posted: 2010年2月26日(金) 17:09
by kazuoni
本来、DXライブラリは同時に複数のウィンドウへの描画をサポートしていません。
マップエディタが本来の目的なので、
DXライブラリを使用しない方向に転換したほうが一番の解決策かと思います。
WINAPIで独立したウィンドウの生成はさほど難しくないので。
ただ、WNIAPIを使いこなすことが結構大変です。
まとめサイトは数多くあるので、気長にがんばってください。
Re:マップエディタ
Posted: 2010年2月26日(金) 17:18
by ★
Dxライブラリではできないのですか・・・・・・
これが一番簡単で
自由に作れると思って使っていたのですが・・・・・・
ありがとうございました。
がんばってみます。
ところで、
WINAPIのまとめサイトで
お勧めのサイトってありますか?
今検索していて、たくさんあったので・・・・・・
教えていただけるとありがたいです。
Re:マップエディタ
Posted: 2010年2月26日(金) 17:27
by バグ
別のWindowを開かないで済むように仕様変更をするという方法もありますね。
例えば、別のWindowに描画しようとしているものを、画面の端の方に描画してやるとか…
Re:マップエディタ
Posted: 2010年2月26日(金) 17:28
by kazuoni
自分は
WisdomSoft
http://wisdom.sakura.ne.jp/
のWin32 API入門を一通り見ました。
Re:マップエディタ
Posted: 2010年2月26日(金) 17:49
by ★
お二方、どうもありがとうございます。
バグさん
その方法はいいですね。
まったく思いつきませんでした。
ただ、それだとマップチップみたいなのを
表示する部分と作ったマップを表示する部分が違うので
処理を二つに分けてそれぞれ表示するようになると思うのですが、
どのようにしてはければいいのですか?
X座標の○~○の部分をクリックしたら・・・・・・
みたいな感じになるのですか?
お願いします。
kazuoniさん
ありがとうございます。
確かにここならわかりやすそうですね。
ですが、やはりバグさんの方法が
自分にはやりやすいように思います。
なので、すみませんがバグさんの方にお願いすることにします。
ここのサイトはいいと思いますので、
お気に入りに保存しておいて、
後で困ったとき、見るようにしたいと思います。
本当にありがとうございました。
Re:マップエディタ
Posted: 2010年2月26日(金) 18:05
by バグ
うーん、お願いしますと言われても…(苦笑)
>>ただ、それだとマップチップみたいなのを
>>表示する部分と作ったマップを表示する部分が違うので
>>処理を二つに分けてそれぞれ表示するようになると思うのですが、
>>どのようにしてはければいいのですか?
>>X座標の○~○の部分をクリックしたら・・・・・・
>>みたいな感じになるのですか?
そうですね、おおむねそんな感じだと思います。
クリックされた位置情報から何を行うべきなのかをこちらで判断してやるといった感じですね。
とりあえず、私が作るんだったら、エディットマップ描画部、マップチップ選択部、メニュー選択部みたいに細かく分けて考えますね。
エディットマップ描画部がクリックされたら現在選択されているマップチップを選択された場所へ置く。
マップチップ選択部がクリックされたら、選択されているマップチップを切り替える。
メニュー選択部がクリックされたら、選択された処理(セーブやロードとか?)を行う。
かなり大雑把ではありますけどね(^_^;)
Re:マップエディタ
Posted: 2010年2月26日(金) 18:56
by ★
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )
{
・・・・・・・・・・・・
}
こんな感じで
クリックした位置のX座標とY座標の位置を取得する方法はわかるのですが、
どうすればいいのですか?
if でいいのですか?

Re:マップエディタ
Posted: 2010年2月26日(金) 19:15
by バグ
それで良いかどうかは何をしたいかによって変わります。
まずは、自分のやりたい事を細かく分析して箇条書きにしてみてください。
そして、それを実現するにはどうしたらよいかを考えてください。
考えがまとまったら、プログラムを書いてください。
実行してみて意図しない動きをしたのならば、その原因を考えてみてください。
それでも駄目ならば、質問してください。何でもかんでも質問しないで、トライ&エラーを繰り返し経験しないと実力はつきませんよ。
Re:マップエディタ
Posted: 2010年2月26日(金) 19:46
by ★
確かにそうですね。
すいません。
がんばってみます。
Re:マップエディタ
Posted: 2010年2月27日(土) 09:23
by ★
バグさんのイメージが、
自分の考えていたイメージに似ていたので、
イメージ通りになるように考えてみました。
画面を分けるために、
if( ( MouseX ) >= 250 )
{
DrawPixel( MouseX , MouseY , Cr ) ;
}
こんな感じでうまくいったのですが、
マップチップの選択方法について、
悩んでいて・・・・・・
画像のような一まとめにしたマップチップの画像の一部を
マップチップ選択部をクリックし、
16×16位の小さな画像に分割・メモリに保存/上書きして、
マップ描画部で、クリックしたところに描画する。
LoadDivGraph を使って分割して読み込めば、
いけると思ったのですが、どうもうまくいきません。
というより、そのようなことは可能ですか?
Re:マップエディタ
Posted: 2010年2月27日(土) 10:34
by kazuoni
LoadDivGraphでできるはずです。
ファイルのパスをしっかり確認してください。
使い方は本家参照で。
http://homepage2.nifty.com/natupaji/DxL ... .html#R3N3
Re:マップエディタ
Posted: 2010年2月27日(土) 17:23
by ★
返事が遅くなってすいません
わかりました。
しっかり確認してみます。
Re:マップエディタ
Posted: 2010年2月28日(日) 19:12
by ★
kazuoniさんの言うとおり、
ファイルのパスがどこかおかしかったみたいで、
表示できるようになりました。
ですが、今表示しているのは、
[ 3 ]のようにあらかじめ設定してある
部分だけです。
なので、[ i ]のように、
あらかじめ変数を設定しておき、
クリックした位置によって、
変数"i"を変更できれば、うまくいくと思っています。
ですが、クリックした位置によって分割した画像を
変更する方法に困っています、
ifを使えば解決すると思ったのですが、
コードが長くなり、大変です。
どうしたらいいですか?
素直にifですべていくしかないのでしょうか?
Re:マップエディタ
Posted: 2010年2月28日(日) 20:34
by kazuoni
一番の質問が良く理解できません。
>クリックした位置によって分割した画像を変更する方法
int image[16];
DrawGraph(... , image,TRUE);
なんてやっているならば、iを変更するだけで画像は変わりますよね。
iの変更方法で詰まっているのかな?と感じます。
例えばクリックしたときマウスの座標が
x=100 y=100
のとき、iは何番になるんだと。
それはそれを判別するプログラム(関数)をゴリゴリ書くしかありません。
雰囲気書いてみました。動作確認していないので悪しからず。
Re:マップエディタ
Posted: 2010年2月28日(日) 20:48
by ★
すいません
書き方が悪かったです。
つまり、
マップチップ表示部の、
描画したいマップチップをクリック
例えば X=16~32、Y=0~16 画像の左上のほうの
「たたみ」の部分をクリックする。
↓
「たたみ」の部分の分割した番号〔この場合は1〕をiに保存
↓
DrawGraph( MouseX , MouseY , Mp_testchip[ i ] , TRUE ) ;
こういう感じでポインタの位置に表示できるように
用意しておき、クリックと同時に描画する。

Re:マップエディタ
Posted: 2010年2月28日(日) 21:09
by ru-pu
int MouseX,MouseY;
GetMousePoint(&MouseX,&MouseY);
i=MouseX/16+MouseY/16*8;
/*補足 i=MouseX/画像横幅+MouseY/画像縦幅*一行辺りの画像数; */
こういうことですか?
Re:マップエディタ
Posted: 2010年2月28日(日) 21:25
by ★
ru-pu さん
ありがとうございました!!
無事解決しました!!
Re:マップエディタ
Posted: 2010年2月28日(日) 22:41
by ★
もう、マップエディタのほうは
ほとんど完成しました。
ただ、今のままだとクリックした場所
すべてにマップチップが表示されてしまうことになるので、
きれいに描画するのが、難しくなってしまいます。
そこで、描画画面を
┼┼┼┼┼┼┼┼┼┼
┼┼┼┼╋╋┼┼┼┼
┼┼┼┼╋╋┼┼┼┼
┼┼┼┼┼┼┼┼┼┼
こんな感じのマス目のように考えて、
ここの
╋━━╋
┃● ┃
┃ ■┃
╋━━╋
●や■の部分など、
1つのマス目の中ならどこをクリックしても
マス目の部分にマップチップを描画するようにする
というようなことは出来ますか?
最初は、マップチップを選択する要領でいけると
思っていたのですが、
どうも出来そうになさそうなので、
質問させていただきます。
Re:マップエディタ
Posted: 2010年2月28日(日) 23:11
by ru-pu
int MouseX,MouseY;
int MapX,MapY;
GetMousePoint(&MouseX,&MouseY);
MapX=MouseX/16;
MapY=MouseY/16;
DrawGraph(MapX*16,MapY*16,Mp_testchip,TRUE);
/*補足 MapX=マス単位のX座標 MapY=マス単位のY座標*/
こういうことですか?
Re:マップエディタ
Posted: 2010年2月28日(日) 23:19
by kazuoni
> ただ、今のままだとクリックした場所
> すべてにマップチップが表示されてしまう
この状況が良くわかりませんが、雰囲気で考えると、
クリックした場所が左上頂点として描写されるってことでしょか?
とりあえず、自分ならば以下のように実装します。
マップチップ描写エリアを確保し、
そのデータ保存のためのメモリを配列で確保
↓
クリックした場所が描写エリアのどの場所に相当するのか
条件分岐で求める
↓
配列に画像データのハンドルを渡す
(画像データハンドルよりは画像データハンドルを格納しているデータ番号のほうがよいかも)
マップの描写は画像データハンドルの有無で分岐すればよいです。
#いずれか「ちゃんと考えたの?」なんて突込みが入りそうですが・・・
Re:マップエディタ
Posted: 2010年2月28日(日) 23:33
by ★
ru-puさん
すごいです!!
すごすぎです!!
Re:マップエディタ
Posted: 2010年2月28日(日) 23:43
by ★
消去や保存
描画したマップ(画面右側)だけを
消去・保存するには、どうすればいいですか?
消去・保存しようとすると、
画面すべてが実行されてしまいます。
Re:マップエディタ
Posted: 2010年3月01日(月) 23:48
by ru-pu
消去はDrawBoxで画面右側だけを黒か何かで塗りつぶせば良いと思います
保存はマウスがクリックされたときにチップ番号を二次元配列に記録すれば良いと思います
配列に記憶
~~~~~~~~~~~~~~~
int Map[256][256];
int MouseX,MouseY;
int MapX,MapY;
GetMousePoint(&MouseX,&MouseY);
MapX=MouseX/16;
MapY=MouseY/16;
DrawGraph(MapX*16,MapY*16,Mp_testchip,TRUE);
Map[MapY][MapX]=i;//←配列に記憶
~~~~~~~~~~~~~~~
ファイルに保存
~~~~~~~~~~~~~~~
FILE *fp;
fp=fopen("map.bin","wb");
fwrite(Map,256*256*sizeof(int),1,fp);
fclose(fp);
~~~~~~~~~~~~~~~
ファイルから読み込み
~~~~~~~~~~~~~~~
FILE *fp;
fp=fopen("map.bin","rb");
fread(Map,256*256*sizeof(int),1,fp);
fclose(fp);
~~~~~~~~~~~~~~~
読み込んだマップを描画
~~~~~~~~~~~~~~~
int i,j;
for(i=0;i<256;i++)
{
for(j=0;j<256;j++)
{
DrawGraph(j*16,i*16,Mp_testchip[Map[j]],TRUE);
}
}
~~~~~~~~~~~~~~~
画面が実行されるってなんのことを指しているのでしょうか?
if文について
Posted: 2010年3月19日(金) 18:05
by 琉金
if文で、○○を△△で割った結果が0から7(0または1、2、3、4、5、6、7)だったら処理みたいな感じに出来ますか?
それともこういう文の場合 forとか while を使うのでしょうか?
Re:if文について
Posted: 2010年3月19日(金) 18:10
by fatens
int q = ○○ / △△;
if (0 <= q && q <= 7) {
//処理
}
で、どうでしょう。