AGB  ·  Datenschutz  ·  Impressum  







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

ping-pong spiel

Ein Thema von konda · begonnen am 20. Dez 2005 · letzter Beitrag vom 22. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von konda
konda

Registriert seit: 20. Dez 2005
253 Beiträge
 
Turbo Delphi für Win32
 
#1

ping-pong spiel

  Alt 20. Dez 2005, 13:10
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?
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: ping-pong spiel

  Alt 20. Dez 2005, 13:13
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#3

Re: ping-pong spiel

  Alt 20. Dez 2005, 13:56
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;
  Mit Zitat antworten Zitat
Benutzerbild von konda
konda

Registriert seit: 20. Dez 2005
253 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: ping-pong spiel

  Alt 20. Dez 2005, 14:37
bei mir geht der ball immer noch durch die schläger durch.
keine Ahnung warum
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#5

Re: ping-pong spiel

  Alt 20. Dez 2005, 14:48
poste doch mal deinen Code.

//edit 555 Beiträge

beachte übrigens was nils hingeschrieben hat: GILT NUR FÜR Form.width=x und form.height=x.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von konda
konda

Registriert seit: 20. Dez 2005
253 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: ping-pong spiel

  Alt 20. Dez 2005, 15:12
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
  Mit Zitat antworten Zitat
pacman1986

Registriert seit: 11. Feb 2005
Ort: Kirchhain
498 Beiträge
 
Delphi 2005 Personal
 
#7

Re: ping-pong spiel

  Alt 20. Dez 2005, 16:21
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
Christian N.
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#8

Re: ping-pong spiel

  Alt 20. Dez 2005, 16:23
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;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von konda
konda

Registriert seit: 20. Dez 2005
253 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: ping-pong spiel

  Alt 21. Dez 2005, 12:01
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
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#10

Re: ping-pong spiel

  Alt 21. Dez 2005, 12:31
wieso das?

[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

[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;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:06 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