//マップエディタ #define DIRECTINPUT #define DIRECTMUSIC #define NEWCODE #define MAPSIZE 16 //マップのサイズ #define MAIN_SCREEN 1 #include"harulib.h" #include"el.h" char map_data[]="map.txt"; char map_initdata[]="map.ini"; //セル構造体 struct _cell{ int gra;//グラフィックデータ int event;//イベント BOOL move_flag;//通過可能フラグ }cell[]={ {0,0,TRUE}, {1,0,TRUE}, {2,0,TRUE}, {3,1,TRUE},//ハウスワープ {4,0,FALSE}, {5,0,TRUE}, {6,0,TRUE}, {7,4,TRUE},//洞窟 {8,0,FALSE}, {10,0,FALSE}, {9,0,TRUE}, {1,2,TRUE},//外ワープ {11,3,TRUE},//手紙 {12,0,FALSE},//空 {13,0,FALSE},//地下 {14,0,FALSE},//宝 {1,0,FALSE},//洞窟から外へ }; //マウス状態構造体 struct _mouse{ POINT p;//座標 int Left,Right;//左と右状態 }mouse; //マップ構造体 struct _map{ POINT p;//座標 DDOBJ Bmp;//ビットマップ画像 int parts;//選択パーツ }map; //マップデータ int maps[256][256]; int map_w,map_h;//マップ最大長 DDOBJ MouseBmp;//マウス画像 int mode=0;//モード(1=マップ,0=パーツ選択) void Init();//初期化 void KeyAction();//キー入力 void Paint();//描画 void EventPaint();//イベント描画 void LeftClick();//左クリック void Save();//セーブ void MainScreen(void); //初期化 void Init(){ int i,j,c; int data; char str1[10],str2[10]; i=j=0; //マップデータの読み込み FILE *fin; fin = fopen(map_initdata,"r"); if(fin == NULL)exit(1); fgets(Buffer,100,fin); /*ある文字を区切りにして二つに分割(aaa=bbb=ccc -> aaa bbb=ccc)*/ Split(',',Buffer,str1,str2); map_w=atoi(str1); map_h=atoi(str2); fclose(fin); fin = fopen(map_data,"r"); if(fin == NULL)exit(1); while((c =fgetc(fin)) != EOF){ data=0; if(c==',' || c=='{' || c=='}' || c==' ' || c=='\t')continue; else if(c=='0'){ c=fgetc(fin); if(c=='x'){ /*二文字の16進数を整数型に変換(0a->10,0A->10)*/ Buffer[0]=fgetc(fin); Buffer[1]=fgetc(fin); Buffer[2]='\0'; data=ChangeHex(Buffer); maps[i][j] = data; if(++j >= map_w){++i;j=0;} } } } fclose(fin); MouseBmp = elDraw::LoadObject("bmp\\hand.bmp"); map.Bmp = elDraw::LoadObject("bmp\\map.bmp"); mouse.p.x = VC_INITMX,mouse.p.y = VC_INITMY; map.p.x = map.p.y = 0; map.parts = 0; mouse.Left = mouse.Right = VC_FREE; } //描画 void Paint(){ int i,j,k,l; int mapdata; //パーツ表示 for(i=0;i<17;i++){ elDraw::Layer(i*MAPSIZE,128,map.Bmp,cell[i].gra*MAPSIZE,0,(cell[i].gra+1)*MAPSIZE,MAPSIZE); } //パーツ選択表示 elDraw::Layer(map.parts*MAPSIZE,128,MouseBmp,MAPSIZE*2,0,MAPSIZE*3,MAPSIZE); k=l=0; //マップ表示(ハーフサイズ) for(i=map.p.x;i=map_w || j>=map_h){ //領域外の場合は白く塗りつぶし elDraw::ColorFill(k*MAPSIZE,l*MAPSIZE, (k+1)*MAPSIZE,(l+1)*MAPSIZE,RGB16(255,255,255)); }else{ mapdata=cell[maps[j][i]].gra; elDraw::Layer(k*MAPSIZE,l*MAPSIZE,map.Bmp, MAPSIZE*mapdata,0,MAPSIZE*(mapdata+1),MAPSIZE); } if(++l >= 6){k++;l=0;} } } elDraw::Layer(mouse.p.x,mouse.p.y,MouseBmp,MAPSIZE,0,MAPSIZE*2,MAPSIZE);//カーソル表示 //文字列描画 SHOW2(0,150,"選択セル(%2d)-マップサイズ(%3d,%3d)",map.parts,map_w,map_h); SHOW2(0,170,"選択座標(%2d,%2d)-マップ座標(%3d,%3d)", map.p.x+MousePX/MAPSIZE,map.p.y+MousePY/MAPSIZE,map.p.x,map.p.y); SHOW(0,200,"操作:TAB・・・モード切替、S・・・セーブ"); } //キー入力 void KeyAction(){ while (elSystem::InputLoop()){ //状態保存 elSystem::GetInput(VC_LBUTTON,&mouse.Left); elSystem::GetInput(VC_RBUTTON,&mouse.Right); switch(elSystem::Get.Code){ case VC_TAB:if(elSystem::Get.Status){mode = 1-mode;}break; case VC_S:if(elSystem::Get.Status)Save();break; case VC_RIGHT: if(elSystem::Get.Status){ switch(mode){ case 0:if(map.parts<16)map.parts++;break; case 1:if(map.p.x<63)map.p.x++;break; } } break; case VC_LEFT: if(elSystem::Get.Status){ switch(mode){ case 0:if(map.parts>0)map.parts--;break; case 1:if(map.p.x>0)map.p.x--;break; } } break; case VC_UP: if(elSystem::Get.Status){ switch(mode){ case 0:if(map.parts>0)map.parts--;break; case 1:if(map.p.y>0)map.p.y--;break; } } break; case VC_DOWN: if(elSystem::Get.Status){ switch(mode){ case 0:if(map.parts>0)map.parts--;break; case 1:if(map.p.y<63)map.p.y++;break; } } break; } // 左ボタンの場合 if(mouse.Left == VC_PUSH){ if(mouse.p.x >= 0 && mouse.p.x <= MAPSIZE*8 && mouse.p.y >= 0 && mouse.p.y <= MAPSIZE*7){ maps[mouse.p.y/MAPSIZE+map.p.y][mouse.p.x/MAPSIZE+map.p.x] = map.parts; } } //マウスの座標 if(elSystem::Get.Code==VC_MX){mouse.p.x = elSystem::Get.Status;} if(elSystem::Get.Code==VC_MY){mouse.p.y = elSystem::Get.Status;} if(mouse.p.x >= 0 && mouse.p.x <= MAPSIZE*6 && mouse.p.y >= 0 && mouse.p.y <= MAPSIZE*7){ mouse.p.x -= mouse.p.x % MAPSIZE; mouse.p.y -= mouse.p.y % MAPSIZE; } } } //セーブ void Save(){ int i,j; FILE *fout; //マップセーブ i=j=0; fout = fopen(map_data,"w"); if(fout == NULL)exit(1); for(i=0;i