Schneeflocken (mal wieder)
Übersicht

KrischanBetreff: Schneeflocken (mal wieder) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
![]() ![]() 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 ![]() matte.png ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Krischan hat Folgendes geschrieben: Der Fehler kam bei mir zwar nur im Debugmode...
Genau dann ist ja Handlungsbedarf ![]() ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
> 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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-Blitzehemals "SimssmiS" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group