AGB  ·  Datenschutz  ·  Impressum  







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

PingPong

Ein Thema von NoRiX · begonnen am 5. Mai 2005 · letzter Beitrag vom 14. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
NoRiX

Registriert seit: 26. Apr 2005
6 Beiträge
 
#1

PingPong

  Alt 5. Mai 2005, 20:12
Ich weiss das es dieses Thema schon oft genug hier gab habe aber auf meine Frage keine Antwort mit Hilfe der Suchfunktion gefunden! Ich in jetzt soweit das der Ball hin und her fliegt und an den Wänden abprallt, aber ich bekomm es nicht hin das er an dem Paddel abprallt Kann mir da einer helfen? Habe als Paddel nen Button verwendet!

Würd auch noch gerne wissen wie man es anstellt das man an zb für den Ball nen eigenes Bild verwenden kann!

Delphi-Quellcode:
  
private
      Ball: TBitmap;

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  posx,posy,geschwx,geschwy,breite,hoehe:integer;
implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
repaint;

breite:=clientwidth;
hoehe:=clientheight;
//Ball
Canvas.Draw(posx+40,posy+40, Ball);

//Bewegung
posx:= posx + geschwx;
posy:= posy + geschwy;

//Gegner
if posy > button2.Top then button2.Top := button2.Top+4;
if posy < button2.Top then button2.Top := button2.Top-4;

//Abprallen Y-Achse
if posy >= hoehe-60 then geschwy:= - geschwy ;
if posy <= -40 then geschwy:= - geschwy ;
//Abprallen X-Achse
if posx <= -50 then
begin
timer1.enabled:= false;
showmessage('Game Over');
end;

if posx >= breite-40 then
begin
timer1.enabled:= false;
showmessage('Gewonnen');
end;

//Abprallen player1 und 2
if
(posx > (button2.left-30 ) + Button2.Width -40 )
or
(posx < Button1.Left + Button1.Width - 40)
then
begin
if
(posy < Button1.Top + Button1.Height )
and
(posy > Button1.Top )
or
(posy < Button2.Top + Button2.Height -50 )
and
(posy > Button2.Top - 70 )
then
geschwx := - geschwx ;

end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

//festgelegte Geschwindigkeit
geschwx:=0;
geschwy:=0;
//Ball Grafik
Ball := TBitmap.Create;
Ball.LoadFromFile('Ball.bmp');

end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
//Paddel Bewegung
button1.top:= y ;
end;

// SPielbeginn per SPace
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if getasynckeystate (vk_space) <> 0 then
begin
label1.visible:=false;
geschwx:=4;
geschwy:=4;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(Ball);
end;
procedure TForm1.Beenden1Click(Sender: TObject);
begin
close
end;
Angehängte Dateien
Dateityp: zip exe_281.zip (166,5 KB, 39x aufgerufen)
Dateityp: zip pongping_143.zip (175,4 KB, 45x aufgerufen)
  Mit Zitat antworten Zitat
McLane

Registriert seit: 4. Sep 2004
37 Beiträge
 
Delphi 5 Professional
 
#2

Re: PingPong

  Alt 5. Mai 2005, 20:56
ich hab mir den anhang jetzt nicht angeschaut, aber such mal nach nem opengl tutorial von MrT im Forum und schreib das ganze in opengl wäre mein tip...
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#3

Re: PingPong

  Alt 5. Mai 2005, 21:15
Mein (gegen)Tip: Bleib beim Canvas, ist definitiv einfacher und verständlicher für den Anfang. (Danach kann mans immer noch auf OGL oder DX ausweiten)

Zu deinem Problem:
betrachten wir folgende Zeile genauer:
if posx <= -50 then geschwx:= - geschwx ; du fragst einfach ab, ob er auf der linken seite abprallt.
dabei darf er nicht ganz an der seite abprallen, sondern auf höhe des buttons, und auf dessen x-koordinate
also:
Delphi-Quellcode:
if posx <= Button1.Left + Button1.Width - 50 then
begin
//Also wenn er rechts da irgendwo anstößt
  if (posy > Button1.Top) and (posy < Button1.Top + Button1.Height) then
    //Wenn der ball auch noch auf der richtigen höhe is
    geschwx := - geschwx
  else
    //Game over, der ball is im aus
end;

Um ein eigenes Bild für den Ball verwenden zu können, kannst du dir evt. mal Delphi-Referenz durchsuchenTBitmap anschaun
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: PingPong

  Alt 5. Mai 2005, 21:34
Nach etwas Einarbeiten mit TBitmap am besten nur noch auf Bitmaps zeichnen und diese im OnPaint in die Paintbox kopieren, dann ist der Sprung zur GR32-Lib auch nicht mehr weit .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
NoRiX

Registriert seit: 26. Apr 2005
6 Beiträge
 
#5
  Alt 5. Mai 2005, 23:11
ok! das klappt jetzt alles soweit...danke schonmal!
aber mit dem Tbitmap versteht ich irgendwie nicht :/
Kann mir einer evtl. nen Beispiel Code oder ein schon fertiges Programm zeigen wo das benutzt wird?

Also nochma Ich möchte gern meine eigenen Grafiken mit in das Spiel einbringen!
  Mit Zitat antworten Zitat
Phobeus

Registriert seit: 14. Sep 2003
Ort: Tespe
65 Beiträge
 
Delphi 7 Professional
 
#6

Re: PingPong

  Alt 6. Mai 2005, 07:57
Also als die Nachfrage nach Code kam, war ich kurz davor dieses Post nicht zu tätigen. Es ist nicht gut Lösungen an Hand fertiger Programme zu suchen. Nur wenn man es sich selbst erarbeitet hat, kann man vernünftig darauf aufbauen. Allerdings hat bei uns zufällig das Mitglied "red" ein Pong-Clone mit Source Code eingereicht. Basierend auf OpenGL und in einem witzigen Stil.
http://www.delphigl.com/do_download.php?f=50003
Florian Sievert
http://www.delphigl.com/
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: PingPong

  Alt 6. Mai 2005, 08:22
@Phobeus: ich denke auch, dass OpenGL für den Anfang etwas "overpowered" ist.

@NoRiX:
Die TBitmap-Variable muss zuerst einmal global (am besten im private-Teil der Form) deklariert sein, da wir sie ja nicht nur in einer Funktion brauchen:
Delphi-Quellcode:
type
  TForm1 = ...
  private
    Bit: TBitmap;
Da TBitmap keine Komponente ist, müssen wir die Instanz selbst erstellen und wieder freigeben. Im OnCreate laden wir gleichzeitig noch das Bild.
Delphi-Quellcode:
// OnCreate
  Bit := TBitmap.Create;
  Bit.LoadFromFile('Ball.bmp');

// OnDestroy
  FreeAndNil(Bit);
Wenn du ein JPEG laden willst, musst du nur die JPEG-Unit in die uses-Klausel einfügen, für PNG gibt es das Bei Google suchenTPNGImage.

Nun musst du im OnTimer statt dem Code für die Ellipse folgenden einfügen:
  Canvas.Draw(0, 0, Bit);
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Nils_13

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

Re: PingPong

  Alt 6. Mai 2005, 09:09
Hi,

OpenGl ist dfür viel zu aufwendig, wenn du hiermit etwas anfangen kannst:
Delphi-Quellcode:
var
  Form1: TForm1;
  xspeed: Integer=1;
  yspeed: Integer=1;
  bdirection: byte;

{ ... }

procedure TForm1.ki;
var schritt: integer;
begin
schritt := 2;
  if ball.Top > enemy.Top then enemy.Top := enemy.Top+schritt;
  if ball.Top < enemy.Top then enemy.Top := enemy.Top-schritt;
end;

procedure TForm1.go_p1;
begin
showmessage(Edit1.text+' '+'gewinnt');
end;

procedure TForm1.go_p2;
begin
showmessage(Edit2.text+' '+'gewinnt');
end;

procedure TForm1.tTimer(Sender: TObject);
var toleranz : integer; // umgebung um den balken herum in pixeln
begin
toleranz := ball.Width div 2;
//KI-Aktivierung
ki;

//Vereinbarungen
ball.left := ball.Left + xspeed;
ball.Top := ball.Top + yspeed;

//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;

//Ballkollisions Ton
if (Abs(ball.Left - enemy.left) <= 5) and (Abs(ball.Top - enemy.Top) <= 5) then mp1;
if (ball.top > player1.top -1-toleranz) and (ball.top < player1.top + player1.height +1+toleranz) and (ball.left = player1.left+player1.width) then mp1;

//Kollisionserkennung
if ball.Left<0 then
begin
  t.Enabled:= false;
  ball.Visible:= false;
  go_p2;
end;
if ball.Left>345 then
begin
t.Enabled:= false;
ball.Visible:= false;
go_p1;
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;
end;
Such dir was du brauchst einfach raus.
Du musst aufpassen, dass width und height angepasst [schritt := 2] ist.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: PingPong

  Alt 6. Mai 2005, 09:35
Zitat von Nils_13:
Hi,

OpenGl ist dfür viel zu aufwendig, wenn du hiermit etwas anfangen kannst:
[...] Such dir was du brauchst einfach raus.
Du musst aufpassen, dass width und height angepasst [schritt := 2] ist.
Das meiste davon hat er doch schon, seine aktuelle Frage ist gar nicht enthalten, der Code ist unvollständig und über globale Variablen und Codeeinrückung will ich gar nichts sagen.

Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Nils_13

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

Re: PingPong

  Alt 6. Mai 2005, 09:36
Es läuft aber
Der Rest vom Code besteht nur aus der Hauptmenüprogrammierung
  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 11:04 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