Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 14:59 
Im Zusammenhang mit: www.delphiforum.de/topic_91289.html

Ich lasse mit einem Timer eine procedure Ausführen die jeweils die x als auch die y Richtung eines Shapes verändert.

Dann habe ich im Timer noch eine Abfrage ob er den Rand berührt und dann soll er wieder in die entgegengesetzte Richtung weiter gehen.

Ich glaube ich habe irgendwo einen Denkfehler.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
procedure GoClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);

public
  procedure linker (negativ : boolean);
  procedure rechter (negativ : boolean);

var
  Pong: TPong;
  richtung : integer;
  links, rechts : boolean;

// Ball nach Links
procedure TPong.linker;
begin
 kugel.Left := kugel.Left - 2;
   if negativ then kugel.Top := kugel.Top - 2
      else
   if NOT negativ then kugel.Top := kugel.Top + 2;
end;

// Ball nach Rechts
procedure TPong.rechter;
begin
 kugel.Left := kugel.Left + 2;
   if negativ then kugel.Top := kugel.Top - 2
      else
   if NOT negativ then kugel.Top := kugel.Top + 2;
end;

// Go Button
procedure TPong.GoClick(Sender: TObject);
begin
kugel.Top := 144;
kugel.Left:= 144;
Timer1.Enabled := true;
richtung := random(2)+1;
         if richtung = 1 then links := true;
         if richtung = 2 then rechts := true;
end;

procedure TPong.Timer1Timer(Sender: TObject);
begin
// Bewegung Ball
if links then
   begin
   linker(true);
   end else
if rechts then
   begin
   rechter(true);
   end;
// Kollision oben
if kugel.Top < 9 then
   begin
        if links then linker(false);
        if rechts then rechter(false);
   end else
if kugel.Top + 13 > 316 then
   begin
        if links then linker(true);
        if rechts then rechter(true);
   end;
// Kollision


Kann ich das besser lösen, oder zumindest was ist falsch? Der Ball ändert nicht die Y Achsenbewegung.

Gruß Dude566

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 31.03.09 15:24 
Also irgendwie sieht das komisch aus. Du setzt links oder rechts auf true, aber nicht wieder zurück auf false bei einem neuen Go, falls es das gibt.

Wie wäre es, wenn du einfach eine Geschwindigkeit (in Pixeln pro Schritt z.B.) für horizontal und vertikal speicherst? Dann musst du nicht nach links und rechts und oben und unten unterscheiden und kannst einfach die Richtung horizinal oder vertikal durch Multiplikation mit -1 umkehren.

Nebenbei:
ausblenden Delphi-Quelltext
1:
2:
3:
   if negativ then kugel.Top := kugel.Top - 2
      else
   if NOT negativ then kugel.Top := kugel.Top + 2;
Wofür das else if not negativ? In else kann es ja nix anderes mehr sein...

Dass du die Parameter für linker und rechter unten nicht schreibst, ist extrem unübersichtlich, auch wenn Delphi das erlaubt.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 15:31 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Also irgendwie sieht das komisch aus. Du setzt links oder rechts auf true, aber nicht wieder zurück auf false bei einem neuen Go, falls es das gibt.


Nein Go wird nur einmal geklickt und dann beginnt das Spiel ja auch schon.

Zitat:

Wie wäre es, wenn du einfach eine Geschwindigkeit (in Pixeln pro Schritt z.B.) für horizontal und vertikal speicherst? Dann musst du nicht nach links und rechts und oben und unten unterscheiden und kannst einfach die Richtung horizinal oder vertikal durch Multiplikation mit -1 umkehren.


Wie das? Zeigs mal bitte an meinem Prog in einem Beispiel.

Zitat:

Wofür das else if not negativ? In else kann es ja nix anderes mehr sein...

Ok stimmt, stört aber auch nicht. ;)

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 15:55 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:

Zitat:

Wie wäre es, wenn du einfach eine Geschwindigkeit (in Pixeln pro Schritt z.B.) für horizontal und vertikal speicherst? Dann musst du nicht nach links und rechts und oben und unten unterscheiden und kannst einfach die Richtung horizinal oder vertikal durch Multiplikation mit -1 umkehren.


Wie das? Zeigs mal bitte an meinem Prog in einem Beispiel.

In deinem anderen (kA wievielten inzwischen :mrgreen:) Pong Topic (dieses um genau zu sein: www.delphi-forum.de/viewtopic.php?t=91289) habe ich deinen Code in einem meiner Beträge um diese Funktion ergänzt (Stichwort: velocity)

Du solltest dir bei Zeiten mal das hier anschauen: wiki.delphigl.com/in...rial_Lineare_Algebra (absolut notwendiges Basiswissen in Sachen Spieleprogrammierung)

Zitat:
Ok stimmt, stört aber auch nicht. ;)

Dinge die nicht stören sind meistens die Dinge, die irgendwann zu komischen Fehlern an Stellen führen, wo man sie am wenigsten vermutet und somit nicht findet ;)

mfg
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 16:03 
Kann ich es nicht auch so machen wie ich es bisher angefangen habe, nur was is falsch und wie gehts weiter?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TPong = class(TForm)
    Go: TButton;
    Timer1: TTimer;
    ball: TTimer;
    Panel1: TPanel;
    Spieler: TButton;
    CPU: TButton;
    kugel: TShape;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure GoClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
  procedure linker (negativ : boolean);
  procedure rechter (negativ : boolean);
    { Public-Deklarationen }
  end;

var
  Pong: TPong;
  richtung : integer;
  links, rechts : boolean;

implementation

{$R *.DFM}

// Ball nach Links
procedure TPong.linker;
begin
 kugel.Left := kugel.Left - 2;
   if negativ then kugel.Top := kugel.Top - 2
      else
   if NOT negativ then kugel.Top := kugel.Top + 2;
end;

// Ball nach Rechts
procedure TPong.rechter;
begin
 kugel.Left := kugel.Left + 2;
   if negativ then kugel.Top := kugel.Top - 2
      else
   if NOT negativ then kugel.Top := kugel.Top + 2;
end;

// Go Button
procedure TPong.GoClick(Sender: TObject);
begin
kugel.Top := 144;
kugel.Left:= 144;
Timer1.Enabled := true;
richtung := random(2)+1;
         if richtung = 1 then links := true;
         if richtung = 2 then rechts := true;
end;

// Bewegung Spieler.
procedure TPong.Timer1Timer(Sender: TObject);
begin
// Bewegungen des Spielers
if GetAsyncKeyState(VK_UP) <> 0 then
     begin
       if Spieler.Top > 8 then Spieler.Top := Spieler.Top - 4 ;
     end
   else
     begin
       if GetAsyncKeyState(VK_DOWN) <> 0 then
         if (Spieler.Top + Spieler.Height) < 316
           then Spieler.Top := Spieler.Top + 4;
     end;
// Bewegung Ball
if links then
   begin
   linker(true);
   end else
if rechts then
   begin
   rechter(true);
   end;
// Kollision oben
if kugel.Top < 9 then
   begin
        if links then linker(false);
        if rechts then rechter(false);
   end else
if kugel.Top + 13 > 316 then
   begin
        if links then linker(true);
        if rechts then rechter(true);
   end;
// Kollision }
end;

procedure TPong.FormCreate(Sender: TObject);
begin
     links := false;
     rechts := false;
     randomize;
end;

end.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 16:10 
Ich glaube wenn du so weiter machst, wird dein Code nur noch unübersichtlicher, sodass es immer schwieriger wird, da überhaupt noch etwas nachvollziehen zu können ;) (Und das auch noch Topic-Übergreifend)
Klassen habt ihr ja scheinbar noch nicht gehabt, deshalb mal ein paar Vorschläge für Variablen/Konstanten:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
const
  SchlaegerGeschwindigkeit = 10;
var
  BallPosition,
  BallGeschwindigkeit: TPoint;
  BallRadius: integer;
  SchlaegerL,
  SchlaegerR: TRect; //oder anders

Mehr braucht man eigentlich nicht. Dann baut man sich noch eine Funktion die Überprüft, ob der Ball mit einem Rect Kollidiert (der kann man dann entweder den einen oder den anderen Schläger übergeben). Vielleicht noch eine Funktion MoveRect(a: TRect; amount: integer); o.Ä.
Dann machst du (wie schon mehrfach vorgeschlagen, die Bewegung Ball und der Schläger über die Geschwindigkeiten. Bei der Kollision wird die entsprechende Komponente umgedreht (Geschwindigkeit.x := -Geschwindigkeit.x). Und dann hast du dein Pong.

mfg
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 16:15 
Ja aber ich habe keine Rectangle Shapes gemacht, sondern 2 Buttons. Am besten ändere ich das dann auch noch.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 16:17 
Du kannst afaik auch auf das Rect von TButton zugreifen, das ist kein Problem. Und die Form des Shapes spielt auch keine Rolle. TRect ist einfach nur ein Datentyp, welcher vier Integer beinhaltet (Top, Bottom, Left und Right)

€: ich verweise auch gerne nochmal auf meinen Avatar <- (gibt leider keinen linkspfeil ;) )

mfg


Zuletzt bearbeitet von F34r0fTh3D4rk am Di 31.03.09 16:35, insgesamt 2-mal bearbeitet
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 16:22 
Oh, ok dann so oder?
ausblenden Delphi-Quelltext
1:
2:
 
Spieler.Rectangle := (...);


Kann ich die Geschwindigkeit nicht vielleicht besser in eine Variable machen und die mit einem Timer in bestimmten Intervallen erhöhen.
Das bringt mehr Spannung ins Spiel.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 31.03.09 16:30 
So ist es doch in dem Beispiel mit der Geschwindigkeit. ;-)
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 16:42 
@user profile iconF34r0fTh3D4rk
Aber wie muss ich das denn jetzt Schreiben, weil in deinem Code weist du einer Variable vom Typ TBall immer nur den neuen Wert hinzu.

Soll ich danach dem Shape und den Schlägern die Variablen zuweisen.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 17:00 
Du kannst sie natürlich auch direkt zuweisen oder du machst das am Ende zusätzlich. Dieser Stil kommt daher, dass man normalerweise Berechnungen vom eigentlich Zeichnen trennt. Das heißt man berechnet die Daten und zeichnet dann anhand dieser das Bild. Da du kein Bild verwendest kannst du die Werte auch direkt zuweisen.
Empfehlenswert ist es natürlich ein Image(oder noch besser eine Paintbox) zu nehmen und nach jedem Durchlauf deine Schläger und deinen Ball darauf zu zeichnen. Aber es geht (bei so einfachen Sachen) auch ohne, auch wenns wenig elegant ist.

Wenn ihr die Aufgabe bekommen habt, ein Pong zu programmieren, so müsst ihr doch aber auch Unterlagen/Informationen bekommen haben um das umzusetzen, oder nicht? Da müsste doch so einiges drinstehen.

btw: mit "Komponente" meinte ich nicht dieser Dinger auf deinem Formular ;) Ersetze das Wort durch "Anteil" oder so ;)

mfg
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 17:14 
Tzz rein garnichts, wir haben bisher: Datentypen mit Rekord gemacht, dyn & stat Array, ein bisschen mit PaintBox etc, aber noch nicht mal etwas mit OnKeyPress oder zumindest Konstanten.

Ich bin jetzt soweit, was fehlt noch blick gerade garnicht mehr durch, doch muss morgen abgeben.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TPong = class(TForm)
    Go: TButton;
    Timer1: TTimer;
    Panel1: TPanel;
    Spieler: TButton;
    CPU: TButton;
    ball: TShape;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure GoClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

TBall = record
        position : TPoint;
        velocity : TPoint;
        end;
TPlayer = record
          r, l : TPoint;
          end;
var
  Pong: TPong;
  richtung : integer;
  links, rechts : boolean;
  bal : TBall;
  player : TPlayer;


implementation

{$R *.DFM}


// Go Button
procedure TPong.GoClick(Sender: TObject);
begin
ball.Top := 144;
ball.Left:= 144;
Timer1.Enabled := true;
richtung := random(2)+1;
         if richtung = 1 then links := true;
         if richtung = 2 then rechts := true;
end;

// Bewegung Spieler.
procedure TPong.Timer1Timer(Sender: TObject);
begin
// Bewegungen des Spielers
if GetAsyncKeyState(VK_UP) <> 0 then
     begin
       if Spieler.Top > 8 then Spieler.Top := Spieler.Top - 4 ;
     end
   else
     begin
       if GetAsyncKeyState(VK_DOWN) <> 0 then
         if (Spieler.Top + Spieler.Height) < 316
           then Spieler.Top := Spieler.Top + 4;
     end;
// Bewegung Ball
bal.position.x := bal.position.x + bal.velocity.x;
bal.position.y := bal.position.y + bal.velocity.y;
ball.Left := bal.position.x;
ball.Left := bal.position.y;
  //if (bal.position.x + ball.radius > spielerR.left) then
 // ball.velocity.x := -ball.velocity.x;


end;

procedure TPong.FormCreate(Sender: TObject);
begin
     links := false;
     rechts := false;
     randomize;
     bal.velocity.x := 4;
     bal.velocity.y := 4;
end;

end.


Wo soll das ball.radius denn vorher hin, und spieler.Left funktioniert beim Linken schläger z.B. nicht da der Ball auf die rechte Seite trifft. Soll ich dann spieler.Left + spieler.Width machen?

Und was sollen die ganzen "and" hinter der 1. Abfrage, da muss doch immer nur eins zutreffen damit es abprallt.
Einloggen, um Attachments anzusehen!
_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 17:18 
Eine abfrage würde ja bedeuten, dass der Ball vom Schläger abprallt, egal in welcher vertikalen Position sich dieser momentan befindet. (Wenn ich richtig interpretiert habe, was du meinst ;) )
Wenn du Rectangles benutzt, kannst du Right benutzen, ansonsten nimmst du Left+Width.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 17:31 
Soll Radius auch noch in den TBall, und welchen Wert annehmen?
So?
ausblenden Delphi-Quelltext
1:
bal.radius := ball.Width div 2;					


Und was für Abfragen sollen in die weiteren Klammern nach den and's, mir ist schon klar für die einzelnen Abschnitte der Y-Achse, aber wie?

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 17:41 
Ein klein wenig Eigeninitiative wäre schon angebracht (die Aufgabe ist schließlich ein Pong zu schreiben und nicht schreiben zu lassen). Zumal es keinen Sinn hat, eine Breite und einen Radius zu haben. Ein Kreis definiert sich bekanntermaßen durch einen Punkt und einen Radius, da brauchst du keine Breite. :mrgreen:
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 17:51 
Ja gerne Eigeninitiative aber TShape hat nunmal kein Radius mit drin, und Right auch nicht.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TPong = class(TForm)
    Go: TButton;
    Timer1: TTimer;
    Panel1: TPanel;
    ball: TShape;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    spieler: TShape;
    cpu: TShape;
    procedure GoClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

TBall = record
        position : TPoint;
        velocity : TPoint;
        radius : TPoint;
        end;
TPlayer = record
          r, l : TPoint;
          end;
var
  Pong: TPong;
  richtung : integer;
  links, rechts : boolean;
  bal : TBall;
  player : TPlayer;


implementation

{$R *.DFM}


// Go Button
procedure TPong.GoClick(Sender: TObject);
begin
ball.Top := 144;
ball.Left:= 144;
Timer1.Enabled := true;
richtung := random(2)+1;
         if richtung = 1 then links := true;
         if richtung = 2 then rechts := true;
end;

// Bewegung Spieler.
procedure TPong.Timer1Timer(Sender: TObject);
begin
// Bewegungen des Spielers
if GetAsyncKeyState(VK_UP) <> 0 then
     begin
       if spieler.Top > 8 then spieler.Top := spieler.Top - 4 ;
     end
   else
     begin
       if GetAsyncKeyState(VK_DOWN) <> 0 then
         if (spieler.Top + spieler.Height) < 316
           then spieler.Top := spieler.Top + 4;
     end;
// Bewegung Ball
bal.position.x := bal.position.x + bal.velocity.x;
bal.position.y := bal.position.y + bal.velocity.y;
ball.Left := bal.position.x;
ball.Left := bal.position.y;
  if (bal.position.x + bal.radius <= spieler.Right) and (bal.position.y + bal.radius >= cpu.Left) then
  ball.velocity.x := -ball.velocity.x;


end;

procedure TPong.FormCreate(Sender: TObject);
begin
     links := false;
     rechts := false;
     randomize;
     bal.velocity.x := 4;
     bal.velocity.y := 4;
     bal.radius := ball.Width div 2;
end;

end.


[Fehler] Unit1.pas(82): Inkompatible Typen
[Fehler] Unit1.pas(82): Undefinierter Bezeichner: 'Right'
[Fehler] Unit1.pas(82): Inkompatible Typen
[Fehler] Unit1.pas(83): Undefinierter Bezeichner: 'velocity'
[Fehler] Unit1.pas(95): Inkompatible Typen: 'TPoint' und 'Integer'

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 17:56 
Die Fehler in deinem Code sind einfach zu elementar, dir fehlt das Grundverständnis, sonst könntest du die genannten Vorschläge auch umsetzen. (Eine Alternative zu der TBall Klasse mit Variablen habe ich dir bereits genannt)
Dein jetziger Code ist einfach nur Copy+Paste aus Vorschlägen, die als Vorschläge gemeint waren und nicht als fertiger Code. Die müssen natürlich auf deinen Code angepasst und nicht einfach so übernommen werden.
Das einzige was ich noch tun kann, ist es, dir dieses Tutorial zu empfehlen: www.christian-stelzm...rials_crashkurs.html

mfg
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 31.03.09 17:59 
Ja das hilft mir bis morgen dann auch nichts, dann kann ich auch nix dafür.

Dann muss der Leherer es halt mal akzeptieren, alles kommt vor den Ferien wieder zusammen.

2 weitere Hausarbeiten müssen noch abgegeben werden und ich habe Heute und Gestern erst 2 Arbeiten geschrieben.

Schaue später vll nochmal drauf vll kriege ich es ja noch hin, aber jetzt bin ich zu fertig.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.03.09 18:00 
Wenn du deinem Lehrer freundlich erklärst, dass die Zeit einfach zu knapp war, du zeigst, dass du es versuchst hast und die Probleme herausstellst, sollte er Verständnis dafür haben.

Und für die Zukunft hast du ja jetzt zwei Tutorials mit denen du dich vorbereiten kannst ;)

mfg


Zuletzt bearbeitet von F34r0fTh3D4rk am Di 31.03.09 18:03, insgesamt 2-mal bearbeitet