メむンコンテンツぞスキップ
芋出し画像

ずりあえずミニマップを䜜っおみる

    さお、前回はかなり取り乱しおいたしたがそれはおいおおいお。

    擬䌌3DダンゞョンRPGに必芁なもの、ず蚀えばやはりこれですね。 
    「ミニマップ」です。
    ミニマップずいうのは、近幎のRPGやロヌグラむクの右端ずかにあるあれです。さすがに初代りィザヌドリィのように方県玙にマップを描かないず攻略䞍可胜は鬌畜過ぎたすからね。

    今回は、たったこれだけの凊理を描きたす。Roomのグリッドを描くだけ。

    壁もプレむダヌもただ描画したせん。
    ですが、今埌なにかに利甚できないかず考えおいたす。本圓にシンプルすぎおこれたでずは比范にならないくらいみやすいず思いたす。

    	/// @description ミニマップの描画
    draw_set_color(c_silver);
    
    // 1チップあたりのサむズ(奜きな倀を入れおOK!)
    var unit   = global.tile_size;
    
    // 描画範囲
    var left   = 640; // å·Š
    var top    = 32; // 侊
    var right  = left + (room_width  * unit); // 右
    var bottom = top  + (room_height * unit); // 例
    
    // ①区切り線の描画.
    for(var i = 0; i < room_width+1; i++) {
      var x1 = left + (unit * i);
      var y1 = top;
      draw_line(x1, y1, x1, bottom);
    }
    for(var j = 0; j < room_height+1; j++) {
      var x1 = left;
      var y1 = top + (unit * j);
      draw_line(x1, y1, right, y1);
    }

    これはかなり簡易的なので、描画範囲をカメラのサむズにしたり、
    プレむダヌの蚘録をもずにしたりできたすね。
    なお、これを実行するずこのようになりたす。

    画像
    でかすぎwwwww🀣

     たあ、Roomサむズを芋おいるのでそりゃそうですよね。

     。
    えそれだけず思った皆様、本圓にそれだけ 

    ではありたせん

    さすがにスパゲッティの元すぎるので曞き換えたした。

    // ミニマップの描画
    draw_set_color(c_silver);
    
    // ★ミニマップ甚の1マスのサむズ※global.tile_sizeのたただず画面をはみ出すので、䟋えば「8」や「12」などの小さいドット数にしたす
    var unit = 12; 
    
    // 2Dマップの栌子サむズルヌムのピクセル幅ではなく、マスの数。tilemapから自動取埗したす
    var map_el_id = layer_tilemap_get_id("Tiles_tukou");
    var map_w_cells = tilemap_get_width(map_el_id);
    var map_h_cells = tilemap_get_height(map_el_id);
    
    // 描画範囲
    var left   = 640; // 巊マヌゞン
    var top    = 32;  // 䞊マヌゞン
    var right  = left + (map_w_cells * unit); // 右
    var bottom = top  + (map_h_cells * unit); // 例
    
    // ①区切り線グリッドの描画
    for(var i = 0; i < map_w_cells + 1; i++) {
      var x1 = left + (unit * i);
      draw_line(x1, top, x1, bottom);
    }
    for(var j = 0; j < map_h_cells + 1; j++) {
      var y1 = top + (unit * j);
      draw_line(left, y1, right, y1);
    }
    
    // ②チップの描画
    for(var j = 0; j < map_h_cells; j++) {
      for(var i = 0; i < map_w_cells; i++) {
        
        // 【修正】tilemap_get で盎接そのマス(i, j)にタむルがあるかチェック
        if (tilemap_get(map_el_id, i, j) > 0) {
            // 壁タむルがある堎所はシルバヌで塗り぀ぶす
            draw_set_color(c_silver);
            
            var x1 = left + (unit * i);
            var y1 = top  + (unit * j);
            var x2 = x1 + unit;
            var y2 = y1 + unit;
            draw_rectangle(x1, y1, x2, y2, false);
        }
      }
    }
    
    // ③【おたけ】プレむダヌの珟圚地もミニマップに赀点で出しおおきたす䞍芁なら消しおOKです
    var p_grid_x = Obj_player.x div global.tile_size;
    var p_grid_y = Obj_player.y div global.tile_size;
    draw_set_color(c_red);
    draw_rectangle(left + (p_grid_x * unit), top + (p_grid_y * unit), left + (p_grid_x * unit) + unit, top + (p_grid_y * unit) + unit, false);
    

    これによりミニマップが完成いたしたした(AIに盞談しただけ)

    画像
    䞀気にそれっぜくなった

    ただ、さすがに

    画像
    これはデカすぎだろおい

    っお案件だったので、修正したした。
    ぜひご芧ください

    // ミニマップの描画
    draw_set_color(c_silver);
    
    // ★ミニマップ甚の1マスのサむズ※global.tile_sizeのたただず画面をはみ出すので、䟋えば「8」や「12」などの小さいドット数にしたす
    var unit = 12; 
    
    // ★【新蚭定】ミニマップの「衚瀺枠」のマス数をここで固定したす䟋15マス×15マスの四角い枠にする
    var view_masu = 15; 
    
    // 2Dマップの栌子サむズルヌムのピクセル幅ではなく、マスの数。tilemapから自動取埗したす
    var map_el_id = layer_tilemap_get_id("Tiles_tukou");
    var map_w_cells = tilemap_get_width(map_el_id);
    var map_h_cells = tilemap_get_height(map_el_id);
    
    // 描画範囲
    var left   = 1100; // 巊マヌゞン
    var top    = 32;  // 䞊マヌゞン
    var right  = left + (view_masu * unit); // 右の限界線
    var bottom = top  + (view_masu * unit); // 䞋の限界線
    
    //プレむダヌの䜍眮をゲット
    var p_grid_x = Obj_player.x div global.tile_size;
    var p_grid_y = Obj_player.y div global.tile_size;
    
    // プレむダヌがこの「15マスの枠」のちょうど真ん䞭に来るように、読み蟌むマップの開始マスを逆算
    var start_x = p_grid_x - floor(view_masu / 2);
    var start_y = p_grid_y - floor(view_masu / 2);
    
    // ①区切り線グリッドの描画ルヌムサむズに関係なく、15マス分の枠だけを綺麗に匕く
    for(var i = 0; i < view_masu + 1; i++) {
      var x1 = left + (unit * i);
      draw_line(x1, top, x1, bottom); // 瞊線
    }
    for(var j = 0; j < view_masu + 1; j++) {
      var y1 = top + (unit * j);
      draw_line(left, y1, right, y1); // 暪線
    }
    
    // ②チップの描画15×15マスのルヌプに絞る
    for(var j = 0; j < view_masu; j++) {
      for(var i = 0; i < view_masu; i++) {
        
        // 珟圚の枠のコマi, jに察応する、実際のマップのマス目座暙check_x, check_y
        var check_x = start_x + i;
        var check_y = start_y + j;
        
        // マップの配列の範囲内0以䞊のずきだけタむルをチェック
        if (check_x >= 0 && check_y >= 0) {
            if (tilemap_get(map_el_id, check_x, check_y) > 0) {
                // 壁タむルがある堎所はシルバヌで塗り぀ぶす
                draw_set_color(c_silver);
                
                var x1 = left + (unit * i);
                var y1 = top  + (unit * j);
                var x2 = x1 + unit;
                var y2 = y1 + unit;
                draw_rectangle(x1, y1, x2, y2, false);
            }
    	}
      }
    }
    // ③プレむダヌの珟圚地固定枠のちょうど「真ん䞭のマス」に赀点を打぀
    var center_i = floor(view_masu / 2);
    var center_j = floor(view_masu / 2);
    
    draw_set_color(c_red);
    var px1 = left + (center_i * unit);
    var py1 = top  + (center_j * unit);
    draw_rectangle(px1, py1, px1 + unit, py1 + unit, false);
    


    たあ芁するにこれで䜕ができるのかず蚀いたすず、
    メガテン(女神転生シリヌズ)のようなミニマップができたす。

    画像
    他の黒い郚分には疑䌌dダンゞョンRPG特有の壁を描画予定🀣

    以䞊、久々にテンションが爆䞊がりする蚘事でした(今日は肌寒いからさすがに䜓が冷えおも心だけは枩めおおきたいものです)

    //远蚘向きの描画
    // ③プレむダヌの珟圚地固定枠のちょうど「真ん䞭のマス」に向き付きの矢印を描く
    var center_i = floor(view_masu / 2);
    var center_j = floor(view_masu / 2);
    
    // マスの䞭心座暙をきっちり蚈算
    var px = left + (center_i * unit) + (unit / 2);
    var py = top  + (center_j * unit) + (unit / 2);
    
    // 矢印のサむズマスの倧きさに合わせお調敎、unitが12なら4〜5くらいがベスト
    var arrow_size = 5; 
    
    draw_set_color(c_red); // プレむダヌは赀
    
    // プレむダヌの向きに合わせお、䞉角圢▲の3点の座暙を力ずくで蚈算しお描画
    switch (Obj_player.dir) {
        case 0: // 北䞊向き ▲
            draw_triangle(px, py - arrow_size, px - arrow_size, py + arrow_size, px + arrow_size, py + arrow_size, false);
            break;
            
        case 1: // 南䞋向き ▌
            draw_triangle(px, py + arrow_size, px - arrow_size, py - arrow_size, px + arrow_size, py - arrow_size, false);
            break;
            
        case 2: // 西巊向き ◀
            draw_triangle(px - arrow_size, py, px + arrow_size, py - arrow_size, px + arrow_size, py + arrow_size, false);
            break;
            
        case 3: // 東右向き ▶
            draw_triangle(px + arrow_size, py, px - arrow_size, py - arrow_size, px - arrow_size, py + arrow_size, false);
            break;
    }


     
     
    自䜜ゲヌムを補䜜しおおりたす(ちなみに孊生です) ※䌝説の冒険譚3の䜜者ですが、珟圚はりディタではなくGamemakerでゲヌムを䜜っおいたす。たた、粟神が匱いずきは匱いです。 これたで䜜った䜜品はコチラ▌ https://takata.booth.pm

    あなたぞのおすすめ