Difference between revisions of "Talk:Field of Vision"
Jump to navigation
Jump to search
(Answered Slash's question) |
(Simple and accurate LOS function) |
||
Line 2: | Line 2: | ||
:As I understand it, field of vision is an algorithm for determining everything is visible. Line of sight is about determining whether a particular square is visible. The former can be created with the latter, but it may be inefficient to do it that way. [[User:Duerig|Duerig]] 20:44, 23 Apr 2007 (CEST) | :As I understand it, field of vision is an algorithm for determining everything is visible. Line of sight is about determining whether a particular square is visible. The former can be created with the latter, but it may be inefficient to do it that way. [[User:Duerig|Duerig]] 20:44, 23 Apr 2007 (CEST) | ||
== Simple and accurate LOS function == | |||
<pre><nowiki> | |||
'// Code is [http://www.Blitzbasic.com BlitzMax] | |||
Function UpdateLOS(m:tMonster, UpdateMap:Int = True) | |||
If m = Null Then RuntimeError("Null in LOScheck!") | |||
Local XX:Int, YY:Int '// Clear LOS flag from previous // | |||
For xx = 0 To MAPWIDTH - 1 | |||
For yy = 0 To MAPHEIGHT - 1 | |||
If Map[xx, yy].InLOS = True Then | |||
Map[xx, yy].HasSeen = True '// HasSeen cells are marked dark | |||
Map[xx, yy].InLOS = False | |||
EndIf | |||
Next | |||
Next | |||
For Local angle:Float = 1 To 360 Step 0.18 '// fractional amount gives better resolution [0.1 causes sight though doors, > 0.2 creates gaps. 0.18 seems the sweet spot | |||
Local dist:Int = 0 | |||
Local x:Float = Float(m.X) + 0.5 '//M.x and M.y are player/monster current map location | |||
Local y:Float = Float(m.y) + 0.5 | |||
Local xmove:Float = Cos(angle) | |||
Local ymove:Float = Sin(angle) | |||
Repeat | |||
x = x + xmove | |||
y = y + ymove | |||
dist = dist + 1 | |||
If dist >= m.Vision Then Exit '// M.vision is the range of sight | |||
If X >= MAPWIDTH Then Exit | |||
If y >= MAPHEIGHT Then Exit | |||
If x < 0 Then Exit | |||
If y < 0 Then Exit | |||
Map[x, y].InLOS = True | |||
If Map[x, y].BlockVision Then Exit '// Map[,].Blockvision is for walls/closed doors ect | |||
Forever | |||
Next | |||
End Function | |||
</nowiki></pre> |
Revision as of 04:37, 12 June 2008
Anyone cares to clarify what is the difference between Field of Vision and Line of Sight??? --Slash 18:08, 8 Apr 2006 (CEST)
- As I understand it, field of vision is an algorithm for determining everything is visible. Line of sight is about determining whether a particular square is visible. The former can be created with the latter, but it may be inefficient to do it that way. Duerig 20:44, 23 Apr 2007 (CEST)
Simple and accurate LOS function
'// Code is [http://www.Blitzbasic.com BlitzMax] Function UpdateLOS(m:tMonster, UpdateMap:Int = True) If m = Null Then RuntimeError("Null in LOScheck!") Local XX:Int, YY:Int '// Clear LOS flag from previous // For xx = 0 To MAPWIDTH - 1 For yy = 0 To MAPHEIGHT - 1 If Map[xx, yy].InLOS = True Then Map[xx, yy].HasSeen = True '// HasSeen cells are marked dark Map[xx, yy].InLOS = False EndIf Next Next For Local angle:Float = 1 To 360 Step 0.18 '// fractional amount gives better resolution [0.1 causes sight though doors, > 0.2 creates gaps. 0.18 seems the sweet spot Local dist:Int = 0 Local x:Float = Float(m.X) + 0.5 '//M.x and M.y are player/monster current map location Local y:Float = Float(m.y) + 0.5 Local xmove:Float = Cos(angle) Local ymove:Float = Sin(angle) Repeat x = x + xmove y = y + ymove dist = dist + 1 If dist >= m.Vision Then Exit '// M.vision is the range of sight If X >= MAPWIDTH Then Exit If y >= MAPHEIGHT Then Exit If x < 0 Then Exit If y < 0 Then Exit Map[x, y].InLOS = True If Map[x, y].BlockVision Then Exit '// Map[,].Blockvision is for walls/closed doors ect Forever Next End Function