Zeitverzögerung
Übersicht

First-ClimberBetreff: Zeitverzögerung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich wollte mit meinem kleinen Anfänger Projekt eigentlich auf jegliche fremde Hilfe verzichten, jedoch weiß ich im Moment einfach nicht weiter.
Die Forumsuche oder fremde Quellcodes brachten mich leider auch nicht wirklich weiter bei diesem Problem. Es ist eigentlich ganz simpel: Code: [AUSKLAPPEN] Graphics 1000,500,32,2
SetBuffer BackBuffer() ;.........................................................Globale Variabeln Global ship, explosion, life, armor Global lifepoint Global lifepoint_max Global armorpoint Global counter Global foe_count Global shot_count ;.........................................................Bilder laden life=LoadImage ("d:\space shooter\gfx\heart.jpg") armor=LoadImage ("d:\space shooter\gfx\armor.jpg") ship=LoadImage ("d:\space shooter\gfx\ship.jpg") ship_foe01=LoadImage ("d:\space shooter\gfx\ship_small.jpg") shot=LoadImage ("d:\space shooter\gfx\shot.jpg") explosion=LoadAnimImage ("d:\space shooter\gfx\Explosion.bmp",64,64,0,32) ;........................................................Lokale Variabeln Local player_x Local player_y Local Player_Lastschuss=0 ;........................................................Variabeln deklarieren lifepoint=100 armorpoint=100 player_x=50 player_y=100 ;........................................................TYPES Type shot Field x Field y Field dead Field number ; Anzahl Schüsse momentan im Spiel End Type Type foe Field x Field y Field dead Field crash Field speed End Type Type star Field x Field y Field scale# Field speed Field number Field del End Type ;...............................................................Mainloop.................................................................................................. Repeat Cls ;Figur If lifepoint>=1 Then DrawImage ship, player_x,player_y ;.....................................................Normales Schiff Else ;..................................................................................Ansonsten Explosion If MilliSecs() > tmr + 30 Then tmr = MilliSecs() frm = (frm + 1) Mod 32 xy=xy+1;........................................................................zählen gegen unendliche Animation End If If xy<32 Then DrawImage explosion, player_x, player_y, frm ;............................Explosion einleiten EndIf star_field ();..............................................................................Sternenfeld erstellen hud ();.....................................................................................Hud anzeigen lassen ;Steuerung If lifepoint>=1 Then If KeyDown(208) Then player_y=player_y+10 ;.............................................Nach Oben If KeyDown(200) Then player_y=player_y-10 ;.............................................Nach unten If KeyDown (205) Then player_x=player_x+5 ;.............................................Nach rechts If KeyDown (203) Then player_x=player_x-5 ;.............................................Nach links EndIf ;Feldbegrenzung If player_y<0 Then player_y=0 If player_y>480 Then player_y=480 ;Gegner If foe_count <2 Then create_foe ();........................................................Gegner Begrenzung For f.foe = Each foe ;.....................................................................Alle Gegner durchgehen If f\dead=0 Then f\x=f\x-f\speed;.........................................................................Bewegung des Gegners DrawImage ship_foe01, f\x, f\y;....................................................Gegner einzeichnen EndIf crash_ship=ImagesCollide (ship, player_x, player_y, 0, ship_foe01, f\x, f\y, 0);...Player Kollision Foe überprüfen If crash_ship = 1 Then ;...........................................................Falls Kollision, Foe zerstören f\dead=1 lifepoint=0 EndIf If shot_count >=1 Then;............................................................Falls es überhaupt Schüsse gibt dann... For s.shot = Each shot;........................................................Alle Schüsse durchgehen crash_shot=ImagesCollide (ship_foe01, f\x, f\y, 0, shot, s\x, s\y, 0);.....Feindliche Schiffe und Schüsse auf Kollision prüfen If crash_shot=1 And a_x=0 Then;............................................Falls es einen Crash gab f\dead=1;..............................................................Wird der Gegner zerstört s\dead=1;..............................................................Wird der Schuss zerstört EndIf Next EndIf If f\x<0 Then f\dead=1;............................................................Bei MapEnde Zerstörung einleiten If f\dead=1 Then;..................................................................Falls Zerstörung notwendig Delete f.foe;..................................................................Zerstören foe_count=foe_count-1;.........................................................Foe_Count um eins verringern EndIf Next ;Schuss If lifepoint>=1 Then If KeyDown (28) And Player_Lastschuss<MilliSecs() -300 Then;...........................Feuerrate (fehlt noch Variable) create_shot (player_x+20, player_y+22) Player_Lastschuss=MilliSecs() EndIf EndIf For s.shot = Each shot s\x=s\x+20;....................................................................Schussgeschwindigkeit (fehlt noch Variable) DrawImage shot, s\x, s\y;......................................................Schuss zeichnen If s\x>900 Then s\dead=1;......................................................Falls der Schuss die 900er Marke verlässt, wird er zerstört (am Ende auf 1000 setzen) If s\dead=1 Then Delete s.shot;.............................................................Zerstörung des Schusses shot_count=shot_count-1;...................................................Schuss"zähler" um eins verringern EndIf Next Flip Forever ;..............................................................................................Funktionen Function create_shot (x,y) shot_count=shot_count+1 s.shot=New shot s\x=x+20 s\y=y+5 s\dead=0 ;........................................................................................................Function Create Foe End Function Function create_foe () If lifepoint>=1 Then foe_count=foe_count+1 f.foe=New foe f\x=1050 f\y=Rand (20,500) f\dead=0 f\crash=0 f\speed=Rand (4,8) EndIf End Function ;.........................................................................................................Function Star Field Function star_field () ;Variabeln deklarieren For x = 0 To number t.star=New star t.star\x=1000 t.star\y=Rand (20,480) t.star\scale#=Rand (0.5,1.5) t.star\speed=Rand (1,3) Next For t.star = Each star t\x=t\x-t\speed ;Position an Speed anpassen Oval t\x, t\y, t\scale, t\scale ;Sterne erstellen If t\x<0 Then t.star\del=1 If t\del=1 Then Delete t.star ;Sterne löschen EndIf Next End Function ;.........................................................................................................Function HUD Function hud () ;Lebenspunkte DrawImage life, 30,460 Color 255,0,0: Text 50,480, lifepoint ;Lebenspunkte anzeigen Color 255,255,255 ;weiße Farbe wieder anpassen ;Panzerung DrawImage armor, 90, 457 Color 240,240,240: Text 115, 480, armorpoint; Panzerung anzeigen Color 255,255,255 ;weiße Farbe wieder anpassen End Function Das ist der Code meines ersten Projektes. Wenn man selber mit feindlichen Schiffen kolidiert, explodiert man vorschriftsgemäß. Jedoch kann ich diesen Mechanismus auf Teufel komm raus nicht bei den Gegnern einbauen, wenn diese von einem Schuss getroffen werden. Vielleicht kann mir da jemand einen Tipp geben. Ich komme einfach nicht auf die Lösung. Eigentlich ist es ganz einfach. Wenn er getroffen wird, soll ein Timer angehen, der die Explosion erstellt. Möglicherweise kann mir ja jemand auch allgemeine Tipps zum Thema Zeitverzögerung geben. Den Code Code: [AUSKLAPPEN] Graphics 400,300,0,2
SetBuffer BackBuffer() ms=MilliSecs() ;ms speichert den Zeitpunkt mit Millisecs While Not KeyHit(1) If MilliSecs() > ms+10000 Then ;irgendwas ms=MilliSecs () EndIf Wend hier verstehe ich, jedoch kann ich folgendes nicht zustande bringen: Nehmen wir an, 3 Gegner fliegen hintereinander Der erste soll nach x Sekunden ein wenig nach unten fliegen, Später sollen ihm langsam die anderen folgen. So eine Art Wellenbewegung. Ich habe es nur geschafft, dass sich alle gleichzeitig bewegen, jedoch halt ohne diese Zeitverzögerung. Anderes Beispiel: Ich drüche eine beliebige Taste, der Spieler nähert sich einem Punkt oder was weiß ich. Diese Aktion startet einen Timer. Nach x Sekunden passiert dann etwas. Solche Dinge. Es wäre wirklich nett, wenn mir da jemand ein paar allgemeine Tipps geben könnte. Hier sind noch die Bilder für das oben genannte Spiel http://www.materialordner.de/5...VZmeU.html First-Climber |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für Explosionen würde ich einen weiteren Type erstellen, der immer neu generiert wird, wenn ein Schiff zerstört wird.
Wenn du öfters/für jeden Type Timer brauchst - schreib dir einen Timer-Type! Du brauchst nur eine Check Funktion, die dir zurückgibt, ob der Timer ausgelaufen ist oder nicht. Hintereinander fliegende Schiffe sind mit Types ohne Hilfe nicht so einfach zu identifizieren. Vielleicht hilft eine Zahl, die Richtung/Flugmodus anzeigt - oder du gibst als Field das folgende Schiff an. Edit: Allgemeiner Tipp: Flip(0) + Waittimer() (siehe Hurra, 100 % Auslastung) |
||
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) |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jap, Types sollten es bringen.
Noch zwei Anmerkungen: Benutze relative Pfade, lass also das d:\.. weg. So kann man den Ordner hinkopieren wo man will. Mach das Spiel mit Esc abbrechbar. Zb mit Code: [AUSKLAPPEN] Repeat
.. Until keydown(1) Ansonsten machs mal fertig ![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
First-Climber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Tipps, ich werde mal schauen, wie ich das mit den Types lösen kann.
Edit: Bei Flip 0 jedoch ruckeln die feindlichen Schiffe ganz leicht... Edit2: Das Problem mit den Timern ist gelöst, nur das leichte Ruckeln noch nicht. |
||
![]() |
faeX |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dein Ruckeln erklärt sich leicht (folgt mal ein kurzer Ex-kurs zum Thema Doublebuffering):
Mit dem SetBuffer ![]() Es gibt viele Buffer, 2 davon sind: Der BackBuffer: Ein Speicher im Hintergrund, der nicht angezeigt wird Der FrontBuffer: Der Bildschirminhalt Wozu BackBuffer? Die Grafikkarte tauscht in regelmäßigen Abständen (der sogenannten Taktfrequenz, bsp: 60Hz, 76Hz = 60 o. 76 mal die Sekunde) den hardwareinternen BackBuffer mit dem FrontBuffer aus, damit das was gezeichnet werden soll nicht direkt auf dem Bildschirm erscheint. Das würde von dem Auge dann als Flackern wargenommen werden. Mit SetBuffer BackBuffer() schaltest du allerdings auf den softwareinternen BackBuffer. Du zeichnest erstmal in den BackBuffer, und tauscht dann FrontBuffer mit BackBuffer aus (dafür gibt's Flip ![]() ![]() Um das zu vermeiden gibt es VSync (Befehl: VWait ![]() ![]() Das und mehr steht übrigens auch in dem Tutorial Hurra, 100% Auslastung. Lies es dir durch! Ist nicht so schwer und hilft! ![]() |
||
First-Climber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das mit den Buffern habe ich so grob auch schon gelesen, jedoch bedanke ich mich für den kleinen Tipp mit dem Befehl.
Jetzt ist das Ruckeln verschwunden und so ziemlich alle bisherigen Fragen beantwortet. Vielen Dank ! ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group