AGB  ·  Datenschutz  ·  Impressum  







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

Mein Pong Problem

Ein Thema von fake115 · begonnen am 21. Mai 2014 · letzter Beitrag vom 21. Mai 2014
Antwort Antwort
fake115

Registriert seit: 21. Mai 2014
3 Beiträge
 
#1

Mein Pong Problem

  Alt 21. Mai 2014, 16:58
Hallo ich habe das wohl simpleste nicht wirklich seiende Pong in Arbeit.
Es soll ganz einfach erstmal so sein, dass die Kugel von Links nach rechts
donnert. Das habe ich mit 2 Timern gemacht, welche sich an bzw. ausschalten
sobald die Kugel einen der Balken trifft. Jetzt ist das Problem, dass die
Kugel an dem einen Abprallt also auch der 2. Timer aktiviert wurde, jedoch
bei Kollision fliegt meine Kugel nicht zurück. Die Timer sind auf 10gestellt.

Delphi-Quellcode:
unit uPong;

{$mode objfpc}{$H+}

interface

uses
  Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, StdCtrls; // Windows vonnöten damit Tastenabfrage funktioniert (KeyPreview True ist wichtig)

type

  { TfrmPong }

  TfrmPong = class(TForm)
    Ball: TShape;
    btStart: TButton;
    Spieler1: TShape;
    Spieler2: TShape;
    tBall1: TTimer;
    tBall2: TTimer;
    procedure btStartClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure tBall1Timer(Sender: TObject);
    procedure tBall2Timer(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  frmPong: TfrmPong;

implementation

{$R *.lfm}

{ TfrmPong }

procedure TfrmPong.FormKeyDown(Sender: TObject; var Key: Word; // TASTENABFRAGEN
  Shift: TShiftState);
begin
     if key = vk_up then
        begin
          Spieler1.top:=Spieler1.top-7;
        end
     else
      begin
        if key = vk_down then
           begin
            Spieler1.top:=Spieler1.top+7;
           end // SPIELER 1
      else
       begin
         if key = ord('W') then
           begin
            Spieler2.top:=Spieler2.top-7;
           end
      else
          begin
           if key = ord('S') then
             begin
              Spieler2.top:=Spieler2.top+7;
             end
          end
       end // SPIELER 2
      end;
end;


v TIMER

procedure TfrmPong.tBall1Timer(Sender: TObject);
begin
  if Ball.Left=Spieler2.Left then
   begin
    tBall2.Enabled:=True;
    tBall1.Enabled:=False;
   end
  else
   begin
    Ball.Left:=Ball.Left+3;
   end;
end;

procedure TfrmPong.tBall2Timer(Sender: TObject);
begin
  if Ball.Left=Spieler1.Left then
   begin
    tBall2.Enabled:=False;
    tBall1.Enabled:=True;
   end
  else
   begin
    Ball.Left:=Ball.Left-3;
   end;
end;

^ TIMER


procedure TfrmPong.btStartClick(Sender: TObject);
begin
  btStart.Visible:=false;
  tBall1.Enabled:=true;
  btStart.Enabled:=false;
end;

end.

Geändert von fake115 (21. Mai 2014 um 17:22 Uhr)
  Mit Zitat antworten Zitat
jojo-sp

Registriert seit: 6. Sep 2006
Ort: Heiligenroth
10 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Mein Pong Problem

  Alt 21. Mai 2014, 17:07
Hallo,

ich rate jetzt mal, aber vermutlich ist die Abfrage mit Ball.Left=Spieler2.Left hier das Problem,

Wenn der Ball den Left Wert nicht genau trifft, kann es sein, dass er einfach weiter fliegt.

Das heisst also, dass du einmal auf <= und auf >= prüfen musst.

Das ganze kann man aber auch mit einem Timer prüfen und beim auftreffen auf den Schläger nur den hinzuaddierten Wert ändern, da z.B. C=A+-B C=A-B ist.

Also in etwa so:

Delphi-Quellcode:
procedure TfrmPong.tBallTimer(Sender: TObject);
begin
  if (Ball.Left <= Spieler1.Left) or (Ball.Left >= Spieler2.Left) then
    FBallSpeed := -FBallSpeed;
   
  Ball.Left:=Ball.Left + FBallSpeed;
end;
Jeder hat einmal klein angefangen; ich zum Beispiel als Baby.
  Mit Zitat antworten Zitat
fake115

Registriert seit: 21. Mai 2014
3 Beiträge
 
#3

AW: Mein Pong Problem

  Alt 21. Mai 2014, 17:11
Natüürlich So simpel wenn ich -3 bzw. +3 mache ist es doch unmöglich auf den anderen Wert zu kommen.
Ich werde es mir jedoch einfach machen und einfach das Intervall ändern und die Werte auf 5 wechseln so
sollte immer der entsprechende Wert kommen.
  Mit Zitat antworten Zitat
jojo-sp

Registriert seit: 6. Sep 2006
Ort: Heiligenroth
10 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Mein Pong Problem

  Alt 21. Mai 2014, 17:15
Nein nicht zwingend!

Die Distanz zwischen Ball, Startpunkt und Schlägern ist auschlaggebend. Wenn die Schläger nicht ein Vielfaches von 5 Pixeln auseinander sind, klappt es nicht!
Jeder hat einmal klein angefangen; ich zum Beispiel als Baby.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

AW: Mein Pong Problem

  Alt 21. Mai 2014, 17:16
Verwende doch das nächste mal bitte das [delphi]-Code-Tag .... mit Syntax-Highlighting sieht das bestimmt übersichtlicher aus.


if Ball.Left = Spieler1.Left then

Der Ball springt in 3er-Schritten ... Bist du dir auch ganz sicher, daß der Ball wirklich ganz genau auf diesem Pixel da landet?


[edit]
Werde wohl langsam alt, ich langsame Schnecke.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Mai 2014 um 18:00 Uhr)
  Mit Zitat antworten Zitat
fake115

Registriert seit: 21. Mai 2014
3 Beiträge
 
#6

AW: Mein Pong Problem

  Alt 21. Mai 2014, 17:23
Funzt alles wunderbar Ist zwar ultra simpel aber für Anschauungszwecke durchaus gut^^
Würde das zwar gerne mit richtiger Kollision machen und dann, dass mein Ball noch in
Winkeln und zu rumfliegen kann und das alles aber das ist wohl zuviel für mich.
  Mit Zitat antworten Zitat
Antwort Antwort


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:49 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