Skip to content

Mouse Controls

noooway edited this page Mar 26, 2017 · 26 revisions

In this part I want to implement mouse controls for the game: the platform follows the mouse cursor, left click launches the ball, and right click - pauses the game.

In general, to make the platform follow the mouse it is necessary to read the cursor position and then move the platform towards it. The first problem with the mouse controls is that it conflicts with the keyboard: it is going to be confusing if the platform follows the cursor and reacts on arrow keys simultaneously. As a compromise, it is possible to retain the keyboard controls when the cursor is outside of the game window and use the mouse controls when it is inside. LÖVE doesn't provide any built-in ways to make such a check, but it should be possible to implement it using functions from the love.window that return window size and position. However, instead of messing with it, I drop the keyboard controls entirely.

function platform.update( dt )
   platform.follow_mouse( dt )
end

The platform can move towards the cursor with a fixed speed (as was the case with the keyboard controls), or it can be repositioned under the cursor immediately. I don't like the delay between the cursor and the platform trying to catch up with it, so I use the second variant. It allows cheating: pause the game, position the cursor, continue. I just ignore it.

function platform.follow_mouse( dt )
   local x, y = love.mouse.getPosition()
   .....
      platform.position.x = x - platform.width / 2
   .....
end

The platform will follow the cursor even outside of the area with the bricks, i.e. on a side panel beyond the right wall. It is necessary to correct this situation. When the cursor is outside of the bricks area, the platform should be positioned to touch the walls without overlapping them.

function platform.follow_mouse( dt )
   local x, y = love.mouse.getPosition()
   local left_wall_plus_half_platform = 34 + platform.width / 2
   local right_wall_minus_half_platform = 576 - platform.width / 2
   if ( x > left_wall_plus_half_platform and
        x < right_wall_minus_half_platform ) then
      platform.position.x = x - platform.width / 2
   elseif x < left_wall_plus_half_platform then
      platform.position.x =
         left_wall_plus_half_platform - platform.width / 2
   elseif x > right_wall_minus_half_platform then
      platform.position.x =
         right_wall_minus_half_platform - platform.width / 2
   end
end

To launch the ball on a mouse press, it is necessary to define an appropriate callback. The function to launch the ball ball.launch_from_platform is the same as for the keyboard controls.

function game.mousereleased( x, y, button, istouch )
   if button == 'l' or button == 1 then
      ball.launch_from_platform()
   elseif 
      .....
   end
end

It is also necessary to register the mousereleased callback in the "gamestates" module.

function love.mousereleased( x, y, button, istouch )
   gamestates.state_event( "mousereleased", x, y, button, istouch )
end

Finally, the game is paused on the right mouse click.

function game.mousereleased( x, y, button, istouch )
   if button == 'l' or button == 1 then
      ball.launch_from_platform()
   elseif button == 'r' or button == 2 then
      music:pause()
      gamestates.set_state(
         "gamepaused",
         { ball, platform, bricks, walls, lives_display } )
   end
end

In the "gamepaused" state the left click resumes the game, and the right terminates it.

function gamepaused.mousereleased( x, y, button, istouch )
   if button == 'l' or button == 1 then
      gamestates.set_state( "game" )
   elseif button == 'r' or button == 2 then
      love.event.quit()
   end   
end

In the "menu" and "gamefinished" the reaction on the mouse keys is similar.

    Home
    Acknowledgements
    Todo

Chapter 1: Prototype

  1. The Ball, The Brick, The Platform
  2. Game Objects as Lua Tables
  3. Bricks and Walls
  4. Detecting Collisions
  5. Resolving Collisions
  6. Levels

    Appendix A: Storing Levels as Strings
    Appendix B: Optimized Collision Detection (draft)

Chapter 2: General Code Structure

  1. Splitting Code into Several Files
  2. Loading Levels from Files
  3. Straightforward Gamestates
  4. Advanced Gamestates
  5. Basic Tiles
  6. Different Brick Types
  7. Basic Sound
  8. Game Over

    Appendix C: Stricter Modules (draft)
    Appendix D-1: Intro to Classes (draft)
    Appendix D-2: Chapter 2 Using Classes.

Chapter 3 (deprecated): Details

  1. Improved Ball Rebounds
  2. Ball Launch From Platform (Two Objects Moving Together)
  3. Mouse Controls
  4. Spawning Bonuses
  5. Bonus Effects
  6. Glue Bonus
  7. Add New Ball Bonus
  8. Life and Next Level Bonuses
  9. Random Bonuses
  10. Menu Buttons
  11. Wall Tiles
  12. Side Panel
  13. Score
  14. Fonts
  15. More Sounds
  16. Final Screen
  17. Packaging

    Appendix D: GUI Layouts
    Appendix E: Love-release and Love.js

Beyond Programming:

  1. Game Design
  2. Minimal Marketing (draft)
  3. Finding a Team (draft)

Archive

Clone this wiki locally