![]() |
Re: Jump and Run! need help !
try this... spiel mal bissl mit den sleep werten und den until bedingungen..
Delphi-Quellcode:
Gruß
var
nCurrTop : integer; begin with ImgCartman do begin // Zwischenspeichern der aktuellen Höhe speichern nCurrTop := Top; // Hochspringen repeat Top := Top - 10; { TODO -oBartuc : hier kannst du noch eventuell nach links oder rechts springen.. einfach mit Left := Left +/- n; } // Kurz warten damit's ned zu schnell geht.. Sleep(15); // Rechenzeit frei geben damit das Bild auch flüssig hoch und runter hüpft... Application.ProcessMessages; until ( Top = nCurrTop - 150 ); // Und wieder runter fallen... repeat Top := Top + 10; Sleep(15); Application.ProcessMessages; until ( Top = nCurrTop ); end; Reli |
Re: Jump and Run! need help !
Danke schonmal für die Tipps...
Also flüssig springen tut er jetzt schon, aber jetzt gibt es eine andere sache. Wenn ich nach links oder nach rechts gehe, fängt der auch an zu springen. Wie kann ich denn den Befehl "springen" auf die Leertaste belegen? |
Re: Jump and Run! need help !
klar... musst bei dir mit in den case-switch bauen...
Delphi-Quellcode:
hast es doch quasi selbst schon geschrieben wie du es einsetzen musst :-)
VK_Space: begin
// hier rein end; die variablendeklaration muss natürlich zwischen procedure und dem begin gruß Reli |
Re: Jump and Run! need help !
Cool danke... klappt soweit....
Nur gibt es jetzt noch ein kleines Problemschen. wenn ich 2xmal die Leertaste drücke bleibt das bild weiter oben stehen. gibt es ein befehl der das bild beim sprung immer auf eine "Grundlinie" bringt? |
Re: Jump and Run! need help !
Du solltest einfach beim drücken der Taste Space vorher überprüfen, ob das Bild auf der Grundlinie ist. Und nur dann den Code ausführen der es springen lässt.
Uwe |
Re: Jump and Run! need help !
ich denke mal am besten wäre es, wenn du dir einen timer einbaust, der alle 50ms überprüft, ob sich unter deinem bild ein "boden" (z.b. ein anderes bild) befindet, wenn dies nicht der fall sein sollte, fällt cartman runter, bis er an einem bild ist (deswegen timer)
hat den vorteil, das du im fall noch irgendwas anderes berechnen kannst, und nicht in der schleife hängst würde das evtl so umbauen, das dein bild ne globale variable für die geschwindigkeit hat (in x und y) die dann jedesmal beim durchlauf des timers beachtet wird (bzw. geändert durch schwerkraft) dann musst du nur beim sprung definieren, das Vy = 20 ist, und das ding fliegt los, der timer bewegt bei jedem durchlauf das bild um 20 pixel nach oben, und zieht von Vy z.b. 5 ab sodas er in der nächsten schleife nur noch 15 nach oben geht und so weiter bis er irgend wann mal bei 0 pixeln, dann gehts wieder rückwärts. ne kollisions abfrage rein, damit er auch wieder am boden damit aufhört. beim laufen setzt du einfach Vx auf +/- 10 oder so und wenn die taste losgelassen wird wieder auf 0 zurück (außer du bist in der luft dann fliegt er sogar parabeln, wenn er schief springt). wenn du das alles hast, hast du quasi ne simple physik engine, die das schon sehr realistisch aussehen lassen MfG |
Re: Jump and Run! need help !
Zitat:
und wo geb ich das an? Zitat:
und wie schreibe ich eine Kollisionsabfrage? Danke schonmal für die Erläuterungen. Bin erst paar monate mit Delphi am programmieren und hab noch nicht soviel Ahnung von den Begriffen. :wink: |
Re: Jump and Run! need help !
Programmierst du objektorientiert, d.h. du verwendest mehrere Units mit mehreren Klassen? Das erweist sich nämlich fast immer als sehr vorteilhaft. Tutorials dazu findest du auf dsdt.info.
Dann könntest du z.B. eine Klasse TPlayer bauen, in der alle möglichen Instanzen eines Spielers, also einer Figur gespeichert werden. Dort kannst du dann u.a. die Geschwindigkeit in x-Richtung und die Geschwindigkeit in y-Richtung speichern. Das ist das, was Panzerfischer sagte. Mit Vy meint er die Y-Gescheindigkeit, also die senkrechte. Wenn gesprungen wird, wird die Y-Geschwindigkeit auf einen Wert gesetzt und dann kontinuierlich erniedrigt, bis sie ein anderes Vorzeichen hat und die Figur irgendwann wieder auf dem Boden steht. Die Abfrage, ob die Figur auf dem Boden steht, kannst du so machen: Du hast ja sicher eine Map. Diese könntest du zusätzlich in schwarz-weiß speichern (also Monochrome-Bitmap). Schwarz machst du dann alle Pixel, die NICHT betreten werden dürfen und weiß die anderen. Bei jedem Timer-Aufruf prüfst du dann alle Pixel dieses Monochrome-Bitmaps, die sich dort befinden, wo gerade die Füße der Figur direkt drauf stehen. Wenn alle weiß sind, fällt die Figur, sonst muss die Y-Geschwindigkeit auf 0 gesetzt werden (falls sie das noch nicht ist). |
Re: Jump and Run! need help !
Bei den Tutorials habe ich nur was für 3D gelesen. Möchte es aber 2D machen.
und kannst du mir die Abfrage vielleicht was genauer erklären? Zitat:
|
Re: Jump and Run! need help !
Ich meinte nicht die Graphik-Tutorials, sondern die zur Objektorientierung. Wenn du damit noch keine Erfahrung hast, kannst du
![]() ![]() So könnte eine Klasse TFigur aussehen:
Delphi-Quellcode:
In der Haupt-Unit schreibst du dann im FormKeyDown:
TFigur = class
private FLeft: Integer; FTop: Integer; FWidth: Integer; FHeight: Integer; FXSpeed: Integer; FYSpeed: Integer; FBitmap: TBitmap; { ... } public function IstAufDemBoden(const Map: TCanvas): Boolean; // Map ist die Schwarz-Weiß-Karte property YSpeed: Integer read FYSpeed write FYSpeed; { ... } end; implementation function TFigur.IstAufDemBoden(const Map: TCanvas): Boolean; var Randposition: Integer; begin Result := False; for Randposition := 0 to FWidth do if Map.Pixels[FLeft + Randposition, FTop + FHeight] = clBlack then begin Result := True; Exit; end; end; { ... }
Delphi-Quellcode:
Und im Timer-Aufruf:
if Key = VK_SPACE then
if Figur.IstAufDemBoden(ImSchwarzWeiss.Canvas) then Figur.YSpeed := -20;
Delphi-Quellcode:
if Figur.IstAufDemBoden then
FYSpeed := 0 else FYSpeed := FYSpeed + 3; Wenn du noch fragen hast, sag Bescheid. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz