Black lines when drawing tiled images.
BlitzMax Forums/BlitzMax Programming/Black lines when drawing tiled images.| 
 | ||
| I have a function to draw a laser, it works okay when zoomed in, but when you zoom out these black lines are shown. If you look close you can also see the black lines in the zoomed in pic.  The method is quite simply. I just draw a part of the laser several times. Method DrawLaser(X1:Float,Y1:Float,X2:Float,Y2:Float) Local Dis:Float = Distance(X1,Y1,X2,Y2) Local Steps:Int = Dis/Float(ImageWidth(LaserMiddle)*Player.Zoom) Local LastStep:Float = -(Steps*Float(ImageWidth(LaserMiddle))*Player.Zoom-Dis)/Float(ImageWidth(LaserMiddle))*Player.Zoom Local Angle:Float = ATan2(Y2-Y1,X2-X1) Local OldRot:Float = GetRotation() SetRotation(Angle) SetScale(Player.Zoom,Player.Zoom) Local DX:Float,DY:Float For Local t:Int = 1 To Steps DX:Float = Float(X1)+Player.Zoom*ImageWidth(LaserMiddle)*Cos(Angle)*Float(t-1) DY:Float = Float(Y1)+Player.Zoom*ImageWidth(LaserMiddle)*Sin(Angle)*Float(t-1) DrawImage LaserMiddle,DX,DY Next SetScale(1.0,1.0) SetRotation(OldRot) End Method | 
| 
 | ||
| I usually get that when I overlap or have one pixel spacing in between. I don't know if using double for a more acurate result will help with the scale factor but it might be wordth to try it out. note that I have not used the scale factor to draw angled tile images. For things like that I sometimes use the "DrawImageRect" which I am shure is a lot faster. | 
| 
 | ||
| Converting to double didn't fix it ;/ | 
| 
 | ||
| Wouldn't it just be easier to scale the laser image instead of tiling it? | 
| 
 | ||
| I did A laser type  a while ago but I never added scale. I updated it right now with scale and it works fine. try it with your image and see if it works. 
Strict
Graphics 640,480,32
SetBlend alphablend
Local lazer:Tlazer= New Tlazer
Global scale:Float = 1
SetColor 255,155,0
Repeat
	Cls	
	If KeyDown(key_space) Tlazer.Create(50,50,45,4.0)
	lazer.update()
	lazer.draw()
	Flip()
	
Until KeyDown(key_escape)
Type Tlazer
	Field x:Float
	Field y:Float
	Field dx:Float
	Field dy:Float
	Field rot:Float
	Field r:Float
	Field speed:Float
	Field warmup:Int
	Field fire:Int
	Field link:TLink
	Global list:TList = New TList
	Global dist:Float
	Global count:Int
	Global beam:TImage
	
	Function Create(x:Float, y:Float, angle:Float, speed:Float)
		If beam = Null
			beam =  LoadImage("gfx\laser_middle.png",MIPMAPPEDIMAGE|FILTEREDIMAGE)
			If beam = Null Print "bad laser.img" ;End
			MidHandleImage beam
			count = 0
		EndIf
		If dist >= beam.width	Or count = 0
			Local l:tlazer = New Tlazer
			dist = dist Mod beam.width 
			l.dx = Cos(angle)
			l.dy = Sin(angle)
			l.x = x+l.dx*dist*scale
			l.y = y+l.dy*dist*scale
			l.rot = angle
			l.speed = speed
			l.count :+ 1
			l.link = list.addlast(l)
		EndIf
	End Function
	
	method update()
		If count = 0 Return
		dist :+ Tlazer(list.last()).speed
		For Local l:Tlazer = EachIn list
			l.x :+ l.dx * l.speed*scale
			l.y :+ l.dy * l.speed*scale
			If l.x > -30
				If l.y < 510
					If l.x < 500
						If l.y > -30
							Continue
						EndIf
					EndIf
				EndIf
			EndIf
			l.link.remove()
			l.count :- 1
		Next	
	End method
	
	method draw()
		SetRotation 0
		SetScale 1,1
		DrawText count,10,10
		SetScale scale , scale
		For Local l:Tlazer = EachIn list
			SetRotation l.rot
			DrawImage beam,l.x,l.y
		Next
		
	End method
	
End Type
I did notice that when I removed the scale of the create function I got the same thing you got. | 
| 
 | ||
| @Ked I think the problem is that when colliding it becomes really slow which makes tiling it a lot more efficient. | 
| 
 | ||
|  I think the problem is that when colliding it becomes really slow which makes tiling it a lot more efficient.  I had a feeling there was a downside to it. :) Well, that's all I got. | 
| 
 | ||
| I think that line will go away if you draw your laser tiles at exact pixel coordinates (integer). | 
| 
 | ||
| Is the image an even or odd number of pixels? I've run into this when I had an odd-sized image (which I had done intentioanlly, for the convenience of being able to rotate them around a central pixel and still have everything fit together) properly) Switching to an even number made the lines go away for me. | 
| 
 | ||
| It's even sized (30x30). | 
| 
 | ||
|  It's even sized (30x30) have you tried a power of 2? | 
| 
 | ||
| I tryed your code and I don't get the black lines. although I had to adopt it to make it work: 
superstrict
Global laserMiddle:TImage = LoadImage("gfx\lazer3b.png",MIPMAPPEDIMAGE|FILTEREDIMAGE)
If laserMiddle = Null Print "bad lazer3 img"
Global zoom:Float = .2
Type Tlaser	
	
	
	Method DrawLaser(X1:Float,Y1:Float,X2:Float,Y2:Float)
		Local Dis:Float = Sqr((X2-X1)^2+(Y2-Y1)^2)
		Local Steps:Int = Dis/Float(ImageWidth(LaserMiddle)*Zoom)
		Local LastStep:Float = -(Steps*Float(ImageWidth(LaserMiddle))-Dis)/Float(ImageWidth(LaserMiddle))*zoom
		Local Angle:Float = ATan2(Y2-Y1,X2-X1)
		Local OldRot:Float = GetRotation()
		SetRotation(Angle)
		SetScale(Zoom,Zoom)
		Local DX:Float,DY:Float
		For Local t:Int = 1 To Steps
			DX:Float = Float(X1)+Zoom*ImageWidth(LaserMiddle)*Cos(Angle)*Float(t-1)
			DY:Float = Float(Y1)+Zoom*ImageWidth(LaserMiddle)*Sin(Angle)*Float(t-1)
			DrawImage LaserMiddle,DX,DY
		Next
		SetScale(1.0,1.0)
		SetRotation(OldRot)
	End Method
	
End Type
Graphics 640,480,32
SetBlend alphablend
SetColor 200,0,0
Local lazer:tlaser = New Tlaser
lazer.drawlaser(100 , 100 , 300,600)
Flip()
WaitKey()
I am using this image:  can you post the image? It might be the problem. | 
| 
 | ||
|  EDIT: I get the black lines with your code too (using my image and also with your image). Perhaps this is a blitzmax bug then? | 
| 
 | ||
|  Perhaps this is a blitzmax bug then?  Or just a driver/video card bug/inconsistency? | 
| 
 | ||
| it might be a driver problem or graphics settings issue. I had some problems with my graphics card before to where it wouldn't draw alpha images properly until I messed with the driver settings. | 
| 
 | ||
| I'm using Nvidia 180.51, but you're right, it might be a driver problem if other people are not seein those lines. | 
| 
 | ||
| Have you tried changing the image size to 32x32? I think textures should be square and a binary size e.g. 32,64,128,...? | 
| 
 | ||
| Merx, thank you very much, changing it to 32x32 fixes the issue. |