![]() |
Re: Pong - Problem bei der Ballkollision
Ok, das klappt zwar soweit, aber dann is miene Transparent Color sichtbar... :/
|
Re: Pong - Problem bei der Ballkollision
Zitat:
Oder aber: Wie sehen die beiden Bitmaps Spieler und Ball denn aus? Wenn sie nicht allzu kompliziert sind, könntest du sie ja auch über die Canvas-Routinen selbst zeichnen. Dann erstellst du ein OffScreen-Bitmap, kopierst darauf zunächst den Bildschirmausschnitt des Images, auf den du später kopierst, zeichnest auf das OffScreen-Bitmap mit den Canvas-Routinen den Ball bzw. Spieler und kopierst das OffScreen-Bitmap anschließend auf die PaintBox. Musst du gucken, was schneller geht. Ich weiß nur, dass Tranzparenz im allgemeinen ziemlich ausbremst. |
Re: Pong - Problem bei der Ballkollision
Den Teil hab ich schon wieder nich verstanden :D
Also der Ball sieht imho noch nich so kompliziert aus aber will den spaeter vielleicht nochma aendern wenn alles funktioniert! Also das is ja auch erstma egal, laeuft so ja auch...nur an der Kollisionsabfrage haperts echt nochn bissl! Versuche das nun mit IntersectRect..das klappt aber irgendwie noch nich so ganz,daran arbeite ich nun erstmal weiter... Könntest du mir das mit dem "getAsyncKeyState" nochmal genauer erklaeren? Also ich rufe dass dann fuer jede Taste die ich benutzen will auf oder wie oder was? :wall: :mrgreen: |
Re: Pong - Problem bei der Ballkollision
Zitat:
Zitat:
Zitat:
|
Re: Pong - Problem bei der Ballkollision
Aso gut dann weiss ich jetzt wie, zu derm Kollisionsding:
Bei der "runden" Kollisionsabfrage bin ich noch garnicht... :D Ich versuch grad erstmal das so hinzukriegen, aber ich versuch erstmal weiter, mein Kopf raucht schon :D Danke fuer deine Hilfe |
Re: Pong - Problem bei der Ballkollision
Ich hab mir grad ueberlegt die Bewegung nich wie vorher zu berechnen sondern mittels der Steigung, dh ich rechne richtung.y / richtung.X und verschiebe y jedesmal wenn ich x um einen verschiebe um soviel...
was haltet ihr davon? sinnvoller? so könnte man die kollisionen genauer abfragen glaube ich...aber die umsetzung is glaub ich dochn bisschen kompliziert, waer ja dann mit extended nichmehr nur mit integer .... |
Re: Pong - Problem bei der Ballkollision
Ok, also habe nun nochmal komplett von vorne angefangen und erstmal nur mit einem Spielerbrett...
Der Stand der Dinge sieht so aus, dass der Ball von allen Waenden abprallt (bis auf die hinter ihm, dann is das Spiel vorbei) und der Ball einen Drall bekommt, jenachdem auf welcher Seite vom Schlaeger er aufprallt! Hier der Quelltext:
Delphi-Quellcode:
Wie immer bin ich offen fuer konstruktive Kritik und Vorschlaege =)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Math; const Breite = 300; Hoehe = 300; type TForm1 = class(TForm) PaintBox1: TPaintBox; Timer1: TTimer; Left: TImage; Right: TImage; Shape1: TShape; procedure Spielfeld_bemalen(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Spielstart; procedure Ball_berechnen; procedure Tastendruck(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation type TSpieler = record X, Y: Integer; Bmp: TBitmap; end; type TBall = record X, Y: Integer; Bmp: TBitmap; Richtung: TPoint; end; var Spieler: TSpieler; Ball: TBall; {$R *.dfm} procedure TForm1.Spielfeld_bemalen(Sender: TObject); begin PaintBox1.Canvas.Brush.Color := clBlack; Paintbox1.Canvas.Pen.Color := clBlack; PaintBox1.Canvas.Rectangle(0, 0, Breite, Hoehe); PaintBox1.Canvas.Draw(Spieler.X, Spieler.Y, Spieler.Bmp); Paintbox1.Canvas.Draw(Ball.X, Ball.Y, Ball.Bmp); end; procedure TForm1.Timer1Timer(Sender: TObject); begin //Tastendrücke if GetAsyncKeyState(VK_Left) < 0 then if Spieler.X > 0 then Spieler.X := Spieler.X - 10; if GetAsyncKeyState(VK_Right) < 0 then if Spieler.X + Spieler.Bmp.Width < Breite then Spieler.X := Spieler.X + 10; PaintBox1.Invalidate; Ball_berechnen; end; procedure TForm1.FormCreate(Sender: TObject); begin Form1.DoubleBuffered := True; Randomize; Timer1.Enabled := False; end; procedure TForm1.Spielstart; begin Spieler.Bmp := TBitmap.Create; Spieler.Bmp.LoadfromFile('Spieler.bmp'); Spieler.X := Breite div 2 - (Spieler.Bmp.Width div 2); Spieler.Y := 0; Ball.Bmp := TBitmap.Create; Ball.Bmp.LoadFromFile('Ball.bmp'); Ball.Bmp.TransparentColor := RGB(255, 0, 216); Ball.Bmp.Transparent := True; Ball.X := Breite div 2 - Ball.Bmp.Width div 2; Ball.Y := Hoehe div 2 - Ball.Bmp.Height div 2; Ball.Richtung.X := 0; Ball.Richtung.Y := -(Random(9) + 3); end; procedure TForm1.Ball_berechnen; var R0, R1, R2: TRect; i: Integer; begin Ball.X := Ball.X + Ball.Richtung.X; Ball.Y := Ball.Y + Ball.Richtung.Y; R1 := Rect(Ball.X - 1, Ball.Y - 1, Ball.X + Ball.Bmp.Width + 1, Ball.Y + Ball.Bmp.Height + 1); R2 := Rect(Spieler.X, Spieler.Y, Spieler.X + Spieler.Bmp.Width, Spieler.Y + Spieler.Bmp.Height); //Schläger angestoßen oder gepunktet? if Ball.Y <= 0 + Spieler.Bmp.Height then //Schläger angestoßen if IntersectRect(R0, R1, R2) = True then begin Ball.Y := Spieler.Bmp.Height; i := (Ball.X + (Ball.Bmp.Width div 2)) - (Spieler.X + (Spieler.Bmp.Width div 2)); Ball.Richtung.X := Ball.Richtung.X + (i div 5); Ball.Richtung.Y := -Ball.Richtung.Y; end else //Gepunktet begin Timer1.Enabled := False; Showmessage('ITS OVER!'); end else //Wand angestoßen? if Ball.X <= 0 then begin Ball.X := 0; Ball.Richtung.X := -Ball.Richtung.X; end else if Ball.X + Ball.Bmp.Width >= Breite then begin Ball.X := Breite - Ball.Bmp.Width; Ball.Richtung.X := - Ball.Richtung.X; end else if Ball.Y + Ball.Bmp.Height >= Hoehe then begin Ball.Y := Hoehe - Ball.Bmp.Height; Ball.Richtung.Y := - Ball.Richtung.Y; end; end; procedure TForm1.Tastendruck(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_Return: begin Spielstart; Timer1.Enabled := True; end; end; end; end. Achja und hat noch wer ne Idee wie ich realisieren kann, dass der Ball auch an der rechten und linken Kante vom Schlaeger abprallen kann? Momentan ist es so, dass sobald er hinter der Vorderkante des Schlaegers landet das Spiel zuende ist, weil ich Probleme hatte zu prüfen ob der Ball nun auf die Kante oder Vorne aufgekommen ist (wie auch schon in einem meiner letzten Posts beschrieben). MfG |
Re: Pong - Problem bei der Ballkollision
Die ersten 3 Anweisungen in Spielfeld_bemalen kannst du dir sparen, wenn du einfach im Objektinspektor Form1.Color auf clBlack stellst. Das Canvas der PaintBox wird vorm OnPaint sowieso gelöscht.
Zitat:
|
Re: Pong - Problem bei der Ballkollision
Liste der Anhänge anzeigen (Anzahl: 1)
Ja verliern tut er trotzdem, aber wenn beim FIFA der Ball ins Tor geht sieht man das auch ;-)
Nein also natuerlich funktioniert das so auch aber irgendwann treten ja auch ma Situationen auf wo das nichtmehr so ist und ich will ja was aus dem Projekt lernen ;-) Danke für deine Antwort ich guck nochma im Forum! Edit: Also habe zu meinem speziellen Problem nichts gefunden im Forum ich haeng mal ne Grafik zur Verdeutlichung dran! |
Re: Pong - Problem bei der Ballkollision
Naja, wann gibt es eine Kollision mit der senkrechten Kante? Wenn der Mittelpunkt des Kreises oberhalb der unteren Kante des Schlägers ist und sich der linke (rechte) Rand des Kreises links (rechts) von der rechten (linken) Kante des Schlägers befindet.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 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