Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 2D Game (https://www.delphipraxis.net/109474-2d-game.html)

Maltimore 2. Mär 2008 16:26

Re: 2D Game
 
also, erstmal an xzise:
du musst dabei bedenken, dass ich n 'noob' bin :D wie stellste dir das mit dem playerspeed konkret vor? könnte ich da evtl. bissl code haben? ich peils wirklich grad nich :D das mit den beiden integer is ne super idee, mach ich sofort.



zu dominikkv:
wir scheinen das gleiche zu denken - genau was du eben gesagt hast hab ich inzwischen gemacht. also jetzt wird mit dem onkeydown ereignis ein timer geenabled oder wie man das sagt - also form1.timer1.enabled := true ihr kennt das ja sicher. jetz kann ich schön sagen wie oft das gemacht wird, und wenn öfter als alle 40 ms das bild erneuere, müsste es für das menschliche auge doch wie bewegung wirken - oder habe ich mich da verrechnet?? nun hab ich nur ein problem.. ich kann nicht mehr schreiben if key = 'a' then... sondern soll wohl irgendwelche ascii zeichen nehmen oder so.. hab mich da ma bei google umgeschaut aber nur so ne sonderzeichen gefunden... könnte mir da jemand nen link zu ner vernünftigen tabelle geben?? oder wenn ich komplett aufm holzweg bin mir sagen was ich schreiben muss um genau die taste a bzw. s und d und leertaste (für springen) abzufragen???

achja, und erstmal vielen dank an alle die mir schon geholfen haben :)

dominikkv 2. Mär 2008 17:22

Re: 2D Game
 
ich würde das so machen:
Delphi-Quellcode:
const
  Speed = 5;

procedure TForm1.tmr1Timer(Sender: TObject);
var
  SpeedX, SpeedY: Integer;
begin
  SpeedX := 0;
  SpeedY := 0;

  if GetAsyncKeyState(VkKeyScan('d')) <> 0 then
    Inc(SpeedX, Speed);
  if GetAsyncKeyState(VkKeyScan('a')) <> 0 then
    Dec(SpeedX, Speed);
  if GetAsyncKeyState(VkKeyScan('s')) <> 0 then
    Inc(SpeedY, Speed);
  if GetAsyncKeyState(VkKeyScan('w')) <> 0 then
    Dec(SpeedY, Speed);

  shp1.Left := shp1.Left + SpeedX;
  shp1.Top := shp1.Top + SpeedY;
end;

xZise 2. Mär 2008 17:32

Re: 2D Game
 
Zitat:

Zitat von Maltimore
also, erstmal an xzise:
du musst dabei bedenken, dass ich n 'noob' bin :D wie stellste dir das mit dem playerspeed konkret vor? könnte ich da evtl. bissl code haben? ich peils wirklich grad nich :D das mit den beiden integer is ne super idee, mach ich sofort.[...]

Inzwischen hat dominikkv das umgesetzt ;)

Maltimore 2. Mär 2008 17:54

Re: 2D Game
 
könntest du das vllt kommentieren oder so?
ich peils wieder nicht... also getasynckeystate... gibt vermutlich 0 oder 1 zurück je nach dem ob der key gedrückt ist wa?
und dann inkrementierst du speed und speedx obwohl speed ne konstante ist?? :coder2: dat kann ja irgendwie nicht sein ?!
shp sind dann deine images? aber so wie ich das jetz verstanden habe ist das doch so das man je länger man z.B. d drückt schneller wird oder? und wenn man dann nach links gehen will muss man erstmal ewig lange a drücken damit er wieder bremst und langsam in die andere richtung geht.. :wiejetzt:

xZise 2. Mär 2008 18:04

Re: 2D Game
 
Zitat:

Zitat von Maltimore
[...]ich peils wieder nicht... also getasynckeystate... gibt vermutlich 0 oder 1 zurück je nach dem ob der key gedrückt ist wa?[...]

Genau ;)
Zitat:

Zitat von Maltimore
[...]und dann inkrementierst du speed und speedx obwohl speed ne konstante ist?? :coder2: dat kann ja irgendwie nicht sein ?![...]

Nein! "Inc(a, b)" erhöht a um b: Also a := a + b! Und wenn du b nicht setzt, ist b = 1 ;)

Zitat:

Zitat von Maltimore
shp sind dann deine images? aber so wie ich das jetz verstanden habe ist das doch so das man je länger man z.B. d drückt schneller wird oder? und wenn man dann nach links gehen will muss man erstmal ewig lange a drücken damit er wieder bremst und langsam in die andere richtung geht.. :wiejetzt:

Nein ;) Guck mal in die beiden Zeilen nach "begin". Da wird die Geschwindigkeit auf 0 gesetzt.

Hast du den Bedacht, dass das in einer Art Schleife abläuft (wegen des Timers)?

MfG
xZise

dominikkv 2. Mär 2008 18:17

Re: 2D Game
 
ok..^^
Du hast eine Konstante Speed, dort kannst du zur Designtime einstellen wie schnell sich dein Image bewegen soll.
Jetzt haben wir einen Timer der sich um das bewegen der Bilder kümmert.
Und zwar kann sich das Bild in X und in Y-Richtung bewegen.
Den jeweiligen Wert um den es sich bewegt speichern wir in SpeedX, SpeedY.
Zuerst müssen wir die beiden Variablen iniziiren (schreibt man das so? ô_0) weil am Anfang ein Zufälliger Wert drinnsteht.
Delphi-Quellcode:
SpeedX := 0;
SpeedY := 0;
Dann schauen wir uns an ob gerade die taste d gedrückt wird:
Delphi-Quellcode:
if GetAsyncKeyState(VkKeyScan('d')) <> 0 then
Zitat:

Zitat von DelphiHilfe
The GetAsyncKeyState function determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState.

Zitat:

Zitat von DelphiHilfe
The VkKeyScan function translates a character to the corresponding virtual-key code and shift state for the current keyboard.

Wenn ja wird SpeedX um den Wert Speed erhöht.
Dann schauen wir uns an ob die Taste a gedrückt ist.
Wenn ja wird SpeedX um Speed wieder erniedrigt.
-> Wenn a und d gedrückt sind ist SpeedX = 0.
Das gleiche machen wir in Y-Richtung.
Und am Schluss bewegen wir das Bild:
Delphi-Quellcode:
shp1.Left := shp1.Left + SpeedX;
shp1.Top := shp1.Top + SpeedY;
(ob das jetzt shp1 oder image1 heißt ist ja egal^^)

für den Rest siehe ein Post über mir^^

Maltimore 2. Mär 2008 19:10

Re: 2D Game
 
WOOOOOOHAAAA!!! wie geil ist das denn!!!! :dancer2:

erst hab ich nur den post von xzise gelesen, und schon voll viel verstanden, und dachte ich hätte alles verstanden....
dann wollte ich posten dass ichs verstanden habe und dann wollt ich noch mal nachgucken was er genau geschrieben hat und seh da was von dominikkv und denk mir so hä der hat doch gar nichts geschrieben also wieder zurück, refresh. hm ne immer noch nix. wtf. also wieder auf antwort erstellen und da wars wieder was er geschrieben hat. und dann so ganz langsam denk ich so hmmm. alle mir bekannten foren machen nach einer bestimmten seiten/zeilenanzahl ne neue seite auf.. warum dieses nicht ?? Jajaja, mir immer alles ganz vorsichtig erklären :D.

Naja. jetz hab ichs alles verstanden. und wenn ich das mit dem vergleiche, was ich vorher geschrieben hab.. da hab ich bei jeder bewegung in x richtung einfach alle images die ich hatte (waren da wohl 7) verschoben.. dann erstmal alle gehidet, dann die postion von einem nochma verschoben, das dann angezeigt und wieder alle verschoeben, und wieder gehidet :D und ich hab n relativ neuen pc, der hat das sogar mitgemacht :D

danach hab ichs ja schon selbst maßgeblich verbessert, aber jetz mit x bzw. y koordinate nich in image1.left bzw. top zu speichern sondern als integerwerte (worauf ich auch selbst hätte kommen können :? ) und dann durch einen timer der mir die abfrage macht, sodass ich selber einstellen kann wie oft überprüft wird, ob ein key gedrückt wurde, und mit der behebung des bugs vom anfang ist das ja ma einfach soo geil :D

macht sich richtig, das programm so langsam.. naja sitz auch schon seit locker 10 stunden dran(also gestern und heute).

aber ma im ernst, richtig geil eure vorschläge!! das forum ist echt verdammt sinnvoll!

Ich werd euch gern noch weiter mit Fragen zumüllen ( xD ) aber ich glaub erstmal ist alles beantwortet.. muss ich da was closen oder so?

Maltimore 3. Mär 2008 14:20

Re: 2D Game
 
so. hm. auf lob scheint ihr ja nicht zu reagieren :)
aber es geht auch schon weiter!

also erstmal möchte ich bei meinem tollen spiel jetzt auch gegner einbinden, denen man dann z.B. ausweichen muss oder so, die vllt auch schießen können. habt ihr ne idee welche komponente ich dafür verwenden könnte?? weil ich denk ma da könnte der pc leicht überlastet sein wenn ich alle 10 ms schon mal die bewegung mache, dann noch überprüfe ob sich mein image mit den images der gegner oder mit den images der schüsse der gegner überschneidet (so dass meine figur stirbt :D) also im klartext ich möchte ne komponente um relativ schnell fliegende punkte oder so was darzustellen und möglichst nicht so ne aufwändige komponente wie image.

außerdem möchte ich eine neue klasse (oder nennt man das typ??) erstellen, sodass ich im designmodus einfach nur noch einer funktion ein rechteck oder einen kreis übergeben muss der dann als hindernis angesehen wird.. hab leider kein plan wie das geht, so weit sind wir im informatik kurs noch nicht....

mfg
Maltimore

edit: achja, momentan mache ich es so, dass ich wenn ein knopf gedrückt wird einen timer starte, der im intervall von 10 ms meine figur verschiebt. und irgendwie ist das noch nicht so richtig das gelbe vom ei, weil er zeigt anscheinend nur jede 10. bewegung ungefähr an, manchmal laggt es sogar schon (bei einem 2D game!!! wtf!!!) und da wüsste ich gerne ob ihr dagegen was habt.. also nen tipp :D

Maltimore 3. Mär 2008 16:02

Re: 2D Game
 
so, jetz mach ichs ganz anders..
ab jetz bewegt sich der hintergrund und die figur bleibt in der mitte :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Seite 2 von 2     12   

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