PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » sine plasma


sine plasma

Сообщений 1 страница 3 из 3

1

Код:
If OpenWindow(0, 0, 0, 640, 400, "sine plasma!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 640, 400)
  
  CreateImage(0,640,400)
  *m=AllocateMemory(640*400*4)
  wdc=GetWindowDC_(WindowID(0))
  bdc=CreateCompatibleDC_(wdc)
  TemporaryBitmapInfo.BITMAPINFO
  GetObject_(ImageID(0), SizeOf(BITMAP), TemporaryBitmap.BITMAP)
  
  TemporaryBitmapInfo\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  TemporaryBitmapInfo\bmiHeader\biWidth       = TemporaryBitmap\bmWidth
  TemporaryBitmapInfo\bmiHeader\biHeight      = -TemporaryBitmap\bmHeight
  TemporaryBitmapInfo\bmiHeader\biPlanes      = 1
  TemporaryBitmapInfo\bmiHeader\biBitCount    = 32
  ;TemporaryBitmapInfo\bmiHeader\biCompression = #BI_RGB
  
  ;https://www.purebasic.fr/english/viewtopic.php?t=25276&highlight=copymemorytoimage  
  AddWindowTimer(0, 0, 10) ; Timeout = 10 ms
  
  a0.a=0
  b0.a=0
  c0.a=0
  d0.a=0
  Dim st.a(255)
  For i=0 To 255
    st(i)=Int( 32+31*Sin(i*#PI/128) )
  Next i
  Dim sx.a(320)
  Dim sy.a(320)
  
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Timer
      aa.a=a0
      a0+1
      bb.a=b0
      b0+2
      cc.a=c0
      c0+3
      dd.a=d0
      d0+1
      For i=0 To 319
        sx(i)=st(aa)+st(bb)
        sy(i)=st(cc)+st(dd)
        aa+1
        bb+2
        cc+1
        dd+4
      Next i
      *p=*m
      For y=0 To 199
        For x=0 To 319
          c.a=sy(y)+sx(x)
          ;c.a=(x!y)+t
          ;r.l=(c<<16)|(c<<8)|c
          r.l=PeekL(?pal+c*4)
          PokeL(*p,r)
          PokeL(*p+4,r)
          PokeL(*p+640*4,r)
          PokeL(*p+4+640*4,r)
          *p+8
        Next x
        *p+(640*4)
      Next y
      res=SetDIBits_(bdc, ImageID(0), 0, TemporaryBitmap\bmHeight, *m, TemporaryBitmapInfo, #DIB_RGB_COLORS)
      StartDrawing(CanvasOutput(0))
      DrawImage(ImageID(0),0,0)
      StopDrawing()
    EndIf
    
  Until Event = #PB_Event_CloseWindow
  FreeMemory(*m)
  DeleteDC_(bdc)
  ReleaseDC_(WindowID(0),wdc)
  
EndIf

DataSection
  pal:
  Data.l $2FD,$6FE,$CFE,$13FE,$118FD,$21FFC,$126FE,$2BFE,$30FE,$35FE,$3BFF,$41FE,$48FE,$4EFD,$154FD,$458FE
  Data.l $460FF,$463FF,$36AFF,$171FF,$78FE,$7EFE,$84FD,$88FE,$28EFF,$293FF,$198FF,$29FFF,$A5FE,$ADFD,$B3FE,$B6FF
  Data.l $BEFD,$1C3FF,$2CAFF,$2D1FF,$D6FD,$DDFD,$E4FC,$EAFE,$EFFE,$F4FE,$1FAFF,$2FDFC,$1FFF5,$1FEEF,$FFE9,$FEE7
  Data.l $2FFDE,$1FDDA,$FDD4,$FECC,$FFC7,$FFC0,$FFB9,$FEB5,$FEAE,$FEAB,$1FDA4,$1FE9D,$FE97,$FF8F,$FE89,$FE86
  Data.l $3FE7D,$1FE79,$FD74,$FE6C,$FE67,$FF5F,$FF59,$FE54,$FE50,$1FD4C,$1FC45,$FD3E,$1FE39,$FF31,$FE2C,$FD27
  Data.l $1FF1F,$FE1B,$FE14,$FD0D,$FE07,$1FF01,$5FF00,$8FF00,$11FF00,$17FE01,$1CFD01,$24FE00,$2AFE01,$31FE01,$34FE00,$37FF00
  Data.l $41FF00,$44FE00,$4AFE00,$50FE00,$58FD01,$5EFE00,$64FD00,$6AFE00,$6FFE01,$74FE00,$7AFE00,$81FE00,$89FE01,$8EFD01,$94FE01,$98FD01
  Data.l $A0FE00,$A2FE00,$A8FE00,$B0FD01,$B6FE00,$BDFD00,$C4FD00,$C7FD00,$CFFE01,$D2FE00,$D9FF00,$E0FE00,$E6FE00,$EEFE00,$F4FF00,$F6FE00
  Data.l $FEFD01,$FDF900,$FDF200,$FEEB00,$FFE501,$FFDE02,$FFD800,$FFD300,$FECD00,$FCC800,$FDC300,$FCBC00,$FFB600,$FFAF00,$FFA800,$FFA500
  Data.l $FB9F00,$FA9B00,$FB9400,$FE8E00,$FF8600,$FF8101,$FF7A01,$FE7600,$FC7000,$FC6B00,$FD6600,$FC5F00,$FF5900,$FF5101,$FF4B00,$FF4800
  Data.l $FF4001,$FE3C00,$FC3400,$FD2E00,$FF2801,$FF2202,$FF1A02,$FF1400,$FF0F00,$FF0A00,$FD0400,$FC0102,$FD0009,$FD000F,$FF0015,$FF0017
  Data.l $FC0020,$FD0124,$FF022B,$FF0032,$FF0038,$FE003E,$FF0046,$FF0049,$FF0050,$FE0053,$FC0059,$FC0060,$FF0067,$FF006F,$FE0074,$FF0077
  Data.l $FB0081,$FC0084,$FF018A,$FF0091,$FF0097,$FE009E,$FF00A5,$FE00A9,$FF00AE,$FD01B2,$FD02B9,$FE01C0,$FD00C5,$FF00CD,$FF00D2,$FF01D7
  Data.l $FD00DD,$FF01E2,$FF01E8,$FF01F1,$FF01F6,$FD00FB,$F900FE,$F600FF,$EE00FE,$E700FD,$E201FD,$DA01FC,$D400FD,$CD00FD,$CA00FD,$C700FE
  Data.l $BC01FE,$B800FE,$B401FE,$AC01FD,$A601FD,$9E01FC,$9801FE,$9400FE,$8F00FD,$8C00FF,$8600FF,$7D00FE,$7700FE,$7000FE,$6B00FD,$6800FF
  Data.l $5D00FE,$5B00FE,$5500FD,$4E01FD,$4800FE,$4000FD,$3900FD,$3600FE,$2F00FD,$2C00FF,$2500FF,$1E00FF,$1800FF,$1000FF,$A00FF,$800FF

0

2

Код:
; Инициализация графического окна
If OpenWindow(0, 0, 0, 640, 480, "Animated Plasma", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If InitSprite() And InitKeyboard() And OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
    
    ; Переменная времени для анимации
    time.f = 0
    
    ; Основной цикл
    Repeat
      ; Обработка событий
      Repeat
        Event = WindowEvent()
        If Event = #PB_Event_CloseWindow
          Quit = 1
        EndIf
      Until Event = 0
      
      ; Начало рисования на экране
      StartDrawing(ScreenOutput())
      
      ; Генерация плазмы с учетом времени
      For y = 0 To 479
        For x = 0 To 639
          ; Вычисление значения плазмы для каждого пикселя
          value.f = Sin(x / 32 + time) + Sin(y / 32 + time) + Sin((x + y) / 32 + time) + Sin(Sqr(x * x + y * y) / 32 + time)
          color = RGB((value + 4) * 32, (value + 4) * 32, (value + 4) * 32)
          Plot(x, y, color)
        Next
      Next
      
      ; Завершение рисования
      StopDrawing()
      
      ; Обновление экрана
      FlipBuffers()
      
      ; Увеличение времени для анимации
      time + 0.05
      
      ; Обработка клавиатуры
      ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Escape)
        Quit = 1
      EndIf
    Until Quit
    
  EndIf
EndIf

End

0

3

На современных процах код покатит. на стареньких превратится в пошаговую анимацию.
Опрос клавиатуры я бы изменил на:

Код:
If GetAsyncKeyState_(#VK_ESCAPE)&32768
break
endif

0


Вы здесь » PureBasic - форум » PureBasic для Windows » sine plasma