ich gebs auf! Ich weiß nicht, wie ich es umsetzen soll.
Folgendes Problem, alles in 2D:
- ein Spielfeld, von Oben betrachtet (sagen wir ein haufen Kreise)
- wenn ich das Mausrate betätige will ich in das Spiel reinzoomen, also alle Geometrie die ich zeichne soll eben großer gezeichnet werden
Mal ne Skizze: Das ist das gesamte Spielfeld (alles sehr schematisch).
Angenommen ich gehe nun mit der Maus auf das Zenrum und scrolle rein, dann möchte ich den Bildschirmausschnitt dort vergrößern.
Wieder eine Skizze: Das schwarze Rechteck möchte ich nun auf den Bildschirm bringen und den Inhlat an die Zoomstufe angepasst haben: Man beachte, das ich nicht einfach ein "Screenshot" machen möchte, sondern die gesamten Objekte eben nur größer zeichnen will.
Also bei Kreisen den Radius und Position anpassen!!
Das Problem:
Wie zur Hölle funktioniert das??
Ich habe mir folgendes schon überlegt:
Ich habe eine Klasse "ViewOfSpielFeld". Diese kapselt die Zoomstufe und den anzuzeigenden Spielfeldausschnitt!
"rectToRenderOnScreen": ist das Rechteck auf dem Bildschirm in dem dann gezeichnet werden soll (ist in der Mitte des ProgrammFensters)
Naja, mal etwas Code:
Code: Alles auswählen
void Renderer::draw(CL_GraphicContext &gc, ViewOfSpielfeld* viewOfSpielfeld, const CL_Rect& rectToRenderOnScreen )
{
CL_Pointf lo(rectToRenderOnScreen.get_top_left().x,rectToRenderOnScreen.get_top_left().y);
// "ViewOfSpielfeld::getAllKreiseInViewRect()":
// liefert alle Kreise vom Spielfeld (bei Zoomstufe 1.0)
// die sich in dem Ausschnitt befinden, der angezeigt werden soll!
// Die Funktion funktioniert auch!
std::vector<Kreis> kreise( viewOfSpielfeld->getAllKreiseInViewRect());
std::vector<Kreis>::const_iterator iter(kreise->begin());
for(iter; iter!=kreise->end(); ++iter)
{
Kreis derKreis(*(iter));
CL_Pointf mitte(derKreis->mMittePos);
// angabe der Mitte u. Radius des Kreises in OriginalKoordinaten (zoomstufe 1.0)
float radius(derKreis->mRadius * viewOfSpielfeld->mZoomFaktor);
CL_Pointf neuMitte(/* some Magic *~~~~~* */);
mKreiszeichner.draw(gc,neuMitte,radius);
}
}
Hat jemand eine Idee? Irgendwie verhädder ich mich immer..
Gruß