void checkBounds(struct circle* Ball, struct world* World) { // Right wall if(rightBound(Ball) >= World->width) { Ball->xPos = World->width - 2*Ball->radius - 1; Ball->xVel *= -1; } // Left wall if (leftBound(Ball) <= 0) { Ball->xPos += 1; Ball->xVel *= -1; } // Floor if(bottomBound(Ball) <= 0) { Ball->yPos += 1; Ball->yVel *= -1; } // Ceiling if(topBound(Ball) >= World->height) { Ball->yPos = World->height - 2*Ball->radius - 1; Ball->yVel *= -1; } }
FB::JSOutObject KeyRange::leftBound(FB::variant bound, const FB::CatchAll& args) { const FB::VariantList& values = args.value; if(values.size() > 1) throw FB::invalid_arguments(); else if(values.size() == 1 && !values[0].is_of_type<bool>()) throw FB::invalid_arguments(); bool open = values.size() == 1 ? values[0].cast<bool>() : false; return static_cast<FB::JSOutObject>(leftBound(bound, open)); }
int main(char* args) { // TODO: Check the resolution of the world in pixels //struct circle* ball_func = createBall(); //printf("Ball position: %d %d", ball_func->xPos, ball_func->yPos); struct circle* ball = malloc(sizeof (struct circle)); struct world* World = malloc(sizeof (struct world)); // Initial position and velocity of the ball. ball->xPos = 560; ball->yPos = 340; ball->xVel = 6; ball->yVel = 9; ball->radius = 10; World->width = 600; World->height = 400; printf("Ball position: %d %d\n", ball->xPos, ball->yPos); printf("World dimensions: %d %d\n", World->width, World->height); printf("Ball right: %d\n", rightBound(ball)); printf("Ball left: %d\n", leftBound(ball)); printf("Ball top: %d\n", topBound(ball)); printf("Ball bottom: %d\n", bottomBound(ball)); int i=0; for (i=0; i<10000; ++i) { updatePosition(ball, World); printf("Ball position: %d %d\n", ball->xPos, ball->yPos); } return 0; }
int main() { std::srand(static_cast<unsigned int>(std::time(NULL))); // Define some constants const float pi = 3.14159f; const int gameWidth = 800; const int gameHeight = 600; sf::Vector2f paddleSize(25, 100); float ballRadius = 10.f; bool easyMode = true; bool hardMode = false; // create the window sf::RenderWindow window(sf::VideoMode(gameWidth, gameHeight), "Dizzy Pong"); // set a view sf::View view = window.getDefaultView(); view.zoom(2.f); window.setView(view); float rVal = 0.005; // Load the sounds used in the game sf::SoundBuffer ballSoundBuffer; if (!ballSoundBuffer.loadFromFile("resources/ball.wav")) return EXIT_FAILURE; sf::Sound ballSound(ballSoundBuffer); sf::SoundBuffer outSoundBuffer; if (!outSoundBuffer.loadFromFile("resources/boxing_bell.wav")) return EXIT_FAILURE; sf::Sound outSound(outSoundBuffer); // set up text sf::Text text; int textXpos = 0; int textYpos = 0; int textSize = 44; sf::Color textColor = sf::Color::White; sf::Font font; if (!font.loadFromFile("resources/sansation.ttf")) return EXIT_FAILURE; text.setFont(font); text.setString("Hello!"); text.setCharacterSize(textSize); text.setColor(textColor); text.setPosition(textXpos, textYpos); sf::Text pauseMessage; pauseMessage.setFont(font); pauseMessage.setString("Welcome to SFML pong!\nPress space to start the game"); pauseMessage.setCharacterSize(textSize); pauseMessage.setColor(textColor); pauseMessage.setPosition(170.f, 150.f); sf::Text toggleInstruct; toggleInstruct.setFont(font); toggleInstruct.setString("Press h to toggle hard mode"); toggleInstruct.setCharacterSize(textSize*.8); toggleInstruct.setColor(textColor); toggleInstruct.setPosition(gameWidth / 3, gameHeight - 50); sf::Text playerScore; int pScore = 0; playerScore.setFont(font); playerScore.setString(std::to_string(pScore)); playerScore.setCharacterSize(textSize); playerScore.setColor(textColor); playerScore.setPosition(170.f, 150.f); sf::Text compScore; int cScore = 0; compScore.setFont(font); compScore.setString(std::to_string(cScore)); compScore.setCharacterSize(textSize); compScore.setColor(textColor); compScore.setPosition(370.f, 150.f); //set up visual boundaries sf::Vector2f boundSize(gameWidth, gameHeight); sf::RectangleShape boundary(boundSize); boundary.setFillColor(sf::Color::Black); boundary.setOutlineColor(sf::Color::White); boundary.setOutlineThickness(10); sf::Color boundColor; if (easyMode) boundColor = sf::Color::Red; else boundColor = sf::Color::Black; sf::RectangleShape leftBound(sf::Vector2f(15, gameHeight)); leftBound.setPosition(sf::Vector2f(-15, 0)); leftBound.setFillColor(boundColor); sf::RectangleShape rightBound(sf::Vector2f(15, gameHeight)); rightBound.setPosition(gameWidth, 0); rightBound.setFillColor(boundColor); //set up left paddle sf::Vector2f paddlePosL(10 + paddleSize.x / 2, gameHeight / 2); Paddle leftPaddle = Paddle::Paddle(paddleSize, sf::Color::White, paddlePosL); //set up right paddle sf::Vector2f paddlePosR((gameWidth-10)-paddleSize.x/2, gameHeight / 2); Paddle rightPaddle = Paddle::Paddle(paddleSize, sf::Color::White, paddlePosR); //set up ball Ball ball = Ball::Ball(ballRadius); // Define the paddles properties sf::Clock AITimer; const sf::Time AITime = sf::seconds(0.1f); const float paddleSpeed = 400.f; float rightPaddleSpeed = 0.f; const float ballSpeed = 400.f; float ballAngle = 0.f; // to be changed later sf::Clock clock; bool isPlaying = false; bool newRound = true; // run the program as long as the window is open while (window.isOpen()) { // check all the window's events that were triggered since the last iteration of the loop sf::Event event; while (window.pollEvent(event)) { // Window closed or escape key pressed: exit if ((event.type == sf::Event::Closed) || ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))) { window.close(); break; } // h key pressed: toggle hardMode if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::H)) { hardMode = !hardMode; if (hardMode) boundColor = sf::Color::Black; else if (!hardMode) boundColor = sf::Color::Red; leftBound.setFillColor(boundColor); rightBound.setFillColor(boundColor); } // Space key pressed: play if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space)) { if (!isPlaying) { // (re)start the game isPlaying = true; clock.restart(); // Reset the position of the paddles and ball leftPaddle.paddle.setPosition(10 + paddleSize.x / 2, gameHeight / 2); rightPaddle.paddle.setPosition(gameWidth - 10 - paddleSize.x / 2, gameHeight / 2); ball.ball.setPosition(gameWidth / 2, gameHeight / 2); // Reset the ball angle do { // Make sure the ball initial angle is not too much vertical ballAngle = (std::rand() % 360) * 2 * pi / 360; } while (std::abs(std::cos(ballAngle)) < 0.7f); } } } if (isPlaying) { float deltaTime = clock.restart().asSeconds(); if (newRound){ // Reset the position of the paddles and ball leftPaddle.paddle.setPosition(10 + paddleSize.x / 2, gameHeight / 2); rightPaddle.paddle.setPosition(gameWidth - 10 - paddleSize.x / 2, gameHeight / 2); ball.ball.setPosition(gameWidth / 2, gameHeight / 2); // Reset the ball angle do { // Make sure the ball initial angle is not too much vertical ballAngle = (std::rand() % 360) * 2 * pi / 360; } while (std::abs(std::cos(ballAngle)) < 0.7f); newRound = false; } // Move the player's paddle if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up) && (leftPaddle.paddle.getPosition().y - paddleSize.y / 2 > 5.f)) { leftPaddle.paddle.move(0.f, -paddleSpeed * deltaTime); } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down) && (leftPaddle.paddle.getPosition().y + paddleSize.y / 2 < gameHeight - 5.f)) { leftPaddle.paddle.move(0.f, paddleSpeed * deltaTime); } // Move the computer's paddle if (((rightPaddleSpeed < 0.f) && (rightPaddle.paddle.getPosition().y - paddleSize.y / 2 > 5.f)) || ((rightPaddleSpeed > 0.f) && (rightPaddle.paddle.getPosition().y + paddleSize.y / 2 < gameHeight - 5.f))) { rightPaddle.paddle.move(0.f, rightPaddleSpeed * deltaTime); } // Update the computer's paddle direction according to the ball position if (AITimer.getElapsedTime() > AITime) { AITimer.restart(); if (ball.ball.getPosition().y + ballRadius > rightPaddle.paddle.getPosition().y + paddleSize.y / 2) rightPaddleSpeed = paddleSpeed; else if (ball.ball.getPosition().y - ballRadius < rightPaddle.paddle.getPosition().y - paddleSize.y / 2) rightPaddleSpeed = -paddleSpeed; else rightPaddleSpeed = 0.f; } // Move the ball float factor = ballSpeed * deltaTime; ball.ball.move(std::cos(ballAngle) * factor, std::sin(ballAngle) * factor); // Check collisions between the ball and the screen //offscreen, play out sound if (ball.ball.getPosition().x - ballRadius < 0.f) { outSound.play(); if (cScore >= 3) { isPlaying = false; pauseMessage.setString("You lost!\nPress space to restart or\nescape to exit"); cScore = 0; pScore = 0; compScore.setString(std::to_string(cScore)); playerScore.setString(std::to_string(pScore)); newRound = true; rVal = 0; } else{ cScore = cScore + 1; compScore.setString(std::to_string(cScore)); newRound = true; if (!hardMode) rVal = 0; //pauseMessage.setString("You lost!\nPress space to restart or\nescape to exit"); } } if (ball.ball.getPosition().x + ballRadius > gameWidth) { outSound.play(); if (pScore >= 3) { isPlaying = false; pauseMessage.setString("You won!\nPress space to restart or\nescape to exit"); pScore = 0; cScore = 0; compScore.setString(std::to_string(cScore)); playerScore.setString(std::to_string(pScore)); newRound = true; rVal = 0; } else{ pScore++; playerScore.setString(std::to_string(pScore)); newRound = false; if (!hardMode) rVal = 0; //pauseMessage.setString("You won!\nPress space to restart or\nescape to exit"); } } //collisions with walls, play bounce sound if (ball.ball.getPosition().y - ballRadius < 0.f) { ballSound.play(); ballAngle = -ballAngle; ball.ball.setPosition(ball.ball.getPosition().x, ballRadius + 0.1f); } if (ball.ball.getPosition().y + ballRadius > gameHeight) { ballSound.play(); ballAngle = -ballAngle; ball.ball.setPosition(ball.ball.getPosition().x, gameHeight - ballRadius - 0.1f); } // Check the collisions between the ball and the paddles // Left Paddle if (ball.ball.getPosition().x - ballRadius < leftPaddle.paddle.getPosition().x + paddleSize.x / 2 && ball.ball.getPosition().x - ballRadius > leftPaddle.paddle.getPosition().x && ball.ball.getPosition().y + ballRadius >= leftPaddle.paddle.getPosition().y - paddleSize.y / 2 && ball.ball.getPosition().y - ballRadius <= leftPaddle.paddle.getPosition().y + paddleSize.y / 2) { if (ball.ball.getPosition().y > leftPaddle.paddle.getPosition().y) ballAngle = pi - ballAngle + (std::rand() % 20) * pi / 180; else ballAngle = pi - ballAngle - (std::rand() % 20) * pi / 180; ballSound.play(); ball.ball.setPosition(leftPaddle.paddle.getPosition().x + ballRadius + paddleSize.x / 2 + 0.1f, ball.ball.getPosition().y); if (!hardMode) rVal += .003; } // Right Paddle if (ball.ball.getPosition().x + ballRadius > rightPaddle.paddle.getPosition().x - paddleSize.x / 2 && ball.ball.getPosition().x + ballRadius < rightPaddle.paddle.getPosition().x && ball.ball.getPosition().y + ballRadius >= rightPaddle.paddle.getPosition().y - paddleSize.y / 2 && ball.ball.getPosition().y - ballRadius <= rightPaddle.paddle.getPosition().y + paddleSize.y / 2) { if (ball.ball.getPosition().y > rightPaddle.paddle.getPosition().y) ballAngle = pi - ballAngle + (std::rand() % 20) * pi / 180; else ballAngle = pi - ballAngle - (std::rand() % 20) * pi / 180; ballSound.play(); ball.ball.setPosition(rightPaddle.paddle.getPosition().x - ballRadius - paddleSize.x / 2 - 0.1f, ball.ball.getPosition().y); if (!hardMode) rVal += .003; } } // clear the window with black color window.clear(sf::Color::Black); // draw boundaries window.draw(boundary); window.draw(leftBound); window.draw(rightBound); if (isPlaying) { //roatate the view if (hardMode) rVal += 0.000001; view.rotate(rVal); window.setView(view); // Draw the paddles, score, and the ball window.draw(leftPaddle.paddle); window.draw(rightPaddle.paddle); window.draw(playerScore); window.draw(compScore); window.draw(ball.ball); } else { // Draw the pause message if (newRound){ view.setRotation(0); window.setView(view); window.draw(pauseMessage); window.draw(toggleInstruct); } } // end the current frame window.display(); } return 0; }
static ResultType convert(const ScalarType &v){ return static_cast<ResultType>((leftBound(v)+rightBound(v)))/ResultType(2.0); }