Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Bewegte, transparente Kreise mit Farbwechsel

Uploader:Redakteurnemored
Datum/Zeit:18.07.2014 17:41:38

' "Rauch"-Kreise (Regenbogeneffekt)
' Idee von dreael; Bewegung und Farbwechsel von nemored

#Define Fensterbreite  640
#Define Fensterhoehe   480
#Define Minimalradius    2
#Define Maximalradius   50
#Define Streifenbreite 2.0
#Define Streifenzahl    10
#Define AnzahlKreise    20

#Include Once "fbgfx.bi"

Randomize

Type Kreis
  As Single x, y, vx, vy, r, dr
  As Integer farbe
End Type

Function Quadrat(s As Single) As Single
  Quadrat = s * s
End Function

' Hier die Kreise unserer "Wolke"
Dim regenbogenfarben(47) As UInteger
For i As Integer = 1 To 8
  regenbogenfarben(i- 1) = RGB(     0,        0,   i*32-1)
  regenbogenfarben(i+ 7) = RGB(     0,   i*32-1,      255)
  regenbogenfarben(i+15) = RGB(     0,      255, 256-i*32)
  regenbogenfarben(i+23) = RGB(i*32-1,      255,        0)
  regenbogenfarben(i+31) = RGB(   255, 256-i*32,        0)
  regenbogenfarben(i+39) = RGB(256-i*32,      0,        0)
Next

Dim k(AnzahlKreise) As Kreis
For i As Integer = LBound(k) to UBound(k)
  With k(i)
    .x     = Rnd*Fensterbreite
    .y     = Rnd*Fensterhoehe
    .vx    = Rnd*10 - 5
    .vy    = Rnd*10 - 5
    .r     = Rnd*(Maximalradius-Minimalradius) + Minimalradius
    .dr    = Rnd - .5
    .farbe = Int(Rnd*(Ubound(regenbogenfarben) + 1))
  End With
Next

ScreenRes Fensterbreite, Fensterhoehe, 32, 1, FB.GFX_ALPHA_PRIMITIVES
Width 80, 30

Dim i As Integer, y As Integer, x As Integer, abstMin As Single, abst As Single
Dim j As Integer, f As Integer
Dim As Any Ptr hintergrund = ImageCreate(Fensterbreite, Fensterhoehe)
Dim As Any Ptr vordergrund = ImageCreate(Fensterbreite, Fensterhoehe)

For i=1 To 30
  For j=1 To 61 Step 20
    Locate i, j
    Print "Kreise mit CIRCLE *";
  Next j
Next i
Get (0, 0)-(Fensterbreite-1, Fensterhoehe-1), hintergrund

Do
  ' neue Kreisposition
  For i = LBound(k) To UBound(k)
    With k(i)
      .x += .vx
      If .x < 0 Or .x > Fensterbreite Then
        .vx *= -1
        .x += 2*.vx
      End If
      .y += .vy
      If .y < 0 Or .y > Fensterhoehe Then
        .vy *= -1
        .y += 2*.vy
      End If
      .r += .dr
      If .r < Minimalradius Or .r > Maximalradius Then
        .dr *= -1
        .r += 2*.dr
      End If
    End With
  Next
  ' zeichnen
  Line vordergrund, (0, 0)-(Fensterbreite-1, Fensterhoehe-1), rgb(255, 0, 255), BF
  For i = Streifenzahl To 0 Step -1
    For j = LBound(k) To UBound(k)
      If i > 0 Then
        f = k(j).farbe + i
        If f > UBound(regenbogenfarben) Then f -= UBound(regenbogenfarben)
        Circle vordergrund, (k(j).x, k(j).y), k(j).r + CSng(i) * Streifenbreite, regenbogenfarben(f), , ,1.0, F
      Else
        Circle vordergrund, (k(j).x, k(j).y), k(j).r + CSng(i) * Streifenbreite, RGB(255, 0, 255), , ,1.0, F
        k(j).farbe += 1
        if k(j).farbe > UBound(regenbogenfarben) Then k(j).farbe = 0
      End If
    Next j
  Next i
  ScreenLock
  Put (0, 0), hintergrund, Pset
  Put (0, 0), vordergrund, Trans
  ScreenUnlock
  Sleep 50
Loop Until Len(Inkey)