AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pong - Problem bei der Ballkollision

Ein Thema von .chicken · begonnen am 7. Dez 2006 · letzter Beitrag vom 12. Dez 2006
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#11

Re: Pong - Problem bei der Ballkollision

  Alt 9. Dez 2006, 18:45
Ok, das klappt zwar soweit, aber dann is miene Transparent Color sichtbar... :/
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Pong - Problem bei der Ballkollision

  Alt 9. Dez 2006, 19:28
Zitat von .chicken:
Ok, das klappt zwar soweit, aber dann is miene Transparent Color sichtbar... :/
Dann statt BitBlt doch Draw nehmen.
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.
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#13

Re: Pong - Problem bei der Ballkollision

  Alt 9. Dez 2006, 20:07
Den Teil hab ich schon wieder nich verstanden
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?
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Pong - Problem bei der Ballkollision

  Alt 9. Dez 2006, 20:20
Zitat von .chicken:
an der Kollisionsabfrage haperts echt nochn bissl!
Hab ich doch oben was zu geschrieben:

Zitat von Cöster:
Dann überprüfst du halt erst, ob eine Kollision auf Höhe des Kugelmittelpunkts stattfindet. Nachher guckst du, ob die Entfernung vom Kugelmittelpunkt zu einer der Ecken des Spielerrechtecks kleiner ist als der Radius der Kugel. Dann gibt es nämlich eine Kollision mit einem Eckpunkt der Kugel. Zur Kollision von Kugeln mit Ecken findest du hier im Forum sämtliche Beiträge. Das wird allerdings dann etwas komplizierter.
Zitat von .chicken:
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?
Eine Prozedur schreiben, die prüft, welche der 4 Steuerungstasten gedrückt sind und abhängig davon dann die Spieler-Positionen verändert. Diese Prozedur dann im Timer aufrufen. Dann läuft das nämlich auch ruckelfrei durch (es sei denn, du willst, dass die Schläger-Bewegung ruckelt).
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#15

Re: Pong - Problem bei der Ballkollision

  Alt 9. Dez 2006, 20:24
Aso gut dann weiss ich jetzt wie, zu derm Kollisionsding:
Bei der "runden" Kollisionsabfrage bin ich noch garnicht...
Ich versuch grad erstmal das so hinzukriegen, aber ich versuch erstmal weiter, mein Kopf raucht schon

Danke fuer deine Hilfe
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#16

Re: Pong - Problem bei der Ballkollision

  Alt 9. Dez 2006, 23:52
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 ....
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#17

Re: Pong - Problem bei der Ballkollision

  Alt 10. Dez 2006, 16:06
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:
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.
Wie immer bin ich offen fuer konstruktive Kritik und Vorschlaege =)

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
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Pong - Problem bei der Ballkollision

  Alt 10. Dez 2006, 17:58
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 von .chicken:
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).
Wenn er auf die linke oder rechte Kante stößt verliert der Spieler ja trotzdem. Höchstens wenn er auf die Ecke des Schlägers prallt, springt er evtl. wieder zurück ins Feld. Bemüh mal die Suchfunktion, gab schon mehrere Threads dazu.
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#19

Re: Pong - Problem bei der Ballkollision

  Alt 10. Dez 2006, 20:26
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!
Angehängte Grafiken
Dateityp: bmp unbenannt_131.bmp (453,1 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Pong - Problem bei der Ballkollision

  Alt 10. Dez 2006, 21:36
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz