PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfaches Ping Pong mit Delphi (mSum)--> Need Help!



Chaintz
31.03.2009, 13:59
Hallo!
Wir müssn in info ne art "facharbeit" erledigen .. naja Delphi is nich wirklich meine stärke.
Un zwar möchte ich das Spiel Pong erstellen jedoch habe ich Probleme mit dem abprallen von dem Schläger. Vom Spielfeld klappts.
Kann mir mal bitte jemand sagen was ich falsch gemacht hab und mir das bitte mal erklären?

Meine Pong Unit

unit mPong;

interface
uses mSUM , mSpielfeld, mSchlaeger ;

type Pong = class

einBuntstift : Buntstift;
kenntSpielfeld : Spielfeld;
kenntSchlaeger : Schlaeger;
zGroesse: Zahl;
zGeschwindigkeit : Zahl;

constructor init;
procedure zeichne;
procedure rolle;
procedure bewegeBis ( pHPosition , pVPosition : Zahl);
procedure dreheBis (Winkel:Zahl);
procedure Wandabprall;
procedure setzeGroesse (pRadius:Zahl);
procedure setzeGeschwindigkeit (pGeschwindigkeit : Zahl);
procedure loesche;
procedure lerneSpielfeldkennen (pSpielfeld:Spielfeld);
procedure lerneSchlaegerkennen (pSchlaeger:Schlaeger);
function hPosition:Zahl;
function vPosition:Zahl;
function Winkel:Zahl;
destructor gibFrei;
end;

implementation

constructor Pong.init;
begin
einBuntstift:=Buntstift.init;
zGroesse := 10;
zGeschwindigkeit := 3;
einBuntstift.bewegeBis(950,20);
self.zeichne ;
self.dreheBis(50);
end;

procedure Pong.lerneSpielfeldkennen (pSpielfeld:Spielfeld);
begin
kenntSpielfeld:=pSpielfeld;
end;

procedure Pong.lerneSchlaegerkennen (pSchlaeger:Schlaeger);
begin
kenntSchlaeger:=pSchlaeger;
end;

procedure Pong.zeichne;
begin
einBuntstift.zeichneKreis(zGroesse);

end;


procedure Pong.rolle;
begin

if (self.hPosition >= kenntSpielfeld.rechterRand-zGroesse-zGeschwindigkeit) or
(self.hPosition <= kenntSpielfeld.linkerRand+zGroesse+zGeschwindigkeit) or
(self.vPosition <= kenntSpielfeld.obererRand+zGroesse+zGeschwindigkeit) or
(self.vPosition >= kenntSpielfeld.untererRand-zGroesse-zGeschwindigkeit) or
(self.hPosition <= kenntSchlaeger.rechterRand+zGroesse+zGeschwindigkeit) or
(self.hPosition >= kenntSchlaeger.linkerRand-zGroesse-zGeschwindigkeit) or
(self.vPosition >= kenntSchlaeger.obererRand-zGroesse-zGeschwindigkeit) or
(self.vPosition <= kenntSchlaeger.untererRand+zGroesse+zGeschwindigkeit)
then
self.Wandabprall;

einBuntstift.radiere;
einBuntstift.zeichneKreis (zGroesse);
einBuntstift.normal;
einBuntstift.bewegeUm(zGeschwindigkeit);
einBuntstift.zeichneKreis(zGroesse);
end;


procedure Pong.bewegeBis (pHPosition, pVPosition : Zahl);
begin
self.loesche;
einBuntstift.bewegeBis ( pHPosition, pVPosition);
self.zeichne;
end;

procedure Pong.dreheBis (Winkel:Zahl);
begin
einBuntstift.dreheBis(Winkel);
end;

procedure Pong.setzeGroesse (pRadius:Zahl);
begin
self.loesche;
zGroesse:=pRadius;
self.zeichne;
end;

procedure Pong.setzeGeschwindigkeit (pGeschwindigkeit:Zahl);
begin
self.loesche;
zGeschwindigkeit:=pGeschwindigkeit;
self.zeichne;
end;


procedure Pong.Wandabprall;
begin
if self.hPosition>= kenntSpielfeld.rechterRand-zGroesse-zGeschwindigkeit
then self.dreheBis(180-self.winkel);

if self.hPosition<= kenntSpielfeld.linkerRand+zGroesse+zGeschwindigkeit
then self.dreheBis(180-self.winkel);

if self.vPosition>= kenntSpielfeld.untererRand-zGroesse-zGeschwindigkeit
then self.dreheBis(360-self.winkel);

if self.vPosition<= kenntSpielfeld.obererRand+zGroesse+zGeschwindigkeit
then self.dreheBis(360-self.winkel);

if self.hPosition<= kenntSchlaeger.rechterRand+zGroesse+zGeschwindigkeit
then self.dreheBis(360+self.winkel);

if self.hPosition>= kenntSchlaeger.linkerRand-zGroesse-zGeschwindigkeit
then self.dreheBis(360+self.winkel);

if self.vPosition<= kenntSchlaeger.untererRand+zGroesse+zGeschwindigkeit
then self.dreheBis(180+self.winkel);

if self.vPosition>= kenntSchlaeger.obererRand-zGroesse-zGeschwindigkeit
then self.dreheBis(180+self.winkel);
end;


procedure Pong.loesche;
begin
einBuntstift.radiere;
einBuntstift.zeichneKreis (zGroesse*6);
end;

destructor Pong.gibFrei;
begin
einBuntstift.gibFrei;
end;

function Pong.hPosition:Zahl;
begin
result :=einBuntstift.hPosition;
end;

function Pong.Winkel:Zahl;
begin
result :=einBuntstift.Winkel;
end;


function Pong.vPosition:Zahl;
begin
result :=einBuntstift.vPosition;
end;

end.



Hauptprogramm

program pExtremePong;
uses
mSuM,
mSpielfeld in 'mSpielfeld.pas',
mPong in 'mPong.pas',
mSchlaeger in 'mSchlaeger.pas';

var
meinBildschirm : Bildschirm;
meinSpielfeld : Spielfeld;
meinBuntstift : Buntstift;
meinPong : Pong;
meineMaus : Maus;
meinSchlaeger : Schlaeger;
meineTastatur: Tastatur;
{meinSchlaeger2 : Schlaeger;}


begin
meinBildschirm :=Bildschirm.init;
meinSpielfeld := Spielfeld.init(75,0);
meinBuntstift := Buntstift.init;
meinPong := Pong.init;
meineMaus := Maus.init;
meinSchlaeger := Schlaeger.init;
meineTastatur := Tastatur.init;
{meinSchlaeger2 := Schlaeger;}
//meinPong.bewegeBis(200,200);
meinPong.lerneSpielfeldkennen(meinSpielfeld);
meinPong.lerneSchlaegerkennen(meinSchlaeger);

meinPong.zeichne;


meinSchlaeger.zeichne;
repeat
meinPong.rolle;
warte(1);

If meineTastatur.wurdeGedrueckt
then
If meineTastatur.zeichen=PFEILOBEN then
begin
meinSchlaeger.loesche;
meinSchlaeger.bewegeHoch;
meinSchlaeger.zeichne;
meineTastatur.weiter;
end
else

If meineTastatur.zeichen=PFEILUNTEN then
begin
meinSchlaeger.loesche;
meinSchlaeger.bewegeRunter;
meinSchlaeger.zeichne;
meineTastatur.weiter;
end
until(meineMaus.istGedrueckt);


meinPong.gibFrei;
meineMaus.gibFrei;
meinSchlaeger.gibFrei;
//meinSchlaeger2.gibFrei;
meinBuntstift.gibFrei;
meinSpielfeld.gibFrei;
meinBildschirm.gibFrei;

end.


Schläger
unit mSchlaeger;

interface
uses mSUM , mSpielfeld ;

type Schlaeger = class
eineTastatur : Tastatur;
einBuntstift : Buntstift;

kenntSpielfeld : Spielfeld;
zGeschwindigkeit : Zahl;

constructor init ;
procedure zeichne;
procedure loesche;
procedure BewegeHoch;
procedure BewegeRunter;
function obererRand:Zahl;
function untererRand:Zahl;
function rechterRand:Zahl;
function linkerRand:Zahl;
destructor gibFrei;
end;

implementation

constructor Schlaeger.init;
begin
einBuntstift:=Buntstift.init;
einBuntstift.bewegeBis(1000,400);
end;

procedure Schlaeger.zeichne;
begin
einBuntstift.zeichneRechteck(10,160);
end;

procedure Schlaeger.loesche;
begin
einBuntstift.radiere;
einBuntstift.zeichneRechteck(10,160);
end;

procedure Schlaeger.bewegeHoch;
begin
einBuntstift.hoch;
einBuntstift.dreheBis(90);
einBuntstift.bewegeUm(50);
einBuntstift.dreheBis(0);
einBuntstift.normal;
end;

procedure Schlaeger.bewegeRunter;
begin
einBuntstift.hoch;
einBuntstift.dreheBis(270);
einBuntstift.bewegeUm(50);
einBuntstift.dreheBis(0);
einBuntstift.normal;
end;

function Schlaeger.obererRand:Zahl;
begin
result:=einBuntstift.vPosition;
end;

function Schlaeger.untererRand:Zahl;
begin
result:=einBuntstift.vPosition+160;
end;

function Schlaeger.rechterRand:Zahl;
begin
result:=einBuntstift.hPosition+10;
end;

function Schlaeger.linkerRand:Zahl;
begin
result:=einBuntstift.hPosition;
end;



destructor Schlaeger.gibFrei;
begin
einBuntstift.gibFrei;
end;

end.



Vielen dank im vorraus!

Manni
31.03.2009, 18:42
Es wäre vielleicht hilfreich, wenn du das Problem etwas mehr eingrenzen könntest. Ich zumindest hab keine Lust, mir erstmal einen Haufen Code zu verstehen, um dir helfen zu können ;)

Chaintz
31.03.2009, 22:19
Oh das hab ich ganz vergessen :D sry
Also mein Problem ist, dass der Ball (Pong) nicht von dem Schläger abprallt.
Es ist als befände sich ein unsichtbares Spielfeld neben dem Schläger in dem sich der Ball bewegt.

Außerdem bewegt sich der ball nur wenn der schläger auf gleicher höhe wie der Pong befindet.

(Also Unit Pong
Pong.rolle
und Pong.Wandabprall)

Brauni90
04.04.2009, 15:18
Wenn deine Funktion flexibel genug ist, tausche den Anweisungsblock "procedure Pong.Wandabprall; begin; [...] end;" mit Folgendem aus:


if self.hPosition>= kenntSpielfeld.rechterRand-zGroesse-zGeschwindigkeit
then self.dreheBis(180-self.winkel);

if self.hPosition<= kenntSpielfeld.linkerRand+zGroesse+zGeschwindigkeit
then self.dreheBis(180-self.winkel);

if self.vPosition>= kenntSpielfeld.untererRand-zGroesse-zGeschwindigkeit
then self.dreheBis(-self.winkel);

if self.vPosition<= kenntSpielfeld.obererRand+zGroesse+zGeschwindigkeit
then self.dreheBis(-self.winkel);

if self.hPosition<= kenntSchlaeger.rechterRand+zGroesse+zGeschwindigkeit
then self.dreheBis(180-self.winkel);

if self.hPosition>= kenntSchlaeger.linkerRand-zGroesse-zGeschwindigkeit
then self.dreheBis(180-self.winkel);

if self.vPosition<= kenntSchlaeger.untererRand+zGroesse+zGeschwindigkeit
then self.dreheBis(-self.winkel);

if self.vPosition>= kenntSchlaeger.obererRand-zGroesse-zGeschwindigkeit
then self.dreheBis(-self.winkel);

mirko schirpe
13.09.2012, 21:17
versuchs mal damit dass du mit einer if abfragst ob die y koordinate vom ball mit der vom flipper übereinstimmern wenn die x koordinaten von ball und flipper gleich sind (if xkoordinateball=xkoordinateflipper and ykoordinateball ungleich ykoordinateflipper then ballmove.enabled:=false) also lässt der den ball nur weiterlaufen, wenn der ball auch auf gleicher höhe wie der flipper ist, sonst stoppt der ball...
ist das verständlich?? :D

DFYX
13.09.2012, 21:46
versuchs mal damit dass du mit einer if abfragst ob die y koordinate vom ball mit der vom flipper übereinstimmern wenn die x koordinaten von ball und flipper gleich sind (if xkoordinateball=xkoordinateflipper and ykoordinateball ungleich ykoordinateflipper then ballmove.enabled:=false) also lässt der den ball nur weiterlaufen, wenn der ball auch auf gleicher höhe wie der flipper ist, sonst stoppt der ball...
ist das verständlich?? :D
Bitte nicht nekroposten. Der Thread ist drei Jahre alt. Ich glaube nicht, dass deine Antwort noch jemandem hilft.