FC2ブログ
TOP > 一から始めるAI講座~第11回:スタックを避けてみよう~
 ← 安全牌は火山 | TOP | 生体研究所の死闘

リストマーク 一から始めるAI講座~第11回:スタックを避けてみよう~ 

【重要】新しいBlogに移転していますあるネットゲーマーの日常
前回は本格的な改造に入りましたが、いかがでしょうか?
まだそんなに難しくないと思います

本連載は、役に立つAIを作るというよりも、
自分で改造できるスキルを身につけてもらうことを目指しています
自分でどんどん改良して、良いホムライフを

  ~2章~ 攻撃パターンを改造する

 2-2:無茶しないで戻りなさい

前回、索敵範囲を指定することで、
無差別な攻撃を止めさせることができました

しかし、問題は全て解決したわけではありません
具体的にまだ残っている問題は以下の通りです

 ・ターゲットした敵が離れていくと、際限なく追いかける
 ・壁の向こうの敵をターゲットしたまま動かなくなる

実際、私も前回のAIを使い、下水で狩りをしていますが、
ノンアクティブのゴキが離れるとずんずん追いかけて離れてしまったり、
壁の反対側を狙ったまま、主人が離れても動かなかったりします

せっかく主人から離れすぎないようにしたのに、
これでは中途半端ですね
そこで今回は、追跡部分に手を入れてみましょう


function  OnCHASE_ST ()

  TraceAI ("OnCHASE_ST")

-- 敵を見失ったか?
  if (true == IsOutOfSight(MyID,MyEnemy)) then  -- ENEMY_OUTSIGHT_IN
    MyState = IDLE_ST
    MyEnemy = 0
    MyDestX, MyDestY = 0,0
    TraceAI ("CHASE_ST -> IDLE_ST : ENEMY_OUTSIGHT_IN")
    return
  end

-- 主人を見失ったか?
  local max_dis = 10 -- 主人との最大距離
  local dis = GetDistanceFromOwner(MyID)
  if (dis > max_dis) then  -- 主人から離れた?
    MoveToOwner (MyID) -- 主人のそばへ
    MyState = FOLLOW_ST -- 追尾状態へ
    MyEnemy = 0 -- 敵を初期化
    TraceAI ("CHASE_ST -> FOLLOW_ST : MASTER_OUTSIGHT_IN")
    return
  end


  if (true == IsInAttackSight(MyID,MyEnemy)) then -- ENEMY_INATTACKSIGHT_IN
    MyState = ATTACK_ST
    TraceAI ("CHASE_ST -> ATTACK_ST : ENEMY_INATTACKSIGHT_IN")
    return
  end

  local x, y = GetV (V_POSITION,MyEnemy)
  if (MyDestX ~= x or MyDestY ~= y) then      -- DESTCHANGED_IN
    MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
    Move (MyID,MyDestX,MyDestY)
    TraceAI ("CHASE_ST -> CHASE_ST : DESTCHANGED_IN")
    return
  end

end


手を加えたのは第2ブロックです
考え方は前回と同じで、追跡中に最大距離より離れたら、
追跡をやめて主人の元に戻るようにしています

これならば、離れていく敵をを追いかけても途中で戻りますし、
壁の向こうをターゲットしても、主人が離れればついてきます
前回同様、数値を変えれば活動範囲を変えられるのがポイントです


今回で二回目ですが、どうでしょうか?
あくまで元の骨組みを利用しつつ、
少し改良を加えるだけで、動きが良くなることがわかるでしょう

次回はある意味最大の問題、
「横殴り」に対処しようと思いますが・・・
ちょっと時間がかかるかも^^;
[2006.03.31(Fri) 19:10] ホムンクルスAI考察Trackback(0) | Comments(3)
↑TOPへ


COMMENT

by えび
この機能によって、画面外に抜けることが少なくなりました。ありがとうございます。しかしまだ画面外にでてしまうことがあります。そこで索敵範囲を8にしてみました。が、それでも画面外に抜けてしまいますね。
がなり運が悪いですorz

by パロット
>まだ画面外にでてしまうことがあります
追跡時だけでなく、あらゆる「状態」において、
主人との距離をチェックするようにすると対応できると思います

例えば、攻撃中の部分に同じコードを入れることで、
攻撃中であっても、主人が離れると帰還を優先するようになります

by えび
ご返事ありがとうございます。
なるほどです。またいろいろと追加してみます。

コメントを閉じる▲

 ← 安全牌は火山 | TOP | 生体研究所の死闘

COMMENT

この機能によって、画面外に抜けることが少なくなりました。ありがとうございます。しかしまだ画面外にでてしまうことがあります。そこで索敵範囲を8にしてみました。が、それでも画面外に抜けてしまいますね。
がなり運が悪いですorz
[ 2007.04.11(Wed) 04:16] えび #MZ.A.zTo | EDIT |

>まだ画面外にでてしまうことがあります
追跡時だけでなく、あらゆる「状態」において、
主人との距離をチェックするようにすると対応できると思います

例えば、攻撃中の部分に同じコードを入れることで、
攻撃中であっても、主人が離れると帰還を優先するようになります
[ 2007.04.11(Wed) 12:45] パロット #kJeoJ8/Y | EDIT |

ご返事ありがとうございます。
なるほどです。またいろいろと追加してみます。
[ 2007.04.11(Wed) 19:26] えび #EtrtsuLc | EDIT |

COMMENT POST











管理者にだけ表示

Trackback

この記事のURL:
http://parrot.blog21.fc2.com/tb.php/251-5f5124e8
 ← 安全牌は火山 | TOP | 生体研究所の死闘

プロフィール

Categories

Recent Entries

Recent Comments

Archives

AdSense

Calander

ブログ内検索

RO Search

Links

Copylights

Amazon