忍者ブログ

しいたけサイクロン

主にRPGツクールVXAceを扱うブログです。 ここに公開してあるスクリプトは全部自由に使用してもらってかまいません。 改造なり何なりして好きに使ってください。

敵の視界スクリプトver2

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

1. 調査依頼

敵視界スクリプト2のDataManagerとcomposedscriptsを導入し、説明通りに進んだところエラーが起きました。
詳細を書きたいところですが投稿文字禁止エラーの表示が出てきて教えられません。

composedscriptsのundefind method[]for NilClassが内容です。

調査をお願いします。もし何もなければ一からの説明をお願いします。

2. 調査依頼(追申)

そのエラー部分を見て見るとclass GameEvent < GameCharacter、def tileidconst(tsetID,id,flagn)のif array[i] == flagnの行目に指定されました。

3. Re: 調査依頼

こんばんは。tentakoです。
おそらく追加したDataManagerの$data_check_tileの部分でエラーが起こっていると思われます。
もし新しくタイルセットを追加している場合は$data_check_tile[現在のタイルセットid]をセットしないとエラーが発生します。
たとえば5番目のタイルセットにフィールド2を追加したときはDataManagerにおいて
$data_check_tile[5] = [1,1,0,0,0,1,0,0,0]
を追加しないとundefind methodエラーになります。
DataManagerの$data_check_tileの部分を確認してみてください。
もしそれでも解決しない場合はまた遠慮なくコメントしてください。

ただいまコメントを受けつけておりません。

敵の視界スクリプトver2


・導入方法
上のスクリプトたちを導入した後、本体のDataManager内のself.initのcreate_game_objectsの下にload_normal_databasetako3を挿入してください。

・使い方

付け加えるDataManagerにおいて
$switchCharは視界に入ったときに変更するスイッチ
$switchCharAは範囲から外れたときに変更するスイッチを指定します。
 $view_area_conditionsに視界データの View_Area_Conditionsを入れてください。
View_Area_Conditions.new(視界範囲のid(int) , 視界から外れるid(int) , フェイスモード(boolean) , 見る能力(int))   です。
・見る能力が$game_player.event_invisiblity以上ならばイベントが発動します。
・フェイスモードではお互い向い合ったときに発動します
 $data_view_areas_conditions で視界範囲イベントを設定するイベント画像を指定します。
$data_view_areas_conditions[character_name , character_index]に対して、
 [適用するイベントページ番号の配列, $view_area_conditionsの視界ID]を設定してください。
  適用するイベントページ番号の配列はnilで全ページ適用します。
例:   $data_view_areas_conditions[["Actor3",0]] = [nil,0]で
Actor3の0番目の画像のイベントすべてに視界範囲の0番がセットされます。


・上以外の場合で個別に指定$view_area_set = [[マップid : イベントid] => [[ページid],パターンid]]
[ページid]がnilなら全ページとなります。
例:$view_area_set[[11,4]] = [nil,0]
ID11のマップのID4のイベントにおいて視界範囲の0番がセットされます。
 
・ $data_viewblindでブラインドになるタイルを指定します。(イベントではない)
ただし通常壁が指定されるタイルはデフォルトでブラインドになります。
[tile_id,p,x,y,]でtile_idに対応するタイルセットでp番目のタブ(ただしp=0からスタートする)の(x,y)の位置にあるタイルが視界をさえぎるタイルに指定されます。

たとえば上の中からを視界をさえぎるタイルに指定したいときは
[4,1,0,13]となります。(ダンジョンなのでタイルセットのIDは4、タブがBなので1,そして位置は左上から(0,13)の位置にある)
 
・ $data_viewblindでブラインド指定されているタイルを解除します。  
 
・$data_check_tile[tile_id]でtile_idに対応するタイルセットに使われているグラフィックA1~A5,B,C,D,Eの9個に関して
存在するなら1、存在しないなら0として配列を作ってください。
デフォルトでデフォルトの場合の配列はすでにセットしています。
たとえばtile_id が1のフィールドだとA1,A2,Bのグラフィックがあるので
$data_check_tile[1] = [1,1,0,0,0,1,0,0,0]  となります
 
・イベントキャラについてはデフォルトでプライオリティが通常キャラと同じで固定キャラは全て
視界をさえぎるタイル扱いされます。    
・$data_viewblind_character_namesでブラインドになるイベント画像を指定します。
[[character_name , character_index, ブラインドになるイベントの向き(-1で全方向)]]     
例:   $data_viewblind_character_names =[["!Other1" , 1, -1]] 
!Other1の1番目の画像のイベント(全方向)においてブラインドが適用されます。

・$data_viewblind_addでブラインドになるイベントを指定します。
[[マップID , イベントID]]で設定してください。    
例:  $data_viewblind_add = [[16,15],[16,16]]
ID16のマップのID15,ID16のイベントたちにブラインドが適用されます。
 
・$data_viewnonblind_addでブラインド指定されているイベントでブラインドとならないイベントを指定します。
[[マップID , イベントID]]で設定してください。      

・範囲の設定方法


上の画像の説明においてキャラクター座標というのはキャラクターの位置を原点とし
進行方向にx軸,右手側をy軸とする座標のことです。(下図)



関数(in_view_areaFなど)を使って範囲を定義していますが
視界の範囲の点をすべて列挙して定義してもいいです。
試してないですが
in_view_areaFがあるところに[[1,-1] , [1,0] , [1,1] , [2 , 0]].include?([cx,cy])みたいにしても範囲を定義できると思います。
関数として
area_circle_norm1(cx,cy,r)で|cx| + |cy|がr以下ならtrueを返す関数
area_circle_norm2(cx,cy,r)でcx ** 2 + cy ** 2 <= rならtrueを返す関数(x ** 2でxの2乗)
view_area_frac_rect(cx,cy,a,b,c,d)でa <= x <= b , c <= y <= dの範囲の長方形に含まれるときtrueを返す関数があります。

ちなみにin_view_areaFが示している範囲は次のように定義しています。
まず(cy - cx < 0) && (cx + cy > 0)となる範囲は下図の赤い範囲になります。

次にarea_circle_norm1(cx,cy,7)は|cx| + |cy| <= 7であり範囲は下図の青い範囲となります。
図2
つまりview_area_frac1(cx,cy) && area_circle_norm1(cx,cy,7)となる範囲は
赤と青の共通部分になります。
そこにさらに下図の緑の範囲を加えます。
図3
最終的に次のような範囲になります。
図4

・設定例



の範囲に入るとスイッチが入るようにします。
上の範囲を配列にして書き出すと[[1,-1] , [1,0] , [1,1] , [2 , 0]]となります。
in_view_areaTにこの範囲を追加するためにwhen 2の場合で
new__in_view_area(cx,cy)を追加します。(直接ココに範囲の定義を書いてもいいです。)

new__in_view_area(cx,cy)を
  def new__in_view_area(cx,cy)
    [[1,-1] , [1,0] , [1,1] , [2 , 0]].include?([cx,cy])
  end  
として定義します。

これでView_Area_Conditions.new(視界範囲のid(int) , 視界から外れるid(int) , フェイスモード(boolean) , 見る能力(int)) 
において最初の引数に2を入れると上の範囲が視界の範囲として使われます。

(ついでに視界からイベントを維持する範囲として半径6の円としています。もしイベントを
解除させたくない場合はtrueを返すようにすればOK)

$view_area_conditions[0] = View_Area_Conditions.new(2,2,false , 1)
とします。
この
$view_area_conditions[0]を

の画像のキャラ(Actor3の0番のキャラ)にすべて持たせたい。
そのときは
$data_view_areas_conditions[["Actor3",0]] = [nil,0]
とします。この[nil , x]で$view_area_conditions[x]を指定した画像のキャラのすべてのイベントページでセットします。nilが[1,3]だと1ページ目と3ページ目でのみこのイベントが発動します。


上の 岩の画像のイベントを視界をさえぎるイベント(以下ブラインド)と設定してみます。
岩の画像は !Other1の1番目の画像なので
$data_viewblind_character_names =[["!Other1" , 1, -1]] 
とします。
さらに!Other1の2番目の画像も加えたいときは
$data_viewblind_character_names =[["!Other1" , 1, -1] , ["!Other1" , 2 , -1]] とすればできます。
さらに画像指定ではなくID1のマップのID3とID4のイベントをブラインドにしたいときは
$data_viewblind_add = [[1,3],[1,4]]とします。

・見る能力について
View_Area_Conditions.newの最後の引数の見る能力ですが
見る能力値が$game_player.event_invisiblity以上にならないとイベントが発動しません。
$game_player.event_invisiblityの変更は、エディタ上で行うなどしてください。


昔作ったスクリプトなので書き直すかもしれません。
設定も(複雑なことをする場合は別として)もっと簡易にできるようにしたいです。

PR

コメント

1. 調査依頼

敵視界スクリプト2のDataManagerとcomposedscriptsを導入し、説明通りに進んだところエラーが起きました。
詳細を書きたいところですが投稿文字禁止エラーの表示が出てきて教えられません。

composedscriptsのundefind method[]for NilClassが内容です。

調査をお願いします。もし何もなければ一からの説明をお願いします。

2. 調査依頼(追申)

そのエラー部分を見て見るとclass GameEvent < GameCharacter、def tileidconst(tsetID,id,flagn)のif array[i] == flagnの行目に指定されました。

3. Re: 調査依頼

こんばんは。tentakoです。
おそらく追加したDataManagerの$data_check_tileの部分でエラーが起こっていると思われます。
もし新しくタイルセットを追加している場合は$data_check_tile[現在のタイルセットid]をセットしないとエラーが発生します。
たとえば5番目のタイルセットにフィールド2を追加したときはDataManagerにおいて
$data_check_tile[5] = [1,1,0,0,0,1,0,0,0]
を追加しないとundefind methodエラーになります。
DataManagerの$data_check_tileの部分を確認してみてください。
もしそれでも解決しない場合はまた遠慮なくコメントしてください。

プロフィール

HN:
tentako
性別:
非公開

P R

フリーエリア