Schneeflocken (mal wieder)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krischan

Betreff: Schneeflocken (mal wieder)

BeitragSa, Dez 04, 2010 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image user posted image

Hier ein aus purer Langeweile (und zu viel Schnee draussen) entstandener Code, der das Blitz Basic Portal Logo mit am Ende bis zu 50.000 Schneeflocken pro Frame zuschneit. Es werden zwei Bilddateien benötigt: header.png für das Logo und matte.png für die Bereiche, an denen die Flocken auf Widerstand stossen (sollte s/w sein, schwarz=frei, weiss=Widerstand). Wer mag kann es noch verbessern, ist lange nicht perfekt:

header.png
user posted image

matte.png
user posted image

Code: [AUSKLAPPEN]
Graphics 575,80,32,2

SetBuffer BackBuffer()

Global SW%=GraphicsWidth()
Global SH%=GraphicsHeight()

Const startflakes%=0      ; start amount of flakes
Const totalflakes%=50000   ; maximum amount of flakes
Const snowchance#=100      ; chance in % for new flakes
Const chanceflakes#=100      ; randomize amount of new flakes (1...x)

Type snow
   
   Field x#,y#
   Field col%
   Field dirx#,diry#
   
End Type

CreateSnow(startflakes)

logo=LoadImage("header.png") : Global lbuffer=ImageBuffer(logo)
matte=LoadImage("matte.png") : Global mbuffer=ImageBuffer(matte)

Dim SNOW%(SW,SH)
LockBuffer mbuffer
For y=0 To SH-1
   For x=0 To SW-1
      r=(ReadPixelFast(x,y,mbuffer) And $ff0000)/$10000
      If r<>0 Then SNOW(x,y)=1 Else SNOW(x,y)=0
   Next
Next
UnlockBuffer mbuffer


fbuffer=FrontBuffer()

timer=CreateTimer(60)

While Not KeyHit(1)
   
   Cls
   
   DrawImage logo,0,0
   
   LockBuffer fbuffer
   
   AppTitle UpdateSnow(fbuffer)+" Flocken"
   
   UnlockBuffer fbuffer
   
   Flip 0
   
   WaitTimer timer
   
Wend

End

Function UpdateSnow(buffer%)
   
   Local counter%=0
   
   LockBuffer buffer
   
   For s.snow = Each snow
      
      recycle=False
      
      ; count flakes
      counter=counter+1
      
      ; add horizontal movement
      s\x=s\x+Rnd(-1,1)
      
      ; add vertical movement
      s\y=s\y+s\diry
      
      ; flake reached screen bottom
      If s\y>SH-1 Then RecycleFlake(s)
      If s\y<0 Then RecycleFlake(s)
      
      ; flake hit snow
      If s\y>=0 And s\x>=0 And s\x<SW And s\y<SH Then
         
         fx=Int(s\x)
         fy=Int(s\y)
         
         dist%=Rand(1,2)
         
         If fx<dist Then fx=(SW-dist)+fx
         If fx>(SW-dist) Then fx=fx-(SW-dist-1)
         
         If SNOW(fx,fy)<>0 Then
            
            fx=fx+(SNOW(fx-dist,fy+1)-SNOW(fx+dist,fy+1))
            
            If fx<dist Then fx=(SW-dist)+fx
            If fx>(SW-dist) Then fx=fx-(SW-dist-1)
            
            If fy<1 Then fy=1
            If fy>SH-2 Then fy=SH-2
            
            If SNOW(fx,fy)<>0 Then
               
               SNOW(fx,fy-1)=(SNOW(fx-dist,fy)+SNOW(fx+dist,fy)+SNOW(fx,fy-1)+SNOW(fx,fy+1))*Rnd(0.1,0.25)
               
               RecycleFlake(s)
               LockBuffer lbuffer
               rgb=s\col*$10000+s\col*$100+s\col
               WritePixelFast fx,fy,rgb,lbuffer
               UnlockBuffer lbuffer
               
            EndIf
         EndIf
         
      EndIf
      
      ; draw pixel if onscreen
      rgb=s\col*$10000+s\col*$100+s\col
      If s\y>=0 And s\y<SH And s\x>=0 And s\x<SW Then
         
         WritePixelFast Int(s\x),Int(s\y),rgb,buffer
         
      EndIf
      
   Next
   
   ; create new flakes up to maximum amount
   c=Rand(1,chanceflakes)
   If counter+c<=totalflakes And Rnd(1)>(1-(snowchance/100.0)) Then
      For i=1 To c
         CreateNewFlake()
      Next
   EndIf
   
   UnlockBuffer buffer
   
   Return counter
   
End Function

Function RecycleFlake(s.snow)
   
   s\x=Rnd(0,SW-1)
   s\y=Rnd(-SH,-1)
   s\col=Rand(192,255)
   s\dirx=Rnd(-1,1)
   s\diry=Rnd(0.5,2)
   
End Function

; creates the initial flakes
Function CreateSnow(flakes%=1)
   
   Local i%
   
   For i=1 To flakes
      
      CreateNewFlake()
      
   Next
   
End Function

; creates an additional flake
Function CreateNewFlake()
   
   s.snow = New snow
   s\x=Rnd(0,SW-1)
   s\y=Rnd(-SH,0)
   s\col=Rand(192,255)
   s\dirx=Rnd(-1,1)
   s\diry=Rnd(0.5,1)
   
End Function
  • Zuletzt bearbeitet von Krischan am So, Dez 05, 2010 11:23, insgesamt 3-mal bearbeitet

ToeB

BeitragSa, Dez 04, 2010 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht gut aus, bekomme aber immer nach ein paar sekunden einen "Array out of bounds" an dieser Zeile :

Code: [AUSKLAPPEN]
fx=fx+(SNOW(fx-d1,fy+1)-SNOW(fx+d1,fy+1))


Bitte bau da eine Überprüfung ein !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Krischan

BeitragSo, Dez 05, 2010 11:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehler kam bei mir zwar nur im Debugmode aber ich habe den Code nun dahingehend verändert, dass die Flocken nun horizontal wrappen, bzw. keinen MAV mehr verursachen und sich zudem nicht zu hoch stapeln.

Hubsi

BeitragSo, Dez 05, 2010 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Krischan hat Folgendes geschrieben:
Der Fehler kam bei mir zwar nur im Debugmode...

Genau dann ist ja Handlungsbedarf Mr. Green Ohne Debug passiert mit etwas Glück zwar nix, aber ein anderer wurschtelt in "bewohntem" Arbeitsspeicher rum der vielleicht von Windows genutzt wird oder sonst einem Programm und verliert möglicherweise wichtige Daten die noch nicht gespeichert wurden, z.B. eine unheimlich aufwendige und komplizierte Function um mal vom GAU auszugehen Very Happy Also bitte im Sinne Deiner Mitstreiter von solchen Gedanken Abstand nehmen. Danke Mr. Green
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Krischan

BeitragSo, Dez 05, 2010 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
> Also bitte im Sinne Deiner Mitstreiter von solchen Gedanken Abstand nehmen. Danke

Das Leben ist aber auch kein Ponyhof mit 100% Sicherheit. No Risk no Fun. Ich finde, Du übertreibst...

Hubsi

BeitragSo, Dez 05, 2010 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar, das war jetzt der übelste Fall der auftreten könnte, aber schon ein freezen des Systems, ohne Spätfolgen, ist mehr als lästig. Von daher sehe ich mich als Softwarezusammenklopper in der Pflicht das System des Anwenders nicht zu schädigen oder (schlimmster Fall) ideelle Werte ins Nirvana zu jubeln, weil es mir egal war das mein Programm außerhalb seines Speichers rumgeistert.

Wer also keine Exe von Dir ausführt kannst Du dir ja jetzt selbst zusammenreimen Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Xeres

Moderator

BeitragSo, Dez 05, 2010 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mir ziemlich sicher, dass Array Indizes automatisch auf die Größe beschränkt werden. BB hat ja als Anfängersprache genügend Sicherheitsmechanismen die ansonsten bei allem einen MAV produzieren.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Hubsi

BeitragSo, Dez 05, 2010 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Möglich. Ich kenne das Phänomen von meinem ersten "Spiel" was in BB entstand. Dort hatte ich es auf Win98 geschafft das OS zu freezen mit einem außerplanmäßigen Speicherzugriff (ebenfalls ein Array). Das ganze liegt allerdings ein paar BB-Updates zurück. Die Allergie gegen sowas jedoch ist geblieben Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Krischan

BeitragSo, Dez 05, 2010 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann es sein, dass Du nicht allzu viel Vertrauen in die Stabilität von Blitzbasic und die Weitsicht von Mark Sibly hast? Solange ich im Speicherbereich vom BB-Prozess oder der Grafikkarte bin OHNE irgendwelche manipulierenden DLLs zu benutzen ist die Wahrscheinlichkeit, dass da irgendwas böses mit meinem 1000-Seitigen, noch nicht abgespeicherten Harry-Potter-übertreff-Roman in Word passiert doch in etwa so hoch wie dass ein Affe in einer Buchstabensuppe rührend zufällig ein Zitat von Goethe herausfischt.

Das schlimmste ist ein MAV und dann wird der Prozess halt beendet. BB hat ja hier sogar SELBST erkannt, dass da ein Wert ausserhalb des Arrays angesprochen wurde und das im nicht-Debugmode sogar ignoriert, also NICHT durchgeführt. Aber wenn Du das weiter diskutieren willst, kannste gerne einen eigenen, neuen Thread aufmachen, da das eigentliche "Problem" ja bereits von mir gefixt wurde und Du Dich zum Inhalt meines Codearchiv-Eintrags eigentlich noch gar nicht geäussert hast.

Noobody

BeitragSo, Dez 05, 2010 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
BB überprüft Arrayindizes, Bankzugriffe und andere Spässe nur im Debugmode (darum ist der ja auch so langsam). Im Release-Modus werden all diese Überprüfungen aus Geschwindigkeitsgründen weggelassen, da man das Programm ja ausführlich getestet haben sollte, bevor man den Debugger deaktiviert. Im Release kann man also wild im Speicher herumstochern, wenn man Lust dazu hat - aber nur im Speicher des eigenen Programms. Das wäre ja noch schöner, wenn ein fehlerhaftes Programm (z.B. durch den eher häufigen Nullpointer) das ganze Betriebssystem crasht. Windows erlaubt einem nur, im Adressraum des eigenen Programms zu arbeiten, für alles andere benötigt man die WinAPI.

Trotzdem aber ist es natürlich unschön, wenn ein Eintrag im Codearchiv russisches Array-Roulette spielt - das das halt "zum Leben dazugehört" ist da nicht wirklich ein Argument. Aber es wurde ja bereits gefixt.

Und noch als Hinweis: Im Grafikspeicher kann man nicht herumstochern. Und wenn es ginge, dann mit BB sowieso nicht Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

US-Blitz

ehemals "SimssmiS"

BeitragSo, Dez 05, 2010 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
cooles prog nur kann mir einer sagen wie ich das auf andre bilder anwende sprich andere größe

EDIT: wer suchet der findet graphics fenster verändert andere bilder genommen fertig sry für die frage war ja echt einfach

EDIT2: damit der post noch nen sinn bekommt ein Verbesserungs Vorschlag:
Man könnte noch einbauen das hinter Der Matte also an allen stellen wo auf der Matte nichts Weiß ist auch schnee Fällt aber nicht liegen bleibt denn sonst sieht das Bei großen Bildern Komisch aus

Nicdel

BeitragMo, Dez 06, 2010 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Satzzeichen würden helfen deine Posts lesbarer zu machen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group