![]() |
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?
|
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.
|
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:
Eine schlechte Methode eine Kollisionserkennung zu programmieren ist diese, aber sie funktioniert bei bestimmten Vorraussetzungen:
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;
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; |
Re: ping-pong spiel
bei mir geht der ball immer noch durch die schläger durch.
keine Ahnung warum :wiejetzt: |
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. |
Re: ping-pong spiel
Delphi-Quellcode:
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 :?:
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. |
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
|
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; |
Re: ping-pong spiel
Zitat:
|
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 22:47 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