• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.

Musikai

Members
  • Content count

    22
  • Joined

  • Last visited

Community Reputation

138 Neutral

About Musikai

  • Rank
    Member
  1. I never thought about the AI, thats a good point. It just seemed like it was testing the key press boolean only to store it and test it again, but yeah the AI has to know to move somehow.   Thanks frob.
  2. So im making a pong clone and i have a silly problem.   I have a Paddle class with HandleInput(), Update(), and Draw() functions. The HandleIput and Update functions look like this at the moment.   void Paddle::HandleInput( Keyboard& keyboard ) { if( keyboard.KeyIsHeld( m_upKey ) ) m_position.y -= m_moveSpeed; if( keyboard.KeyIsHeld( m_downKey ) ) m_position.y += m_moveSpeed; } void Paddle::Update( float deltaTime ) { }   The problem is that i want the position to be changed over time but at the moment the "Update" function is the one who is passed the delta time. It's a stupid problem but i can't figure out a nice way around it.   I want to avoid passing the delta time to the "HandleInput" function because it wouldn't really make sense, and also these function are actually an interface to a game object so it would mean passing it to every "HandleInput" function, whether it needed it or not. I could add a couple booleans to track whether either of the keys were pressed during "HandleInput" but that is essentially testing the same thing twice. I'm leaning towards the idea of adding a "delta position" variable to track the change in position, so the code would look something like this.   void Paddle::HandleInput( Keyboard& keyboard ) { if( keyboard.KeyIsHeld( m_upKey ) ) m_deltaY -= m_moveSpeed; if( keyboard.KeyIsHeld( m_downKey ) ) m_deltaY += m_moveSpeed; } void Paddle::Update( float deltaTime ) { m_position.y += (m_deltaY * deltaTime); m_deltaY = 0; }   What do you guys think is the best solution?
  3. Thanks Juliean. Might be a stupid question but what would an entity manager look like, and how do the states interact with it?   Maybe i'm just slow but im really struggling to get this. I'm still very much a begginer, the only game i've written is a 2d game of pong. I just want to get away from the messy switch statements i've been using for game states. It feels like this is the only thing stopping me from writing more complex games, but every time i ask a question, the answer creates ten more questions. Wish i could have a programer sit next to me so i could bore them to tears with my lack of understanding.
  4. Thanks for the help guys. So if i understand, the data should be stored in, and read from, a "Model". The state then acts as the View/Controller to alter and display the data?   So going with ppodsiadly's layout, say i have an Application state "Game" which has three substates. Would the "Game" state class act as the Model and store all the data to be accessed by each substate? Or should the Model be a seperate class entirely?
  5. So i've been trying to make a game using a state machine/state pattern and im having trouble. So I have each state in its own class being managed by a state machine class (which is inherited by any class that needs multiple states). I've read many examples and tutorials on state machines but none of them seem to explain how the states communicate and share data.   I'l give some hypothetical game situations. What if, when playing an rpg you're in the "gameplay state" and you hit "M" to change to a "map view state", the map state is giong to need to know the players position in the world. What if you're in a "menu state" and change the games difficulty, then the "gampley state" would also need to know the new difficulty setting. If you're in an "inventory state" and you equip items then the "gameplay state" would need to know so it can display these new items on the player.   I dont know where this data should be stored and how it should be shared. If anyone knows a solution i would realy appreciate it.  
  6. Thanks for the replies guys.   I tried getting the msvcr110 to static link but apparently the only way is to change the code generation options in VS, but this makes it assume all libraries will be staticly linked and conflicts with the other DLL's. It's a shame, i see over 40 people have downloaded it but only the people who happen to have Visual Studio 11.0 runtimes will be able to play it. I wonder what commercial games do, do they just include the DLL with the install? Or do they make people install the VS redistributable.   I tried to make code as readable as possible with smart variable names and such, i would try only comment where i though the code wasn't self explanatory, that and laziness.   I've seen people declaring all the variables at the start of a function before, I didn't know that was a C programing style. I didn't really like that as it means a variable can be a mile away from where it's used.
  7. Thanks for the feedback  Aliii. Strange, can i ask did it say what DLL's were missing?   I'l definately work on the things you mentioned. I spent quite a while reading about hungarian notation, i didn't want to over do it but i can see how prefixing enums, structs and classes would help redability.   As for the state machine, i'm gonna need to know how to make one eventually. This is only a simple game of pong with two screens and the switch statemant for game states is already over 230 lines long.
  8. I've just finished making a pong clone written in C++ using SFML and would really appreciate some feedback and criticism on the game logic and/or coding style. One thing i really don't like is that my game states are just big switch staments. I've read about state machines and even tried implementing one but i just couldn't figure out how everything fits together, if anyone could help me with a state machine, that would be awesome.   The executable with DLL's and audio files. [attachment=15505:Pong.rar]   Main.cpp #include <Windows.h> #include <SFML\Graphics.hpp> #include "Game.h" #include "Keyboard.h" int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nCmdShow) { sf::RenderWindow window( sf::VideoMode(900, 700), "Pong", sf::Style::Close ); window.setVerticalSyncEnabled( true ); MyGame game( window ); Keyboard keyboard; while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); else if (event.type == sf::Event::KeyPressed) keyboard.KeyDown( event.key.code ); else if (event.type == sf::Event::KeyReleased) keyboard.KeyUp( event.key.code ); } game.Update( keyboard ); keyboard.Update(); window.clear(); game.Draw(); window.display(); } return 0; }   Game.h #ifndef GAME_H #define GAME_H #include <SFML\Graphics.hpp> #include <SFML\Audio.hpp> #include "Paddle.h" #include "Ball.h" #include "Scores.h" enum ScreenState { SS_TITLE, SS_INGAME }; enum InGameState { GS_INIT, GS_ONE, GS_TWO, GS_THREE, GS_RUN, GS_PAUSED, GS_GAMEOVER }; enum MenuState { MS_YES, MS_NO }; class MyGame { public: MyGame( sf::RenderWindow& window ); void Update( Keyboard& keyboard ); void Draw(); private: void InitText(); void InitSounds(); bool TestCollision( Paddle paddle, Ball ball ); void RestartGame(); void Reset(); private: sf::RenderWindow& m_window; sf::Clock m_clock; sf::Clock m_eventClock; float m_eventTime; Paddle m_player1; Paddle m_player2; Ball m_ball; Scores m_scores; // States ScreenState m_screenState; InGameState m_inGameState; MenuState m_menuState; // Font and Text sf::Font m_sqPixFont; sf::Text txtTitle; sf::Text txtPressEnt; sf::Text txtThree; sf::Text txtTwo; sf::Text txtOne; sf::Text txtWinner; sf::Text txtPaused; sf::Text txtQuitGame; sf::Text txtPlayAgain; sf::Text txtYes; sf::Text txtNo; sf::Color m_blue; sf::Color m_yellow; sf::Color m_grey; // Sounds sf::Music m_fearOfDark; sf::SoundBuffer m_blip1Buffer; sf::Sound m_blip1; sf::SoundBuffer m_blip2Buffer; sf::Sound m_blip2; sf::SoundBuffer m_blopBuffer; sf::Sound m_blop; }; #endif   Game.cpp #include "Game.h" using std::to_string; MyGame::MyGame( sf::RenderWindow& window ) : m_window( window ), m_player1( 75.0f, window.getSize().x, window.getSize().y ), m_player2( 815.0f, window.getSize().x, window.getSize().y ), m_ball( window.getSize().x, window.getSize().y ) { m_screenState = SS_TITLE; m_inGameState = GS_INIT; m_menuState = MS_YES; m_blue = sf::Color( 0, 100, 200, 255 ); m_yellow = sf::Color( 255, 200, 0, 255 ); m_grey = sf::Color( 20, 20, 20, 255 ); InitText(); InitSounds(); m_scores.Init( m_sqPixFont, m_window ); m_fearOfDark.play(); } void MyGame::Update( Keyboard& keyboard ) { float frameTime = m_clock.getElapsedTime().asSeconds(); m_clock.restart(); m_eventTime = m_eventClock.getElapsedTime().asSeconds(); switch( m_screenState ) { case SS_TITLE: if( keyboard.KeyIsPressed( sf::Keyboard::Escape ) ) m_window.close(); if( keyboard.KeyIsPressed( sf::Keyboard::Return ) ) { m_screenState = SS_INGAME; m_fearOfDark.stop(); m_eventClock.restart(); } break; case SS_INGAME: switch( m_inGameState ) { case GS_INIT: { if( m_eventTime > 1.0f ) { m_blip1.play(); m_inGameState = GS_THREE; m_eventTime = 0; m_eventClock.restart(); } break; } case GS_THREE: { if( m_eventTime > 1.0f ) { m_blip1.play(); m_inGameState = GS_TWO; m_eventTime = 0; m_eventClock.restart(); } break; } case GS_TWO: { if( m_eventTime > 1.0f ) { m_blip1.play(); m_inGameState = GS_ONE; m_eventTime = 0; m_eventClock.restart(); } break; } case GS_ONE: { if( m_eventTime > 1.0f ) { m_blip2.play(); m_inGameState = GS_RUN; m_eventTime = 0; m_eventClock.restart(); } break; } case GS_RUN: { if( m_scores.Winner() ) { m_inGameState = GS_GAMEOVER; break; } if( keyboard.KeyIsPressed( sf::Keyboard::Escape ) || keyboard.KeyIsPressed( sf::Keyboard::P ) ) m_inGameState = GS_PAUSED; // Player one controls if( keyboard.KeyIsHeld( sf::Keyboard::W ) ) m_player1.MoveUp( frameTime ); if( keyboard.KeyIsHeld( sf::Keyboard::S ) ) m_player1.MoveDown( frameTime ); // Player two controls if( keyboard.KeyIsHeld( sf::Keyboard::Up ) ) m_player2.MoveUp( frameTime ); if( keyboard.KeyIsHeld( sf::Keyboard::Down ) ) m_player2.MoveDown( frameTime ); // World collision if( m_ball.GetPosition().x < 0 ) { m_ball.SetXPosition( 0 ); if( m_ball.GetSpeed().x < 0 ) { m_ball.BounceX(); m_ball.IncreaseSpeed(); m_scores.Player2Scored(); } } if( m_ball.GetPosition().x + m_ball.GetSize().x >= m_window.getSize().x ) { m_ball.SetXPosition( m_window.getSize().x - m_ball.GetSize().x ); if( m_ball.GetSpeed().x > 0 ) { m_ball.BounceX(); m_ball.IncreaseSpeed(); m_scores.Player1Scored(); } } if( m_ball.GetPosition().y < 0 ) { m_ball.SetYPosition( 0 ); if( m_ball.GetSpeed().y < 0 ) { m_ball.BounceY(); } } if( m_ball.GetPosition().y + m_ball.GetSize().y >= m_window.getSize().y ) { m_ball.SetYPosition( m_window.getSize().y - m_ball.GetSize().y ); if( m_ball.GetSpeed().y > 0 ) { m_ball.BounceY(); } } // Paddle collision if( TestCollision( m_player1, m_ball ) ) { if( m_ball.GetSpeed().x < 0 ) { m_blop.play(); m_ball.BouncePaddle( m_player1 ); m_ball.IncreaseSpeed(); } } if( TestCollision( m_player2, m_ball ) ) { if( m_ball.GetSpeed().x > 0 ) { m_blop.play(); m_ball.BouncePaddle( m_player2 ); m_ball.IncreaseSpeed(); } } m_player1.Update(); m_player2.Update(); m_ball.Update( frameTime ); m_scores.Update(); break; } case GS_PAUSED: { if( keyboard.KeyIsPressed( sf::Keyboard::Escape ) || keyboard.KeyIsPressed( sf::Keyboard::P ) ) m_inGameState = GS_RUN; if( keyboard.KeyIsPressed( sf::Keyboard::Left ) || keyboard.KeyIsPressed( sf::Keyboard::A ) ) m_menuState = MS_YES; if( keyboard.KeyIsPressed( sf::Keyboard::Right ) || keyboard.KeyIsPressed( sf::Keyboard::D ) ) m_menuState = MS_NO; if( keyboard.KeyIsPressed( sf::Keyboard::Return ) ) { if( m_menuState == MS_YES ) Reset(); else m_inGameState = GS_RUN; } if( m_menuState == MS_YES ) { txtYes.setColor( m_blue ); txtNo.setColor( m_grey ); } else if( m_menuState == MS_NO ) { txtYes.setColor( m_grey ); txtNo.setColor( m_blue ); } break; } case GS_GAMEOVER: { if( keyboard.KeyIsPressed( sf::Keyboard::Left ) || keyboard.KeyIsPressed( sf::Keyboard::A ) ) m_menuState = MS_YES; if( keyboard.KeyIsPressed( sf::Keyboard::Right ) || keyboard.KeyIsPressed( sf::Keyboard::D ) ) m_menuState = MS_NO; if( keyboard.KeyIsPressed( sf::Keyboard::Return ) ) { if( m_menuState == MS_YES ) RestartGame(); if( m_menuState == MS_NO ) Reset(); } if( m_menuState == MS_YES ) { txtYes.setColor( m_blue ); txtNo.setColor( m_grey ); } else if( m_menuState == MS_NO ) { txtYes.setColor( m_grey ); txtNo.setColor( m_blue ); } break; } } break; } } void MyGame::Draw() { m_eventTime = m_eventClock.getElapsedTime().asSeconds(); switch( m_screenState ) { case SS_TITLE: m_window.draw( txtTitle ); if( m_eventTime < 0.5f ) m_window.draw( txtPressEnt ); else if( m_eventTime > 1.0f ) m_eventClock.restart(); break; case SS_INGAME: { switch( m_inGameState ) { case GS_INIT: break; case GS_THREE: m_window.draw( txtThree ); break; case GS_TWO: m_window.draw( txtTwo ); break; case GS_ONE: m_window.draw( txtOne ); break; case GS_RUN: break; case GS_PAUSED: m_window.draw( txtPaused ); m_window.draw( txtQuitGame ); m_window.draw( txtYes ); m_window.draw( txtNo ); break; case GS_GAMEOVER: m_window.draw( txtWinner ); m_window.draw( txtPlayAgain ); m_window.draw( txtYes ); m_window.draw( txtNo ); break; } m_scores.Draw( m_window ); m_player1.Draw( m_window ); m_player2.Draw( m_window ); m_ball.Draw( m_window ); break; } } } void MyGame::InitText() { int centerX = m_window.getSize().x / 2; int centerY = m_window.getSize().y / 2; m_sqPixFont.loadFromFile( "squarePixel7.ttf" ); txtTitle = sf::Text( "PONG", m_sqPixFont, 100); txtTitle.setColor( m_blue ); txtTitle.setPosition( centerX - (txtTitle.getLocalBounds().width / 2), 100.0f ); txtPressEnt = sf::Text( "Press Enter", m_sqPixFont, 30 ); txtPressEnt.setColor( m_blue ); txtPressEnt.setPosition( centerX - (txtPressEnt.getLocalBounds().width / 2), 500 ); txtOne = sf::Text( "1", m_sqPixFont, 100 ); txtOne.setColor( m_blue ); txtOne.setPosition( centerX - (txtOne.getLocalBounds().width / 2) - 5, 400 ); txtTwo = sf::Text( "2", m_sqPixFont, 100 ); txtTwo.setColor( m_blue ); txtTwo.setPosition( centerX - (txtTwo.getLocalBounds().width / 2), 400 ); txtThree = sf::Text( "3", m_sqPixFont, 100 ); txtThree.setColor( m_blue ); txtThree.setPosition( centerX - (txtThree.getLocalBounds().width / 2), 400 ); txtWinner = sf::Text( "Winner", m_sqPixFont, 100 ); txtWinner.setColor( m_yellow ); txtWinner.setPosition( centerX - (txtWinner.getLocalBounds().width / 2), 100 ); txtPaused = sf::Text( "Paused", m_sqPixFont, 100 ); txtPaused.setColor( m_blue ); txtPaused.setPosition( centerX - (txtPaused.getLocalBounds().width / 2), 100 ); txtQuitGame = sf::Text( "Quit game?", m_sqPixFont, 30 ); txtQuitGame.setColor( m_blue ); txtQuitGame.setPosition( centerX - (txtQuitGame.getLocalBounds().width / 2), 450 ); txtPlayAgain = sf::Text( "Play Again?", m_sqPixFont, 30 ); txtPlayAgain.setColor( m_blue ); txtPlayAgain.setPosition( centerX - (txtPlayAgain.getLocalBounds().width / 2), 450 ); txtYes = sf::Text( "Yes", m_sqPixFont, 30 ); txtYes.setColor( m_grey ); txtYes.setPosition( centerX - txtYes.getLocalBounds().width - 50, 510); txtNo = sf::Text( "No", m_sqPixFont, 30 ); txtNo.setColor( m_grey ); txtNo.setPosition( centerX + 50, 510); } void MyGame::InitSounds() { m_fearOfDark.openFromFile( "fearofdark.wav" ); m_blip1Buffer.loadFromFile( "Blip1.wav" ); m_blip1.setBuffer( m_blip1Buffer ); m_blip2Buffer.loadFromFile( "Blip2.wav" ); m_blip2.setBuffer( m_blip2Buffer ); m_blopBuffer.loadFromFile( "Blop.wav" ); m_blop.setBuffer( m_blopBuffer ); } bool MyGame::TestCollision( Paddle paddle, Ball ball ) { float padX = paddle.GetPosition().x; float padY = paddle.GetPosition().y; float padW = paddle.GetSize().x; float padH = paddle.GetSize().y; float ballX = ball.GetPosition().x; float ballY = ball.GetPosition().y; float ballW = ball.GetSize().x; float ballH = ball.GetSize().y; if( padX + padW < ballX || ballX + ballW < padX ) return false; if( padY + padH < ballY || ballY + ballH < padY ) return false; return true; } void MyGame::RestartGame() { m_inGameState = GS_INIT; m_menuState = MS_YES; m_clock.restart(); m_eventClock.restart(); m_player1.Reset(); m_player2.Reset(); m_ball.Reset(); m_scores.Reset(); } void MyGame::Reset() { m_screenState = SS_TITLE; RestartGame(); }   Paddle.h #ifndef PADDLE_H #define PADDLE_H #include <SFML\Graphics.hpp> class Paddle { public: Paddle(); Paddle( float posX, int screenHeight, int screenWidth ); void Update(); void Draw( sf::RenderWindow& window ); void MoveUp( float frameTime ); void MoveDown( float frameTime ); void Reset(); sf::Vector2f GetPosition(); sf::Vector2f GetSize(); private: int m_screenWidth, m_screenHeight; sf::RectangleShape m_rectangle; sf::Vector2f m_position; int m_width, m_height; float m_moveSpeed; // Stored variables for reset. float m_initX, m_initY; }; #endif   Paddle.cpp #include "Paddle.h" #include "Keyboard.h" Paddle::Paddle() {} Paddle::Paddle( float posX, int screenWidth, int screenHeight ) : m_screenWidth( screenWidth ), m_screenHeight( screenHeight ), m_width( 15 ), m_height( 100 ), m_moveSpeed( 500 ) { m_initX = m_position.x = posX; m_initY = m_position.y = ((float)screenHeight / 2.0f) - ((float)m_height / 2.0f); m_rectangle = sf::RectangleShape( sf::Vector2f( (float)m_width, (float)m_height ) ); m_rectangle.setPosition( m_position.x, m_position.y ); m_rectangle.setFillColor( sf::Color( 0, 100, 200, 255 ) ); } void Paddle::Update() { // Clamp to screen if( m_position.y < 0 ) m_position.y = 0; if( m_position.y + m_height >= m_screenHeight ) m_position.y = (float)m_screenHeight - (float)m_height; m_rectangle.setPosition( m_position.x, m_position.y ); } void Paddle::Draw( sf::RenderWindow& window ) { window.draw( m_rectangle ); } void Paddle::MoveUp( float frameTime ) { m_position.y -= m_moveSpeed * frameTime; } void Paddle::MoveDown( float frameTime ) { m_position.y += m_moveSpeed * frameTime; } sf::Vector2f Paddle::GetPosition() { return m_position; } sf::Vector2f Paddle::GetSize() { sf::Vector2f size; size.x = (float)m_width; size.y = (float)m_height; return size; } void Paddle::Reset() { m_position.x = m_initX; m_position.y = m_initY; m_rectangle.setPosition( m_position.x, m_position.y ); }   Ball.h #ifndef BALL_H #define BALL_H #include <SFML\Graphics.hpp> #include <SFML\Audio.hpp> #include "Paddle.h" class Ball { public: Ball( int screenWidth, int screenHeight ); void Update( float frameTime ); void Draw( sf::RenderWindow& window ); void BounceX(); void BounceY(); void BouncePaddle( Paddle paddle ); void SetXPosition( float x ); void SetYPosition( float y ); void IncreaseSpeed(); void Reset(); sf::Vector2f GetPosition(); sf::Vector2f GetSize(); sf::Vector2f GetSpeed(); private: sf::RectangleShape m_rectangle; sf::Vector2f m_position; int m_width, m_height; float m_speedX, m_speedY, m_maxYSpeed; // Store variables for reset float m_initX, m_initY; float m_initYspeed; }; #endif   Ball.cpp #include "Ball.h" #include <random> #include <time.h> Ball::Ball( int screenWidth, int screenHeight ) : m_maxYSpeed( 650 ), m_initYspeed( 650 ) { // Randomize the initial direction. srand( (unsigned int)time(NULL) ); int xDirection = rand() % 2; if( xDirection == 0 ) xDirection = -1; m_speedX = xDirection * 600; m_speedY = 0; m_width = m_height = 10; m_initX = m_position.x = (screenWidth / 2) - (m_width / 2); m_initY = m_position.y = (screenHeight / 2) - (m_height / 2); m_rectangle = sf::RectangleShape( sf::Vector2f( (float)m_width, (float)m_height ) ); m_rectangle.setPosition( m_position.x, m_position.y ); m_rectangle.setFillColor( sf::Color( 0, 100, 200, 255 ) ); } void Ball::Update( float frameTime ) { m_position.x += m_speedX * frameTime; m_position.y += m_speedY * frameTime; m_rectangle.setPosition( m_position.x, m_position.y ); } void Ball::Draw( sf::RenderWindow& window ) { window.draw( m_rectangle ); } sf::Vector2f Ball::GetPosition() { return m_position; } sf::Vector2f Ball::GetSize() { sf::Vector2f size; size.x = (float)m_width; size.y = (float)m_height; return size; } sf::Vector2f Ball::GetSpeed() { sf::Vector2f speed; speed.x = m_speedX; speed.y = m_speedY; return speed; } void Ball::BounceX() { m_speedX *= -1; } void Ball::BounceY() { m_speedY *= -1; } void Ball::BouncePaddle( Paddle paddle ) { BounceX(); float paddleY = paddle.GetPosition().y + (paddle.GetSize().y / 2.0f); float ballY = m_position.y + (m_height / 2.0f); m_speedY = (ballY - paddleY) / (paddle.GetSize().y / 2.0f) * m_maxYSpeed; } void Ball::SetXPosition( float x ) { m_position.x = x; } void Ball::SetYPosition( float y ) { m_position.y = y; } void Ball::IncreaseSpeed() { if( m_speedX < 0 ) m_speedX -= 1; if( m_speedX > 0 ) m_speedX += 1; m_maxYSpeed += 1; } void Ball::Reset() { m_position.x = m_initX; m_position.y = m_initY; m_maxYSpeed = m_initYspeed; m_rectangle.setPosition( m_position.x, m_position.y ); int xDirection = rand() % 2; if( xDirection == 0 ) xDirection = -1; m_speedX = xDirection * 500; m_speedY = 0; }   Scores.h #ifndef SCORES_H #define SCORES_H #include <SFML\Graphics.hpp> class Scores { public: Scores(); void Init( sf::Font& font, sf::RenderWindow& window ); void Update(); void Draw( sf::RenderWindow& window ); void Player1Scored(); void Player2Scored(); void SetMaxScore( int maxScore ); bool Winner(); void Reset(); private: int m_player1Score, m_player2Score, m_maxScore; sf::Text m_txtScore1, m_txtScore2; sf::Color m_grey; sf::Color m_yellow; bool m_winner; }; #endif   Scores.cpp #include "Scores.h" Scores::Scores() {} void Scores::Init( sf::Font& font, sf::RenderWindow& window ) { m_yellow = sf::Color( 255, 200, 0, 255 ); m_grey = sf::Color( 20, 20, 20, 255 ); m_player1Score = 0; m_player2Score = 0; m_maxScore = 10; m_winner = false; int centerY = window.getSize().y / 2; m_txtScore1 = sf::Text( "00", font, 100 ); m_txtScore1.setColor( m_grey ); m_txtScore1.setPosition( 350 - m_txtScore1.getLocalBounds().width, centerY - (m_txtScore1.getLocalBounds().height / 2) - m_txtScore1.getLocalBounds().top ); m_txtScore2 = sf::Text( "00", font, 100 ); m_txtScore2.setColor( m_grey ); m_txtScore2.setPosition( 550, centerY - (m_txtScore2.getLocalBounds().height / 2) - m_txtScore2.getLocalBounds().top ); } void Scores::Update() { if( m_player1Score >= m_maxScore ) { m_player1Score = m_maxScore; m_txtScore1.setColor( m_yellow ); m_winner = true; } if( m_player2Score >= m_maxScore ) { m_player2Score = m_maxScore; m_txtScore2.setColor( m_yellow ); m_winner = true; } std::string score1 = std::to_string( (_Longlong)m_player1Score ); if( m_player1Score < 10 ) score1 = std::string( "0" ).append( score1 ); m_txtScore1.setString( score1 ); std::string score2 = std::to_string( (_Longlong)m_player2Score ); if( m_player2Score < 10 ) score2 = std::string( "0" ).append( score2 ); m_txtScore2.setString( score2 ); } void Scores::Draw( sf::RenderWindow& window ) { window.draw( m_txtScore1 ); window.draw( m_txtScore2 ); } void Scores::Player1Scored() { m_player1Score += 1; } void Scores::Player2Scored() { m_player2Score += 1; } void Scores::SetMaxScore( int maxScore ) { m_maxScore = maxScore; } bool Scores::Winner() { return m_winner; } void Scores::Reset() { m_player1Score = 0; m_player2Score = 0; m_winner = false; m_txtScore1.setColor( m_grey ); m_txtScore1.setString( "00" ); m_txtScore2.setColor( m_grey ); m_txtScore2.setString( "00" ); }    
  9.   Partly i just wanted to try a different language, and partly so I could get straight to pogramming game logic without having to deal with lower level stuff. I read about Pygame and thought i'd give it a shot, its great for knocking out simple games quickly and trying ideas. The only thing is i much prefer C++, i've started using SFML which is in the same vein.
  10. I first learned C++, i'd be lying if i said it was a cake walk, but it's not impossibe. I then learned Python and after months of using C++ i was amazed at how simple Python is in comparison. Sure it's not as powerful or as fast, but who the hell needs speed and power when you first start programming.
  11. I personally find inline braces really hard to read when there's more than a few lines of code. I'ts much easier to identify code blocks when the braces match virtically.
  12. Thanks guys, that tool kit sounds good.
  13. Yes i know, but it is not included in the latest Windows SDK, and is not supported for Windows apps should i ever want to make one. So i'd like to know how to load a texture without it.
  14. I'm trying to learn texture mapping but every tutorial or sample i've seen uses D3DX functions like D3D11XCreateResourceViewFromFile();. Since D3DX is now depricated, how do i load a texture?