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

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

11

10.11.2008, 14:17

Zitat von »"Gon"«

ja, das stimmt, ich hab das buch, aber da werden keine arrays von sprites, bzw. klassen besprochen und wie man es macht, wenn man die größe des arrays erst später weis...


Oh doch. In dem Buch wird die STL besprochen und da kommen vectoren vor und auch für was die gut sind.
Und wenn ich mich recht erinnere hat er Arrays schon auch mit eigenen Klassen besprochen..

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

12

10.11.2008, 14:20

achso, danke für den hinweis. das kapitel mit der STL und das über die Windows-programmierung hab ich mir nähmlich noch gar nicht angeschaut.

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

13

16.11.2008, 14:45

ok, ich jetzt versucht, das mit vektoren zu machen. hier ist definition und deklaration:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
vector<CSprite> m_vLineLeft;
    vector<CSprite> m_vLineRight;
    vector<CSprite> m_vLineUp;
    vector<CSprite> m_vLineDown;
    vector<CSprite> m_vStopPoint;

// werte aus ini-datei lesen

  char ini[] = "C:\\Programmierung\\Projekte\\C++\\Grafik-Programme\\Teilchenbeschleuniger\\Data\\TB.ini";

  m_Steps    = GetPrivateProfileInt("Settings", "Schritte", 0, ini);


  for (int i = 0; i <= m_Steps; i++)
  {

      m_vLineLeft.push_back ;
      m_vLineLeft[i].Load ("Data/Line_Left_Right.bmp");
      m_vLineLeft[i].SetColorKey (255, 0, 255);

      m_vLineRight.push_back;
      m_vLineRight[i].Load ("Data/Line_Left_Right.bmp");
      m_vLineRight[i].SetColorKey (255, 0, 255);

      m_vLineUp.push_back;
      m_vLineUp[i].Load ("Data/Line_Left_Right.bmp");
      m_vLineUp[i].SetColorKey (255, 0, 255);

      m_vLineDown.push_back;
      m_vLineDown[i].Load ("Data/Line_Left_Right.bmp");
      m_vLineDown[i].SetColorKey (255, 0, 255);

      m_vStopPoint.push_back;
      m_vStopPoint[i].Load ("Data/Line_Left_Right.bmp");
      m_vStopPoint[i].SetColorKey (255, 0, 255);

  }


jetzt gibt der compiler aber logischerweise die meldung aus, dass nach push_back die argumentliste fehlt:

C-/C++-Quelltext

1
2
3
4
5
1>c:\programmierung\projekte\c++\grafik-programme\teilchenbeschleuniger\game.cpp(97) : error C3867: "std::vector<_Ty>::push_back": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&std::vector<_Ty>::push_back", um einen Zeiger auf den Member zu erstellen.
1>        with
1>        [
1>            _Ty=CSprite
1>        ]


was muss ich in die klammern schreiben? doch etwas, was vom typ CSprite ist, aber was?
wenn der vector int wäre, müsste ich einen int in die klammern schreiben, aber wenn ich jetzt eine klasse habe? weil da steht, ich muss einen zeiger auf das objekt schreiben, oder wie ist das gemeint?

vielen dank im voraus,

mfg Gon

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

14

16.11.2008, 14:56

Zitat

wenn der vector int wäre, müsste ich einen int in die klammern schreiben, aber wenn ich jetzt eine klasse habe? weil da steht, ich muss einen zeiger auf das objekt schreiben, oder wie ist das gemeint?

Das hat nichts mit deinem Fehler zu tun. VC interpretiert eine fehlende Argumentliste oftmals (richtigerweise) damit, dass der Programmierer probiert die Adresse einer Funktion zu übergeben (Funktionszeiger) und um das zu tun muss man den Adressoperator & auf die Funktion anwenden (ohne Parameter).

Aber zu deinem Problem.
Der vector speichert dir ja Objekte vom Typ CSprite. Nun musst du beim push_back ja auch noch was in den vector einfügen. Nämlich ein Objekt.
Du hast richtig erkannt, dass bei einem integer du da einfach eine Zahl angeben kannst. Aber auch nur, weil eine Zahl in den Typ implizit umgewandelt werden kann. Ansonsten müsstest du auch :

C-/C++-Quelltext

1
.push_back ( int ( 2 ) );


schreiben. ;)

Jetzt kannst du mal raten, was du mache musst, um ein CSprite in den vector einzufügen..

15

16.11.2008, 15:07

Du brauchst auch eigentlich keine 4, sondern einen Vector:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vector<CSprite> m_vMySprites;

CSprite s;   // Temporäres Objekt


s.Load ("Data/Line_Left_Right.bmp"); 
s.SetColorKey (255, 0, 255); 

m_vMySprites.push_back( s ); // Objekt hinzufügen


// Nächser Eintrag


s.Load ("Data/Line_Right_Left.bmp"); 
s.SetColorKey (255, 0, 255); 

m_vMySprites.push_back( s ); // Objekt hinzufügen


// usw.

...

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

16

16.11.2008, 15:39

@drakon:
ok, danke ;)

@TrikkieMikkie:
stimmt, aber dann ist es nicht übersichtlich find ich. und außerdem wirds dann mit dem zeichnen schwierig, wie z.b. hier:

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
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
// RenderSteps

//

// Aufgabe: Linien, bzw. Punkte, die den Weg markieren, rendern

//

void CGame::RenderSteps ()
{

    if (m_Zufallszahl == 1)  // Links(-Rechts)-Linie zeichnen

    {
        m_vLineLeft[m_Left].SetPos ((m_fPlayerEndXPos + 12.5f), (m_fPlayerEndYPos));
    
    }

    else if (m_Zufallszahl == 2)  // (Links-)Rechts-Linie zeichnen

    {
        m_vLineRight[m_Right].SetPos ((m_fPlayerEndXPos - 37.5f), (m_fPlayerEndYPos));
    
    }

    else if (m_Zufallszahl == 3)  // Oben(-Unten)-Linie zeichnen

    {
        m_vLineUp[m_Up].SetPos ((m_fPlayerEndXPos), (m_fPlayerEndYPos + 12.5f));
    
    }

    else if (m_Zufallszahl == 4)  // Oben(-Unten)-Linie zeichnen

    {
        m_vLineDown[m_Down].SetPos ((m_fPlayerEndXPos), (m_fPlayerStartYPos - 37.5f));
    
    }

    else if (m_Zufallszahl == 5)  // Stop-Punkt zeichnen

    {
        m_vStopPoint[m_Stop].SetPos ((m_fPlayerEndXPos), (m_fPlayerEndYPos));
    
    }

    

    for (int i = 0; i < m_Steps; i++)
    {

        m_vLineLeft[i].Render ();

        m_vLineRight[i].Render ();

                m_vLineUp[i].Render ();

        m_vLineDown[i].Render ();

        m_vStopPoint[i].Render ();
     }
        
} // RenderSteps


kann ich das eigentlich so schreiben? stimmt das dann auch? also m_Left, m_Right, m_Up, m_Down und m_Stop erhöhen sich nach jedem schritt um 1, also ist das sprite jedesmal ein anderes aus dem array.

es kommt folgende meldung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
1>------ Erstellen gestartet: Projekt: Teilchenbeschleuniger, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Game.cpp
1>Verknüpfen...
1>Game.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp___CrtDbgReportW" in Funktion ""public: class CSprite & __thiscall std::vector<class CSprite,class std::allocator<class CSprite> >::operator[](unsigned int)" (??A?$vector@VCSprite@@V?$allocator@VCSprite@@@std@@@std@@QAEAAVCSprite@@I@Z)".
1>.\Debug/Teilchenbeschleuniger.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
1>Das Buildprotokoll wurde unter "file://c:\Programmierung\Projekte\C++\Grafik-Programme\Teilchenbeschleuniger\Debug\BuildLog.htm" gespeichert.
1>Teilchenbeschleuniger - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


muss ich etwa noch etwas einbinden? oder liegt das an was anderem?

mfg Gon

17

16.11.2008, 15:59

Keine Ahnung, was du da genau zeichnen willst und wie du dein Array gefüllt hast.
Hauptsache, du sprengst die Array-Grenzen nicht.

Das Beispiel mit dem Füllen, was ich dir vorher genannt habe könnte man selbstverständlich auch anders machen. Mit 'ner Schleife zum Beispiel.
Und mit Aufzählungskonstanten (enum).

18

16.11.2008, 17:47

switch wäre auch keine schlechte Idee... ;)

19

16.11.2008, 17:51

grundlagen wäre hier generell das beste ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

20

16.11.2008, 18:22

Gon

Schau mal in den Projekteinstellungen unter C++ - Codegenerierung -> Laufzeitbibliothek und stell ggf. auf "/MTd" oder "/MDd" um.

Werbeanzeige