bisher habe ich vorzugsweise schonmal qpixmaps statt qimages benutzt, aber viel wird das nicht ändern... da hauptsächlich berechnungen und mausabfragen eine rolle spielen. außerdem überlege ich ob timer nicht evtl. effektiver wären. bisher ist das event-gesteuert.
das ist mal ein ausschnitt aus einem event, das eintritt wenn man eine einheit bewegen will.
Code: Alles auswählen
case bfa_move_unit:
painter.setPen(QPen(QColor(0,0,0)));
painter.setBrush(QColor(255, 255, 255));
double vect_ln;
unit_to_set.clear();
moving_unit_model_offsets.clear();
for(int i = 0; i < models_selected.size(); i++)
{
//!unit sizes
float width = units.at(models.at(models_selected.at(i) )->owner() )->get_ModelDym()->get_width();
float height = units.at(models.at(models_selected.at(i) )->owner() )->get_ModelDym()->get_height();
float radius = units.at(models.at(models_selected.at(i) )->owner() )->get_ModelDym()->get_radius();
//!entfernungsvektor
moving_unit_model_offsets.insert(models_selected.at(i), models.at(models_selected.at(i) )->position() - models.at(models_selected.first() )->position() );
UnitMovVect = models.at(models_selected.at(i) )->position() - (mouse_pos/zoom_factor + moving_unit_model_offsets[models_selected.at(i)] );
//!entfernung
vect_ln = sqrt ( pow(UnitMovVect.x(), 2.0f) + pow(UnitMovVect.y(), 2.0f) );
//!zeichne linien/modelle am zielort
if(vect_ln <= units.at(unit_selected)->get_movement() )
{
unit_to_set.append(models_selected.at(i) );
painter.drawLine(mouse_pos/zoom_factor + moving_unit_model_offsets[models_selected.at(i)], models.at(models_selected.at(i) )->position() );
//!kein pixmap
if(/*zoom_level < 2 &&*/ models.at(models_selected.at(i) )->get_pixmap() == NULL)
{
//!infantrie
if(!units.at(models.at(models_selected.at(i) )->owner() )->get_isVehicle() )
painter.drawEllipse(QRectF(mouse_pos.x()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].x() - radius/2, mouse_pos.y()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].y() - radius/2, radius, radius) );
//!fahrzeuge
if(units.at(models.at(models_selected.at(i) )->owner() )->get_isVehicle() )
{
//!zum modell bewegen, drehen, zurückbewegen
QPointF pnt(mouse_pos.x()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].x(), mouse_pos.y()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].y() );
painter.translate(pnt);
painter.rotate(models.at(models_selected.at(i))->getAngle() );
painter.translate(-pnt);
painter.drawRect(QRectF(mouse_pos.x()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].x() - width/2, mouse_pos.y()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].y() - height/2, width, height) );
//!zum modell bewegen, drehen, zurückbewegen
painter.translate(pnt);
painter.rotate(-models.at(models_selected.at(i))->getAngle() );
painter.translate(-pnt);
}
}
//!pixmap vorhanden
if(/*zoom_level >= 2 &&*/ models.at(models_selected.at(i) )->get_pixmap() != NULL)
{
float rel = zoom_factor/8;
//! infantrie
if(!units.at(models.at(models_selected.at(i) )->owner() )->get_isVehicle() )
px_painter.drawPixmap(mouse_pos - QPointF(8*rel, 8*rel) + moving_unit_model_offsets[models_selected.at(i)]*zoom_factor, models.at(models_selected.at(i) )->get_pixmap()->scaled(16*rel, 16*rel) );
}
}
}
//!bewegungsdistanz
px_painter.setPen(QPen(QColor(255,255,255)));
px_painter.drawText(mouse_pos + QPointF(25,20), (new QString)->setNum(vect_ln, 'f', 1) + "\"");
break;