This code doesn't work on PB3.93
-
- Enthusiast
- Posts: 152
- Joined: Sun Jul 11, 2004 7:48 pm
- Location: Lillehammer, No(r)way
- Contact:
Yes...Fred wrote:Just seen than the "For k=0 to #AppHeight" should be changed by For k=0 to #AppHeight-1" and the same for the width, else it can do a buffer overflow (may be the olrjr bug).

And i was really starting to wonder,
because it was these kind of lines that caused the crashes:
Code: Select all
*screen1\l = pixel
- Psychophanta
- Always Here
- Posts: 5153
- Joined: Wed Jun 11, 2003 9:33 pm
- Location: Anare
- Contact:
That's not logical. That code is well done.olejr wrote:And i was really starting to wonder,
because it was these kind of lines that caused the crashes:Code: Select all
*screen1\l = pixel
I can't understand why on olejr PC it crashes, and doesn't for others

- Psychophanta
- Always Here
- Posts: 5153
- Joined: Wed Jun 11, 2003 9:33 pm
- Location: Anare
- Contact:
- Psychophanta
- Always Here
- Posts: 5153
- Joined: Wed Jun 11, 2003 9:33 pm
- Location: Anare
- Contact:
and to add a little... as far as i know windows pads bitmaps, so it would depend on screen resolution nr. of colours etc. etc. it writing beyound the last 'planned' byte would cause a crash or not...
it may actually be fine on some specific machine, just isn't the proper thing to do
it may actually be fine on some specific machine, just isn't the proper thing to do

( PB6.00 LTS Win11 x64 Asrock AB350 Pro4 Ryzen 5 3600 32GB GTX1060 6GB)
( The path to enlightenment and the PureBasic Survival Guide right here... )
( The path to enlightenment and the PureBasic Survival Guide right here... )
- Psychophanta
- Always Here
- Posts: 5153
- Joined: Wed Jun 11, 2003 9:33 pm
- Location: Anare
- Contact:
I get a white blank screen in PB4.30B4, but i find no reason.
This is the tested code:
This is the tested code:
Code: Select all
; converted from bb code
; edited by webmatze
; turn debugger off for performance..
#appWidth = 640
#appHeight= 480
Global Dim Palette.l(255)
Global Dim table.l(#appWidth-1, #appWidth-1)
Procedure SetupPalette()
; create a temporary image...
CreateImage(0, #appWidth, #appHeight)
; ...to draw a nice colour-pattern onto it
StartDrawing(ImageOutput(0))
For i = 0 To 63
LineXY(i,0,i,200, RGB(0, 0, i*4))
Next
For i = 0 To 127
LineXY(i+64,0,i+64,200, RGB(0, (i/2)*4, 63*4))
Next
For i = 0 To 63
LineXY(i+192,0,i+192,200,RGB(i*4, 63*4, 63*4))
Next
; grab palette data
For x = 0 To 255
Palette(x) = Point(x,0)
Next
StopDrawing()
; clean-up
FreeImage(0)
EndProcedure
Procedure PreCalc()
For y = 0 To #appHeight-1
For x = 0 To #appWidth-1
If x = 0 And y = 0
table(y,x) = 255
Else
table(y,x) = (9000000000 / (Sqr(x*x + y*y) * 250000))
EndIf
Next
Next
EndProcedure
If InitSprite()=0
End
EndIf
OpenWindow(0, 0, 0, #appWidth, #appHeight, "testing...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, #appWidth, #appHeight, 0, 0 ,0)
SetupPalette()
PreCalc()
halfW.l = #appWidth/2
halfH.l = #appHeight/2
While WindowEvent()<>#PB_Event_CloseWindow
; fps
If GetTickCount_() => zeit + 1000
FrameSek = Frames
Frames = 0
zeit = GetTickCount_()
Else
Frames + 1
EndIf
FlipBuffers():Delay(16)
cosAlfa.f = Cos (alfa.f)
cosAlfam.f = Cos (-alfa)
cosAlfa2.f = Cos (alfa*2)
cosAlfam2.f = Cos (-alfa*2)
sinAlfa.f = Sin (alfa)
sinAlfam.f = Sin (-alfa)
sinAlfa2.f = Sin (alfa*2)
x1.f = 60 * cosAlfa + 30 * sinAlfam + halfW
y1.f = 30 * cosAlfam2 + 60 * sinAlfa + halfH
x2.f = 30 * cosAlfa + 60 * sinAlfa2 + halfW
y2.f = 60 * cosAlfa + 30 * sinAlfa + halfH
x3.f = 45 * cosAlfam + 45 * sinAlfa + halfW
y3.f = 45 * cosAlfa2 + 45 * sinAlfam + halfH
x4.f = 75 * cosAlfa + 15 * sinAlfa2 + halfW
y4.f = 15 * cosAlfam + 75 * sinAlfa2 + halfH
x5.f = 35 * cosAlfa + 10 * sinAlfa + halfW
y5.f = 10 * cosAlfa2 + 35 * sinAlfam + halfH
x6.f = 40 * cosAlfam + 30 * sinAlfa2 + halfW
y6.f = 40 * cosAlfa + 10 * sinAlfa + halfH
alfa.f+0.05
If StartDrawing(ScreenOutput())
*Screen.LONG = DrawingBuffer()
byte_pixel.b = Round((DrawingBufferPixelFormat() + 1)/2, 1)
byte_line.l = DrawingBufferPitch()
For y = 0 To #appHeight-1 Step 2
a1.l = Abs(y1-y)
a3.l = Abs(y2-y)
a5.l = Abs(y3-y)
a7.l = Abs(y4-y)
a9.l = Abs(y5-y)
a11.l = Abs(y6-y)
*screen1.LONG = *Screen.LONG + y*byte_line
*screen2.LONG = *screen1.LONG + byte_line
For x = 0 To #appWidth-1 Step 2
a2.l = Abs(x1-x)
a4.l = Abs(x2-x)
a6.l = Abs(x3-x)
a8.l = Abs(x4-x)
a10.l = Abs(x5-x)
a12.l = Abs(x6-x)
pixel.l = table(a1, a2) + table(a3, a4) + table(a5, a6) + table(a7,a8) + table(a9, a10) + table(a11, a12)
If pixel>255:pixel=255:EndIf
pixel = palette(pixel)
*screen1.LONG\l = pixel
*screen1.LONG + byte_pixel
*screen1.LONG\l = pixel
*screen2.LONG\l = pixel
*screen2.LONG + byte_pixel
*screen2.LONG\l = pixel
*screen1.LONG + byte_pixel
*screen2.LONG + byte_pixel
Next
Next
DrawingMode(0)
DrawText(5,452,"FPS: "+Str(FrameSek),0)
StopDrawing()
EndIf
Wend
Maybe this changed line is helping you do understand why it is white:
I changed only this line:
If pixel>255:pixel%255:EndIf
The problem seems to be:
The result of this operation
seems to be 'always' > 255
I changed only this line:
If pixel>255:pixel%255:EndIf
The problem seems to be:
The result of this operation
Code: Select all
pixel.l = table(a1, a2) + table(a3, a4) + table(a5, a6) + table(a7,a8) + table(a9, a10) + table(a11, a12)
Code: Select all
; converted from bb code
; edited by webmatze
; turn debugger off for performance..
#appWidth = 640
#appHeight= 480
Global Dim Palette.l(255)
Global Dim table.l(#appWidth-1, #appWidth-1)
Procedure SetupPalette()
; create a temporary image...
CreateImage(0, #appWidth, #appHeight)
; ...to draw a nice colour-pattern onto it
StartDrawing(ImageOutput(0))
For i = 0 To 63
LineXY(i,0,i,200, RGB(0, 0, i*4))
Next
For i = 0 To 127
LineXY(i+64,0,i+64,200, RGB(0, (i/2)*4, 63*4))
Next
For i = 0 To 63
LineXY(i+192,0,i+192,200,RGB(i*4, 63*4, 63*4))
Next
; grab palette data
For x = 0 To 255
Palette(x) = Point(x,0)
Next
StopDrawing()
; clean-up
FreeImage(0)
EndProcedure
Procedure PreCalc()
For y = 0 To #appHeight-1
For x = 0 To #appWidth-1
If x = 0 And y = 0
table(y,x) = 255
Else
table(y,x) = (9000000000 / (Sqr(x*x + y*y) * 250000))
EndIf
Next
Next
EndProcedure
If InitSprite()=0
End
EndIf
OpenWindow(0, 0, 0, #appWidth, #appHeight, "testing...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, #appWidth, #appHeight, 0, 0 ,0)
SetupPalette()
PreCalc()
halfW.l = #appWidth/2
halfH.l = #appHeight/2
While WindowEvent()<>#PB_Event_CloseWindow
; fps
If GetTickCount_() => zeit + 1000
FrameSek = Frames
Frames = 0
zeit = GetTickCount_()
Else
Frames + 1
EndIf
FlipBuffers():Delay(16)
cosAlfa.f = Cos (alfa.f)
cosAlfam.f = Cos (-alfa)
cosAlfa2.f = Cos (alfa*2)
cosAlfam2.f = Cos (-alfa*2)
sinAlfa.f = Sin (alfa)
sinAlfam.f = Sin (-alfa)
sinAlfa2.f = Sin (alfa*2)
x1.f = 60 * cosAlfa + 30 * sinAlfam + halfW
y1.f = 30 * cosAlfam2 + 60 * sinAlfa + halfH
x2.f = 30 * cosAlfa + 60 * sinAlfa2 + halfW
y2.f = 60 * cosAlfa + 30 * sinAlfa + halfH
x3.f = 45 * cosAlfam + 45 * sinAlfa + halfW
y3.f = 45 * cosAlfa2 + 45 * sinAlfam + halfH
x4.f = 75 * cosAlfa + 15 * sinAlfa2 + halfW
y4.f = 15 * cosAlfam + 75 * sinAlfa2 + halfH
x5.f = 35 * cosAlfa + 10 * sinAlfa + halfW
y5.f = 10 * cosAlfa2 + 35 * sinAlfam + halfH
x6.f = 40 * cosAlfam + 30 * sinAlfa2 + halfW
y6.f = 40 * cosAlfa + 10 * sinAlfa + halfH
alfa.f+0.05
If StartDrawing(ScreenOutput())
*Screen.LONG = DrawingBuffer()
byte_pixel.b = Round((DrawingBufferPixelFormat() + 1)/2, 1)
byte_line.l = DrawingBufferPitch()
For y = 0 To #appHeight-1 Step 2
a1.l = Abs(y1-y)
a3.l = Abs(y2-y)
a5.l = Abs(y3-y)
a7.l = Abs(y4-y)
a9.l = Abs(y5-y)
a11.l = Abs(y6-y)
*screen1.LONG = *Screen.LONG + y*byte_line
*screen2.LONG = *screen1.LONG + byte_line
For x = 0 To #appWidth-1 Step 2
a2.l = Abs(x1-x)
a4.l = Abs(x2-x)
a6.l = Abs(x3-x)
a8.l = Abs(x4-x)
a10.l = Abs(x5-x)
a12.l = Abs(x6-x)
pixel.l = table(a1, a2) + table(a3, a4) + table(a5, a6) + table(a7,a8) + table(a9, a10) + table(a11, a12)
If pixel>255:pixel%255:EndIf ; <<<<<<<<<<<<<< CHANGED
pixel = palette(pixel)
*screen1.LONG\l = pixel
*screen1.LONG + byte_pixel
*screen1.LONG\l = pixel
*screen2.LONG\l = pixel
*screen2.LONG + byte_pixel
*screen2.LONG\l = pixel
*screen1.LONG + byte_pixel
*screen2.LONG + byte_pixel
Next
Next
DrawingMode(0)
DrawText(5,452,"FPS: "+Str(FrameSek),0)
StopDrawing()
EndIf
Wend
Belive! C++ version of Puzzle of Mystralia
<Wrapper>4PB, PB<game>, =QONK=, PetriDish, Movie2Image, PictureManager,...
<Wrapper>4PB, PB<game>, =QONK=, PetriDish, Movie2Image, PictureManager,...
- Psychophanta
- Always Here
- Posts: 5153
- Joined: Wed Jun 11, 2003 9:33 pm
- Location: Anare
- Contact:
Thanks,
allow me to point that:has the same effect than just a simple.
It just wraps the value between 0 and 255. So then the 'If' is a surplus.
I replaced the 3 lines by:
But well...
http://www.purebasic.fr/english/viewtopic.php?p=268845
allow me to point that:
Code: Select all
If pixel>255:pixel%255:EndIf
Code: Select all
pixel%255
It just wraps the value between 0 and 255. So then the 'If' is a surplus.
I replaced the 3 lines by:
Code: Select all
pixel.l=palette((table(a1,a2)+table(a3,a4)+table(a5,a6)+table(a7,a8)+table(a9,a10)+table(a11,a12))%255)
http://www.purebasic.fr/english/viewtopic.php?p=268845
