![]() |
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? |
Re: 2d game:ping-pong
Zitat:
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:
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.
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; |
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? |
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: |
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 ![]() 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:
Edit:
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; Ähh...bei euch könnt ihr die z-Achse weglassen! |
Re: 2d game:ping-pong
Zitat:
|
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 ^^ |
Re: 2d game:ping-pong
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ums Prinzip zu begreifen. |
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."!
|
Re: 2d game:ping-pong
:gruebel: den Fehler hatte ich noch nie, hast du es entpackt ?
Auch aus der Rar läufts. |
Re: 2d game:ping-pong
Bei mir meint er die LMD-Kompo fehlt...
|
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.
|
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! |
Re: 2d game:ping-pong
Hi, wenns nicht läuft zieh alles rüber, was wichtig ist (in eine neue Anwendung).
|
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.
|
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 |
Re: 2d game:ping-pong
Zitat:
|
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.
|
Re: 2d game:ping-pong
Delphi-Quellcode:
Und ich weiss nicht warum sich Ball sooo verhält . :gruebel:
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. |
Re: 2d game:ping-pong
Der Ball ruckelt ?
|
Re: 2d game:ping-pong
|
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 |
Re: 2d game:ping-pong
Da die is die richtige.
|
Re: 2d game:ping-pong
Danke!
Dann mal schnell einkaufen gehn^^ bis gleich! |
Re: 2d game:ping-pong
Zitat:
Delphi-Quellcode:
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.
type
TBall = class private FPosition: TPoint; FSpeed: TPoint; //TPoint als Vektor, der in jedem Frame zur Position addiert wird [...] So stelle ich mir das vor :mrgreen: . [edit] Ich sollte keinen Beitrag vor dem Mittagessen anfangen und danach abschließen :oops: . |
Re: 2d game:ping-pong
Zitat:
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:
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.
const integer LinkeWand = -10;
const integer RechteWand = 10; const integer ObereWand = 7; const integer UntereWand = -7; 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:
Zitat:
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:
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:
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. |
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? |
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 |
Re: 2d game:ping-pong
Erwartest du jetzt wirklich das wir lachen, das ist nämlich viel lustiger :lol:
|
Re: 2d game:ping-pong
@mangaka: Bitte mach einen neuen Thread auf wenn du eine neue Frage hast. Danke.
|
Re: 2d game:ping-pong
Wieso, das Thema ist jetzt hoffentlich für immer beendet.
|
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 |
Re: 2d game:ping-pong
kriegst du nicht, Thema ist jetzt beendet sonst wird hier gleich geschlossen.
|
Re: 2d game:ping-pong
Zitat:
|
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 |
Re: 2d game:ping-pong
Delphi-Quellcode:
Und jetzt ist der Ball nicht mehr verzehrt.
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. |
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.
|
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