Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ping-pong spiel (https://www.delphipraxis.net/59302-ping-pong-spiel.html)

konda 20. Dez 2005 13:10


ping-pong spiel
 
ich will nen ping-pong spiel programmieren mit 2 spielern. Der Ball springt aber einfach durch meine Schläger(Shape-objekte) hindurch. Wie krieg ich es hin das er abprallt?

3_of_8 20. Dez 2005 13:13

Re: ping-pong spiel
 
Du machst das mit Shapes? Naja, nicht die beste Möglichkeit. Aber du musst halt einfach dir ein Rechteck um den Ball denken, und dann überprüfen mit einem Timer, ob der Ball den Schläger berührt. Wenn ja, berechnest du einfach anhand des Eintrittwinkels den Austrittswinkel und änderst die Bewegungsrichtung.

Nils_13 20. Dez 2005 13:56

Re: ping-pong spiel
 
Hi !

[EDIT]Herzlich Willkommen in der dp ![/EDIT]

Das ist eine Möglichkeit eine KI zu programmieren:
Delphi-Quellcode:
procedure TForm1.ki;
var schritt: integer;
begin
  // enemy = 'gegnerischer Balken'
  schritt := 1;
  if ball.Top > enemy.Top then enemy.Top := enemy.Top+schritt;
  if ball.Top < enemy.Top then enemy.Top := enemy.Top-schritt;
end;
Delphi-Quellcode:
procedure TForm1.tTimer(Sender: TObject);
var toleranz : integer; // umgebung um den balken herum in pixeln
begin
  // player = Spilerbalken
  toleranz := ball.Width div 2;
  if (ball.top > player1.top -1-toleranz) and (ball.top < player1.top + player1.height +1+toleranz) and   (ball.left = player1.left+player1.width) then xspeed := -xspeed;
end;
Eine schlechte Methode eine Kollisionserkennung zu programmieren ist diese, aber sie funktioniert bei bestimmten Vorraussetzungen:
  • Form muss 352 Pixel breit sein
  • Form muss 380 Pixel hoch sein
  • Player Left muss 0 entsprechen
  • Gegner Left muss 328 entsprechen
Ohne diese Vorrausetzungen kann es zu allenmöglichen Fehlern kommen, teilweise nur Fehler, so dass der Ball durch den Spieler durchläuft und dann ganz links oder rechts abprallt ... . Aber nun zum Code:
Delphi-Quellcode:
//Ballkollision
if (Abs(ball.Left - enemy.left) <= 5) and (Abs(ball.Top - enemy.Top) <= 5) then xspeed:= -xspeed;
if (ball.top > player1.top -1-toleranz) and (ball.top < player1.top + player1.height +1+toleranz) and (ball.left = player1.left+player1.width) then xspeed := -xspeed;

//Kollisionserkennung
if ball.Left<0 then
begin

end;

if ball.Left>345 then
begin

end;

if ball.Left<0 then xspeed := -xspeed;

if ball.Top<0 then yspeed := -yspeed;
if ball.Left>346 then xspeed := -xspeed;
if ball.Top>346 then yspeed := -yspeed;

konda 20. Dez 2005 14:37

Re: ping-pong spiel
 
bei mir geht der ball immer noch durch die schläger durch.
keine Ahnung warum :wiejetzt:

ichbins 20. Dez 2005 14:48

Re: ping-pong spiel
 
poste doch mal deinen Code.

//edit 555 Beiträge :cheers:

beachte übrigens was nils hingeschrieben hat: GILT NUR FÜR Form.width=x und form.height=x.

konda 20. Dez 2005 15:12

Re: ping-pong spiel
 
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Ball: TShape;
    Timer1: TTimer;
    player1: TShape;
    player2: TShape;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private
    xspeed,yspeed,vx,vy,xpos,ypos: integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

     ypos:= 0;
     xpos:= 0;
     ball.left:= xpos;
     ball.top:= ypos;

     xspeed:= -1;
     yspeed:= 1;
     vx:= 5;
     vy:= 5;
end;




procedure TForm1.Timer1Timer(Sender: TObject);
var toleranz,schritt: integer;
begin
     xpos:= xpos+xspeed*vx;
     ypos:= ypos+yspeed*vy;

     if (xpos<0) then begin
       xspeed:= 1;
       xpos:= 0;
     end;
     if (xpos+ball.width>=form1.ClientWidth) then begin
       xspeed:= -1;
       xpos:= form1.clientwidth-ball.width;
     end;

     if (ypos<0) then begin
       yspeed:= 1;
       ypos:= 0;
     end;
     if (ypos+ball.height>=form1.Clientheight) then begin
       yspeed:= -1;
       ypos:= form1.clientheight-ball.height;
     end;

     ball.top:= ypos;
     ball.left:= xpos;
end;

end.
Hier ist mein code. player1 i´st der linke schläger, player2 der rechte. wie ich das mit dem abprallen machen soll weiß ich noch gar nicht :?:

pacman1986 20. Dez 2005 16:21

Re: ping-pong spiel
 
Du hast nur berprüft ob der ball die wände trifft oder seh ich das falsch wenn du willst das er auch abprallt wenn er den schläger trift reicht das net

ichbins 20. Dez 2005 16:23

Re: ping-pong spiel
 
Wie du das mit dem Abprallen machen sollst: Du überprüfst einfach, ob der Ball den Schläger überlappt.

Delphi-Quellcode:
//für player1:
if (ball.left<player1.left+player1.width) and (ball.top<player1.top) and (ball.top+ball.height<player1.top+player1.height) then
  xspeed:=1;
//für player2:
if (ball.left+ball.width>player2.left) and (ball.top<player2.top) and (ball.top+ball.height<player2.top+player2.height) then
  xspeed:=-1;

konda 21. Dez 2005 12:01

Re: ping-pong spiel
 
Zitat:

Zitat von ichbins
Wie du das mit dem Abprallen machen sollst: Du überprüfst einfach, ob der Ball den Schläger überlappt.

hat super geklappt, man muss nur statt dem zweiten and ein 'or' oder aus einer if zwei if's machen :thumb:

ichbins 21. Dez 2005 12:31

Re: ping-pong spiel
 
wieso das? :gruebel:

[Wenn Ball rechts der Linie] und [Höchster Punkt des Balles niedriger als Höchster Punkt des Schlägers] und [Niedirigster Punkt des Balles höher als Niedrigster Punkt des Schlägers]

wenn ich da jetzt aus dem 2. Und ein Oder mache, geht das für die ganze Bildschirmbreite :gruebel:

[edit]

SORRY in meinem Code war ein Fehler. Das muss so heissen:

Delphi-Quellcode:
//für player1:
if (ball.left<player1.left+player1.width) and (ball.top{hier}>player1.top) and (ball.top+ball.height<player1.top+player1.height) then
  xspeed:=1;
//für player2:
if (ball.left+ball.width>player2.left) and (ball.top{und hier}>player2.top) and (ball.top+ball.height<player2.top+player2.height) then
  xspeed:=-1;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.
Seite 1 von 2  1 2      

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