artisocモデル集の中の交通モデル(交差点)についてですが、このモデルは交差点が4つありますが、交差点は一つだけでいいので信号到達時に右左折させ、右左折時にも直進と同様にゆっくり加速させたりさせたいのですがどうすればいいのでしょうか?
長すぎてご自身もどのような構造であるのかよく分かっていないのかなと存じます。ですので関数に細分化して見やすくしてはいかがかと思います。
該当する部分を発見できませんでした。どの部分でエラーが起きたのでしょうか?
turn(角度asDouble)はfunctionではないので単体でかつAgtの中で書けばエラーは起きないはずです。
以下、車エージェントの記述になります。if文を用いて指定した座標に到達した時、turn()で曲げようと思ったのですがデータタイプエラーと出ました。
Agt_Init{
//表示座標更新
My.現在地(X) = My.X
My.現在地(Y) = My.Y
}
Agt_Step{
Dim isTmpFlag As Boolean
Dim changeDistance As Double
Dim distance As Double
Dim minDistance As Double
Dim tmpRnd As Double
//前方車用
Dim isCarFront As Boolean
Dim aroundCars As AgtSet
Dim tmpCar As Agt
Dim frontCar As Agt
Dim speedForFrontCar As Double
//信号用
Dim isSignal As Boolean
Dim aroundSignals As AgtSet
Dim tmpSignal As Agt
Dim frontSignal As Agt
Dim speedForFrontSignal As Double
//交差点用
Dim isJunction As Boolean
Dim isChangeDirection As Boolean
Dim aroundJunctions As AgtSet
Dim tmpJunction As Agt
Dim frontJunction As Agt
Dim speedForFrontJunction As Double
Dim distanceForJunctionSpeed As Double
Dim nextDirection As Integer
//前方車(100m以上先は無視)
//初期化
isCarFront = False
minDistance = 100
//100m以内の車を取得
MakeOneAgtSetAroundPosition(aroundCars, Universe.マップ,My.現在地(X),My.現在地(Y), 0, 10,Universe.マップ.車)
//100m以内の車から前方車を見つける
For Each tmpCar In aroundCars
isTmpFlag = False
//自分の向いてる方向から、該当しない車(違うライン、後ろの車)を見つけ、フラグをオフ
If (My.方向 == 1) And (tmpCar.方向 == 1) And (My.現在地(X) == tmpCar.現在地(X) ) And ( My.現在地(Y) >= tmpCar.現在地(Y)) Then
isTmpFlag = True
End If
If (My.方向 == 2) And (tmpCar.方向 == 2) And (My.現在地(Y) == tmpCar.現在地(Y) ) And ( My.現在地(X) <= tmpCar.現在地(X)) Then
isTmpFlag = True
End If
If (My.方向 == 3) And (tmpCar.方向 == 3) And (My.現在地(X) == tmpCar.現在地(X) ) And ( My.現在地(Y) <= tmpCar.現在地(Y)) Then
isTmpFlag = True
End If
If (My.方向 == 4) And (tmpCar.方向 == 4) And (My.現在地(Y) == tmpCar.現在地(Y) ) And ( My.現在地(X) >= tmpCar.現在地(X)) Then
isTmpFlag = True
End If
//該当する車で近いと思われるものがあれば、前方車として登録
If isTmpFlag == True Then
distance = Abs( (My.現在地(X) - tmpCar.現在地(X)) + (My.現在地(Y) - tmpCar.現在地(Y)) )
If (distance > 0) And (distance < minDistance) Then
isCarFront = True
minDistance = distance
frontCar = tmpCar
End If
End If
Next tmpCar
//車間距離をとるための速度を算出
If isCarFront == True Then
//前方車がいればその距離によって算出(停止時の車間は4mとして計算)
if minDistance < 1 Then
speedForFrontCar = 0 //誤差のための処理
Else
speedForFrontCar = ( ( minDistance - 1 ) * 10 / 0.02590816 ) ^ ( 1 / 1.81847769 )
If speedForFrontCar * 1000 / 3600 * 0.6 > (minDistance - 1) * 10 Then
speedForFrontCar = (minDistance - 1) / 1000 * 3600 / 0.6 * 10
End If
//加速の許容量を超えて速度を上げることはできない
If speedForFrontCar > My.速度 + My.加速度 Then
speedForFrontCar = My.速度 + My.加速度
End If
End If
Else
//前方車がいなければ加速
speedForFrontCar = My.速度 + My.加速度
End If
//信号(100m以上先は無視)
//初期化
isSignal = False
//100m以内の信号を取得
MakeOneAgtSetAroundPosition(aroundSignals,Universe.マップ, My.現在地(X),My.現在地(Y) ,0,10,Universe.マップ.信号)
//100m以内の車から前方車を見つける
For Each tmpSignal In aroundSignals
isTmpFlag = False
//自分の向いてる方向から、該当しない信号(違うライン、後ろの信号)を見つけ、フラグをオフ
If (My.方向 == 1) And (My.現在地(X) == tmpSignal.X) And (My.現在地(Y) >= tmpSignal.Y) Then
isTmpFlag = True
End If
If (My.方向 == 2) And (My.現在地(Y) == tmpSignal.Y) And (My.現在地(X) <= tmpSignal.X) Then
isTmpFlag = True
End If
If (My.方向 == 3) And (My.現在地(X) == tmpSignal.X) And (My.現在地(Y) <= tmpSignal.Y) Then
isTmpFlag = True
End If
If (My.方向 == 4) And (My.現在地(Y) == tmpSignal.Y) And (My.現在地(X) >= tmpSignal.X) Then
isTmpFlag = True
End If
//該当する信号で近いと思われるものがあれば、信号として登録
If isTmpFlag == True Then
distance = Abs( (My.現在地(X) - tmpSignal.X ) + (My.現在地(Y) - tmpSignal.Y ) )
If distance < minDistance Then
isSignal = True
minDistance = distance
frontSignal = tmpSignal
End If
End If
Next tmpSignal
//信号が赤であれば止まるための速度を算出
If isSignal == True Then
If frontSignal.現在の色 == Color_Red Then
//信号が赤ならばその距離によって算出(信号は長さない)
speedForFrontSignal = ( (minDistance-1) * 10 / 0.02590816 ) ^ ( 1 / 1.81847769 )
If speedForFrontSignal * 1000 / 3600 * 0.6 > (minDistance-1) * 10 Then
speedForFrontSignal = (minDistance-1) / 1000 * 3600 / 0.6 * 10
End If
//加速の許容量を超えて速度を上げることはできない
If speedForFrontCar > My.速度 + My.加速度 Then
speedForFrontCar = My.速度 + My.加速度
End If
Else
//信号が青ならば加速
speedForFrontSignal = My.速度 + My.加速度
End If
Else
//信号がないならば加速
speedForFrontSignal = My.速度 + My.加速度
End If
//交差点(100m以上先は無視)
//初期化
isJunction = False
isChangeDirection = False
//100m以内の交差点を取得
MakeOneAgtSetAroundPosition(aroundJunctions,Universe.マップ, My.現在地(X),My.現在地(Y) ,0,10,Universe.マップ.交差点)
//100m以内の交差点から前方交差点を見つける
For Each tmpJunction In aroundJunctions
isTmpFlag = False
//自分の向いてる方向から、該当しない交差点(違うライン、後ろの信号)を見つけ、フラグをオフ
If (My.方向 == 1) And (tmpJunction.有効方向 == 1) And (My.現在地(X) == tmpJunction.X) And (My.現在地(Y) >= tmpJunction.Y) Then
isTmpFlag = True
End If
If (My.方向 == 2) And (tmpJunction.有効方向 == 2) And (My.現在地(Y) == tmpJunction.Y) And (My.現在地(X) <= tmpJunction.X) Then
isTmpFlag = True
End If
If (My.方向 == 3) And (tmpJunction.有効方向 == 3) And (My.現在地(X) == tmpJunction.X) And (My.現在地(Y) <= tmpJunction.Y) Then
isTmpFlag = True
End If
If (My.方向 == 4) And (tmpJunction.有効方向 == 4) And (My.現在地(Y) == tmpJunction.Y) And (My.現在地(X) >= tmpJunction.X) Then
isTmpFlag = True
End If
//該当する交差点で近いと思われるものがあれば、交差点として登録
If isTmpFlag == True Then
distance = Abs( (My.現在地(X) - tmpJunction.X ) + (My.現在地(Y) - tmpJunction.Y ) )
If distance < minDistance Then
isJunction = True
minDistance = distance
frontJunction = tmpJunction
End If
End If
Next tmpJunction
//交差点で交差点速度まで落とすための速度を算出
If isJunction == True Then
//交差点までの距離によって算出
distanceForJunctionSpeed = (0.02590816) * ( (frontJunction.交差点速度) ^ (1.81847769) ) / 10
speedForFrontJunction = ( (minDistance + distanceForJunctionSpeed) * 10 / 0.02590816 ) ^ ( 1 / 1.81847769 )
//加速の許容量を超えて速度を上げることはできない
If speedForFrontJunction > My.速度 + My.加速度 Then
speedForFrontJunction = My.速度 + My.加速度
End If
//交差点を越えそうであれば交差点速度を保つ
If speedForFrontJunction * 1000 / 3600 * 0.6 > minDistance * 10 Then
speedForFrontJunction = frontJunction.交差点速度
End If
//交差点速度で交差点を越えるようであれば、方向転換処理
If speedForFrontJunction * 1000 / 3600 * 0.6 > minDistance * 10 Then
isChangeDirection = True
//現在地を交差点中心にセット
My.現在地(X)= frontJunction.X
My.現在地(Y)= frontJunction.Y
//次に進む方向を決める
nextDirection = 0
tmpRnd = Rnd()
If tmpRnd < frontJunction.上確率 Then
nextDirection = 1
End If
tmpRnd = tmpRnd - frontJunction.上確率
If nextDirection == 0 And tmpRnd < frontJunction.右確率 Then
nextDirection = 2
End If
tmpRnd = tmpRnd - frontJunction.右確率
If nextDirection == 0 And tmpRnd < frontJunction.下確率 Then
nextDirection = 3
End If
tmpRnd = tmpRnd - frontJunction.下確率
If nextDirection == 0 Then
nextDirection = 4
End If
//現在地を方向転換先に合わせて調整
If My.方向 == 1 And nextDirection == 2 Then
My.現在地(X)= My.現在地(X)+ 0
My.現在地(Y)= My.現在地(Y)- 1
End If
If My.方向 == 2 And nextDirection == 3 Then
My.現在地(X)= My.現在地(X)+ 1
My.現在地(Y)= My.現在地(Y)+ 0
End If
If My.方向 == 3 And nextDirection == 4 Then
My.現在地(X)= My.現在地(X)- 0
My.現在地(Y)= My.現在地(Y)+ 1
End If
If My.方向 == 4 And nextDirection == 1 Then
My.現在地(X)= My.現在地(X)- 1
My.現在地(Y)= My.現在地(Y)- 0
End If
If nextDirection == 1 Then
My.現在地(Y)= My.現在地(Y)+ minDistance
End If
If nextDirection == 2 Then
My.現在地(X)= My.現在地(X)- minDistance
End If
If nextDirection == 3 Then
My.現在地(Y)= My.現在地(Y)- minDistance
End If
If nextDirection == 4 Then
My.現在地(X)= My.現在地(X)+ minDistance
End If
//現在地を方向転換先にセット
My.方向 = nextDirection
End If
Else
//交差点がないならば加速
speedForFrontJunction = My.速度 + My.加速度
End If
//速度の算出
My.速度 = speedForFrontCar
If My.速度 > speedForFrontSignal Then
My.速度 = speedForFrontSignal
End If
If (My.速度 > speedForFrontJunction) Or (isChangeDirection == True) Then
My.速度 = speedForFrontJunction
End If
//速度が最高速度を超える場合、最高速度へ調節
If My.速度 > My.最高速度 Then
My.速度 = My.最高速度
End If
//現在地算出
//移動量の算出
changeDistance = My.速度 / 60
//自分の向いてる方向から、現在地を算出
If My.方向 == 1 Then
My.現在地(Y) = My.現在地(Y) - changeDistance
End If
If My.方向 == 2 Then
My.現在地(X) = My.現在地(X) + changeDistance
End If
If My.方向 == 3 Then
My.現在地(Y) = My.現在地(Y) + changeDistance
End If
If My.方向 == 4 Then
My.現在地(X) = My.現在地(X) - changeDistance
End If
//表示座標更新
My.X = (My.現在地(X) + 0.5)
My.Y = (My.現在地(Y) + 0.5)
//画面外へ出たときの処理
If My.X < 0 Or My.X > GetWidthSpace(Universe.マップ) Then
KillAgt(My)
End If
If My.Y < 0 Or My.Y > GetHeightSpace(Universe.マップ) Then
KillAgt(My)
End If
}
直進と同様に記述すればいいかと思われますが、どのように処理させているのでしょうか?