Problem mit Map-Generator
-
Hallo,
ich will aus Quadraten eine zufällige Map erstellen, das Problem ist, dass 2 Quadrate immer mind. 10 Pixel Abstand zueinander haben (Quadrat - 10 Pixel - Quadrat, muss nicht hundertprozentig genau sein), hier ist der Teil, der den Abstand berechnet, nur irgendwie funktioniert es nicht.for (it = Quadrats.begin(); it!=Quadrats.end(); it++) { Radius = (*it)->GetWidth(); // Jedes Quadrat hat den gleichen Radius CenterX1 = m_QRX + Radius; // m_QRX ist die x-cord des neu erstellten Quadrats CenterY1 = m_QRY + Radius; CenterX2 = (*it)->GetPositionX() + Radius; CenterY2 = (*it)->GetPositionY() + Radius; OffsetX = abs(CenterX1 - CenterX2); OffsetY = abs(CenterY1 - CenterY2); if (OffsetX < 10 || OffsetY < 10) { Quadrat_Overlap = true; } }Was ist hier falsch bzw. liegt der Fehler an dem Code hier?
-
Quadrate haben keinen Radius. Wenn sie einen hätten, wäre er nur die Hälfte der Seitenlänge.
Code ist prinzipiell nicht verständlich, da die Variablen nicht erklärt werden. Sieht auch nicht allgemein genug aus, da Zahlen nicht als Indizes verwendet werden. Ich habe das mit Boxes in 3D z.B. so gemacht:
const int LENGTH_DIMENSION_OF_NODES = 12; const int WIDTH_DIMENSION_OF_NODES = 12; const int COUNT_OF_NODES = LENGTH_DIMENSION_OF_NODES * WIDTH_DIMENSION_OF_NODES; const int SIZESQUARE = 12; const int SIZEHEIGHT = 12; const int DISTANCE = 0; vector3df boardPos[COUNT_OF_NODES]; // determine vectors of board's boxes for( int i=0; i<COUNT_OF_NODES; ++i ) { boardPos[i].Z = float((i%LENGTH_DIMENSION_OF_NODES)*(10*SIZESQUARE+10*DISTANCE)); boardPos[i].Y = 120; boardPos[i].X = float((i/WIDTH_DIMENSION_OF_NODES)*(10*SIZESQUARE+10*DISTANCE)); } //... for( int i=0; i<COUNT_OF_NODES; ++i ) { // position of boards nodeBoard[i]->setPosition( vector3df( boardPos[i].X, 0, boardPos[i].Z) ); nodeBoard[i]->setRotation( vector3df( -90,0,0)); }Vielleicht hilft Dir das irgendwie weiter. Mache es so allgemein wie möglich, damit Du später alles ändern kannst.
-
Arr0ws schrieb:
Hallo,
ich will aus Quadraten eine zufällige Map erstellen, das Problem ist, dass 2 Quadrate immer mind. 10 Pixel Abstand zueinander haben (Quadrat - 10 Pixel - Quadrat, muss nicht hundertprozentig genau sein), hier ist der Teil, der den Abstand berechnet, nur irgendwie funktioniert es nicht.for (it = Quadrats.begin(); it!=Quadrats.end(); it++) { Radius = (*it)->GetWidth(); // Jedes Quadrat hat den gleichen Radius CenterX1 = m_QRX + Radius; // m_QRX ist die x-cord des neu erstellten Quadrats CenterY1 = m_QRY + Radius; CenterX2 = (*it)->GetPositionX() + Radius; CenterY2 = (*it)->GetPositionY() + Radius; OffsetX = abs(CenterX1 - CenterX2); OffsetY = abs(CenterY1 - CenterY2); if (OffsetX < 10 || OffsetY < 10) { Quadrat_Overlap = true; } }Was ist hier falsch bzw. liegt der Fehler an dem Code hier?
ich glaube der fehler liegt darin, dass du Center jeweils um den radius verschiebst, ich denke, was du eigentlich vor hast, ist zu testen ob sie ausserhalb des radius sind. somit in etwa
for (it = Quadrats.begin(); it!=Quadrats.end(); it++) { Radius = (*it)->GetWidth(); // Jedes Quadrat hat den gleichen Radius CenterX1 = m_QRX; // m_QRX ist die x-cord des neu erstellten Quadrats CenterY1 = m_QRY; CenterX2 = (*it)->GetPositionX(); CenterY2 = (*it)->GetPositionY(); OffsetX = abs(CenterX1 - CenterX2); OffsetY = abs(CenterY1 - CenterY2); if (OffsetX < 10 + Radius || OffsetY < 10 + Radius) { Quadrat_Overlap = true; } }
-
@EH: Das braucht nicht allgemein sein, und mit dem "Radius" meine ich die hälfte der seitenlänge, ja
@rapso: Nein, daran liegts nicht
-
Also, so richtig verstehe ich die Logik nicht, aber folgende Ideen:
-
+ Radius
Könnte dies vielleicht auch minus sein? (hängt vom Koordinatensystem ab. Wo ist der Ursprung (X|Y) im Quadrat? Wie verläuft die Richtung der Achse? -
Warum verwendest Du überhaupt diesen Radius? Ist doch überflüssig?
Verwende den "Ursprung" des Quadrates und die Seitenlänge.
for (it = Quadrats.begin(); it!=Quadrats.end(); it++) { OffsetX = abs(m_QRX - (*it)->GetPositionX()); OffsetY = abs(m_QRY - (*it)->GetPositionY()); if ( (OffsetX < (*it)->GetWidth()) || (OffsetY < (*it)->GetWidth()) ) Quadrat_Overlap = true; }- Siehe oben: mach mal vorsichtshalber Klammern um die Argumente der ODER-Funktion:
(OffsetX < (*it)->GetWidth()) || (OffsetY < (*it)->GetWidth())
-
-
Läuft, nochmals Danke an alle, die mir geholfen haben!
void C2D_GameManager::CreateRandomQuadrats(LPDIRECT3DDEVICE9 lpDevice, LPDIRECT3DTEXTURE9 Texture, int Count) { m_Quadrat_Amount = 0; m_lpD3DDevice = lpDevice; while(m_Quadrat_Amount <= Count) { Quadrat_Overlap = false; m_QRX = 1 + rand() % (1000 - 1 + 1); // Zufallszahl fürs neue Quadrat m_QRY = 1 + rand() % (700 - 1 + 1); for (it = Quadrats.begin(); it!=Quadrats.end(); it++) { Radius = 70; // Radius der Texturen ist immer 70 CenterX1 = m_QRX + Radius; CenterY1 = m_QRY + Radius; CenterX2 = (*it)->GetPositionX() + Radius; CenterY2 = (*it)->GetPositionY() + Radius; Radius = Radius * 0.3; OffsetX = abs(CenterX2 - CenterX1); OffsetY = abs(CenterY2 - CenterY1); if (OffsetX < (Radius * 2) && OffsetY < (Radius * 2)) { Quadrat_Overlap = true; // 2 Quadrate schneiden sich } } if (Quadrat_Overlap == false) // Wenn sie sich nicht schneiden, wird ein neues erstellt { CQEngine_Sprite *Quadrat = new CQEngine_Sprite; // QEngine = 2D Engine Quadrat->Create(m_lpD3DDevice, Texture, m_QRX, m_QRY, 1.0f, 0.0f, 0.3f); Quadrats.push_back(Quadrat); m_Quadrat_Amount += 1; } } }