bool GLObject::collision(GLObject & obj){ float vx = obj.x()-x(); float vy = obj.y()-y(); if( object.model() ){ //object.model()->cullInfo().radius(); return ( vx*vx + vy*vy ) < viewSize()*obj.viewSize(); } else return 0; }
int main() { #if defined(DEBUG) || defined(_DEBUG) _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //_crtBreakAlloc = 277; #endif //set the working directory to the directory where the executable exists, so that the relative paths work SetCurrentDirectory(GameHelper::ExecutableDirectory().c_str()); // create the window sf::Vector2f viewCenter(960.f, 540.f); sf::Vector2f viewSize(1920, 1080); sf::View view(viewCenter, viewSize); sf::RenderWindow window(sf::VideoMode(1920, 1080), "Game of Paths"); window.setView(view); auto getWindow = [&]() { return &window; }; sf::Clock clock; Game game(getWindow); // run the program as long as the window is open while (window.isOpen()) { std::chrono::time_point<std::chrono::system_clock> start, end; start = std::chrono::system_clock::now(); // check all the window's events that were triggered since the last iteration of the loop sf::Event event; while (window.pollEvent(event)) { // "close requested" event: we close the window if (event.type == sf::Event::Closed) window.close(); } // clear the window with black color window.clear(sf::Color(100, 100, 100)); float deltaTime = clock.restart().asSeconds(); game.Update(deltaTime); game.Draw(); // end the current frame window.display(); end = std::chrono::system_clock::now(); std::this_thread::sleep_for(std::chrono::microseconds(16000) - (end - start)); } return 0; }
void Camera::getToPlayer(const Player& player, sf::Vector2u levelSize){ sf::Vector2f playerSpritePos = player.getSpritePosition(); sf::Vector2f viewSize(this->w, this->h); float cameraXPosition; float cameraYPosition; if(levelSize.y < GAMEHEIGHT){ cameraYPosition = levelSize.y/2; } else { cameraYPosition = playerSpritePos.y + 16; calculateCameraYPosition(cameraYPosition, playerSpritePos, viewSize, levelSize); } if(levelSize.x < GAMEWIDTH){ cameraXPosition = levelSize.x/2; } else { cameraXPosition = playerSpritePos.x + 16; calculateCameraXPosition(cameraXPosition, playerSpritePos, viewSize, levelSize); } this->view.setCenter(cameraXPosition, cameraYPosition); }
void DataSetView::viewportChanged() { if(_viewportX != _viewportX || _viewportY != _viewportY || _viewportW != _viewportW || _viewportH != _viewportH ) //only possible if they are NaN return; #ifdef DEBUG_VIEWPORT std::cout << "viewportChanged!\n" <<std::flush; #endif QVector2D leftTop(_viewportX, _viewportY); QVector2D viewSize(_viewportW, _viewportH); QVector2D rightBottom(leftTop + viewSize); int currentViewportColMin = -1, currentViewportColMax = -1, currentViewportRowMin = -1, currentViewportRowMax = -1; float cumulative = 0; for(int col=0; col<_model->columnCount() && currentViewportColMax == -1; col++) { if(currentViewportColMax == -1 && cumulative > rightBottom.x()) currentViewportColMax = col; cumulative += _dataColsMaxWidth[col]; if(currentViewportColMin == -1 && cumulative > leftTop.x()) currentViewportColMin = col; } if(currentViewportColMax == -1) currentViewportColMax = _model->columnCount(); currentViewportColMin = std::max(0, currentViewportColMin - _viewportMargin); currentViewportColMax = std::min(_model->columnCount(), currentViewportColMax + _viewportMargin); currentViewportRowMin = std::max(qRound(leftTop.y() / _dataRowsMaxHeight) - 1, 0); currentViewportRowMax = std::min(qRound(rightBottom.y() / _dataRowsMaxHeight) + 1, _model->rowCount()); // remove superflouous textItems if they exist (aka store them in stack) if(_previousViewportRowMin != -1 && _previousViewportRowMax != -1 && _previousViewportColMin != -1 && _previousViewportColMax != -1) { for(int col=_previousViewportColMin; col<_previousViewportColMax; col++) { for(int row=_previousViewportRowMin; row < currentViewportRowMin; row++) storeTextItem(row, col); for(int row=currentViewportRowMax; row < _previousViewportRowMax; row++) storeTextItem(row, col); } for(int row=_previousViewportRowMin; row<_previousViewportRowMax; row++) { for(int col=_previousViewportColMin; col < currentViewportColMin; col++) storeTextItem(row, col); for(int col=currentViewportColMax; col < _previousViewportColMax; col++) storeTextItem(row, col); } for(int row=_previousViewportRowMin; row < currentViewportRowMin; row++) storeRowNumber(row); for(int row=currentViewportRowMax; row < _previousViewportRowMax; row++) storeRowNumber(row); } _lines.clear(); //and now we should create some new ones! for(int col=currentViewportColMin; col<currentViewportColMax; col++) for(int row=currentViewportRowMin; row<currentViewportRowMax; row++) { QVector2D pos0(_colXPositions[col], _dataRowsMaxHeight + row * _dataRowsMaxHeight); QVector2D pos1(pos0.x() + _dataColsMaxWidth[col], pos0.y()+ _dataRowsMaxHeight); int lineFlags = _model->data(_model->index(row, col), _roleNameToRole["lines"]).toInt(); bool left = (lineFlags & 1 > 0) && pos0.x() > _rowNumberMaxWidth + _viewportX, right = (lineFlags & 2 > 0) && pos1.x() > _rowNumberMaxWidth + _viewportX, up = lineFlags & 4 > 0 && pos0.y() > _dataRowsMaxHeight + _viewportY, down = lineFlags & 8 > 0 && pos1.y() > _dataRowsMaxHeight + _viewportY; createTextItem(row, col); if(left) _lines.push_back(std::make_pair(QVector2D(pos0.x(), pos1.y()), pos0)); if(up) _lines.push_back(std::make_pair(QVector2D(pos1.x(), pos0.y()), pos0)); if(right) _lines.push_back(std::make_pair(QVector2D(pos1.x(), pos0.y()), pos1)); if(down) _lines.push_back(std::make_pair(QVector2D(pos0.x(), pos1.y()), pos1)); } _lines.push_back(std::make_pair(QVector2D(_viewportX, _viewportY), QVector2D(_viewportX, _viewportY + _viewportH))); _lines.push_back(std::make_pair(QVector2D(_viewportX + _rowNumberMaxWidth, _viewportY), QVector2D(_viewportX + _rowNumberMaxWidth, _viewportY + _viewportH))); _lines.push_back(std::make_pair(QVector2D(_viewportX, _viewportY), QVector2D(_viewportX + _viewportW, _viewportY))); _lines.push_back(std::make_pair(QVector2D(_viewportX, _viewportY + _dataRowsMaxHeight), QVector2D(_viewportX + _viewportW, _viewportY + _dataRowsMaxHeight))); for(int row=currentViewportRowMin; row<currentViewportRowMax; row++) { createRowNumber(row); QVector2D pos0(_viewportX, (1 + row) * _dataRowsMaxHeight); QVector2D pos1(_viewportX + _rowNumberMaxWidth, (2 + row) * _dataRowsMaxHeight); if(pos0.y() > _dataRowsMaxHeight + _viewportY) _lines.push_back(std::make_pair(QVector2D(pos0.x(), pos0.y()), QVector2D(pos1.x(), pos0.y()))); if(row == _model->rowCount() - 1 && pos1.y() > _dataRowsMaxHeight + _viewportY) _lines.push_back(std::make_pair(QVector2D(pos0.x(), pos1.y()), QVector2D(pos1.x(), pos1.y()))); } for(int col=currentViewportColMin; col<currentViewportColMax; col++) { createColumnHeader(col); QVector2D pos0(_colXPositions[col], _viewportY); QVector2D pos1(pos0.x() + _dataColsMaxWidth[col], pos0.y() + _dataRowsMaxHeight); if(pos0.x() > _rowNumberMaxWidth + _viewportX) _lines.push_back(std::make_pair(QVector2D(pos0.x(), pos0.y()), QVector2D(pos0.x(), pos1.y()))); if(col == _model->columnCount() - 1 && pos1.x() > _rowNumberMaxWidth + _viewportX) _lines.push_back(std::make_pair(QVector2D(pos1.x(), pos0.y()), QVector2D(pos1.x(), pos1.y()))); } createleftTopCorner(); update(); #ifdef DEBUG_VIEWPORT std::cout << "viewport X: " << _viewportX << " Y: " << _viewportY << " W: " << _viewportW << " H: " << _viewportH << std::endl << std::flush; std::cout << "_previousViewport ColMin: "<<_previousViewportColMin<<" ColMax: "<<_previousViewportColMax<<" RowMin: "<<_previousViewportRowMin<<" RowMax: "<<_previousViewportRowMax<<"\n"; std::cout << "currentViewport ColMin: "<<currentViewportColMin<<" ColMax: "<<currentViewportColMax<<" RowMin: "<<currentViewportRowMin<<" RowMax: "<<currentViewportRowMax<<"\n"<<std::flush; #endif _previousViewportColMin = currentViewportColMin; _previousViewportColMax = currentViewportColMax; _previousViewportRowMin = currentViewportRowMin; _previousViewportRowMax = currentViewportRowMax; }