SRC質問掲示板Mk2
(現在 過去ログ44 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■8383 / inTopicNo.1)  障害物を作成できませんか?
  
□投稿者/ いからす -(2003/05/23(Fri) 06:49:43)
    戦闘において、高層ビルなどを障害物として、
    ・ユニットの進入を不可にする
    ・射撃系武器の射程を阻む
    などの効果を持たせることはできないでしょうか?
引用返信/返信 削除キー/
■8384 / inTopicNo.2)  Re[1]: 障害物を作成できませんか?
□投稿者/ 幻魔の公子 -(2003/05/23(Fri) 11:08:37)
     幻魔の公子です。


     前のほうについては二つほどやり方があります。
     まず、高層ビルを壁にしてしまう方法。壁は通り抜けられませんので、障害物になります。
     ただし、配布されているファイルの名称を変更してシナリオに添付することは汎用データの許可項目になかった気がしますので、汎用データ管理人(及び、返答によってはアイコン制作者)に確認するか、でなければ自前で用意するかすることにんるでしょう。

     もう一つは、開発版を利用して、すべてのユニットに進入不可=高層ビルを付加してしまうことです。
     こちらの問題は、開発版を利用しなければならないことと、それから空中・地中移動ユニットの移動は制限できないことです。


     あとのほうは無理です。
     攻撃者と防御者の位置から斜線を算出して、高層ビルが間にあった場合は攻撃をキャンセルするという方法はあるのですが、お勧めできません。
     ……というか、私ならそれを作ることを考えただけで嫌になりますね。


     それでは。

引用返信/返信 削除キー/
■8396 / inTopicNo.3)  後者の方を作ってみました
□投稿者/ ANSI -(2003/05/24(Sat) 00:46:11)
    一応動作確認済みです。攻撃イベントは適当にカスタマイズしてください。


    *攻撃 全 全:
    Local xy_list # ユニット間を通る直線のXY座標(リスト)

    If Party( 対象ユニットID ) = "味方" Then
    xy_list = GetXYList( X(対象ユニットID), Y(対象ユニットID), X(相手ユニットID), Y(相手ユニットID) )

    If IsObstacle( xy_list, "高層ビル" ) = 1 Then # 地形が指定された障害物かどうかを判定
    Talk システム
    障害物が前方にあるため、攻撃できません。
    End

    Mind Unit( 対象ユニットID ) 覚醒
    Cancel
    EndIf
    EndIf
    Exit



    #
    # 障害物の判定
    #
    IsObstacle:
    Local xy_list obstacle_name xx yy i

    xy_list = Args(1) # ユニット間を通る直線のXY座標(リスト)
    obstacle_name = Args(2) # 指定された障害物

    For i = 1 To LLength( xy_list )
    xx = LIndex( LIndex(xy_list, i), 1 )
    yy = LIndex( LIndex(xy_list, i), 2 )

    If Info( マップ, xx, yy, 地形名 ) = obstacle_name Then
    Return 1
    EndIf
    Next

    Return 0



    #
    # ユニット間を通る直線のXY座標をリストで返す
    #
    GetXYList:
    Local x1 y1 x2 y2
    Local temp_x temp_y xy_list
    Local e dx dy sx sy i

    x1 = Args(1) # ユニット1のX座標
    y1 = Args(2) # ユニット2のY座標
    x2 = Args(3) # ユニット1のX座標
    y2 = Args(4) # ユニット2のY座標

    If x2 > x1 Then
    sx = 1
    dx = x2 - x1
    Else
    sx = -1
    dx = x1 - x2
    EndIf

    If y2 > y1 Then
    sy = 1
    dy = y2 - y1
    Else
    sy = -1
    dy = y1 - y2
    EndIf

    i = 0
    xy_list = ""
    temp_x = x1
    temp_y = y1

    # 傾きが1以下の場合
    If dx >= dy Then
    e = -1 * dx
    Do While ( i <= dx )
    xy_list = List( xy_list, "($(temp_x) $(temp_y))" )
    temp_x = temp_x + sx
    e = e + 2 * dy

    If e >= 0 Then
    temp_y = temp_y + sy
    e = e - 2 * dx
    EndIf

    Incr i
    Loop
    # 傾きが1より大きい場合
    Else
    e = -1 * dy
    Do While ( i <= dy )
    xy_list = List( xy_list, "($(temp_x) $(temp_y))" )
    temp_y = temp_y + sy
    e = e + 2 * dx

    If e >= 0 Then
    temp_x = temp_x + sx
    e = e - 2 * dy
    EndIf

    Incr i
    Loop
    EndIf

    Return xy_list
引用返信/返信 削除キー/
■8397 / inTopicNo.4)  追記
□投稿者/ ANSI -(2003/05/24(Sat) 00:52:22)
    インデントはタブで付けてるので無視されちゃってますが、
    その辺も適当に直して使ってください。こんな感じので良ければですけど。
    当然ですが、改変・転載等はフリーです。
引用返信/返信 削除キー/
■8398 / inTopicNo.5)  Re[3]: 追記
□投稿者/ いからす -(2003/05/24(Sat) 02:20:35)
    >幻魔の公子さん
    ご回答、ありがとうございました。
    ユニットの移動制限について、解決いたしました。

    >ANSIさん
    ご回答ありがとうございます。
    早速、こちらでも動作確認させていただきましたところ、エラーが
    発生しましたので、
    Mind Unit( 対象ユニットID ) 覚醒

    Mind UnitID( 対象ユニットID ) 覚醒
    と変更することで、正常に動作しました。

    最初のIf文を削除して、敵からの攻撃にも動作させてみたところ、
    攻撃が不能であることを認識してくれないので、何度も攻撃を選択し、
    戦闘が先に進まなくなってしまいました。
    やはり、敵の攻撃についても適用するのは難しいようですね・・・。

    大変参考になりました。ありがとうございました。
    もし、敵からの攻撃についても適用できる案がありましたら、是非
    よろしくお願いします。
解決済み!
引用返信/返信 削除キー/
■8399 / inTopicNo.6)  試しに・・・
□投稿者/ いからす -(2003/05/24(Sat) 04:04:56)
    敵の攻撃時を想定して作ってみました。
    どうもうまく動作しないのですが、
    何かお気づきの点があればアドバイスを
    いただけないでしょうか?


    攻撃 敵 味方:
    Local xy_list

    xy_list = GetXYList( X(対象ユニットID), Y(対象ユニットID), X(相手ユニットID), Y(相手ユニットID) )

    If IsObstacle( xy_list, "高層ビル" ) = 1 Then
    SetAbility 相手ユニット ステルス 1
    Mind UnitID( 対象ユニットID ) 覚醒
    Cancel
    Set 相手 相手ユニットID
    Set 対象 対象ユニットID
    EndIf
    Exit

    行動終了 UnitID( 対象 ):
    ClearAbility UnitID( 相手 ) ステルス
    Unset 相手
    Unset 対象
    Exit

    #
    # 障害物の判定
    #

    (以下、ANSIさんと同様)
引用返信/返信 削除キー/
■8401 / inTopicNo.7)  Re[5]: 試しに・・・
□投稿者/ 樹招 -(2003/05/24(Sat) 13:02:26)
    樹招と申します。
    説明するだけじゃわかり難そうなので、以下改変させて頂いたものを載せます。

    *攻撃 全 全:
    Local xy_list
    xy_list = GetXYList(X(対象ユニットID),Y(対象ユニットID),X(相手ユニットID),Y(相手ユニットID))
    Switch Party(対象ユニットID)
    Case "味方"

    If IsObstacle(xy_list,"高層ビル") = 1 Then
    Talk システム
    障害物が前方にあるため、攻撃できません。
    End
    Mind 対象ユニットID 覚醒
    Cancel
    EndIf

    Case "敵" "中立" "NPC"

    If IsObstacle(xy_list,"高層ビル") = 1 Then
    Set 対象 対象ユニットID
    Set 相手 相手ユニットID
    Mind 対象 覚醒
    Mind 相手 隠れ身
    Cancel
    EndIf

    EndSw
    Exit

    *行動終了 全:
    If 対象 = 対象ユニットID And Action(対象) = 0 Then
    ClearMind 相手 隠れ身
    UnSet 対象
    UnSet 相手
    EndIf
    Exit

    (以下、ANSIさんと同様)

    まず UnitID(対象ユニットID) は直接 対象ユニットID と指定しても同じです。
    SetStatusにはステルスという状態はありませんし、
    ユニットを無視させるような状態もなかったと思うので、SPの隠れ身を使用します。
    これだけではまだ攻撃を繰り返す状態になってしまうので、
    行動終了時に攻撃側のユニットの行動回数をAction関数で調べ、
    行動回数が0(完全に行動終了)の場合にのみ隠れ身を解除するようにします。

    あとはNPCや中立にも適用する為に、味方の方と統合すると上記のようになります。
    NPCと中立に関しては動作確認していませんが、たぶん大丈夫だと思います。

    それでは・・・
引用返信/返信 削除キー/
■8415 / inTopicNo.8)  Re[6]: 試しに・・・
□投稿者/ いからす -(2003/05/25(Sun) 08:25:42)
    >樹招さん
    無事、解決しました。ありがとうございました。
解決済み!
引用返信/返信 削除キー/
■8429 / inTopicNo.9)  少しだけ手直ししました
□投稿者/ ANSI -(2003/05/25(Sun) 22:54:58)
    後から見返してみたら、なんか無駄な記述をしていたので修正しました。
    解決済みとのことですし、動作そのものは同じなのであまり意味はないのですが。
    変更点は、二つあったサブルーチンを一つにまとめてしまっただけです。

    #
    # 障害物の判定
    #
    # 引数1:ユニット1のX座標
    # 引数2:ユニット1のY座標
    # 引数3:ユニット2のX座標
    # 引数4:ユニット2のY座標
    # 引数5:障害物の地名
    #
    # 戻り値:ユニット間に指定された障害物が存在するなら1、存在しないなら0を返す
    #
    IsObstacle:
    Local x1 y1 x2 y2 obstacle_name
    Local xx yy e dx dy sx sy i

    x1 = Args(1)
    y1 = Args(2)
    x2 = Args(3)
    y2 = Args(4)
    obstacle_name = Args(5)

    If x2 > x1 Then
    sx = 1
    dx = x2 - x1
    Else
    sx = -1
    dx = x1 - x2
    EndIf

    If y2 > y1 Then
    sy = 1
    dy = y2 - y1
    Else
    sy = -1
    dy = y1 - y2
    EndIf

    i = 0
    xx = x1
    yy = y1

    # 傾きが1以下の場合
    If dx >= dy Then
    e = -1 * dx
    Do While ( i <= dx )
    # 指定された障害物があるなら1を返して終了
    If Info( マップ, xx, yy, 地形名 ) = obstacle_name Then
    Return 1
    EndIf

    xx = xx + sx
    e = e + 2 * dy

    If e >= 0 Then
    yy = yy + sy
    e = e - 2 * dx
    EndIf

    Incr i
    Loop
    # 傾きが1より大きい場合
    Else
    e = -1 * dy
    Do While ( i <= dy )
    # 指定された障害物があるなら1を返して終了
    If Info( マップ, xx, yy, 地形名 ) = obstacle_name Then
    Return 1
    EndIf

    yy = yy + sy
    e = e + 2 * dx

    If e >= 0 Then
    xx = xx + sx
    e = e - 2 * dy
    EndIf

    Incr i
    Loop
    EndIf
    Return 0
引用返信/返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Pass/

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -