Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

29.11.2008, 15:27

OOP *Kopfschmerz*

Hallo,
nachdem mein erster Versuch ein kleines Rundenbasiertes Strategiespiel in der Konsole zumachen gescheitert ist (also mit OOP) will ich es nochmal versuchen.
Nur ist das das erste mal gescheitert weil ich Klassen verwendet habe.
Hab da ein paar fragen.

1. Vererbung.
Also nehmén wir an ich habe die Hauptklasse Infantrie und von der erben die Klassen Schwertkämpfer und Bogenschütze.
Ich geh ja beim zeichen von Einheiten so vor das ich ein zweidemensionales Array habe mit y und x position (vorhanden in der Klasse "Feld"). Das Array gehört zu einer Struktur .Von der Struktur gehen dann Instanzen ab wie z.b "Schertkämpfer"
Jetzt habe ich in der Hauptklasse die Funktion "Herstellen" die ja eine Einheit auf das Spielfeld "herstellen" soll.
Also frage ich x und y ab. So bis dahin ist mir das auch klar.

So jetzt muss das ja eingetragen werden in das Array.
Ich dachte mir das mach ich gleich in der selben Funktion

1.1Wie bekommt ich jetzt das Array in die Klasse "Infantrie" um dort die
Position einzutragen. Zeiger? Aber wie übergebe ich Zeiger über Klassen hinweg?

1.2 Wie soll ich es schreiben das ,dass Programm weiss wo es die Koordinaten eintragen soll. Also hab es x und y jetzt bei

C-/C++-Quelltext

1
Schwertkeampfer.Pos [] []

oder bei

C-/C++-Quelltext

1
Bogenschuetze.Pos [] [];

Einträgt.


Hoffe es ist klar was ich meine.
Das Porblem ist einfach das zwei Klassen zusammen arbeiten sollen.
Die eine frägt ab und speichert die andere zeichnet das ganze auf das Spielfeld.
Hab zwar einen Code von unsigned long bekommen aber da wird meine Frage nicht bewantwortet

2

29.11.2008, 16:05

Warum erstellst du für jede Figur einen ganzen "Abbild" der Map?
erstell doch einfach zwei Variablen (z.B. xpos, ypos), in die du dann die Positionen der Figuren erstellst.

Dann müsstest du die ganzen Arrays auch nicht nach einer "1" / TRUE durchsuchen lassen.

3

29.11.2008, 20:03

Also, falls du Arrays benutzt, würde ich dir Raten, lieber mit Vektoren zu arbeiten. Mit denen kann man leichter arbeiten und lassen sich auch einfach über Parameter übergeben.
Arrays lassen sich viel schwerer übergeben. Soweit ich weiß, geht es nur mit Zeigern und die Ermittlung der Größe des Arrays mit Hilfe von sizeof, wobei ich mir da nicht so sicher bin. Außerdem haben Arrays viele Nachteile gegenüber Vektoren.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

4

30.11.2008, 16:03

Zitat von »"PS3-690"«

Warum erstellst du für jede Figur einen ganzen "Abbild" der Map?
erstell doch einfach zwei Variablen (z.B. xpos, ypos), in die du dann die Positionen der Figuren erstellst.

Dann müsstest du die ganzen Arrays auch nicht nach einer "1" / TRUE durchsuchen lassen.


Wie meint du das?
Meinst du jetzt das es nur noch ein Array gibt?

@Speranza

Da bin ich noch net. Will jetzt nicht schon wieder was neues anfangen sondern erstmal mit dem hier klar kommen.



Ich leg das Strategiepsiel ertsmal wieder bei Seite vieleicht ist das doch ein wenig zu hoch gesteckt für den Anfang. Ich will jetzt erstmal mein Tic-Tac-Toe auf Klassen umlegen. Also die Frage stellung ist immer noch die gleiche.
Wie kriege ich die Koordinaten die ich ihn einer Funktionn einer Klassse abfrage. In ein Array einer anderen Klasse.

5

30.11.2008, 16:12

Zitat

Wie kriege ich die Koordinaten die ich ihn einer Funktionn einer Klassse abfrage. In ein Array einer anderen Klasse.


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B
{
public:
int a;
void set(int t) {a = t;}
};

class A
{
public:
void f(B* o);
};

void A::f(B* o)
{
int a;
cin >> a;
o->set(a);
}


Meinst du das ungefähr so?

Anonymous

unregistriert

6

02.12.2008, 10:01

Re: OOP *Kopfschmerz*

Zitat von »"Errschaffer"«

Hab zwar einen Code von unsigned long bekommen aber da wird meine Frage nicht bewantwortet
Ja denkst du, du bekommst alles von mir?!

7

03.12.2008, 12:00

glaub was PS3 meinte ist das, was du eigentlich suchst.


du hast deine klasse feld, die das spielfeld darstellt(?)

also z.b.
width = 3, height = 3
O | O | O
O | O | O
O | O | O

die O's sind deine felder.

jetzt brauchst du bei deinen spielfiguren nicht das ganze spielfeld abzuspeichern, sondern nur deren momentane position.

Also hast du nicht x[],y[] sondern nur z.b. CurrentX, CurrentY, eben die momentane position der einheit.

zum abfragen, ob dann diese einheit auf einem feld steht, benutzt du z.b. 2 gettermethoden

schon lange nicht mehr c++ programmiert also keine 100% garantie auf folgendes

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// methoden deiner haupteinheitklasse

int Unit::GetCurrentX()
{
  return this->CurrentX;
}

int Unit::GetCurrentY()
{
  return this->CurrentY;
}



// allgemeine funktionen für einheiten

int GetUnitX( Unit WhichUnit )
{
  return Whichunit.GetCurrentX();
}

int GetUnitY( Unit WhichUnit )
{
  return Whichunit.GetCurrentY();
}



hoffe habe dein problem richtig verstanden.


danach verwendest du das ca. so

C-/C++-Quelltext

1
2
3
// angenommen die position des kämpfers ist ( 0, 0 )

set Spielfeld[ GetUnitX( kaempfer ) ] [ GetUnitY( kaempfer ) ] = 'X'
Spielfeld.draw();


X | O | O
O | O | O
O | O | O

8

03.12.2008, 17:15

@Draculark: Wofür sind die Allgemeinen funktionen gut? du könntest unten einfach die Memberfunktionen von unit aufrufen.
dabei fällt mir noch was gravierenderes auf: das set am anfang der 1.Zeile deines verwendungsbeispiels ist falsch, Zuweisungen funktionieren einfach nur mit VARIABLE = DATEN ;)

zur optimierung könnte man deine Funktionen noch inline machen.

9

03.12.2008, 18:05

wie in nem anderen thread schon angedeutet habe ich sehr wenig C++ in letzter zeit programmiert und mache eigentlich nur im wc3 editor mit jass rum. da ist die syntax etwas anders ;)

und von daher auch die allgemeinen funktionen: blizzard hat das da auch so. warum? weiß ich nicht^^

auszug aus jasscraft (editor für jass)

C-/C++-Quelltext

1
2
3
4
5
constant native GetUnitX            takes unit whichUnit returns real
constant native GetUnitY            takes unit whichUnit returns real
native          SetUnitX            takes unit whichUnit, real newX returns nothing
native          SetUnitY            takes unit whichUnit, real newY returns nothing
native          CreateUnit              takes player id, integer unitid, real x, real y, real face returns unit


da hast du dann eben sowas wie

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
function foo takes nothing returns nothing
  local unit u = CreateUnit( Player(0), 'hfoo', 500.00, -738.55, 180.00 )

  call SetUnitX( u, 1200.00 )
  set u = CreateUnit( Player(5), 'ogru', 0, 0, 0 )
  call SetUnitY( u, -500 )

  set u = null
endfunction



aber das ist jetzt am topic vorbei. man braucht die allgemeinen funktionen wohl einfach nicht.

sry ;)


P.S.: man sieht eh, constant ist das pendant ( richtig geschrieben?:D) zu inline.

10

05.12.2008, 14:37

Zitat von »"Draculark"«

wie in nem anderen thread schon angedeutet habe ich sehr wenig C++ in letzter zeit programmiert und mache eigentlich nur im wc3 editor mit jass rum. da ist die syntax etwas anders ;)

und von daher auch die allgemeinen funktionen: blizzard hat das da auch so. warum? weiß ich nicht^^
Naja, Blizzard's Jazz-Sprache ist wohl nicht wirklich mit C++ zu vergleichen.

Und selbst wenn man das in C++ mit globalen Funktionen realisieren will (was hier aber sehr unschön ist), sollte man das Objekt als Const-Referenz übergeben...

Zitat von »"Draculark"«

P.S.: man sieht eh, constant ist das pendant ( richtig geschrieben?:D) zu inline.
Kaum. Ich denke, in dem Zusammenhang entspricht es eher dem const am Ende der Funktionsdeklaration, um anzuzeigen, das das Objekt von der Funktion nicht verändert wird.

Werbeanzeige