Bewegliche Felder

Ich versuche nun schon seit ein paar Wochen ein Spiel zu programmieren. Ich bin zwar fortgeschrittener Programmierer aber kein wirklicher Experte.

In meinem Programm möchte ich Felder erstellen, die nach Erstellung völlig verfügbar sind und erst bei Beendigung des Programms aus dem Speicher gelöscht werden. Ich habe bereits versucht meine eigene Klasse zu schreiben:

[jfields.h]

#include 

class jFields
{

 TImage \*PaintRect;

 static int count;
 TColor FieldColor;

 int FieldX;
 int FieldY;

 public:

 int WideSet;
 int isSet;

 jFields();
 jFields(int FX, int FY, int FSet, TColor FCol);

 ~jFields();

 void SetPos(int setfx, int setfy);
 void SetColor(TColor fsetcolor);
 void Paint();
 TColor getColor();
 static int Count(void);
 void Parent();

};

[/jfields.h]

[jfields.cpp]

#include 

TColor myLightGreen = (TColor)0x00008800;
TColor myGreen = (TColor)0x00006600;

int jFields::count = 0;

 jFields::jFields() :
 FieldColor(myLightGreen), WideSet(10), isSet(0), FieldX(0), FieldY(0)
{
// PaintRect = new TImage();
 ++count;
}

 jFields::jFields(int FX, int FY, int FSet, TColor FCol) :
 WideSet(10), FieldX(FX), FieldY(FY), isSet(FSet), FieldColor(FCol)
{
// PaintRect = new TImage;
 ++count;
}

 jFields::~jFields()
{
 --count;
}

void jFields::SetPos(int setfx, int setfy)
{
 FieldX = setfx; FieldY = setfy;
}

void jFields::SetColor(TColor fsetcolor)
{
 FieldColor = fsetcolor;
}

void jFields::stuck\_out\_tongue:aint()
{

 PaintRect-\>Left = 0;
 PaintRect-\>Top = 0;
 PaintRect-\>Height = 20;
 PaintRect-\>Width = 40;

 TPoint BuildGridPoint[4];
 BuildGridPoint[0].x = 0;
 BuildGridPoint[0].y = 10;

 PaintRect-\>Canvas-&gt:stuck\_out\_tongue\_winking\_eye:enPos = BuildGridPoint[0];
 PaintRect-\>Canvas-&gt:stuck\_out\_tongue\_winking\_eye:en-\>Color = myLightGreen;
 PaintRect-\>Canvas-\>Brush-\>Color = myGreen;

 BuildGridPoint[1].x = 20; BuildGridPoint[1].y = 0;
 BuildGridPoint[2].x = 40; BuildGridPoint[2].y = 10;
 BuildGridPoint[3].x = 20; BuildGridPoint[3].y = 20;
 BuildGridPoint[4].x = 0; BuildGridPoint[4].y = 10;

 PaintRect-\>Canvas-&gt:stuck\_out\_tongue\_winking\_eye:olyline(BuildGridPoint, 4);
 PaintRect-\>Update();
 PaintRect-\>Show();
}

TColor jFields::getColor()
{
 return FieldColor;
}

int jFields::Count()
{
 return count;
}

[/jfields.cpp]

Wie man Sieht habe ich bereits „PaintRect = new TImage“ herauskommentiert, da dies nicht funktioniert. Ein „new TImage(bla)“ in der Funktion Paint() hat zwar dazu geführt, dass das Programm ausgeführt werden kann, jedoch springt der debugger an, wenn ich Paint() tatsächlich aufrufe, weil ich wahrscheinlich nicht das richtige Objekt in die Klammern schreibe. Ist es möglich, der Klasse per Parameter das richtige Objekt zu übergeben, sodass ich dort das neue Image erstellen kann? Ich sehe momentan TImage und TBitmap als einzig vernünftige Lösungen um den in der Funktion erstellten Salmi auf die ganze Spielfläche verteilt ohne Lücken zu zeichnen, wenn ich ihn noch weiter verwenden will. Ein Formular wäre wahrscheinlich keine gute Lösung und selbst dieses zu erstellen scheint mir derweil noch zu kompliziert. BITTE HELFT MIR! - euers joph`

P.S.: Ich benutze Borland C++ Builder 6

Hallo,

Ein „new
TImage(bla)“ in der Funktion Paint() hat zwar dazu geführt,
dass das Programm ausgeführt werden kann, jedoch springt der
debugger an, wenn ich Paint() tatsächlich aufrufe, weil ich
wahrscheinlich nicht das richtige Objekt in die Klammern
schreibe.

Was ist denn die Fehlermeldung? Oder hast du einen Breakpoint gesetzt?

Grüße,
Moritz

CPU Debug-Fenster
Da kommt keine Fehlermeldung, ich kann dir leider nicht sagen, was das Fenster, das dabei aufpoppt bedeutet. Erst kommt „Quelldatei nicht gefunden: ExtCtrl.pas“ -> da kann ich den Pfad zur Quelldatei eingeben. Die Datei existiert jedoch gar nicht. Nach Abbrechen kommt das nächste Fenster zum Vorschein. ‚Zugriffsverletzung bei 0x00476d1b: Lesen von Adresse 0x00000168‘ und dann kommt ein Fenster mit dem Titel „CPU“ und einer Menge Daten die ich überhaupt nicht deuten kann. Hoffe das hilft zu helfen.
MfG joph

Hallo,

‚Zugriffsverletzung bei 0x00476d1b: Lesen von Adresse
0x00000168‘

das bedeutet, dass dein Programm versucht aus dem Arbeitspeicher an einer Stelle zu lesen, die nicht dem Programm gehört.

Grüße,
Moritz