マップエディタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

マップエディタ

#1

投稿記事 by » 15年前

RPG○クールのような、
マップエディタを
VC++2008、windowsXP
で、作りたいと考えています。

画像の表示方法はわかっているのですが、
クリックしたところに応じて
画像を上書きする?
みたいなのは、できますか?

どうかよろしくお願いします。

バグ

Re:マップエディタ

#2

投稿記事 by バグ » 15年前

画像の表示方法は分かっているんですよね?
それならば、画像の表示場所をマウスカーソルの位置へ変更してやれば良いですよ。

マウスに関する事は下記URL参照で…

http://www.geocities.jp/ky_webid/win32c/007.html

Re:マップエディタ

#3

投稿記事 by » 15年前

わかりました。
早速やってみます

Re:マップエディタ

#4

投稿記事 by » 15年前

いきなり画像を表示しようとすると
なかなかうまくいきそうにないと思ったので、
とりあえず、ドット(点)を
クリックした位置に表示してみようとしました。
とりあえずこんな感じで作ってみたのですが・・・・・・
#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 ;
}

これでは、
『クリックした場所』
ではなく、
『マウスカーソルがある位置』
にドット(点)が表示されるようになってしまいます。

どうすればいいですか?
よろしくお願いします。

kazuoni

Re:マップエディタ

#5

投稿記事 by kazuoni » 15年前

if(左クリックがあったら)
DrawPixel();

とすればよいです。

Re:マップエディタ

#6

投稿記事 by » 15年前

すいません、
どこに入れればいいのでしょうか?
詳しく教えていただけませんか?
似たようなことは何度かやってみたのですが・・・・・・
画像

kazuoni

Re:マップエディタ

#7

投稿記事 by kazuoni » 15年前

本家をご覧ください。
ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_input.html#R5N8

Re:マップエディタ

#8

投稿記事 by » 15年前

返事が遅れてすいません
時間がなかったもので・・・・・・

おかげでできました!
ありがとうございます。


今、別のウィンドウを開いて画像を表示しようと
思っているのですが、本体とは別のウィンドウを表示するには、
どうすればいいのでしょうか?

連続で質問してすいません。
どうかよろしくお願いいたします。

kazuoni

Re:マップエディタ

#9

投稿記事 by kazuoni » 15年前

本来、DXライブラリは同時に複数のウィンドウへの描画をサポートしていません。

マップエディタが本来の目的なので、
DXライブラリを使用しない方向に転換したほうが一番の解決策かと思います。
WINAPIで独立したウィンドウの生成はさほど難しくないので。
ただ、WNIAPIを使いこなすことが結構大変です。
まとめサイトは数多くあるので、気長にがんばってください。

Re:マップエディタ

#10

投稿記事 by » 15年前

Dxライブラリではできないのですか・・・・・・
これが一番簡単で
自由に作れると思って使っていたのですが・・・・・・

ありがとうございました。
がんばってみます。
ところで、
WINAPIのまとめサイトで
お勧めのサイトってありますか?
今検索していて、たくさんあったので・・・・・・
教えていただけるとありがたいです。

バグ

Re:マップエディタ

#11

投稿記事 by バグ » 15年前

別のWindowを開かないで済むように仕様変更をするという方法もありますね。
例えば、別のWindowに描画しようとしているものを、画面の端の方に描画してやるとか…

kazuoni

Re:マップエディタ

#12

投稿記事 by kazuoni » 15年前

自分は

WisdomSoft
http://wisdom.sakura.ne.jp/

のWin32 API入門を一通り見ました。

Re:マップエディタ

#13

投稿記事 by » 15年前

お二方、どうもありがとうございます。

 バグさん
その方法はいいですね。
まったく思いつきませんでした。
ただ、それだとマップチップみたいなのを
表示する部分と作ったマップを表示する部分が違うので
処理を二つに分けてそれぞれ表示するようになると思うのですが、
どのようにしてはければいいのですか?
X座標の○~○の部分をクリックしたら・・・・・・
みたいな感じになるのですか?
お願いします。

 kazuoniさん
ありがとうございます。
確かにここならわかりやすそうですね。
ですが、やはりバグさんの方法が
自分にはやりやすいように思います。
なので、すみませんがバグさんの方にお願いすることにします。
ここのサイトはいいと思いますので、
お気に入りに保存しておいて、
後で困ったとき、見るようにしたいと思います。
本当にありがとうございました。

バグ

Re:マップエディタ

#14

投稿記事 by バグ » 15年前

うーん、お願いしますと言われても…(苦笑)

>>ただ、それだとマップチップみたいなのを
>>表示する部分と作ったマップを表示する部分が違うので
>>処理を二つに分けてそれぞれ表示するようになると思うのですが、
>>どのようにしてはければいいのですか?
>>X座標の○~○の部分をクリックしたら・・・・・・
>>みたいな感じになるのですか?


そうですね、おおむねそんな感じだと思います。
クリックされた位置情報から何を行うべきなのかをこちらで判断してやるといった感じですね。


とりあえず、私が作るんだったら、エディットマップ描画部、マップチップ選択部、メニュー選択部みたいに細かく分けて考えますね。


エディットマップ描画部がクリックされたら現在選択されているマップチップを選択された場所へ置く。

マップチップ選択部がクリックされたら、選択されているマップチップを切り替える。

メニュー選択部がクリックされたら、選択された処理(セーブやロードとか?)を行う。


かなり大雑把ではありますけどね(^_^;)

Re:マップエディタ

#15

投稿記事 by » 15年前

if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )
{
・・・・・・・・・・・・
}
こんな感じで
クリックした位置のX座標とY座標の位置を取得する方法はわかるのですが、
どうすればいいのですか?
if でいいのですか? 画像

バグ

Re:マップエディタ

#16

投稿記事 by バグ » 15年前

それで良いかどうかは何をしたいかによって変わります。
まずは、自分のやりたい事を細かく分析して箇条書きにしてみてください。
そして、それを実現するにはどうしたらよいかを考えてください。
考えがまとまったら、プログラムを書いてください。
実行してみて意図しない動きをしたのならば、その原因を考えてみてください。
それでも駄目ならば、質問してください。何でもかんでも質問しないで、トライ&エラーを繰り返し経験しないと実力はつきませんよ。

Re:マップエディタ

#17

投稿記事 by » 15年前

確かにそうですね。
すいません。
がんばってみます。

Re:マップエディタ

#18

投稿記事 by » 15年前

バグさんのイメージが、
自分の考えていたイメージに似ていたので、
イメージ通りになるように考えてみました。

画面を分けるために、

if( ( MouseX ) >= 250 )
{
DrawPixel( MouseX , MouseY , Cr ) ;
}

こんな感じでうまくいったのですが、

マップチップの選択方法について、
悩んでいて・・・・・・
画像のような一まとめにしたマップチップの画像の一部を
マップチップ選択部をクリックし、
16×16位の小さな画像に分割・メモリに保存/上書きして、
マップ描画部で、クリックしたところに描画する。

LoadDivGraph を使って分割して読み込めば、
いけると思ったのですが、どうもうまくいきません。
というより、そのようなことは可能ですか?

kazuoni

Re:マップエディタ

#19

投稿記事 by kazuoni » 15年前

LoadDivGraphでできるはずです。
ファイルのパスをしっかり確認してください。
使い方は本家参照で。
http://homepage2.nifty.com/natupaji/DxL ... .html#R3N3

Re:マップエディタ

#20

投稿記事 by » 15年前

返事が遅くなってすいません

わかりました。
しっかり確認してみます。

Re:マップエディタ

#21

投稿記事 by » 15年前

kazuoniさんの言うとおり、
ファイルのパスがどこかおかしかったみたいで、
表示できるようになりました。
ですが、今表示しているのは、
[ 3 ]のようにあらかじめ設定してある
部分だけです。
なので、[ i ]のように、
あらかじめ変数を設定しておき、
クリックした位置によって、
変数"i"を変更できれば、うまくいくと思っています。

ですが、クリックした位置によって分割した画像を
変更する方法に困っています、
ifを使えば解決すると思ったのですが、
コードが長くなり、大変です。

どうしたらいいですか?
素直にifですべていくしかないのでしょうか?

kazuoni

Re:マップエディタ

#22

投稿記事 by kazuoni » 15年前

一番の質問が良く理解できません。

>クリックした位置によって分割した画像を変更する方法

int image[16];
DrawGraph(... , image,TRUE);

なんてやっているならば、iを変更するだけで画像は変わりますよね。
iの変更方法で詰まっているのかな?と感じます。
例えばクリックしたときマウスの座標が
x=100 y=100
のとき、iは何番になるんだと。
それはそれを判別するプログラム(関数)をゴリゴリ書くしかありません。

雰囲気書いてみました。動作確認していないので悪しからず。

Re:マップエディタ

#23

投稿記事 by » 15年前

すいません
書き方が悪かったです。
つまり、

マップチップ表示部の、
描画したいマップチップをクリック

例えば X=16~32、Y=0~16 画像の左上のほうの
「たたみ」の部分をクリックする。
   ↓
「たたみ」の部分の分割した番号〔この場合は1〕をiに保存
   ↓
DrawGraph( MouseX , MouseY , Mp_testchip[ i ] , TRUE ) ;
こういう感じでポインタの位置に表示できるように
用意しておき、クリックと同時に描画する。

画像

ru-pu

Re:マップエディタ

#24

投稿記事 by ru-pu » 15年前

int MouseX,MouseY;
GetMousePoint(&MouseX,&MouseY);
i=MouseX/16+MouseY/16*8;

/*補足 i=MouseX/画像横幅+MouseY/画像縦幅*一行辺りの画像数; */

こういうことですか?

Re:マップエディタ

#25

投稿記事 by » 15年前

ru-pu さん
ありがとうございました!!
無事解決しました!!

Re:マップエディタ

#26

投稿記事 by » 15年前

もう、マップエディタのほうは
ほとんど完成しました。
ただ、今のままだとクリックした場所
すべてにマップチップが表示されてしまうことになるので、
きれいに描画するのが、難しくなってしまいます。

そこで、描画画面を
┼┼┼┼┼┼┼┼┼┼
┼┼┼┼╋╋┼┼┼┼
┼┼┼┼╋╋┼┼┼┼
┼┼┼┼┼┼┼┼┼┼
こんな感じのマス目のように考えて、
ここの
╋━━╋
┃● ┃
┃ ■┃
╋━━╋
●や■の部分など、
1つのマス目の中ならどこをクリックしても
マス目の部分にマップチップを描画するようにする

というようなことは出来ますか?

最初は、マップチップを選択する要領でいけると
思っていたのですが、
どうも出来そうになさそうなので、
質問させていただきます。

ru-pu

Re:マップエディタ

#27

投稿記事 by ru-pu » 15年前

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座標*/

こういうことですか?

kazuoni

Re:マップエディタ

#28

投稿記事 by kazuoni » 15年前

> ただ、今のままだとクリックした場所
> すべてにマップチップが表示されてしまう

この状況が良くわかりませんが、雰囲気で考えると、
クリックした場所が左上頂点として描写されるってことでしょか?

とりあえず、自分ならば以下のように実装します。


マップチップ描写エリアを確保し、
そのデータ保存のためのメモリを配列で確保

クリックした場所が描写エリアのどの場所に相当するのか
条件分岐で求める

配列に画像データのハンドルを渡す
(画像データハンドルよりは画像データハンドルを格納しているデータ番号のほうがよいかも)


マップの描写は画像データハンドルの有無で分岐すればよいです。


#いずれか「ちゃんと考えたの?」なんて突込みが入りそうですが・・・

Re:マップエディタ

#29

投稿記事 by » 15年前

ru-puさん
すごいです!!
すごすぎです!!

Re:マップエディタ

#30

投稿記事 by » 15年前

消去や保存

描画したマップ(画面右側)だけを
消去・保存するには、どうすればいいですか?

消去・保存しようとすると、
画面すべてが実行されてしまいます。

ru-pu

Re:マップエディタ

#31

投稿記事 by ru-pu » 15年前

消去は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文について

#32

投稿記事 by 琉金 » 15年前

if文で、○○を△△で割った結果が0から7(0または1、2、3、4、5、6、7)だったら処理みたいな感じに出来ますか?
それともこういう文の場合 forとか while を使うのでしょうか?

fatens

Re:if文について

#33

投稿記事 by fatens » 15年前

int q = ○○ / △△;
if (0 <= q && q <= 7) {
//処理
}
で、どうでしょう。

閉鎖

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