Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 2d game:ping-pong (https://www.delphipraxis.net/43821-2d-game-ping-pong.html)

mangaka 9. Apr 2005 09:24


2d game:ping-pong
 
Moin,
Ein Kumpel und ich wollen ein Game auf Delphi basis programmieren.
Es handelt sich um ein remake von ping pong^^(jeder kennt es- 2balken eine kugel...ping ...pong)

Da wir beide noch am Anfang unserer Delphi Erfahrung stehen, brauchen wir etwas Hilfe...
Ein paar Fragen zunächst:
-Wie erstellen wir eine x- und y-achse?
-Habt ihr vorschläge wie wir den Ball zum bewegen kriegen können und wie die Flugbahn berechnet werden soll?..
ich habe da schon ein paar ideen, aber die sind nicht so einfach umzusetzen...

um wissen über delphi zu sammeln lese ich grad dieses buch:
Delphi für Kids-(9.kapitel)...

und danach werde ich wohl das lesen:
3D Proigrammierung für Kids. denkt ihr dieses buch könnte mir bei meinen Problemme weiter helfen...ich habe nocht nicht wikrlich reingesehn...

Das 1. Buch habe ich, wie schon gesagt, angefangen zu lesen und ich finde es gut. Doch es vermittelt mir eher ein Basis/Grundwissen. Sicherlich auch mehr aber ich brauche noch andere bücher um weitrer zukommen. beim den nächsten büchern will ich mein wissen über die datenbanken und über das netzwerk/inet programmierung anreichern.
kennt ihr da paar gute?

falls ich rechtschreibfehler eingebaut haben sollte tut es mir leid. mir ist grad aufgefallen, dass ich manchmal groß und dann ne zeit lang klein schreiben...liegt alles an der uhrzeit-es ist freitag und kurz vor 0uhr...bin müde :D

Achja ...und ich habe noch eine Frage zu einem Buch. Gibt es Bücher für die Konsolenanwendung unter Delphi?

Tubos 9. Apr 2005 10:02

Re: 2d game:ping-pong
 
Zitat:

Habt ihr vorschläge wie wir den Ball zum bewegen kriegen können und wie die Flugbahn berechnet werden soll?..
Das Abprallen eines Balls an vier Wänden, die in einem Rechteck angeordnet sind, löse ich folgendermaßen (Pseudocode).
Wenn der Ball an Schlägern abprallt, geht es im Prinzip genauso nur musst du vorher abfragen ob der Ball überhaupt auf den Schläger auftrifft oder ins "Aus" geht.
Code:
boolean outside=false;
   // Kollision mit linker und rechter Wand überprüfen:
if (kollision mit linker oder rechter wand) then
   if (not outside)
   begin
      bewegung.x := -bewegung.x;
      outside:=true;
   end;

if (kollision mit oberer oder unterer wand) then
   if (not outside)
   begin
      bewegung.y := -bewegung.y;
      outside:=true;
   end;

if (ballposition + ballradius > LinkeWand) AND (ballposition + ballradius < RechteWand) AND (ballposition - ballradius > UntereWand) AND (ballposition - ballradius < ObereWand) then outside:=false;
Ich kann dir keinen Delphicode geben weil das Programm nicht in Delphi geschrieben ist. Sollte aber keine Probleme machen den Pseudocode zu verstehen, ansonsten --> fragen.

mangaka 9. Apr 2005 10:17

Re: 2d game:ping-pong
 
hmm... kannst du die einzelnene schritte die du mit der if-else abfrage gemacht hast, etwas erklären?
was bedeutet in diesem fall outside?
udn wie kriege ich die position des balls raus, bzw woher kriege ich solche x- und y-achsen?
und^^...wie lasse ich den ball fliegen...
wenn der ball gegen ein hindernis stößt, zb. eine wand, dann soll der einfallswinkel = ausfallswinkel sein, weist du was ich damit meine?

Wuaegner 9. Apr 2005 10:29

Re: 2d game:ping-pong
 
@Tubos:
Bei deinem Code würde es aber keinen Unterschied machen ob man seinen "Schläger" wenn der Ball auftrifft gerade voll nach oben zieht oder man den Schläger einfach so lässt. Beim klassischen Ping-Pong wird das doch berücksichtigt oder irre mich da? :gruebel:

Speedmaster 9. Apr 2005 10:40

Re: 2d game:ping-pong
 
Habt ihr in der Schule schon Geometrien durchgenommen??
Wenn nein, schlage ich vor sich mal mit dem Thema Sinus & Co zu beschäftigen, zusätzlich solltet ihr wissen was Bogenmase sind. Einfach mal in Google suchen!

Dannach solltet ihr euch am besten nocheinmal mit den Grundlagen beschäftigen, diese sind bei Spielen äußerst wichtig, siehe Hier! Wobei dort wohl eher Delphi-Sprache und Styleguide für euch Wichtig sind, besonderst das zweite sollte man sich umbedingt durchlesen!

Wenn ihr das gemacht und verstanden habt könnt ihr mit Ping-Pong anfangen.
Da es 2D ist würde denke ich würd es Reichen wenn mit folgendem Ansatz anfangt:

Delphi-Quellcode:
type
  TVec3 = record
    x: word;
    y: word;
    z: word;
  end;

  TGObject = class
    public
      Position: TVec3;
      HitPoints: byte;
      procedure Move(Vektor: TVec3);
      procedure RegisterObject;
      procedure Destroy;
      constructor Create(DPosition: TVec3);
    end;
Edit:
Ähh...bei euch könnt ihr die z-Achse weglassen!

Khabarakh 9. Apr 2005 11:10

Re: 2d game:ping-pong
 
Zitat:

Zitat von Speedmaster
Habt ihr in der Schule schon Geometrien durchgenommen??
Wenn nein, schlage ich vor sich mal mit dem Thema Sinus & Co zu beschäftigen, zusätzlich solltet ihr wissen was Bogenmase sind. Einfach mal in Google suchen!

Ich würde am Anfang nur das Abprallen an den Wänden und Schlägern ohne deren Bewegung behandeln, dazu ist Trigonometrie überflüssig.

mangaka 9. Apr 2005 11:17

Re: 2d game:ping-pong
 
bin in der 10kl. wir nehmen grad zufällig sinus/cosinus durch.
das die z-achse (die tiefe) hier nicht nötig ist wohl selbsdtverständlich.
Danke für deine Hilfe. Ich befolge mal dienne rat...ich denk trozdem das warnicht der letzte thread von mir ^^

Nils_13 9. Apr 2005 11:50

Re: 2d game:ping-pong
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ums Prinzip zu begreifen.

whiteshark 9. Apr 2005 11:56

Re: 2d game:ping-pong
 
Ich kann deine *.exe-Datei nicht ausführen. Bringt er bei mir immer die Windows-Fehlermeldung "Pong.exe hat ein Problem festgestellt und muss beendet werden."!

Nils_13 9. Apr 2005 11:58

Re: 2d game:ping-pong
 
:gruebel: den Fehler hatte ich noch nie, hast du es entpackt ?
Auch aus der Rar läufts.

LoL 9. Apr 2005 11:58

Re: 2d game:ping-pong
 
Bei mir meint er die LMD-Kompo fehlt...

Nils_13 9. Apr 2005 12:00

Re: 2d game:ping-pong
 
Schmeiß die LMD raus wos nur geht LMD zerstört alle Programme, wenn es [bei mir ist es so] nicht ausgebunden wird, LMD hängt mit den Credits zusammen, einfach in beiden uses Teilen alles, was mit LMD zu tun hat rauschmeißen.

mangaka 9. Apr 2005 12:01

Re: 2d game:ping-pong
 
hmm... der link von speedmaster hat micht nicht wirklich weiter gebracht.
danke für dein programm, aber ich kann es nicht öffnenne kriege eine fehlermeldung bei der ausfürhung der exe datei! und wenn ich den quellcode öffne kriege ich uach ne fehlermeldung von wegen ein steam modul wurde nicht gefundne oda so ^^
öffne ich das ding falsch?

nochmals danke allen die sich hier beteiigen!

ach ihr habt das gleiche prob?
diese lmd vom code zu trennen könnte für nen anfänger wie mir doch etwas schwerer werden...
hat einer von euch es schon getrennt? könnt ihr es zum download freigeben?

aber mal eine andere frage:
wie es aussieht bringt alles was ihr mir schickt nicht wirklich weiter...
das liegt wohl größten teils dran, dass ich wenn ich den code sehe nur bahnhof verstehe...
wenn ihr ein beispiel prog macht fügt plz kommentare hinzu.

aber wir können die ganze sache schritt für schritt durchgehn. also was wir bruachen ist wohl klar:
x und y-achse
2 schläger
ein ball

lasst und mal die probleme hintereinander lösen, damit ich auch nocht mit komme..
erstma also die achsen. wie erstellt man die, und wie kann mit die derzeitige position eines objekt auslesen?
die 2 schläger- wie erstellt man die? die bewegungen kriege ich wohl auch nocht hin aber zu sicherheit, wäre es nett wenn ihr auch dazu was schreibt.

der ball ist wohl das schwierigste, dazu können wir ja was hinschreiben wenn wir die anderen punkte durch sind!

Hoffentlich macht es euch jetzt nicht viel zu viel arbeit!

Nils_13 9. Apr 2005 12:05

Re: 2d game:ping-pong
 
Hi, wenns nicht läuft zieh alles rüber, was wichtig ist (in eine neue Anwendung).

whiteshark 9. Apr 2005 12:08

Re: 2d game:ping-pong
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe auch schon mal so ein Spiel programmiert. Vielleicht hilft dir der Anhang weiter.

mangaka 9. Apr 2005 12:15

Re: 2d game:ping-pong
 
danke ich sehs mir gerade an, vllt hilft mir das schon mehr, weil das nicht soviele sachen sind..
aber warum kriege ich immer ne fehlermeldung wenn ich die dpr datei öffne..
"ungültiges steamformat"
kann das daran liegen dass ihr eine neuere version von delphi nutzt?
ich nutze delphi 3 prof

Speedmaster 9. Apr 2005 12:17

Re: 2d game:ping-pong
 
Zitat:

Zitat von mangaka
danke ich sehs mir gerade an, vllt hilft mir das schon mehr, weil das nicht soviele sachen sind..
aber warum kriege ich immer ne fehlermeldung wenn ich die dpr datei öffne..
"ungültiges steamformat"
kann das daran liegen dass ihr eine neuere version von delphi nutzt?
ich nutze delphi 3 prof

Daran kann es auf jeden fall liegen. Ich rate dir eine Personalversion von Delphi zuzulegen, entweder Delphi 7 Personal, oder Delphi 2005 Personal, die sollte es glaube ich ja im moment sogar im laden in einem Magazin geben!

Nils_13 9. Apr 2005 12:18

Re: 2d game:ping-pong
 
Das ist normal ... Wenn du das bewegen der Bälle hast musst du aber noch dafür sorgen, dass sich der Computer auch äußert.

sniper_w 9. Apr 2005 12:23

Re: 2d game:ping-pong
 
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Ball : TRect;
  BallSpeedX : integer = 5;
  BallSpeedY : integer = 5;
  BallHeight : integer = 30;
  BallWidth : integer = 30;

// offscreen, flickefrei
  Offscreen : TBitmap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Caption := 'B_Ball';
 Width := 300;
 Height := 300;
 Ball := Rect(0,0,BallWidth,BallHeight);
 Timer1.Interval := 10;

 Offscreen := TBitmap.Create();
 with Offscreen do
 begin
  PixelFormat := pf32bit;
  Width := Screen.Width;
  Height := Screen.Height;
  Canvas.Brush.Color := clOlive;
  Canvas.Pen.Color := clBlack;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
 var old : integer;
begin//
 FormPaint(Self);

 OffsetRect(Ball,BallSpeedX,BallSpeedY);

      // Korrektur bei Bandenkollision
      if (Ball.Left < 0) then // links
      begin
        BallSpeedX := -BallSpeedX;
        Ball.Left := - Ball.Left;
      end
      else if (Ball.Left + BallWidth > ClientRect.Right) then// rechts
      begin
        BallSpeedX := -BallSpeedX;
        Ball.Left := 2 * (ClientRect.Right - BallWidth ) - Ball.Left;
      end;

      if (Ball.Top < 0) then         // oben
      begin
        BallSpeedY := -BallSpeedY;
        Ball.Top := - Ball.Top;
      end
      else if (Ball.Top + BallHeight > ClientRect.Bottom) then// unten
      begin
        BallSpeedY := -BallSpeedY;
        Ball.Top := 2 * (ClientRect.Bottom - BallHeight) - Ball.Top;
      end;

 FormPaint(Self);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin//
 with Offscreen do
 begin
  Canvas.FillRect(ClientRect);
  Canvas.Ellipse(Ball);
 end;
 BitBlt(Canvas.Handle,0,0,Width,Height,
        Offscreen.Canvas.Handle,0,0,SRCCOPY);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin//
 Offscreen.Free();
end;

end.
Und ich weiss nicht warum sich Ball sooo verhält . :gruebel:

Nils_13 9. Apr 2005 12:32

Re: 2d game:ping-pong
 
Der Ball ruckelt ?

mangaka 9. Apr 2005 12:33

Re: 2d game:ping-pong
 
speedmaster meinst du vllt dieses magazin:
http://www.pc-magazin.de/common/aktu...onat=05&art=cd

mangaka 9. Apr 2005 12:37

Re: 2d game:ping-pong
 
lol ich krieg die ganze zeit fehlermeldungen bei eurem code..
so bringt es nichts, ihr müht euch ab und ich kann eure codes trozdem nicht anweden...
könntet ihr ma gucken ob die version in dem magazin(siehe link 1 thread vorher) "richtig" ist?
ich kenn mich da nicht aus, daher frag ich so blöd

Wuaegner 9. Apr 2005 12:40

Re: 2d game:ping-pong
 
Da die is die richtige.

mangaka 9. Apr 2005 12:41

Re: 2d game:ping-pong
 
Danke!
Dann mal schnell einkaufen gehn^^
bis gleich!

Khabarakh 9. Apr 2005 12:43

Re: 2d game:ping-pong
 
Zitat:

Zitat von mangaka
lasst und mal die probleme hintereinander lösen, damit ich auch nocht mit komme..
erstma also die achsen. wie erstellt man die, und wie kann mit die derzeitige position eines objekt auslesen?
die 2 schläger- wie erstellt man die? die bewegungen kriege ich wohl auch nocht hin aber zu sicherheit, wäre es nett wenn ihr auch dazu was schreibt.

Die Achsen musst du nicht "erstellen", das Grafikobjekt, das du benutzst ( :?: stimmt das wirklich so?), hat schon ein eigenes Koordinatensystem. Die Koordinaten des Spielers/Balls speicherst du als Feld in deiner Klasse, entweder als getrennte x- und y-Integer oder gleich als TPoint:
Delphi-Quellcode:
type
  TBall = class
  private
    FPosition: TPoint;
    FSpeed: TPoint; //TPoint als Vektor, der in jedem Frame zur Position addiert wird
    [...]
Deine Klassen haben dann noch eine "Draw" (von mir aus auch "Zeichnen") Methode, der ein Bitmap übergeben wird, auf das sie sich dann zeichnen. Dann noch eine weitere Klasse, die Engine, sie verwaltet die anderen Objekte und das Bitmap. Über einen TTimer oder QueryPerformanceCounter wird die Methode "Advance" der Engine aufgerufen, diese ruft dann die "Advance"-Methoden der anderen Objekte auf. Beim OnPaint des Formulars wird eine Methode der Engine aufgerufen, die das Bitmap auf die Canvas der Form kopiert.

So stelle ich mir das vor :mrgreen: .

[edit] Ich sollte keinen Beitrag vor dem Mittagessen anfangen und danach abschließen :oops: .

Tubos 9. Apr 2005 12:49

Re: 2d game:ping-pong
 
Zitat:

was bedeutet in diesem fall outside?
Mein Programm ist in C++ geschrieben und verwendet DirectX.
Es geht dabei um eine Box mit 4 Seitewänden, und einem Ball der drinnen hin- und herrollt. Die Box ist 20*14 groß (wenn ich mich recht erinnere...), wenn man annimmt dass die Box genau in der Mitte ist ergeben sich folgende Konstanten:
Code:
const integer LinkeWand = -10;
const integer RechteWand = 10;
const integer ObereWand = 7;
const integer UntereWand = -7;
Wenn der Ball an der linken Wand abprallt, muss ich einfach die x-Komponente der Bewegungsrichtung ändern. Da gibts nur ein Problem: Der Ball wird jedes Frame weiterbewegt, und die Bewegung ist bei jedem Frame verschieden: dauert das Frame länger, bewegt sich auch der Ball weiter.
Ich überprüfe, ob die Koordinaten des Balls plus Ballradius bereits außerhalb der Box sind. Wenn ich dann die y-Komponente der Bewegungsrichtung umdrehe, kann es passieren dass der Ball zwei Frames braucht um wirklich wieder in der Box zu sein. Und während dieser zwei Frames wird die Bewegungsrichtung des Balles ständig umgedreht! Er hüpft dann hin- und her und kommt nicht mehr in die Box zurück. Um das zu verhindern, verwende ich die Variable outside. Wenn sie auf true ist, dann heißt das dass der Ball gerade außerhalb der Box ist - in dem Fall drehe ich die Bewegungsrichtung nicht um, solange bis er wieder drinnen ist.

Zitat:

udn wie kriege ich die position des balls raus, bzw woher kriege ich solche x- und y-achsen?
Indem du DirectX, OpenGL oder evt. auch die WinAPI verwendest. Bedenke dass DirectX und OpenGL (aber insbesondere DirectX) äußerst kompliziert sind und dass man zunächst die Sprache, in der man programmiert, gut beherrschen sollte um mit sowas anzufangen.


Zitat:

Beim klassischen Ping-Pong wird das doch berücksichtigt oder irre mich da?
Ich glaube nicht dass das beim Computer-Ping-Pong berücksichtigt wird, aber vielleicht meinen wir zwei unterschiedliche Spiele.
Mein Code ist natürlich nur für den Fall dass die Flächen an denen der Ball abprallt achsenparallel sind. Nur dann ist es so einfach.

Zitat:

und^^...wie lasse ich den ball fliegen...
Wieder etwas Pseudocode, ich hoffe du kannst meine Mischung aus Delphi, C++ und Deutsch lesen ^^
Code:
VerwendeteVariablen:
   double TimeCorrectionFactor;
   float FrameTime;
   __int64 PerformanceFrequency;
   __int64 PerformanceCounter;
   float StartTime; // Zeitwert bei Programmstart
   float LastTime; // Der Zeitwert beim letzten Frame
   float CurrentTime; // Derzeitiger Zeitwert in Sekunden


// Beim Programmstart aufrufen, aber möglichst knapp vor dem Berechnen des ersten Frames:
QueryPerformanceFrequency(PerformanceFrequency);
TimeCorrectionFactor=1/PerformanceFrequency;
QueryPerformanceCounter(PerformanceCounter);
StartTime=PerformanceCounter*TimeCorrectionFactor;
LastTime=StartTime;

// Jedes Frame:
QueryPerformanceCounter(PerformanceCounter);
CurrentTime=PerformanceCounter * TimeCorrectionFactor;
FrameTime=(CurrentTime-LastTime);
LastTime=CurrentTime;

// Bewegen eines Objekts unter der Annahme dass objekt.bewegung und objekt.dimension beides zweidimensionale Vektoren mit Gleitkommazahlen sind und die verwendete.... ich sag mal "Grafik-Engine" (z.B. ein TBitMap, die WinAPI oder DirectX oder OpenGL.....) Gleitkommazahlen unterstützt. Auf ein Bitmap kannst du nicht mit Kommazahlen zeichnen, da gibts nur ganze Pixelnummern!
objekt.position = objekt.position + objekt.bewegung * FrameTime
Zitat:

wenn der ball gegen ein hindernis stößt, zb. eine wand, dann soll der einfallswinkel = ausfallswinkel sein, weist du was ich damit meine?
Ja, weiß ich. Ich weiß aber nicht auswendig wie man es berechnet weil ich es noch nie gebraucht habe. Du findest aber sicher Informationen bzw. Formeln dazu im Internet. Ist nicht soooo kompliziert.


Ich weiß nicht was du von den Informationen brauchen kannst, aber die oben geschilderte Methode zur Zeitmessung und framerate-unabhängigen Objektbewegung funktioniert äußerst gut, sofern die dort erwähnten Bedingungen gegeben sind.

mangaka 9. Apr 2005 13:03

Re: 2d game:ping-pong
 
1.habe jetzt dieses mag gekauft und versuche gleich delphi 2005pe zu installieren
2.wow-das ist ja schon ein schwerer happen den ihr mir davor wirft...

omg das wird doch etwas zu schwer für den anfang...
wie habt ihr das eigentlich alles gelernt?
unter euch sind doch bestimmt welche die ping-pong programmiert haben, was habt ihr vorher getan?

habt ihr irgendwelche bücher zu empfehlen?

mangaka 9. Apr 2005 13:14

Re: 2d game:ping-pong
 
hier habt ihr was zum totlachn:
HABE DAS SCHEISS FALSCHE MAGAZIN!
ich habe das mag mit der cd version und obowhl im inhalt steht dass borland drin sit gibts keine spur davon im heft

Nils_13 9. Apr 2005 13:17

Re: 2d game:ping-pong
 
Erwartest du jetzt wirklich das wir lachen, das ist nämlich viel lustiger :lol:

Tubos 9. Apr 2005 13:17

Re: 2d game:ping-pong
 
@mangaka: Bitte mach einen neuen Thread auf wenn du eine neue Frage hast. Danke.

Nils_13 9. Apr 2005 13:20

Re: 2d game:ping-pong
 
Wieso, das Thema ist jetzt hoffentlich für immer beendet.

mangaka 9. Apr 2005 13:27

Re: 2d game:ping-pong
 
Ich versuche grad delphi von borland zu laden, mal sehn ob es klappt T_T

nachdem ich dann eure codes studiert habe kommen die nächsten fragen.


-ja ich mach neuen thread bei einer neune frage auf

Nils_13 9. Apr 2005 13:30

Re: 2d game:ping-pong
 
kriegst du nicht, Thema ist jetzt beendet sonst wird hier gleich geschlossen.

malo 9. Apr 2005 13:30

Re: 2d game:ping-pong
 
Zitat:

Zitat von mangaka
sagt mal delphi 2005pe kriegt man nicht von borland.com/.de oda?
nur d7

Wie bereits gesagt: neue Frage -> neuer Thread. Um deine Frage aber zu beantworten: nein.

Seniman 9. Apr 2005 15:03

Re: 2d game:ping-pong
 
Hallo Mangaka,

ich weiß nicht genau, wie weit du dich mit Delphi auskennst, aber was du auf jeden Fall können solltest, um ein Ping-Pong spiel zu programmieren ist: Deklarieren eigener Klassen und das Zeichnen von Objekten auf der Canvas.
Dann solltest du dir erstmal generelle Gedanken zur Struktur deines Programms machen. Folgendes solltest du dir überlegen: Was für Variablen/ Objekte brauche ich für das Spiel? Was soll dann damit passieren?
Zu der ersten Frage: Du brauch zwei Schläger, und einen Ball. Der Ball muss ausserdem noch Informationen darüber haben, in welche Richtung er sich bewegt (Bewegungsvektor) gegebenenfalls, wie groß er ist, welche Farbe und so weiter, der Phantasie sind keine Grenzen gesetzt, absolut notwenig sind nur die Koordinaten und der Bewegungsvektor. Die beiden Schläger brauchen eine Position (obere Kante) und die Breite (Abstand Oberkante/Unterkante).
Was soll mit den Objekten passieren? Zuersteinmal müssen sie sich bewegen. Der Ball bewegt sich entlang seines Bewegungsvektors und prallt gegebenenfalls ab. Die Schläger bewegen sich auf Tastendruck. Danach müssen die Objekte noch auf den Bildschirm gezeichnet werden. Da das ganze in Echtzeit ablaufen soll, müssen diese Aktionen alle in einen Timer.
Soweit.
Das sind ersteinmal die Überlegungen, die man sich immer vorher machen muss. Die haben zwar erstmal nichts mit der Programmiersprache zu tun, sind aber mindestens genausowichtig, wie das Coden selbst.
Falls dir die obigen Überlegungen nicht weiterhelfen, dann versuch deine Schwierigkeiten im Detail weiter zu klären.

Grüße
Seniman

sniper_w 9. Apr 2005 15:10

Re: 2d game:ping-pong
 
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Ball : TRect;
  BallSpeedX : integer = 5;
  BallSpeedY : integer = 5;
  dx : integer = 1;
  dy : integer = 1;
  BallHeight : integer = 30;
  BallWidth : integer = 30;

// offscreen, flickefrei
  Offscreen : TBitmap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Caption := 'B_Ball';
 Width := 600;
 Height := 300;
 Ball := Rect(0,0,BallWidth,BallHeight);
 Timer1.Interval := 1;

 Offscreen := TBitmap.Create();
 with Offscreen do
 begin
  PixelFormat := pf32bit;
  Width := Screen.Width;
  Height := Screen.Height;
  Canvas.Brush.Color := clOlive;
  Canvas.Pen.Color := clBlack;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
 var old : integer;
begin//
 FormPaint(Self);

 OffsetRect(Ball,dx * BallSpeedX,dy * BallSpeedY);

      // Korrektur bei Bandenkollision
      if (Ball.Left < 0) then // links
      begin
        dx := 1;
      end
      else if (Ball.Left + BallWidth > ClientRect.Right) then// rechts
      begin
        dx := -1;
      end;

      if (Ball.Top < 0) then         // oben
      begin
        dy := 1;
      end
      else if (Ball.Top + BallHeight > ClientRect.Bottom) then// unten
      begin
        dy := -1;
      end;

 FormPaint(Self);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin//
 with Offscreen do
 begin
  Canvas.Brush.Style := bsSolid;
  Canvas.Brush.Color := clOlive;
  Canvas.FillRect(ClientRect);
  Canvas.Brush.Style := bsClear;
  Canvas.Ellipse(Ball);
 end;
 BitBlt(Canvas.Handle,0,0,Width,Height,
        Offscreen.Canvas.Handle,0,0,SRCCOPY);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin//
 Offscreen.Free();
end;

end.
Und jetzt ist der Ball nicht mehr verzehrt.

Nils_13 9. Apr 2005 15:13

Re: 2d game:ping-pong
 
@mangaka: noch ein Beitrag außer Danke oder sowas und es zählt: ich hab früher auch Pong geproggt und hatte nur ein kleines Problem.

mangaka 9. Apr 2005 15:25

Re: 2d game:ping-pong
 
hmmm.. danke für eure hilfe und seniman danke für deine grundsätzlichen überlegungen!
kann ich dich in icq kontaktieren?
hier meine icqno.:
173976608

Ich frag nur weil ich glaube das Nild_13 irgendwas gegen mich hat Oo
Der geht mir irgendwie langsam auf die nerven...


btw.: habe jetzt delphi7


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