Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Blöde Frage, aber kann mir einer PONG programmieren :) ???? (https://www.delphipraxis.net/1359-bloede-frage-aber-kann-mir-einer-pong-programmieren.html)

Luckie 17. Nov 2002 16:10

Goggle-Suchergebnis (pong, delphi)

Mr_T 18. Nov 2002 14:36

Habe auch mit Delphi schonmal nen Pong - Clone gebastelt... kannst dur dir ja mal ansehen, falls du etwas Inspiration benötigst:
dgl.quellcodes.de


[edit=Admin]Link klickbar gemacht. Mfg. Daniel[/edit]

Raiden 21. Nov 2002 12:42

bitte bitte bitte bitte bitte bitte kann mir denn niemand helfen ???? ich muss das prog morgen abgeben und komme hier VOLL NICH weiter :(
Hier ist ein versuch von mir , bitte guckt es euch mal an und sagt mir wo der fehler ist bitte bitte bitte bitte bitte . Das prog hier unten soll eigentlich nur erstmal machen , dass der ball in dem spielfeld rumfliegt und an einer wand abprallt . bitt ebitte bitte könnt ihr das noch ein bisschen aufbessern , damit es geht , weil ich kriege das voll nicht hin ..........

Delphi-Quellcode:
unit pongu;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    BitBtn1: TBitBtn;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    PaintBox1: TPaintBox;
    procedure BitBtn1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Var winkel,r :REAL ;
      dx,dy : INTEGER ;

implementation

{$R *.dfm}

procedure TForm1.Button1.Click(Sender: TObject);
begin
timer1.enabled:= true ;
end;
VAR a : Tbitmap;
procedure TForm1.FormCreate(Sender: TObject);
begin
a := Tbitmap.create;
a.loadfromfile ('H:\ball.bmp');
PaintBox1.canvas.draw (i+dx,i+dy,a);
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
a.free;
end;

VAR i : INTEGER ;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
i := 1 ;
winkel := strtofloat (edit1.text);
r := strtofloat (edit2.text);

dx := round(cos(winkel*PI/180) *r) ;
dy := round (sin(winkel*PI/180) *r) ;
Form1.Repaint:
i := i+1 ;
end;

end.
[edit=sakura]Delphi Tags eingefügt[/edit]

sakura 21. Nov 2002 13:09

Am schnellsten können wir Dir helfen, wenn Du das gesamte Programm als ZIP Datei als Anhang zum Download bereitstellst.

Danke,

Luckie 21. Nov 2002 13:35

Dieser Code läßt dir einen roten Ball in einer Paintbox hin und her fliegen. Ist allerdings wohl etwas stümperhaft, aber Grafik- und Spieleprogrammierung ist nicht meine Stärke.

Delphi-Quellcode:
var
  Form1: TForm1;
  x, y: Integer;
  bleft: Boolean;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  Paintbox1.Canvas.Brush.Color := clRed;
  PaintBox1.Canvas.Ellipse(x+Paintbox1.Left,y+Paintbox1.Top,15+x,15);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (x < Paintbox1.Width-15) and (bleft = TRUE) then
    x := x+2
  else
  begin
    bleft := FALSE;
    x := x-2;
  end;
  if x <= 0 then
    bleft := TRUE;

  Caption := IntToStr(x);
  PaintBox1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bleft := TRUE;
end;

Raiden 21. Nov 2002 16:30

OK , also hier ist mein "nicht funktionierendes Proggie" zum download :

http://www.chrisparadise.de.vu/PONG.zip

falls Nr. 1 nicht geht: http://home.t-online.de/home/bodybuilder/PONG.zip


bittö helft mir , ich brauche das bis morgen und das ist extrem wichtig für mich , und ich denke mal für euch ist das nicht viel arbeit , da ihr ja alle profis seid im proggen .....

Also nochmal : ich brauche einfach nur ein prog , wo ein ball in einer paintbox oder in einem anderen spielfeld (image) hin und her fliegt und an den wänden im richtigen reflexionswinkel abprallt ... mehr eigentlich nicht , später muss ich noch die beiden paddle dareinmachen ,aber das werde ich hoffentlich alleine schaffen ...

ok , ich hoffe und warte auf schnell antworten , cu


[edit=sakura]Zweiter Link eingetragen - erster wollte bei mir nicht ;)[/edit]

d3g 21. Nov 2002 17:23

Hallo Raiden,

der Grund, warum sich der Ball nicht bewegt, ist, dass du die Variable i zwar global deklarierst, aber bei jedem Timerdurchlauf wieder auf 1 setzst. Eine Variable i ist aber ohnehin der falsche Weg, da die Position eines Balles nicht eindimensional, sondern zweidimensional ist. Du kannst also eine Variable pos vom Typ TPoint einführen (TPoint ist ein [packed] Record mit zwei Intergervariablen, x und y). Dieser speichert die Position des Balles.
Code:
[b]var[/b]
  pos: TPoint = (x: 0; y: 0);
Wenn du jetzt deine Funktion ausführst, wirst du erkennen, dass der Ball einen "Kondensstreifen" hinterlässt, da die alte Position des Balles nicht übermalt wird. Du musst also ein
Code:
PaintBox1.Repaint;
vor dem Zeichnen einbauen, damit ist der Fehler behoben.

Jetzt prallt der Ball leider noch nicht von den Seiten ab. Um das zu realisieren, führe zei neue Integervariablen vx und vy ein:
Code:
[b]var[/b]
  vx: Integer = 1;
  vy: Integer = 1;
Der Trick besteht darin, dass diese Variablen mit dx bzw. dy multipliziert werden. Hier passiert (weil vx und vy noch 1 sind) nichts. Nach dem Zeichnen wird dann aber überprüft, ob der Ball gerade an einer Wand ist. wenn an der linken oder rechten, wird vx mit -1 multipliziert, an der oberen und unteren vy mit -1. Jetzt passiert beim nächsten Zeichnen folgendes: Nehmen wir an dx beträgt 8, der Ball sollte also um 8 Pixel nach rechts verschoben werden. Jetzt wird dx mit -1 multipliziert und damit wird der Ball um -8 Pixel nach rechts, also 8 Pixel nach links verschoben - das Abprallen ist perfekt. Analog dazu verhält sich die Beziehung zwischen vy und dy.

Die gesamte Funktion könnte jetzt so aussehen:
Code:
[b]var[/b]
  pos: TPoint = (x: 0; y: 0);
  vx: Integer = 1;
  vy: Integer = 1;

[b]procedure[/b] TForm1.Timer1Timer(Sender: TObject);
[b]begin[/b]
  dx := vx * round(cos(winkel * Pi / 180) * r);
  dy := vy * round(sin(winkel * Pi / 180) * r);
  Inc(pos.x, dx);
  Inc(pos.y, dy);
  PaintBox1.Repaint;
  PaintBox1.Canvas.Draw(pos.x, pos.y, a);
  [b]if[/b] ((pos.x + a.Width >= PaintBox1.Width) [b]or[/b]
      (pos.x <= 0))
  [b]then[/b]
    vx := -vx;

  [b]if[/b] ((pos.y + a.Height >= PaintBox1.Height) [b]or[/b]
      (pos.y <= 0))
  [b]then[/b]
    vy := -vy;
[b]end[/b];
Ich habe die beiden FloatToStr-Anweisungen in die BitBtn1Click-Prozedur verschoben, da r und winkel nur einmal eingelesen werden müssen.

Ab hier darfst du selber weiterdenken, jetzt dürfte es nicht mehr so schwierig sein, zwei Paddles einzubauen.

MfG,
d3g

PS. Ich würde die Grafik niht von H:\ball.bmp laden, sondern in einem relativen Pfad, weil es bei anderen Rechnern, auf denen H:\ nicht existiert, Probleme gibt.

[edit]Tippfehler korrigiert.[/edit]

Raiden 21. Nov 2002 20:39

:shock: :shock:
WAHNSINN , cool .... danke :D

du hast mich gerade gerettet , danke für deine mühen , ist echt verdammt nett von dir , na gut ich werde mich dann mal an die paddles machen und hoffe das ich die schaffe :)


cu


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