void Creep::draw(sf::RenderWindow &window) { if (tileSet_) { sf::Sprite creepSprite = tileSet_->getSpriteById(1); sf::Vector2f position = getPosition(); int drawnSize = TileSet::getDrawnSize(); creepSprite.setOrigin(drawnSize/2.f,drawnSize/2.f); position.x += drawnSize/2.f; position.y += drawnSize/2.f; creepSprite.setPosition(position); int goingTo = paths_.getNextByID(comingFrom_); if (isAbove(comingFrom_,goingTo)) { creepSprite.setRotation(180); }else if (isBelow(comingFrom_,goingTo)) { creepSprite.setRotation(0); }else if (isLeft(comingFrom_,goingTo)) { creepSprite.setRotation(90); }else if (isRight(comingFrom_,goingTo)) { creepSprite.setRotation(270); } window.draw(creepSprite); } return; }
sf::Vector2f Creep::getFuturePosition(double timeDelta) { int drawnSize = TileSet::getDrawnSize(); sf::Vector2f pos = getPosition(); float distanceDelta(timeDelta*speed_*drawnSize); while (distanceDelta > 0) { int goingTo = paths_.getNextByID(comingFrom_); if (isLeft(comingFrom_,goingTo)) { //coming from left of goingTo float distanceIntoTile = pos.x - (comingFrom_%paths_.getNumTilesX())*drawnSize; if (distanceDelta >= drawnSize - distanceIntoTile) { distanceDelta -= (drawnSize-distanceIntoTile); pos.x = (goingTo%paths_.getNumTilesX())*drawnSize; comingFrom_ = goingTo; }else { pos.x += distanceDelta; distanceDelta = 0; } }else if (isRight(comingFrom_,goingTo)) { //coming from right of goingTo float distanceIntoTile = (comingFrom_%paths_.getNumTilesX())*drawnSize - pos.x; if (distanceDelta >= drawnSize - distanceIntoTile) { distanceDelta -= (drawnSize - distanceIntoTile); pos.x = (goingTo%paths_.getNumTilesX())*drawnSize; comingFrom_ = goingTo; }else { pos.x -= distanceDelta; distanceDelta = 0; } }else if (isAbove(comingFrom_,goingTo)) {//coming from above goingTo float distanceIntoTile = pos.y - comingFrom_/paths_.getNumTilesX() * drawnSize; if (distanceDelta >= drawnSize - distanceIntoTile) { distanceDelta -= (drawnSize - distanceIntoTile); pos.y = (goingTo/paths_.getNumTilesX()) * drawnSize; comingFrom_ = goingTo; }else { pos.y += distanceDelta; distanceDelta = 0; } }else if (isBelow(comingFrom_,goingTo)) {//coming from below goingTo float distanceIntoTile = comingFrom_/paths_.getNumTilesX() * drawnSize - pos.y; if (distanceDelta >= drawnSize - distanceIntoTile) { distanceDelta -= (drawnSize - distanceIntoTile); pos.y = (goingTo/paths_.getNumTilesX()) * drawnSize; comingFrom_ = goingTo; }else { pos.y -= distanceDelta; distanceDelta = 0; } }else if (comingFrom_ == goingTo) { distanceDelta = 0; leaked_ = true; } } return pos; }
void GraphGraphicsView::drawPath(NodeGraphicsItem *from, NodeGraphicsItem *to) { QPen pen(QColor(qrand()%256,qrand()%256,qrand()%256)); double Pi = 3.1415926535897932384626433832795028; qreal x1, x2, y1, y2; if (isBelow(from, to)) { x1 = from->pos().x()+15; y1 = from->pos().y()+10; x2 = to->pos().x()+15; y2 = to->pos().y()-20; } else { x1 = from->pos().x()+15; y1 = from->pos().y()-20; x2 = to->pos().x()+15; y2 = to->pos().y()+10; } lines.push_back(scene.addLine(x1, y1, x2, y2,pen)); qreal arrowsize = 15; QGraphicsLineItem* line = lines.last(); // I HAVE NO IDEA WHAT I'M CALCULATING MODE ON double angle = ::acos(line->line().dx() / line->line().length()); if (line->line().dy() >= 0) angle = (Pi * 2) - angle; QPointF arrowP1 = line->line().p1() + QPointF(sin(angle + Pi / 3 ) * arrowsize, cos(angle+Pi/3)*arrowsize); QPointF arrowP2 = line->line().p1() + QPointF(sin(angle + Pi - Pi / 3) * arrowsize, cos(angle + Pi - Pi / 3) * arrowsize); // I HAVE NO IDEA WHAT I'M CALCULATING MODE OFF arrows.push_back(scene.addLine(line->line().p1().x(), line->line().p1().y(), arrowP1.x(), arrowP1.y(),pen)); arrows.push_back(scene.addLine(line->line().p1().x(), line->line().p1().y(), arrowP2.x(), arrowP2.y(),pen)); }