Entwickler-Ecke

Sonstiges (Delphi) - Breakout Problem


Huntergamer - Fr 25.06.10 20:18
Titel: Breakout Problem
Hallo!
Bei uns im Info Kurs sollen wir ein Spiel programmieren, als Projekt. Viele kennen dies als Breakout. Jetzt habe ich ein Problem mit den Blöcken, der Ball fliegt da einfach durch. Nur das dumme ist, ich hab nen Schläger da klappt auch alles und hab dann einfach das alles rauskopiert, nur es klappt net. Könnt ihr mal mein Programm angucken bzw. den Fehler lösen? Muss am Mittwoch fertig sein, nur irgendwie verstehe ich nicht wieso das einfach nicht klappen will ^^
thx im vorraus ^^

Moderiert von user profile iconNarses: Binaries aus dem Projektarchiv entfernt.


F34r0fTh3D4rk - Fr 25.06.10 23:33

Vielleicht solltest du dich auf den relevanten Code beschränken. Kaum einer wird Lust haben, sich den ganzen Quellcode herunterzuladen und sich da durchzuwühlen.

Prinzipiell läuft es so:


Quelltext
1:
2:
3:
4:
für alle Blöcke
  wenn Ball kollidiert mit Block
    entferne Block
    lasse Ball abprallen


glotzer - Sa 26.06.10 08:37

du könntest auch hier [http://www.delphiforum.de/topic_BreakIt+Version+13+der+Klasiker+in+Delphi_91519.html] ein bischen spicken(aber NICHT kopieren, nur vom prinzip her...)


jaenicke - So 27.06.10 13:20

Aua, den Code solltest du zuerst mal ordentlich formatieren, dann würde man vielleicht auch etwas erkennen.

Jedenfalls sind da z.B. in mStein.pas ein paar dicke Fehler:

mStein.pas
 
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:
{ ... }
type TStein= class(Tobject)
private
Stein: Ticon;
Leinwand: TImage;
public
constructor create(pLeinwand: Timage ; PPosX, PPosY: Integer);
procedure zeichnen(PPosX, PPosY: Integer);
function gibX: Integer;
function gibY: Integer;
end;
var
 PosX, PosY, PPosX, PPosY: Integer;

implementation
constructor TStein.create(pLeinwand: TImage; PPosX, PPosY: Integer);
begin
Leinwand:= pLeinwand;
Stein:= Ticon.Create;
Stein.LoadFromFile('Spiel\res\stone_green.ico');
end;
procedure TStein.zeichnen(PPosX, PPosY: Integer);
begin
Leinwand.Canvas.Draw(PPosX, PPosY, Stein);
end;
function TStein.gibX: Integer;
begin
PosX:= PPosX;
result:= PosX;
end;
function TStein.gibY: Integer;
begin
PosY:= PPosY;
result:= PosY;
end;
Dann fangen wir mal an:

Delphi-Quelltext
1:
2:
var
 PosX, PosY, PPosX, PPosY: Integer;
Wozu PPosX und PPosY?
Zudem hast du zwei Steine, aber nur einmal PosX und PosY. Wie willst du in den selben Variablen die Werte beider Steine unterbringen...

Deshalb: globale Variablen sind Pfui. Die gehören wie auch Stein und Leinwand unter private.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
constructor TStein.create(pLeinwand: TImage; PPosX, PPosY: Integer);
begin
Leinwand:= pLeinwand;
Stein:= Ticon.Create;
Stein.LoadFromFile('Spiel\res\stone_green.ico');
end;
Und warum ignorierst du PPosX und PPosY? Wenn du die Werte nicht speicherst (wie pLeinwand), sind die eben weg.


Delphi-Quelltext
1:
Stein.LoadFromFile('Spiel\res\stone_green.ico');                    
Relative Pfade gehen sehr leicht ins Auge. Wenn du Windows nicht sagst wo der Pfad liegt, dann muss Windows raten. Und das ist keine gute Idee.
http://www.delphi-library.de/viewtopic.php?p=499701


Delphi-Quelltext
1:
2:
3:
4:
5:
function TStein.gibX: Integer;
begin
PosX:= PPosX;
result:= PosX;
end;
Hmm, du liest hier aus PPosX. Aber du setzt das vorher nirgends. Also ist der Wert 0.

Wie wäre es so:

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:
unit mStein;

interface

uses
  ExtCtrls, Graphics, SysUtils;

type
  TStein = class(Tobject)
  private
    Stein: Ticon;
    Leinwand: TImage;
    PosX, PosY: Integer;
  public
    constructor Create(pLeinwand: Timage ; PPosX, PPosY: Integer);
    procedure zeichnen(PPosX, PPosY: Integer);
    function gibX: Integer;
    function gibY: Integer;
  end;

implementation

constructor TStein.Create(pLeinwand: TImage; PPosX, PPosY: Integer);
begin
  Leinwand := pLeinwand;
  Stein := TIcon.Create;
  Stein.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Spiel\res\stone_green.ico');
  PosX := PPosX;
  PosY := PPosY;
end;

procedure TStein.zeichnen(PPosX, PPosY: Integer);
begin
  Leinwand.Canvas.Draw(PPosX, PPosY, Stein);
end;

function TStein.gibX: Integer;
begin
  Result := PosX;
end;

function TStein.gibY: Integer;
begin
  Result := PosY;
end;

end.
Und jetzt bist du wieder dran. ;-)
Alles mache ich nicht, aber hoffentlich zeigt dir das zumindest einmal wo die Probleme lagen und wie der Code ordentlich formatiert aussieht. ;-)