Autor Beitrag
wiefrie94
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 06.04.10 02:19 
hallo
ich habe ein pong spiel geschrieben. das ist nicht das kklassische pong (man muss panels mit dem treffen, die dann verschwinden) das klappt auch so weit ganz gut. da sind aber 3 punkte wo ich ziemlich auf dem schlauch stehe (die sind rot Moderiert von user profile iconNarses: Jetzt sind sie ge-highlight-ed ;)). wär super wennn ihr mir erklären würdet was ich da machen kann?
ich würd mich total freuen wenn ihr mit helfen könntet
lg wieland

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:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
unit Unit1;

interface

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

type  {alle Objekte}
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    Edit1: TEdit;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    Panel9: TPanel;
    Panel10: TPanel;
    Panel11: TPanel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Panel1: TPanel;

    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

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

var
  Form1: TForm1; x1,y1,vx,vy:integer;     {Deklaration der Variablen}

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
  begin

    Form1.Image1.Picture:=Nil;                              {Ball geht weg, wenn man neu startet}
    x1:=random (image1.Width)-20 ; y1:=150;  vx:=1; vy:=1;     {Startpunkt nach links und rechts unterschiedlich, fällt zu Beginn immer schräg nach rechts unten}
    if x1 < 0 then x1:=0;   {damit Kugel nie außerhalb des canvas startet, weil negative werte durch width -20 möglich sind}

    timer1.Enabled:=true;
    Form1.Image1.Canvas.Pen.Mode:=pmnotxor;             {Beim 2. Mal wird der Ball in Gegenfarbe gezeichnet}
    Form1.Image1.canvas.Pen.color:=clred;
    Form1.Image1.canvas.Brush.color:=clred;
    Form1.Image1.Canvas.ellipse(x1,y1,x1+20,y1+20);     {Größe des Kreises}
    Button1.Visible:=false;
    label1.visible:=false;
    label2.visible:=false;
    label3.Visible:=true;
    label4.Visible:=false;
    edit1.Visible:=true;
    panel1.Visible:=true;
    panel2.Visible:=true;
    panel3.Visible:=true;
    panel4.Visible:=true;
    panel5.Visible:=true;
    panel6.Visible:=true;
    panel7.Visible:=true;
    panel8.Visible:=true;
    panel9.Visible:=true;
    panel10.Visible:=true;
    panel11.Visible:=true;

  end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

  begin

    panel1.Left:=x;    

Problem Nummer 1: dieser Panel wandert aus der Leinwand heraus.
wie kann man das verhindern?


  end;

procedure TForm1.Timer1Timer(Sender: TObject);
  begin

      Form1.Image1.Canvas.Ellipse(x1,y1,x1+20,y1+20);    {löschen des alten Balles, da ein neuer ball in Gegenfarbe gezeichnet wird}

      x1:=x1+vx;   {Bewegung nach rechts}
      y1:=y1+vy;   {Bewegung nach unten}

      Form1.Image1.Canvas.Ellipse(x1,y1,x1+20,y1+20);   {Neuzeichnen des Balles, der neue ball verschiebt sich um 5 nach unten und rechts}

   {das ABPRALLEN an der WAND}

  if ((x1+20)>Form1.Image1.Width) or ((x1)<0)      {wenn der Ball rechts oder links gegen die Wand....}
    then  vx:=(-1)*vx;                             {.....Richtungsänderung}

  if (y1<0)                                        {wenn der Ball ben gegen die Wand prallt....}
    then vy:=(-1)*vy;                              {.....Richtungsänderung}

Problem 2: Dummerweise klappt dass nicht mit dem wert der bei y1+20 steht.
der pall ändert erst seine richtung wenn der ball mitten im panel ist. ich will aber,
dass das passiert, wenn aber gerade die kante berührt


  if (y1+20>panel1.top)                            
      then if (x1>panel1.left)                     {der Ball recht von der linken Seite des Panels}

        and (x1<(panel1.Left+panel1.Width))        {links von der rechten Seite des Panel ist}
    then  vy:=(-1)*vy;                             {.....Richtungswechsel}

  if (y1+20>panel1.top)                                  {Wenn die oberste Koordinate - 15 unter dem Panel ist}
    then edit1.Text:=inttostr(strtoint(Edit1.Text)+1);   {Edit.Text+1}

  if strtoint(edit1.text)=3
    then begin  label4.visible:=true;
                button1.Visible:=false;
                button1.Caption:='Neuer Versuch';
                edit1.Text:=inttostr(strtoint(Edit1.Text)*0)
  end;

  if (y1+20>panel1.top)                            {man verliet wenn der Ball unter dem panel 1 ist und der Button für Start erscheint}
    then begin  Button1.Visible:=true;
                label1.Visible:=true;
                Button1.Caption:='Neuer Ball';
                beep;                              {BEEP-Ton}
                timer1.enabled:=false;             {Timer wird deaktiviert-Zweck: nur 1mal wird gezählt wenn der Ball unter dem panel1 ist}
    end;

  {Die folgenden Befehle bewirken, dass ein Panel unsichtbar wird, wenn man auf es stößt,
  und, dass der Ball dann abprallt}


 {Panel2}

auch hier ist das problem, dass der ball erst in der mitte ders panels
seine richtung ändert. außerdemverschwinden die panels manchmal auch wenn der ball
ganz nah herankommt. ich vermute, dass das daran leigt, dass die ursprünglichen
koordinaten des kreises ja ein quadrat sind (stimmt das :))


if panel2.visible=true then begin if (y1+20>panel2.top)and(y1<panel2.top+panel2.height)
 then if (x1>panel2.left) and (x1<(panel2.Left+panel2.Width))
  then begin
          panel2.visible:=false;
          vy:=(-1)*vy;  endend;

  {Panel3}

if panel3.visible=true then begin if (y1+20>panel3.top)and(y1<panel3.top+panel3.height)
 then if (x1>panel3.left) and (x1<(panel3.Left+panel3.Width)) then begin
          panel3.visible:=false;
          vy:=(-1)*vy;   endend;

   {Panel4}

if panel4.visible=true then begin if (y1+20>panel4.top)and(y1<panel4.top+panel4.height)
 then if (x1>panel4.left) and (x1<(panel4.Left+panel4.Width)) then begin
          panel4.visible:=false;
          vy:=(-1)*vy;    endend;

 {Panel5}

if panel5.visible=true then begin if (y1+20>panel5.top)and(y1<panel5.top+panel5.height)
then if (x1>panel5.left) and (x1<(panel5.Left+panel5.Width)) then begin
          panel5.visible:=false;
          vy:=(-1)*vy;   endend;

  {Panel6}

if panel6.visible=true then begin if (y1+20>panel6.top)and(y1<panel6.top+panel6.height)
 then if (x1>panel6.left) and (x1<(panel6.Left+panel6.Width)) then begin
          panel6.visible:=false;
          vy:=(-1)*vy;  endend;

   {Panel7}

if panel7.visible=true then begin if (y1+20>panel7.top)and(y1<panel7.top+panel7.height)
 then if (x1>panel7.left) and (x1<(panel7.Left+panel7.Width)) then begin
          panel7.visible:=false;
          vy:=(-1)*vy;   endend;

  {Panel8}

if panel8.visible=true then begin if (y1+20>panel8.top)and(y1<panel8.top+panel8.height)
then if (x1>panel8.left) and (x1<(panel8.Left+panel8.Width)) then begin
          panel8.visible:=false;
          vy:=(-1)*vy;   endend;

 {Panel9}

if panel9.visible=true then begin if (y1+20>panel9.top)and(y1<panel9.top+panel9.height)
 then if (x1>panel9.left) and (x1<(panel9.Left+panel9.Width)) then begin
          panel9.visible:=false;
          vy:=(-1)*vy;   endend;

 {Panel10}

if panel10.visible=true then begin if (y1+20>panel10.top)and(y1<panel10.top+panel10.height)
then if (x1>panel10.left) and (x1<(panel10.Left+panel10.Width)) then begin
          panel10.visible:=false;
          vy:=(-1)*vy;   endend;

   {Panel11}

if panel11.visible=true then begin if (y1+20>panel11.top)and(y1<panel11.top+panel11.height)
 then if (x1>panel11.left) and (x1<(panel11.Left+panel11.Width)) then begin
          panel11.visible:=false;
          vy:=(-1)*vy;   endend;

{wenn alle Panels unsichtbar sind, wird "Herzlichen Glückwunsch" eingeblendet}

if panel2.Visible=false
  then begin if panel3.Visible=false
  then begin if panel4.Visible=false
  then begin if panel5.Visible=false
  then begin if panel6.Visible=false
  then begin if panel7.Visible=false
  then begin if panel8.Visible=false
  then begin if panel9.Visible=false
  then begin if panel10.Visible=false
  then begin if panel11.Visible=false

then label2.visible:=true;
end;
end;
end;
end;
end;
end;
end;
end;
end;

if label2.visible=true
  then begin label1.Visible:=false;
        Form1.Image1.Picture:=Nil;     {Leinwand wird gelöscht}
        panel1.visible:=false;         {wenn Gewonnen erscheint, wird der  Zähler und der Schläger ausgeblendet}
   end;

end;

end.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Di 06.04.10 08:27 
Hallo wiefrie94,

bei Problem Nummer 1 kann ich helfen. Für die anderen fehlt mir die Zeit (bin auf Arbeit).
Definiere für die jeweilige Koordinate Ober- und Untergrenze.
Inetwa so

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if newval>maxval then 
 newval:=maxval;
if newval<minval then
 newval:=minval;
//oder ohne If
newval=min(newval,maxval);
newval=max(newval,minval);


Ach und noch was:
Ichhabe bei Dir folgendes Kontrukt gesehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
if panel2.Visible=false
  then begin if panel3.Visible=false
  then begin if panel4.Visible=false
  then begin if panel5.Visible=false
  then begin if panel6.Visible=false
  then begin if panel7.Visible=false
  then begin if panel8.Visible=false
  then begin if panel9.Visible=false
  then begin if panel10.Visible=false
  then begin if panel11.Visible=false

then label2.visible:=true;
end;
end;
end;
end;
end;
end;
end;
end;
end;


Mit boolschen Operatoren sieht es noch viel besser aus:
ausblenden Delphi-Quelltext
1:
if (Bedinung1) AND (Bedinung2) AND [...] then doAction;					


So brauchst Du nicht die Begin und ends zu zählen. Es gibt da noch weitere Varianten (z.B. Alle Panels in einem Array referenzieren und mit einer Schleife Prüfen)

Denke dass reicht erstmal.
Es gibt hier nämlich den Grundsatz: Pro Problem ein Thread.

//edit: :welcome: und einen schönen Tag.
Tilo
wiefrie94 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 06.04.10 10:33 
vielen dank für die schnell antwort

ist das hier dann richtig ( ich habvon newval vorher noch nie etwas gehört)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if newval>810-panel.width then
       newval:=810-panel1.width;
    if newval<10 then
      newval:=10;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt und Selbst-Zitat entfernt.
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Di 06.04.10 14:08 
jep, Ist vom Code her richtig aber der Einzug des Zweiten Ifs ist etwas unglücklich gewählt. Beide Verzweigungen stehen auf der selben stufe und können daher einen gleichlangen Einzug haben.
newval steht einfach nur für newValue => neuerWert. Es ist einfach nur ein Bezeichner um nicht jedesmal "lange" Kontrukte wie ObjekteName1.ObjektMemberXY zu schreiben.