diff options
| author | Ian C <ianc@noddybox.co.uk> | 2005-10-24 00:10:52 +0000 | 
|---|---|---|
| committer | Ian C <ianc@noddybox.co.uk> | 2005-10-24 00:10:52 +0000 | 
| commit | 53cc1b3be81ac220f6353bb5206b667261b3eab6 (patch) | |
| tree | 404ae3aa0977272c6dbd434d1a8f794d0f001504 | |
| parent | 2c4a357e8f8e62fe50ab489519990e91e718c0d0 (diff) | |
Added a different method for handling collisions
| -rw-r--r-- | vectorgfx.mod/.cvsignore | 1 | ||||
| -rw-r--r-- | vectorgfx.mod/doc/.cvsignore | 1 | ||||
| -rw-r--r-- | vectorgfx.mod/doc/intro.html | 44 | ||||
| -rw-r--r-- | vectorgfx.mod/vectorgfx.bmx | 206 | 
4 files changed, 114 insertions, 138 deletions
| diff --git a/vectorgfx.mod/.cvsignore b/vectorgfx.mod/.cvsignore index ae424d8..eda0494 100644 --- a/vectorgfx.mod/.cvsignore +++ b/vectorgfx.mod/.cvsignore @@ -3,4 +3,3 @@ vectorgfx.debug.win32.a  vectorgfx.debug.win32.i
  vectorgfx.release.win32.a
  .bmx
 -doc
 diff --git a/vectorgfx.mod/doc/.cvsignore b/vectorgfx.mod/doc/.cvsignore new file mode 100644 index 0000000..2ec3ca5 --- /dev/null +++ b/vectorgfx.mod/doc/.cvsignore @@ -0,0 +1 @@ +commands.html
\ No newline at end of file diff --git a/vectorgfx.mod/doc/intro.html b/vectorgfx.mod/doc/intro.html new file mode 100644 index 0000000..c456aa1 --- /dev/null +++ b/vectorgfx.mod/doc/intro.html @@ -0,0 +1,44 @@ +<html> +<head> +<title></title> +<link rel="styleSheet" href="../../../../doc/css/bmxref.css" type="text/css"> +</head> +<body> +<h1>noddybox.VectorGfx</h1> +This module provides methods for displaying 2D vector graphics, and finding +collisions between objects. +This is implemented in two different ways depending on how you want collisions +work work. +<p> + +<ul> + +<li> +A collision map can be used, whereby objects can be drawn into the map when +being drawn onto the screen.  A mask of these collisions, as well as the +actual objects and lines involved with the collisions is returned.  This +method uses a <a href="commands.html#TVectorGfxCollisionMap" class="token"> +TVectorGfxCollisionMap</a> to store collision data, and is invoked using the +<a href=commands.html#DrawToCollisionMap class=token>DrawToCollisionMap</a> +method in +<a href="commands.html#TVectorGfxObject" class="token">TVectorGfxObject</a>. +</li> + +<li> +The other method is more manual in that a point of lists is returned (defined +using +<a href="commands.html#TVectorGfxPoint" class="token">TVectorGfxPoint</a> +objects) defining all the points drawn for an object. +This is invoked using the +<a href=commands.html#DrawToPointList class=token>DrawToPointList</a> +method in +<a href="commands.html#TVectorGfxObject" class="token">TVectorGfxObject</a>. +</li> + +</ul> + +It should be noted that the collision map method is not fool-proof.  For +example, two diagnal lines may pass through each other without colliding. + +</body> +</html> diff --git a/vectorgfx.mod/vectorgfx.bmx b/vectorgfx.mod/vectorgfx.bmx index 3da763a..4dfc801 100644 --- a/vectorgfx.mod/vectorgfx.bmx +++ b/vectorgfx.mod/vectorgfx.bmx @@ -19,20 +19,33 @@ Import noddybox.vector  Import noddybox.algorithm  Rem +bbdoc: Wibble +about: Wobble +EndRem + +Rem  bbdoc: Defines a method for drawing vector lines +about: For an example of creating a line drawing routine view the LineSolid type in the private section of this module.  EndRem  Type TVectorGfxLineStyle Abstract  	Rem -	bbdoc: Draws a vector line. +	bbdoc: Draws a vector line using IDs and @TVectorGfxCollisionMap method.  	returns: The or'ed mask of all collision IDs overwritten in @colmap by this line, or zero if @colmap is null.  	about: This routine must draw a line from @x1, @y1 to @x2, @y2 using the colour @r,@g,@b.  	about: @id, @obj and @line must be written into the collision map @colmap if @colmap is not null and @actor is false.  	about: If @colmap is set and @actor true, then collisions must be returned but no points written into the collision map.  	about: If @colmap is set, @actor is true and @list is not null then any collisions should be recorded into this list  	about: (no requirement for duplicate checking). +	EndRem +	Method LineToCollisionMap:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, id:Int, obj:TVectorGfxObject, line:Int, colmap:TVectorGfxCollisionMap, actor:Int, list:TList) Abstract + +	Rem +	bbdoc: Draws a vector line using the point list method. +	about: This routine must draw a line from @x1, @y1 to @x2, @y2 using the colour @r,@g,@b. +	about: If list is not null, then the points drawn must be stored in the list as @TVectorGfxPoint objects.  	about: For an example of creating a line drawing routine view the LineSolid type in the private section of this module.  	EndRem -	Method Draw:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, id:Int, obj:TVectorGfxObject, line:Int, colmap:TVectorGfxCollisionMap, actor:Int, list:TList) Abstract +	Method LineToPointList:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, list:TList) Abstract  End Type  Rem @@ -44,27 +57,6 @@ Function VectorGfxSetSolid()  End Function  Rem -bbdoc: Set to use alpha lines for drawing. -about: This mode draws vector lines using a @line_alpha for the lines, except for the end-points drawn with @end_alpha. -EndRem -Function VectorGfxSetAlpha(line_alpha:Double,end_alpha:Double) -	Local l:LineAlpha=New LineAlpha -	l.la=line_alpha -	l.ea=end_alpha -	Static.linedraw=l -End Function - -Rem -bbdoc: Set to use thick lines for drawing. -about: This mode draws vector lines using solid line, surrounded by points of alpha @line_alpha. -EndRem -Function VectorGfxSetThickAlpha(line_alpha:Double) -	Local l:ThickAlpha=New ThickAlpha -	l.a=line_alpha -	Static.linedraw=l -End Function - -Rem  bbdoc: Set to use a custom drawing method.  EndRem  Function VectorGfxSetCustom(linedraw:TVectorGfxLineStyle) @@ -114,9 +106,7 @@ End Type  Rem  bbdoc: Defines a vector graphics collision map. -about: Collisions in the library are defined using a bitmask (allowing 32 collision masks). -about: Note that with the way that lines are drawn in an object you are likely -about: to receive collisions for the IDs used by the lines in the object. +about: Collisions using this method in the library are defined using a bitmask (allowing 32 collision masks).  EndRem  Type TVectorGfxCollisionMap @@ -458,14 +448,30 @@ Type TVectorGfxObject  	End Method  	Rem -	bbdoc: Draw the object. +	bbdoc: Draw the object, not bothering about collisions. +	EndRem +	Method Draw() +		rotated=New TVectorGfxPoint[points.length] +		 +		For Local f:Int=0 Until points.length +			Local p:TAlgoPointD=DoRotateD(points[f].x*scale,points[f].y*scale,ang) +			rotated[f]=TVectorGfxPoint.Create(p.x,p.y) +		Next +		 +		For Local l:TVectorGfxLine=EachIn lines +			Static.linedraw.LineToCollisionMap(x+rotated[l.i1].x,y+rotated[l.i1].y,x+rotated[l.i2].x,y+rotated[l.i2].y,l.r,l.g,l.b,0,Self,0,Null,True,Null) +		Next +	End Method + +	Rem +	bbdoc: Draw the object, using the collision map routines.  	returns: A bitmask of collisions.  	about: Draws the object.  If @colmap is null then no collision processing takes place.  	about: If @actor is true then collision processing takes place, but the object will  	about: not write into the collision map.  	about: If @list is not null then any collisions will be written into this list.  This only applies if @colmap is set and @actor true.  	EndRem -	Method Draw:Int(colmap:TVectorGfxCollisionMap=Null, actor:Int=False, list:TList=Null) +	Method DrawToCollisionMap:Int(colmap:TVectorGfxCollisionMap=Null, actor:Int=False, list:TList=Null)  		Local col:Int=0  		rotated=New TVectorGfxPoint[points.length] @@ -478,19 +484,50 @@ Type TVectorGfxObject  		Local i:Int=0  		For Local l:TVectorGfxLine=EachIn lines -			col:|Static.linedraw.draw(x+rotated[l.i1].x,y+rotated[l.i1].y,x+rotated[l.i2].x,y+rotated[l.i2].y,l.r,l.g,l.b,l.id,Self,i,colmap,actor,list) +			col:|Static.linedraw.LineToCollisionMap(x+rotated[l.i1].x,y+rotated[l.i1].y,x+rotated[l.i2].x,y+rotated[l.i2].y,l.r,l.g,l.b,l.id,Self,i,colmap,actor,list)  			i:+1  		Next  		Return col  	End Method + +	Rem +	bbdoc: Draw the object, using returning a point list. +	returns: The list of points plotted as @TVectorGfxPoint objects. +	EndRem +	Method DrawToPointList:TList() +		Local list:TList=CreateList() +		Local col:Int=0 +		 +		rotated=New TVectorGfxPoint[points.length] +		 +		For Local f:Int=0 Until points.length +			Local p:TAlgoPointD=DoRotateD(points[f].x*scale,points[f].y*scale,ang) +			rotated[f]=TVectorGfxPoint.Create(p.x,p.y) +		Next +		 +		Local i:Int=0 +		 +		For Local l:TVectorGfxLine=EachIn lines +			col:|Static.linedraw.LineToPointList(x+rotated[l.i1].x,y+rotated[l.i1].y,x+rotated[l.i2].x,y+rotated[l.i2].y,l.r,l.g,l.b,list) +			i:+1 +		Next +		 +		Return list +	End Method  End Type  Rem  bbdoc: Defines a point  EndRem  Type TVectorGfxPoint +	Rem +	bbdoc: The X co-ordinate of the point +	EndRem  	Field x:Int +	Rem +	bbdoc: The Y co-ordinate of the point +	EndRem  	Field y:Int  	Rem @@ -581,7 +618,7 @@ Type Static  End Type  Type LineSolid Extends TVectorGfxLineStyle -	Method Draw:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, id:Int, obj:TVectorGfxObject, line:Int, colmap:TVectorGfxCollisionMap, actor:Int, list:TList) +	Method LineToCollisionMap:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, id:Int, obj:TVectorGfxObject, line:Int, colmap:TVectorGfxCollisionMap, actor:Int, list:TList)  		Local mask:Int=0  		Local lp:TList=DoLine(x1,y1,x2,y2) @@ -607,124 +644,19 @@ Type LineSolid Extends TVectorGfxLineStyle  		Return mask  	End Method -End Type - -Type LineAlpha Extends TVectorGfxLineStyle -	Field la:Double -	Field ea:Double -	Method Draw:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, id:Int, obj:TVectorGfxObject, line:Int, colmap:TVectorGfxCollisionMap, actor:Int, list:TList) +	Method LineToPointList:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, list:TList)  		Local mask:Int=0  		Local lp:TList=DoLine(x1,y1,x2,y2) -		Local p:TAlgoPoint -		Local a:Double=GetAlpha()  		SetColor(r,g,b) -		SetAlpha(ea) -		 -		p=TAlgoPoint(lp.RemoveFirst()) -		 -		If colmap -			If actor -				Local c:TVectorGfxCollision=colmap.GetCollision(p.x,p.y) -				 -				If c -					mask:|c.mask -					If list -						list.AddLast(c) -					EndIf -				EndIf -			Else -				mask:|colmap.SetCollision(p.x,p.y,id,obj,line) -			EndIf -		EndIf -		Plot(p.x,p.y) -		 -		If lp.Count()=0 -			Return id -		EndIf -		 -		p=TAlgoPoint(lp.RemoveLast()) -		 -		If colmap -			If actor -				Local c:TVectorGfxCollision=colmap.GetCollision(p.x,p.y) -				 -				If c -					mask:|c.mask -					If list -						list.AddLast(c) -					EndIf -				EndIf -			Else -				mask:|colmap.SetCollision(p.x,p.y,id,obj,line) -			EndIf -		EndIf -		Plot(p.x,p.y) -		SetAlpha(la) -  		For Local p:TAlgoPoint=EachIn lp -			If colmap -				If actor -					Local c:TVectorGfxCollision=colmap.GetCollision(p.x,p.y) -					 -					If c -						mask:|c.mask -						If list -							list.AddLast(c) -						EndIf -					EndIf -				Else -					mask:|colmap.SetCollision(p.x,p.y,id,obj,line) -				EndIf -			EndIf  			Plot(p.x,p.y) -		Next -		 -		SetAlpha(a) -		 -		Return mask -	End Method -End Type - - -Type ThickAlpha Extends TVectorGfxLineStyle -	Field a:Double -	 -	Method PlotPoint(x,y) -		SetAlpha(a) -		DrawRect(x-1,y-1,3,3) -		SetAlpha(1.0) -		Plot(x,y) -	End Method -	 -	Method Draw:Int(x1:Int, y1:Int, x2:Int, y2:Int, r:Int, g:Int, b:Int, id:Int, obj:TVectorGfxObject, line:Int, colmap:TVectorGfxCollisionMap, actor:Int, list:TList) -		Local mask:Int=0 -		Local lp:TList=DoLine(x1,y1,x2,y2) -		 -		SetColor(r,g,b) -		 -		For Local p:TAlgoPoint=EachIn lp -			If colmap -				If actor -					Local c:TVectorGfxCollision=colmap.GetCollision(p.x,p.y) -					 -					If c -						mask:|c.mask -						If list -							list.AddLast(c) -						EndIf -					EndIf -				Else -					mask:|colmap.SetCollision(p.x,p.y,id,obj,line) -				EndIf -			EndIf -			PlotPoint(p.x,p.y) +			list.AddLast(TVectorGfxPoint.Create(p.x,p.y))  		Next  		Return mask -  	End Method  End Type | 
