Kolben-System

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Triology

Betreff: Kolben-System

BeitragMi, Feb 22, 2012 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,
ein Freund und ich haben heute aus Spaß ein kleines Kolben-System entwickelt.
Wir haben einen Schalter eingebaut und wollten jetzt machen, dass wenn der Hebel umgelegt wird, eine Sekunde vergeht und dann der Kolben hochgeht. Haben wir auch soweit geschafft. Nur bleibt das Programm nach dem Auslösendem Tastendruck eine Sekunde stehen, dann wechselt sich das Hebel-Bild und dann der Kolben.
Womit sollte man sowas am besten machen?
Delay, MilliSecs oder Timer? Oder sonst was anderes?
Wenn ihr wollt, poste ich morgen oder übermorgen noch meinen Code.

MfG Triology

Midimaster

BeitragMi, Feb 22, 2012 1:16
Antworten mit Zitat
Benutzer-Profile anzeigen
mit Millisecs()

da gibt es ein Tutorial von mir zu Timern:

https://www.blitzforum.de/foru...hp?t=34436

das dürfte für euch genau passen!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Mi, Feb 22, 2012 10:05, insgesamt einmal bearbeitet

Ana

BeitragMi, Feb 22, 2012 8:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde es so lösen:

BlitzBasic: [AUSKLAPPEN]
Type TKolben
Field Image,x,y,maxY,minY,dir = 1,Timer = MilliSecs()
End Type

Function DrawKolben(k:TKolben)
DrawImage k\image,k\x,k\y
If Timer + 1000 > MilliSecs() Then Return
k\y = k\y + dir
If k\y => k\maxy Or k\y <= k\minY Then dir = -dir
End Function


Also bei einem Type einfach einen int = Millisecs() setzen (Also den Startzeitpunkt aufschreiben) und wenn das plus 1000 (1 Sekunde) kleiner als Millisecs() ist (Der Wert wächst ja jede Millisekunde) dann die Bewegung starten. Bei dir klang es so als wenn er einfach nach oben ploppt, eine flüssige Bewegung ist mit einer Schleife und der Funktion ist doch eigentlich viel netter und nicht sonderlich schwer?

Und würde die Frage nicht im Beginner Teil mehr Sinn machen, ist sie doch sehr grundlegend?
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Xeres

Moderator

BeitragMi, Feb 22, 2012 10:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Da stimme ich Ana zu.

~VERSCHOBEN~
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)

Vertex

BeitragMi, Feb 22, 2012 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Solche Sachen, wo Abläufe bereits zur Entwicklungszeit bekannt sind, würde ich immer in ein Zustandsautomaten gießen. In diesem Fall vereinfacht: Wartend (1 s lang) -> Ausfahrend -> Ausgefahren.

Die Zustandsübergänge würde ich normalerweise durch Events auslösen, aber so kompliziert wollte ich es im folgenden Quelltext nicht machen:
BlitzBasic: [AUSKLAPPEN]
Const YELLOW    = $FFFFFF00
Const GREY = $FFCCCCCC
Const DARK_GREY = $FF999999

Const KEY_ESCAPE = 1
Const KEY_SPACE = 57

Const KOLBEN_STATE_IDLE = 1 ; Ruhezustand
Const KOLBEN_STATE_START_DELAY = 2 ; Warten beginnt
Const KOLBEN_STATE_DELAY = 3 ; Warten
Const KOLBEN_STATE_MOVING = 4 ; Kolben wird ausgefahren
Const KOLBEN_STATE_OUT = 5 ; Kolben ist ausgefahren

Type TKolben
Field position[2] ; x, y Koordinaten (unten, mitte)
Field moving# ; wie weit der Kolben ausgefahren ist: 0.0 ... 1.0
Field state ; aktueller Zustand
Field time ; Startzeit des Wartens und Ausfahrens [ms]
End Type

Function createKolben.TKolben(x, y)
Local kolben.TKolben = New TKolben
kolben\position[0] = x
kolben\position[1] = y
kolben\moving = 0.0
kolben\state = KOLBEN_STATE_IDLE

Return kolben
End Function

Function updateKolben(kolben.TKolben)
Select kolben\state
Case KOLBEN_STATE_IDLE
; nichts tun
Case KOLBEN_STATE_START_DELAY
kolben\time = MilliSecs()
kolben\state = KOLBEN_STATE_DELAY
Case KOLBEN_STATE_DELAY
; ist bereits 1 s verstrichen?
If MilliSecs() - kolben\time >= 1000 Then
kolben\time = MilliSecs()
kolben\state = KOLBEN_STATE_MOVING
EndIf
Case KOLBEN_STATE_MOVING
If kolben\moving = 1.0 Then
kolben\state = KOLBEN_STATE_OUT
Else
; der Kolben braucht 2 s zum vollständigen Ausfahren
kolben\moving = Float(MilliSecs() - kolben\time) / 2000.0
If kolben\moving > 1.0 Then kolben\moving = 1.0
EndIf
Case KOLBEN_STATE_OUT
; nichts tun
End Select
End Function

Function drawKolben(kolben.TKolben)
Color(0, 0, YELLOW)
Rect(kolben\position[0] - 60/2, kolben\position[1] - 130, 60, 130)

Local length = kolben\moving * 110
Color(0, 0, GREY)
Rect(kolben\position[0] - 26/2, kolben\position[1] - 130 - length, 26, length)

Color(0, 0, DARK_GREY)
Rect(kolben\position[0] - 32/2, kolben\position[1] - 130 - length - 14, 32, 14)
End Function

Graphics(800, 600, 0, 2)
SetBuffer(BackBuffer())

Local kolben.TKolben = createKolben(GraphicsWidth() / 2, GraphicsHeight() / 2)


While Not KeyDown(KEY_ESCAPE)
If KeyHit(KEY_SPACE) And kolben\state = KOLBEN_STATE_IDLE Then
kolben\state = KOLBEN_STATE_START_DELAY
EndIf
updateKolben(kolben)

Cls()
Text(10, 10, "Drücke [Space] zum Starten")
drawKolben(kolben)
Flip()
Wend

End
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group