0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FEモドキ開発日記 2章 攻撃範囲表示ができた

0
Posted at

chrome_3IGiAFAemx.gif

攻撃範囲の探索と表示ができた。
次はキャラクターを置いて実際にキャラクターの性能を元に
移動とか攻撃範囲の表示ができるようにしていきた。

とりあえずキャラクターを仮置きしている、そんな現状です。

移動範囲の探索に比べると攻撃範囲の探索は比較的簡単だった。

最初に移動範囲を求めて
移動可能なマスから武器の射程(min~max)をマンハッタン距離で調べるというロジックで実装

移動可能マスと攻撃可能マスが被る場合は移動できる場所ってことを優先したいので
攻撃可能なマスとしては除外するようにしている。

コードを抜粋

/**
 * 攻撃範囲の座標リストを取得する(※移動マスと重複しない)
 * @param moveCoords 移動範囲(座標の配列)
 * @param attackRange 武器の射程
 * @param mapSize マップサイズ
 * @returns 
 */
export function findAttackRange
(
  moveCoords  : Point[],
  attackRange : Range,
  mapSize     : Size,
) : Point[] {

  // 攻撃範囲マスの座標(index)を格納用、重複を弾くため集合(Set)で定義する。
  const attackSet = new Set<number>();

  // 重複排除用に移動マスの座標(index)集合も用意しておく。
  const moveSet = new Set<number>();
  moveCoords.forEach(coord => moveSet.add(calc.toIndex(coord.x, coord.y, mapSize.w)));

  for (const pos of moveCoords) 
  {
    // 各移動可能マスを中心として、指定射程内のマスをループ
    for (let dx = -attackRange.max; dx <= attackRange.max; dx++) {
      for (let dy = -attackRange.max; dy <= attackRange.max; dy++) 
      {
        const dist = Math.abs(dx) + Math.abs(dy); // マンハッタン距離

        // 現在地が射程内 (range.min <= 距離 <= range.max)
        if (attackRange.min <= dist && dist <= attackRange.max) 
        {
          // ターゲット座標
          const tx = pos.x + dx;
          const ty = pos.y + dy;

          // マップ範囲外であればスキップ
          if(!calc.isBoundsCoord(tx, ty, mapSize)) {
            continue;
          }

          // 重複排除しやすくするために座標をindexに戻しておく
          const index = calc.toIndex(tx, ty, mapSize.w);

          // 移動マスと被る場合はスキップ
          if (moveSet.has(index)) {
             continue;
          }

          // 攻撃可能座標として登録
          attackSet.add(ty * mapSize.w + tx);
        }
      }
    }
  }

  // indexを{x, y}座標に戻して返却
  return Array.from(attackSet).map(index => {
    return calc.toCoord(index, mapSize.w);
  }); 
}

またフォルダ名で悩む

ロジックを入れておくフォルダをlogicと命名していたのだが
ロジックと聞くとなんか本当に関数だけというか
状態とかクラスとかそういう類のものが入っているのはなんか違うんじゃないのって

そんな気持ちになってきた

やはりdomainとかmodelとかそこらへんなのか...

いや、しかしこの単語はなんか嫌なのだ...
システムっぽさというか硬さというか
ゲームプログラムっぽいさが薄い、そんな感じがして
なんかこうもっとないかなぁと

一日頭を抱えていた

そしてふと、それってどんなカラクリで動いてるの?
っていう言葉あるよなって

カラクリか...」

俺の中で結構いいぞという感触がある言葉だった

ゲームの仕組み、どういうカラクリでうごいているのか

karakuri

どういうメカニズムでうごいているの?

メカニズムか

ちょっと硬さもあるが、個人的にはlogicよりも適している

いろいろ調べているとゲームメカニクスなる言葉があり

プレイヤーがゲーム内で実行できる行動や、その行動によってゲーム世界がどのように反応するかを定義する「遊びの仕組み・ルール」のことです。

となっていた、うーんこれだなぁと思い

logicというフォルダはmechanicsに変更されたのであった。

image.png

とまぁそんな感じでマップ上のデータ管理や探索のメカニクスは
src/mechanics/mapの中に置かれることになり
今のところありなんじゃないかなと思っている。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?