BPS #5: Seifenblasenmaschine - Auswertung
Übersicht

![]() |
XeresModeratorBetreff: BPS #5: Seifenblasenmaschine - Auswertung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Zeit ist 'rum - wer konnte was hübsches mit den Seifenblasen anstellen?
Das war die Aufgabe Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern. Diskussion Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen. Nächste Aufgabe In drei Tagen, am 6. April wird die Musterlösung nach editiert und die nächste Aufgabe eingestellt. Viel Spaß & viel Erfolg! Musterlösung: Ein Objekt: BlitzBasic: [AUSKLAPPEN] Const gfx_w% = 800 Mit Types: BlitzBasic: [AUSKLAPPEN] Const gfx_w% = 800 |
||
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) |
- Zuletzt bearbeitet von Xeres am Do, Apr 07, 2011 1:12, insgesamt einmal bearbeitet
![]() |
PhillipB |
![]() Antworten mit Zitat ![]() |
---|---|---|
So diesmal habe ich mich auch mal dran gemacht und hier mein Code:
Code: [AUSKLAPPEN] Graphics 640, 480, 16
SetBuffer BackBuffer() Machine = LoadAnimImage("Machine.png", 128, 128, 0, 4) ;Daten laden Seifenblasen = LoadAnimImage("blasen.png", 64, 64,0, 5) MaskImage Seifenblasen, 255, 0, 255 ;Transparent effect MaskImage Machine, 255, 0, 255 Global M_einstellung = 0 Global S_einstellung# = 0 Global S_da# = 0.1 Global S_speed# = 340 Global S_anim# = 0 Timer=MilliSecs()+1000 ;Maschienen Timer SeifenblasenTimer=MilliSecs()+5400 ;SeifenblasenTimer MS=MilliSecs() While Not KeyHit(1) Cls ;Maschienen Ablauf: If Timer < MilliSecs() And M_einstellung = 0 ;Status änderung der Maschiene // Frame änderung durch M_einstellung M_einstellung = 1 Timer=MilliSecs()+3000 Else If Timer < MilliSecs() And M_einstellung = 1 M_einstellung = 2 Timer=MilliSecs()+1000 Else If Timer < MilliSecs() And M_einstellung = 2 M_einstellung = 3 Timer=MilliSecs()+300 Else If Timer < MilliSecs() And M_einstellung = 3 M_einstellung = 1 Timer=MilliSecs()+8000 EndIf ;Seifenblase starten: If M_einstellung = 3 Then ;Seifenblase erstellen S_da = 0 EndIf If S_da = 0 Then ;Speed geht immer herunter da die Y koordinate ja auch nach unten steigt S_speed = S_speed - 0.9 DrawImage Seifenblasen, 232, S_Y ,S_einstellung ;S_einstellung steht für den jeweiligen Frame EndIf ;Schnelligkeit: S_Y = S_speed ;S_Y ist für die Y Koordinaten der Seifenblase(Schnelligkeit) ;Weitere Einstellungen: If S_da = 1 Then ;Speed auf 340 für die Tiefste Koordinate stellen S_speed = 340 EndIf ;Seifenblase gesamt: If S_da = 0 And SeifenblasenTimer < MilliSecs() And S_einstellung = 0 Then S_einstellung = 1 SeifenblasenTimer=MilliSecs()+1000 ElseIf SeifenblasenTimer < MilliSecs() And S_einstellung = 1 Then S_einstellung = 2 SeifenblasenTimer=MilliSecs()+1000 ElseIf SeifenblasenTimer < MilliSecs() And S_einstellung = 2 Then S_einstellung = 3 SeifenblasenTimer=MilliSecs()+4000 Else If SeifenblasenTimer < MilliSecs() And S_einstellung = 3 Then S_einstellung = 4 Timer=MilliSecs()+7000 Else If SeifenblasenTimer < MilliSecs() And S_einstellung = 4 Then S_einstellung = 0 Timer=MilliSecs()+8000 S_da = 1 EndIf DrawImage Machine, 200, 350, M_einstellung ;Maschiene wird erstellt // M_einstellung steht für die Frames Flip Wend End Die erklärung ist in den Kommentaren ![]() Ich fande die Timer variante am einfachsten also mit millisecs! mfg PhillipB. |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] ;ozzi789 - BPS #5: Seifenblasenmaschine
;Initialisierung AppTitle "Seifenblasenmaschine" gfx_window_x=800 gfx_window_y=600 Graphics gfx_window_x,gfx_window_y,32,2 SetBuffer BackBuffer() ClsColor (30,40,220) timer=CreateTimer(60) ;Bilder Laden gfx_img_machine =LoadAnimImage("Machine4x128.png",128,128,0,4) gfx_img_bubble =LoadAnimImage("Bubbels5x64.png",64,64,0,5) MaskImage(gfx_img_machine,255,0,255) MaskImage(gfx_img_bubble,255,0,255) ;Type für die Blasen erstellen Type tbuble Field x Field y Field frame End Type While Not KeyHit(1) Cls If MilliSecs()>timecounter+500 ;Die Positionen der Blasen und den aktuellen Frame berechnen timecounter=MilliSecs() framecounter_img_machine=framecounter_img_machine+1 For t.tbuble= Each tbuble t.tbuble\frame=t.tbuble\frame+1 ;Frame immer erhöhen t.tbuble\y=t.tbuble\y-1 ;Immer ein px nach oben Next If framecounter_img_machine Mod 4 = 3 ;Falls Maschine wieder grün zeigt neue Blase erstellen t.tbuble = New tbuble t\x=(gfx_window_x-64)/2 t\y=(gfx_window_y-(170)) t\frame=3 EndIf EndIf For t.tbuble= Each tbuble ; Die Blasen zeichnen t.tbuble\y=t.tbuble\y-1 t.tbuble\x=t.tbuble\x+Sin(t.tbuble\y+Rand(-20,20)) If t.tbuble\y<50 DrawImage gfx_img_bubble,t.tbuble\x,t.tbuble\y,4 Else DrawImage gfx_img_bubble,t.tbuble\x,t.tbuble\y,t.tbuble\frame Mod 4 EndIf If t.tbuble\y<20 ;Wenn sie ganz oben ist kann man sie löschen Delete t.tbuble EndIf Next DrawImage gfx_img_machine,(gfx_window_x-128)/2,gfx_window_y-128,framecounter_img_machine Mod 4 ;Die Maschine einzeichnen WaitTimer timer Flip 0 Wend Sieht dann etwa so aus ![]() mfg |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@PhillipB: Schön, dass du mitmachst. Scheint zu funktionieren, aber: Man sieht deine Blase weder herumwackeln noch zerplatzen. Du behandelst deine Variablen etwas komisch:
Code: [AUSKLAPPEN] S_Y = S_speed Wenn du Geschwindigkeit und Koordinaten mischst, kann man nur verwirrt werden. Ich würde eher S_Y_StartPosition o.ä. nehmen und S_speed sollte das sein, was es aussagt - die Geschwindigkeit die Hardcoded bei 0.9 liegt.
Werfen wir mal einen Blick auf die Maschinensteuerung: BlitzBasic: [AUSKLAPPEN] If Timer < MilliSecs() And M_einstellung = 0 Wenn immer wieder der Gleiche Ausdruck da steht, lässt sich was optimieren. Da die Bedingungen mit AND Verknüpft sind, kann man die Bedingungen auch verschachtelt schreiben: BlitzBasic: [AUSKLAPPEN] If Timer < MilliSecs() Then Bei einfachen Zahlen, benötigt eine Select Case Konstruktion weniger Platz: BlitzBasic: [AUSKLAPPEN] If Timer < MilliSecs() ThenÄhnlich lässt sich auch Block mit der Seifenblase verkürzen. |
||
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) |
![]() |
PhillipB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstmal vielen dank für Die tipps ![]() Die Seifenblase zerplatzt aber. Das mit dem herumm schwirren muss ich mir mal näher angucken. |
||
![]() |
Nova |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zuerst wollte ich die Blasen noch etwas hin- und herschwingen lassen, habe das dann aber doch gelassen.
Dass die Seifenblasen leicht verzögert erstellt werden ist übrigens Absicht. ![]() Im Grunde funktioniert mein Programm nach folgendem Schema: Erst werden 5 Maschinen erstellt. In der Hauptschleife werden dann immer alle Maschinen und alle Seifenblasen durchgegangen. Für die einzelnen Teile der Bilder habe ich ein (nur schlecht erweiterbares) System auf If-Abfragen genutzt. Das war die einfachste Lösung für mich. ![]() BlitzBasic: [AUSKLAPPEN] ; Bereite alles vor, also die Grafik und die Timer |
||
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group