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. |


