ページ 11

マップエディタ作ってみました

Posted: 2012年10月23日(火) 18:56
by イマダニ
先月、こんな質問をした者です。

アクションゲームにおける敵キャラとマップの管理に
http://dixq.net/forum/viewtopic.php?f=3&t=11517

ドット絵などの素材作りなどいろいろやってたせいで
beatleさんとsoftyaさんのアドバイスの実践、それに対する返信がかなり遅れてしまいましたが……
beatleさん、softyaさん、本当にすみません!
ひとまず自分なりにマップエディタを作ってみました。
これがそのソースコードになります。

コード:

#include "DxLib.h"
#include <stdio.h>

#define CHIP_SIZE   32
#define MAP_WIDTH   20
#define MAP_HEIGHT  15

//マップの二次元配列
int MapData[MAP_HEIGHT][MAP_WIDTH]={
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },

	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
		
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 },
	{ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 }
};

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	SetMainWindowText("マップエディタ");ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

	//チップ画像格納変数、マウスポインタの座標変数、マウスとホイール用の変数
	int block_img,x,y,Mouse,Wheel;
	//クリックした座標の記録用変数
	int imgx=0;
	int imgy=0;
	//クリックされた配列を記録する変数
	int hnum=0;
	int wnum=0;
	FILE *fp;
	fp=fopen("マップデータ.dat","wb");//バイナリファイルを開く

	//ブロック画像読み込み
	block_img=LoadGraph("img/block.bmp");

	while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0)
	{
		Mouse=GetMouseInput();
		Wheel=GetMouseWheelRotVol();
		GetMousePoint(&x,&y);
		
		if(Mouse & MOUSE_INPUT_LEFT){//左クリックが押されたら
			//押された座標を記録
			imgx=x;imgy=y;
			//それをチップサイズで割る事で押された配列を確認
			wnum=imgx/CHIP_SIZE;hnum=imgy/CHIP_SIZE;

			//そこを1に変える
			MapData[hnum][wnum]=1;
		}
		if(Mouse & MOUSE_INPUT_RIGHT){//右クリックが押されたら
			//押された座標を記録
			imgx=x;imgy=y;
			//それをチップサイズで割る事で押された配列を確認
			wnum=imgx/CHIP_SIZE;hnum=imgy/CHIP_SIZE;
			
			//そこを0に変える
			MapData[hnum][wnum]=0;
		}

		//マップチップ描画
		for(int i=0;i<MAP_HEIGHT;i++){
			for(int j=0;j<MAP_WIDTH;j++){
				//配列要素が1である所に画像を表示する。
				if(MapData[i][j]==1){
					DrawGraph(j*CHIP_SIZE,i*CHIP_SIZE,block_img,TRUE);
				}
			}
		}
	}

	if(fp==NULL){//エラーが起きたらNULLを返す
		return 0;
	}
	fwrite(MapData,sizeof(MapData),1,fp);//MapDataの中身を出力
	fclose(fp);//ファイルを閉じる

	DxLib_End();
	return 0;
}
こんな感じでいいのでしょうか?
platinumなどと比べるとまだまだですがとりあえずのベースはできた?と思います。
が、やはり不安なので、変なところが無いか見てください。m(_ _)m
ここはこうしたほうがいいとか、これはまずいんじゃないの?とか
そういうのがあったら教えてください。お願いします。

Re: マップエディタ作ってみました

Posted: 2012年10月23日(火) 19:12
by softya(ソフト屋)
ファイル名を選べて、何時でもセーブ/ロードできたほうが良い気がするのと、マップのサイズを決める機能、0/1だけじゃなくマップチップを選ぶ機能や大きなマップをスクロールする機能などは必要になるんじゃないでしょうか。それとセーブデータにマップサイズを含んだほうが汎用的になります。
まぁ、必要としない機能は切り捨てて構わないので必要に応じて拡張してください。

あとアクションとのことなので、背景のアニメーションやら、仕掛けやトラップの配置やら、ボス起動やマップ移動イベントの設定とか欲しくなってくるんじゃないかと思うんですけどね。凝りだすとキリがないです。

Re: マップエディタ作ってみました

Posted: 2012年11月03日(土) 19:17
by イマダニ
返信ありがとうございます。
機能ちょっとずつ足していきます。
でも、そろそろWIN32APIを勉強したほうがいいですかね?
こういったツールにそれなりの機能つけるにはやっぱりライブラリだけでは限界がある気がします。
softyaさんが指摘してくださった追加したほうがいい機能はライブラリだけでも行けそうですけど、
スクロールバーとかメニューバーとかつけて、
普通のアプリのようにするならばやっぱりwindowsの勉強をしなきゃいけないのではないだろうか?
と感じています。メニューを押して上書き保存を選択とか
ひとまずここを見ながらちまちまとやっています。といってもまだウィンドウを作るしかやってませんが……

標準 Windows API
http://wisdom.sakura.ne.jp/system/winap ... index.html

Re: マップエディタ作ってみました

Posted: 2012年11月03日(土) 20:12
by nil
DXライブラリでも一応メニューをつけたり
(少し苦労をすれば)自作でスクロールバーをつけたりはできるのですが……

GUIアプリを作るならC#がお勧めです。
オブジェクト指向言語なので知識がないと少し戸惑うかもしれませんが…………

情報も多く、VC#ならインテリセンスも有能なので結構さくさくと作れますよ

Re: マップエディタ作ってみました

Posted: 2012年11月03日(土) 20:34
by softya(ソフト屋)
涼雅さんの言われる通りDXライブラリではSetupToolBar()でツールバーやSetUseMenuFlag()でメニューバーの処理が可能であり、スクロールは自前でやる必要があるでしょうね。

>普通のアプリのようにするならばやっぱりwindowsの勉強をしなきゃいけないのではないだろうか?

本格的にWindowsのパーツを使いたいならC#に移ったほうが良いでしょう。
基本的にDXライブラリ(DirectX)の描画とWindowsのパーツの描画は別系統なので相性が悪いです。

Re: マップエディタ作ってみました

Posted: 2012年11月03日(土) 23:20
by イマダニ
お二方、返信ありがとうございます。

>DXライブラリでも一応メニューをつけたり
(少し苦労をすれば)自作でスクロールバーをつけたりはできるのですが……

>涼雅さんの言われる通りDXライブラリではSetupToolBar()でツールバーやSetUseMenuFlag()でメニューバーの処理が可能であり、スクロールは自前でやる必要があるでしょうね。

そうなんですか!勉強になります
ゲームにセーブ機能つけるついでいやってみます

>GUIアプリを作るならC#がお勧めです。
オブジェクト指向言語なので知識がないと少し戸惑うかもしれませんが…………

>本格的にWindowsのパーツを使いたいならC#に移ったほうが良いでしょう。

連載:C#入門
http://www.atmarkit.co.jp/fdotnet/cshar ... index.html

さっそくここのサイトを見ながら、visual C#をインストールして、hello world!をやってみました!
涼雅さんの言う通り、Cとは少し勝手が違って戸惑いましたが、がんばってみます!
ここ以外におすすめの解説サイト、書籍ってありますか?

Re: マップエディタ作ってみました

Posted: 2012年11月03日(土) 23:31
by nil
有名ドコロの猫でもわかる~のC#編とかは結構役立ちますよ

Re: マップエディタ作ってみました

Posted: 2012年11月03日(土) 23:32
by softya(ソフト屋)
C#をC言語と同じだと思うとハマるでお断りしておきます。
C#はオブジェクト指向言語ですので、C++と同様にクラスの理解が不可欠です。
あとGUI部分の本とC#自体の文法の本は別に必要です。

オススメはありますが、はたしてちょっとやりたいという意向に添えるものではないかも知れません。
「独習C# 第3版 - Herbert Schildt/矢嶋聡/翔泳社:SEShop.com」
http://www.seshop.com/product/detail/12768/
これはC#の文法だけでコンソールアプリで説明してあります。

ざっとした入門には次のような本があります。
「Amazon.co.jp: ひと目でわかるMicrosoft Visual C# 2010アプリケーション開発入門 (MSDNプログラミングシリーズ): 伊藤 達也, チーム・エムツー: 本」

Re: マップエディタ作ってみました

Posted: 2012年11月03日(土) 23:59
by 翡翠
私もアクションゲーム用のマップエディタをC#で作っている最中のものです

私の場合は「やさしいC#」という本で1からC#を学びました
あまり複雑なことは解説されていませんが、C#でどういうことができるのか、基本を押さえることができます
基本がわかれば、platinumなどのマップエディタを参考に作っていけると思います
複数のフォームの操作など、本に載っていない複雑な処理は検索すれば大体は出てきますので

Re: マップエディタ作ってみました

Posted: 2012年11月04日(日) 17:44
by イマダニ
こんなに早くお答えいただくとは、感謝感謝です。
本って高いからこうおすすめ教えていただくと本当に助かります。
地雷踏むと最悪ですからね……

さっそく、softyaさんおすすめの独習C# 第三版と、ひと目でわかるMicrosoft Visual C# 2010アプリケーション開発入門を
amazonで注文してきました。早く来ないかな。

翡翠さんおすすめのやさしいC#は図書館にあったので予約しました。明日あたり手に入ると思います。
やさしいシリーズいいですよね。初心者の時、大変お世話になりました。
僕以外にもマップエディタ作ってる人がいるっていうのはなんというかとても励みになります。
お互い頑張りましょうね!

いい機会ですし、涼雅さんおすすめの「猫でも」とこれらを併用しつつ、C#も使えるぜって言えるくらいまで勉強しちゃおうと思います。
みなさんアドバイス本当にありがとうございました!