Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Ganz einfaches Fußballgame (https://www.delphipraxis.net/21694-ganz-einfaches-fussballgame.html)

Neuni 6. Mai 2004 16:08


Ganz einfaches Fußballgame
 
Hallo,
ich wüde gerne ein gaaaanz einfach Fußball game proggen...

Der Spieler soll immer in der Mitte stehen, und um ihn herum soll das Spielfeld sich bewegen...das klappt auch alles.

meine Frage: Wie bekomm ich es hin, dass man dem anderen, wenn man neben ihm steht auf Tastendruck den Ball bnehmen kann? Also wie bei Fifa, dass man auf den anderen zuläuft, und ihm dann den Ball abnehmen kann wenn man in seiner näche steht. Man könnte zwar abfragen ob die beiden Spieler die gleiche Position haben, aber man sollte den Ball auch bekommen, wenn man neben ihm steht, also egal aus welcher richtung.

jemand ne idee?

Danke schonmal :thuimb:

dizzy 6. Mai 2004 17:05

Re: Ganz einfaches Fußballgame
 
Entfernung messen!
(Stichwort: Vektoren)

Neuni 6. Mai 2004 17:55

Re: Ganz einfaches Fußballgame
 
Hab im Forum schon gesucht, aber nichts gefunde...weißt du wie ich die Entfernung messen kann?

alcaeus 6. Mai 2004 17:59

Re: Ganz einfaches Fußballgame
 
Also, Mathe wasweißichwievielte Klasse:
Distanz zwischen Punkt P1(x1, y1) und P2(x2, y2):
Delphi-Quellcode:
dist := sqrt(sqr(x2-x1)+sqr(y2-y1));
Also, das müsste funzen...wo die Herrschaften stehen weißt du ja,oder?

dizzy 6. Mai 2004 18:02

Re: Ganz einfaches Fußballgame
 
Du hast zwei Koordinaten, mit je einmal X und einmal Y.

Angemommen ein Spieler steht bei
X=10, Y=20
ein weiterer bei
X=15, Y=50

(hier ists sofort ersichtlich, soll so sein, damit man sieht, dass es wirklich so geht ;) )

Dies sind 2 Vektoren A=(10, 20); B=(15, 20)
Der Koordinatenunterschied ergibt sich aus A-B = (-5, 0)
Dies ist der Vektor zwischen den beiden Spielern. Und dessen Länge ist dann die Entfernung - die sich wie folgt berechnet:
Länge = sqrt(x² + y²)
ind diesem Fall
Länge = sqrt(-5² + 0²) = sqrt(-5²) = sqrt(25) = 5
*tädäää* - der Abstand zwischen den Spielern - ganz egal wie sie zueinander stehen.


gruss,
dizzy

\\edit: mal wieder zu langsam...

glkgereon 6. Mai 2004 19:01

Re: Ganz einfaches Fußballgame
 
und abnehmen: du machst
Delphi-Quellcode:
if keydown(watweissich)
then
Begin
gegner.image:=ohneball;
for i:=1 to x1-x2 do
   begin
   ball.x:=ball.x- (x1-x2);
   ball.y:=ball.y- (y1-y2) div (x1-x2);//dann bewegts sich gleichmässig
   end;
spieler.image:=mitball;
end;
also so in etwa..is teilweise nur symbolisch
gibt noch ungelöste frage, aber so isses doc vom grundsatz schon ma ganz gut
auch so sachen obs nicht ball.x:=ballx.x + sein muss, ausprobieren :-)

Seniman 6. Mai 2004 19:02

Re: Ganz einfaches Fußballgame
 
Hallo,

noch ein kleiner Tipp für die Umsetzung.

Die Entfernung berechnet sich, wie ja schon beschreiben, mit
Delphi-Quellcode:
dist:=sqrt(sqr(x1-x2)+sqr(y1-y2));
Wenn du nun die If-Abfrage bastelst, in der die Entfernung überprüft wird, dann quadriere besser beide Seiten der Gleichung, d.h. statt

Delphi-Quellcode:
if sqrt(sqr(x1-x2)+sqr(y1-y2))<distmax then blablabla
schreibst du besser

Delphi-Quellcode:
if (sqr(x1-x2)+sqr(y1-y2)<distmax*distmax then blablabla
Inhaltlich passiert genau dasselbe, es ist aber ein kleines bißchen schneller.

Grüße
Seniman

Neuni 6. Mai 2004 19:33

Re: Ganz einfaches Fußballgame
 
ähhh...ja
Ich bin nicht gerade DAS Ass in Mathe, also falls jemand dass alles versteht, könnte er mir vielleicht nen Beispiel geben, wie ich die entfernung zwisch image1 und image2 messe?

alcaeus 6. Mai 2004 19:40

Re: Ganz einfaches Fußballgame
 
Naja, du musst die Position eines Images kennen: x1, y1.
Außerdem musst du einen Hotspot-Offset definieren: ox1, oy1. Der Hotspot ist der Punkt, von dem die Entfernung aus gemessen wird. Die Position ist immer relativ zu (x1, y1) definiert. Für das zweite Image gilt natürlich das gleicht. Also:
Delphi-Quellcode:
x1 := Image1.Left;
y1 := Image1.Top;
x2 := Image2.Left;
y2 := Image2.Top;
dist := sqrt(sqr((x2+ox2)-(x1+ox1))+sqr((y2+oy2)-(y1+oy1)));
Ich glaube du meintest das, oder?

Neuni 6. Mai 2004 20:26

Re: Ganz einfaches Fußballgame
 
wie bekomm ich denn den hotspot-offset raus???

alcaeus 6. Mai 2004 20:28

Re: Ganz einfaches Fußballgame
 
Sorry, das hab ich vergessen zu sagen :oops: Den musst du dir festlegen
Mit Hilfe von dem kannst du bestimmen, von welcher Position startend er die Distanz berechnen soll. Dies ist nützlich, wenn du z.B. bei diesem Spiel verschiedene Spielerfiguren in Images hast, welche den Fuß an einer anderen Position haben.

Neuni 7. Mai 2004 13:53

Re: Ganz einfaches Fußballgame
 
Wahrscheinlich bin ich einfach zu dumm dazu...kann mir nicht jemand ein Beispiel schreiben?
Ich sitz hier nun schon seit stunden herum, aber ich raffs einfach nicht :duck:

BITTÄÄÄ :|

Matze 7. Mai 2004 14:00

Re: Ganz einfaches Fußballgame
 
Wenn bei dir jeder SPieler ein Image ist, dann kannst du einen beliebigen Punkte nehmen, z.B. (0/0) als hotspot-offset.

Neuni 7. Mai 2004 14:09

Re: Ganz einfaches Fußballgame
 
So, mein Quelltext sieht jetzt so aus:

Code:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  x1,x2,y1,y2,ox1,ox2,oy1,oy2:integer;
  dist:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
x1 := Image1.Left;
y1 := Image1.Top;
x2 := Image2.Left;
y2 := Image2.Top;
dist := sqrt(sqr((x2+ox2)-(x1+ox1))+sqr((y2+oy2)-(y1+oy1)));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ox1:=0;
ox2:=0;
oy1:=0;
oy2:=0;
end;

end.
Wenn ich nun auf F9 drücke kommt dieser Fehler:
Code:
[Fehler] Unit1.pas(37): Inkompatible Typen: 'Integer' und 'Extended'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Jemand ne Idee woran das liegen könnte???

dizzy 7. Mai 2004 14:11

Re: Ganz einfaches Fußballgame
 
:wall: :wall: :wall: Du hast "dist" als Integer deklariert. Es muss ein Float-Typ sein, oder dur rundest. :zwinker:

Neuni 7. Mai 2004 14:34

Re: Ganz einfaches Fußballgame
 
Sorry, aber was ist ein Float-Typ??? :duck:

dizzy 7. Mai 2004 14:37

Re: Ganz einfaches Fußballgame
 
real, real48, single, double, extended.
(real=double (bei aktuellen CPUs); real48 nutzt keiner mehr)
Auf aktuellen FPUs empfiehlt sich double (64 Bit breit -> FPU-Register auch)
Halt Fließkommazahlen.

Matze 7. Mai 2004 14:41

Re: Ganz einfaches Fußballgame
 
schreibe einfach anstatt

Delphi-Quellcode:
dist: integer;
das hier:

Delphi-Quellcode:
dist: real;
oder:

Delphi-Quellcode:
dist: extended;
...

Neuni 7. Mai 2004 14:45

Re: Ganz einfaches Fußballgame
 
Ja, hab ich schon, trotzdem danke...

So, nun müsste es gehen...danke für die viele geduld mit mir nap :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 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