;
; ------------------------------------------------------------
;
; PureBasic - Drawing via Direct Screen Access (DSA)
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
; Примечание: отключите отладчик, чтобы работать на максимальной скорости!
;
#ScreenWidth = 800 ; Не стесняйтесь изменять это, чтобы видеть, с какой скоростью заполняются пиксели!
#ScreenHeight = 600
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Ошибка", "DirectX is needed.",0)
EndIf
Structure Pixel
Pixel.l
EndStructure
Procedure.f GSin(angle.f)
ProcedureReturn Sin(angle*(2*3.14/360))
EndProcedure
; Предварительно рассчитанные значения быстрее, чем расчетные в реальном времени...
; ..таким образом, мы сохраняем их в массиве прежде, чем запустить gfx операции.
Dim CosTable(#ScreenWidth*2)
Dim ColorTable(255)
For i = 0 To #ScreenWidth*2
CosTable(i) = GSin(360*i/320)* 32 + 32
Next
If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma")
Repeat
Wave+6
If Wave > 320 : Wave = 0 : EndIf
If StartDrawing(ScreenOutput())
Buffer = DrawingBuffer() ; Получить начальный адрес экранного буфера
Pitch = DrawingBufferPitch() ; Получить длину (в байтах) одной, отдельно взятой горизонтальной линии
PixelFormat = DrawingBufferPixelFormat() ; Получить формат пикселя.
If PixelFormat = #PB_PixelFormat_32Bits_RGB
For i = 0 To 255
ColorTable(i) = i << 16 ; Синий на уровне 3th пикселя
Next
Else ; Еще это 32bits_BGR
For i = 0 To 255
ColorTable(i) = i ; Синий на уровне 1th пикселя
Next
EndIf
For y = 0 To #ScreenHeight-1
pos1 = CosTable(y+wave)
*Line.Pixel = Buffer+Pitch*y
For x = 0 To #ScreenWidth-1
pos2 = (CosTable(x+Wave) + CosTable(x+y) + pos1)
*Line\Pixel = ColorTable(pos2) ; Write the pixel directly to the memory !
*Line+4
Next
Next
StopDrawing()
EndIf
ExamineKeyboard()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Else
MessageRequester("Ошибка","Can't open the screen !",0)
EndIf
End