Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Jump"n"run (https://www.delphipraxis.net/62071-jump-n-run.html)

hans101 30. Jan 2006 16:45


Jump"n"run
 
hallo,
Ich möchte ein Jumpnrungame im stil von super mario programmieren.Mein Problem ist, dass ich nicht weiß, wie er diagonal( nach oben und zur seite gleichzeitig) springen kann und wie man die Scrollbar programmieren muss, dass die Figur immer in der mitte der Form ist. :gruebel:
Ich habe 3 timer, 1 shape, und 2 textboxen(zur überprüfung der Variablen).

Hier mein Quellcode bis jetzt:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Shape2: TShape;
    Timer1: TTimer;
    Edit1: TEdit;
    links: TTimer;
    Edit2: TEdit;
    rechts: TTimer;
    procedure linksTimer(Sender: TObject);
    procedure rechtsTimer(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  y : integer;     // für den Sprung
  t : integer = 0;  // für den Sprung
  d : integer = 7;  // für den Sprung
  k : integer = 3; // Für den Turbo
 zr : integer = 0; // Zeit für Timer: Rechts
 zl : integer = 0; //Zeit für Timer: Links


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  t := 0;
  if timer1.Enabled = false then timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var yy : integer;
    v : integer;
begin
  t := t + 1;
  v := 50 div d;
  yy := abs(round(100*sin(t/v)));
  edit1.Text := inttostr(yy);
  shape1.Top := y - yy;
  if round(100*sin(t/v)) <= 0 then timer1.enabled := false;
  If g = 1 then shape1.Left := shape1.Left + 5;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  y := shape1.top;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin
  if key = #119 then begin //Sprung
    t := 0;
    if timer1.Enabled = false then timer1.Enabled := true;
    end;
   if key = #100 then begin //Laufen nach rechts
         zr:= 0;
    if rechts.Enabled = false then rechts.Enabled := true;
      end;
   if key = #97 then begin //Laufen nach links
   zl:= 0;
   if links.Enabled = false then links.Enabled := true;
   end;
end;


:coder2:


Danke im Voraus!!!

DP-Maintenance 30. Jan 2006 16:59

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Datenbanken" nach "Sonstige Fragen zu Delphi" verschoben.
Kein Datenbank-Problem

DGL-luke 30. Jan 2006 20:18

Re: Jump"n"run
 
da würde ich dir jetzt fast dazu raten, alle x millisekunden den tastaturstatus mit Hier im Forum suchengetasynckeystate abzufragen und dann eben, wenn mehrere tasten gedrückt sind, auch die entsprechenden aktionen auslösen.

Natürlich kannst du auch im OnKeyDown Variablen setzen und im OnkeyUP wieder entsetzen :zwinker:

Delphi-Quellcode:
//global:
type TKeys = (left,right,up,down); //das hier ist ein aufzählungstyp

var keysdown = set of TKeys; //das hier ist eine Menge

procedure TForm1.OnkeyDown(Sender: TObject, var Key: Integer);
begin
case Key of
  vk_left: keysdown = keysdown + left; // hier fügst du der menge eine wert hinzu
  //etc.
end;
// dasselbe für onkeyup, nur dann mit -
Das ganze musst du dann natürlich im Timer-Event auswerten.

EDIT: ach ja übrigens, ich hab jetzt glaub ich schon 6 threads von dir gesehen, und in zwei geantwortet... meinst du nicht, das reicht jetzt dann mal wieder ;) ? im übrigen kann ich dir empfehlen, da du in Delphi neu scheinst, die mal die Tutorial auf www.dsdt.info durchzulesen und eventuell, wenn es dir ernster ist, dir ein Buch zu kaufen oder erstmal in einer Bücherei auszuleihen (solls ja auch geben). :)

hans101 30. Jan 2006 20:27

Re: Jump"n"run
 
Danke erstmal für deine Hilfe! (also 6 Threads warns nich, sondern 2) - Ich habe mit Delphi erst neu angefangen und deswegen kenne ich mich noch nicht so gut aus - Die Community ist aber super hier!!! Ich werde mir das Tutorial jetzt mal anschauen.Ich hoffe,dass das dann auch mit dem JumpnRun klappt. :mrgreen:

DGL-luke 31. Jan 2006 14:14

Re: Jump"n"run
 
jo, sorry, hab dich wohl mit Erdnusslocke verwechselt... :oops:

hans101 31. Jan 2006 15:09

Re: Jump"n"run
 
np, aber ich dachte, dass es für Fragen das Forum gibt :wink: . Ich wüsste nämlich noch gerne, ob man einem TImage während der Laufzeit des Programms z.B. per Buttonklick ein anderes Picture verpassen kann (Das habe ich leider nicht in den Tutorials gefunden), damit wäre es dann möglich eine kleine einfache Animation zu erstellen. Falls da jemand etwas weis, bitte melden (ohne OpenGL oder DirectX zu benutzen)

hans101 31. Jan 2006 20:07

Re: Jump"n"run
 
könnte mir vllt jemand mit diesem Problem helfen oder Tipps geben etc. plz :hi:

Khabarakh 31. Jan 2006 20:27

Re: Jump"n"run
 
Du kannst andere TBitmaps per TImage.Canvas.Draw (= TImage.Picture.Bitmap.Canvas.Draw) auf das OffScreenBitmap des Images zeichnen.

hans101 31. Jan 2006 21:10

Re: Jump"n"run
 
Aha, vielen Dank :!: Soweit so gut, nur jetzt kommt ein Problem auf - Ich weis jetzt nicht, wie ich ein anderes Bild da rein zeichnen soll, den Befehl dazu habe ich ja schon mal :wiejetzt: . Aber muss man jetzt in der ...Canvas.Draw() <--Klammer den Pfad des Bildes angeben, das er laden soll ?? Vllt. könnte mir ja jemand freundlicherweise :cheers: ein kleines Beispiel geben. :coder: :-D

hans101 1. Feb 2006 15:12

Re: Jump"n"run
 
Also ich verstehe einfach nicht, wie das mit Onkeyup und Onkeydown gehen soll, denn wenn ich z.B. das hier schreibe :
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Edit2: TEdit;
      procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.nfm}
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  // Schießen
  if key =VK_SPACE then form2.Width := 300;
end;
end.
tut sich einfach gar nichts.
Das war ja jetzt für Keydown,aber für OnkeyUP,Onkeydown und Keydown find ich einfach nix
ALso brauch man da noch eine Prozedur oder so.Vllt könnte Jemand einfach nen kleinen Quellcode hier rein posten.
Ich weis, das es bestimmt einer weis, also wäre es gut,wenn mir jemand mit dem eigentlich kleinen Problem weiter helfen würde.

Khabarakh 1. Feb 2006 15:21

Re: Jump"n"run
 
Dein letzter Quelltext ist VCL.NET, hast du dich vielleicht bei den Projekten verklickt?

hans101 1. Feb 2006 16:19

Re: Jump"n"run
 
Nein, ich hab das so gelernt, mit VLC anwendungen zu arbeiten. Ist das schlecht und kann mir Jemand die oben genannte Frage beantworten bitte.

JamesTKirk 1. Feb 2006 16:36

Re: Jump"n"run
 
Also ich hab mit OnKeyDown und Leertaste keine Probleme... eventuell mal die Eigenschaft KeyPreview des Forms auf True setzen?! Hat mir bei meinen Anfängen meistens geholfen :-D

Nur warum machst du eigentlich einmal ein .NET Projekt (siehe #10) und einmal ein normales (siehe #1)?! Oder irre ich mich da?! :gruebel:

hans101 1. Feb 2006 17:16

Re: Jump"n"run
 
ouu...ich finde, das ist doch jetzt egal zum Verständnis.
--------------> Bitte schreib mir doch mal ein kleines Beispiel und tus in den Anhang oder poste es hier rein, es wäre mir wirklich sehr hilfreich, ich selbst bekomme es einfach nicht hin, obwohl ich keypreview auf true gesetzt habe, ein kleines Progrämmchen mit Onkeyup würde mir doch schon ausreichen. BITTTTTEE helft mir :coder2:

JamesTKirk 1. Feb 2006 17:29

Re: Jump"n"run
 
Man ist ja ein freundlicher Mensch :-D

Also: Zieh ein Memo aufs Form und stell ReadOnly auf TRUE; Setze KeyPreview des Forms auf TRUE und erstell die Events OnKeyUp und OnKeyDown des Forms. Hier der Code:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Memo1.Lines.Add(Format('Taste %d gedrückt',[Key]));
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Memo1.Lines.Add(Format('Taste %d losgelassen',[Key]));
end;
Dann kompiliere und drücke ein wenig auf der Tastatur rum... es müsste dann die Nummer der Taste und ob losgelassen oder gedrückt angezeigt werden... :-D

hans101 1. Feb 2006 17:50

Re: Jump"n"run
 
Mmh, scheint gut zu sein, aber wenn ich Memo in die Form ziehe, KeyPreview und Readonly umstelle und schließlich noch das oben stehende hereinkopiere markiert er [...].FormKeyUp und FormKeyDown rot,also sie sind rot unterstrichen (???)
Wenn ich mit der Maus darüberfahre erhalte ich die Meldung : "TFormX(x ist bei mir 2) enthält kein Element namens "FormKeyUp" "

Fehlt da noch irgendwas oder ist es so , weil ich VLC Formularanwendung benutze??? Irgendwie muss er das ja erkennen. Muss man da vllt. noch procedur... unter type schreiben.
Hmm...ich bin ratlos

inherited 1. Feb 2006 17:53

Re: Jump"n"run
 
du musst einmal bei deiner Form OnKeyDown bzw OnKeyUp erstellt haben (doppelt darauf klicken) und bei dem Beispiel die Zahl der form natürlich durch die deiner Form ersetzen

JamesTKirk 1. Feb 2006 17:56

Re: Jump"n"run
 
@inherited: Da war jmd schneller als ich... :mrgreen:

@hans101: Ich dachte ich hätte das mit

Zitat:

Zitat von JamesTKirk
und erstell die Events OnKeyUp und OnKeyDown des Forms.

gesagt... Mein Fehler... :wink:

hans101 1. Feb 2006 17:59

Re: Jump"n"run
 
ja, aber ich bin eben ein Anfänger in Delphi und habe keine Ahnung, was mit "erstell die Events OnkeyUP etc." gemeint ist :?:

hans101 1. Feb 2006 18:02

Re: Jump"n"run
 
Wie kann man diese Events erstellen?

JamesTKirk 1. Feb 2006 18:36

Re: Jump"n"run
 
Also: Du hast links doch den ObjektInspektor, wo du auch zB des KeyPreview setzen kannst... dort gibt es oben die beiden Felder "Eigenschaften" und "Ereignisse" (bzw. "Properties" und "Events" bei der Englischen Version). Du klickst bei angewählten Form auf Ereignisse und suchst in der Liste dann nach dem gewünschten Ereignis. Rechts neben dem Ereignis vollführst du einen Doppelklick und die Prozedur für das Eregnis müsste im Quelltext erscheinen.
Voila! :-D

Khabarakh 1. Feb 2006 19:44

Re: Jump"n"run
 
Zitat:

Zitat von hans101
Nein, ich hab das so gelernt, mit VLC anwendungen zu arbeiten. Ist das schlecht und kann mir Jemand die oben genannte Frage beantworten bitte.

Zwischen VCL und VCL.NET liegen Welten. Du wolltest wohl eigentlich eine Win32-VCL-Anwendung (wie in Post 1) erstellen.

hans101 1. Feb 2006 21:50

Re: Jump"n"run
 
:mrgreen: Also ich danke 1000mal für die hilfreichen Antworten, echt super! Jetzt funktioniert alles
- bis jetzt, ich freue mich schon bald auf neue Beantwortungen meiner Fragen :wink: Einfach eine suuper Community :dancer2: :hello: :hello:

hans101 2. Feb 2006 13:25

Re: Jump"n"run
 
Ich hätte mal wieder eine Frage:
Kharbarakh hat mal gesagt, dass man eine Animation über TImages erstellen kann:

"Du kannst andere TBitmaps per TImage.Canvas.Draw (= TImage.Picture.Bitmap.Canvas.Draw) auf das OffScreenBitmap des Images zeichnen"

Doch jetzt kenne ich zwar den Befehl, aber ich weis noch nicht, wie ich das Bild dann hinein laden kann oder welchen Pfad man dann angeben muss. :?: :cry:

Vllt. könnt Ihr mir ja dazu etwas sagen???

hans101 2. Feb 2006 16:22

Re: Jump"n"run
 
Kann mir bitte jemand bei diesem Problem helfen :lol:

superjojo 10. Jan 2014 14:50

AW: Jump"n"run
 
Wenn du das Bild, das im Image angezeigt wird ändern willst kannst du das über folgenden Befehl

Delphi-Quellcode:
image1.picture.loadfromfile('dateiname');
.

Wichtig:
-Der Dateiname muss auch die Dateiendung (z.B. .jpg ) enthalten und in '...' stehen.
-Nach obiger Schreibweise muss die Bilddatei im gleichen Verzeichnis wie die Projektdatei und
die units sein. Falls die zu ladende Bilddatei woanders gespeichert sein sollte, musst du den
kompletten Pfad angeben

Hoffe ich hab dein Problem richtig verstanden

p.s. hatte irgendwer jetzt eine Idee wie das mit dem srollen der map funktioniert?

DeddyH 10. Jan 2014 14:52

AW: Jump"n"run
 
Ob ihm das nach fast 8 Jahren weiterhilft?

Sir Rufo 10. Jan 2014 15:18

AW: Jump"n"run
 
Zitat:

Zitat von DeddyH (Beitrag 1243043)
Ob ihm das nach fast 8 Jahren weiterhilft?

You never know - stell dir vor, der hat jetzt die ganze Zeit vor dem Monitor gehockt und auf eine Antwort gewartet - dann kann sich die Antwort auch noch verzögern (vor Schreck ist der bestimmt vom Hocker gefallen) :mrgreen:

himitsu 10. Jan 2014 15:21

AW: Jump"n"run
 
Zitat:

Zitat von superjojo (Beitrag 1243042)
Wichtig:
-Nach obiger Schreibweise muss die Bilddatei im gleichen Verzeichnis wie die Projektdatei und
die units sein. Falls die zu ladende Bilddatei woanders gespeichert sein sollte, musst du den
kompletten Pfad angeben

Falsch: Nach dieser Schreibweise muß sie im aktuellen Arbeitsverzeichnis liegen und das muß nicht das Programmverzeichnis sein.

Und die Projektdatei (dpr/dpk) ist nicht die Programmdatei (exe), welche nach dem Kompilieren auch nicht im selben Verzeichnis liegen muß. (jenachdem, was als Ausgabeverzeichnis angegeben wurde)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz