Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

A Splash Screen

edited July 2012 in General Posts: 266

I created a program but all I had was the game itself. So I browse through @Reefwing's tutorials and find a guide for creating the splash screen. I created it and after it's done it goes to the easy button menu. What kind of kind would I use to tell codea to start the game once I press the easy button. Right now it's starting in the background because I hear the sounds (no visuals). Sorry if this is a noob question, but I'm really stuck on it. I will post my code if anyone asks to see it in order to help me. Thanks guys! This is a really great community

Comments

  • Posts: 563

    Hi @veeeralp - the secret is to use a state machine, have a look at Tutorial 5. In the action method for your button (the one that gets called when the button is tapped), change your gameState variable to the run program state. Then in your draw() method check what state you are in and draw the appropriate screen. The MineSweeper game in Tutorial 6 uses this exact technique. You can download the code for the Main class at https://www.dropbox.com/sh/dtvpqnsvltsqq7c/PnhlMtRnUI/Main.lua

    Let me know if you have any further questions.

  • Posts: 266

    Ok, I'll read through it later because I'm busy today. I'll let you know if I have any questions. Thanks

  • Posts: 266

    I took you whole minesweeper game and took out the code and classes that I didn't need. I noticed that for the button action for the easy, medium, or hard it was function() easyButtonPressed(). Following what you said would I change it gameState == stateRun. So the final code would be. easyButton.action = gameState == stateRun. I'm not too sure

  • edited July 2012 Posts: 563

    Hi @veeralp,

    You dont need to change that bit, the only bit you need to change is the draw() method.

    What happens in MineSweeper is when you tap the easy button for example, easyButtonPressed() will be called and this will set gameState = stateRun.

    Remember draw() gets called automatically roughly 60 times per second. So in draw() you need a block that looks like:

    if gameState == stateSplash then
            splashScreen: draw()
        elseif gameState == stateMenu then
            drawMenu()
        elseif gameState == stateRun then
            drawYourGameScreen()
        elseif gameState == stateWon then
            handleWinState()
        elseif gameState == stateLost then
            handleLostState
        end
    

    The gameState variable determines what gets drawn each frame. Does that make sense?

  • Posts: 266

    I followed what you said and I put drawMyGame() if gameSTate == stateRun. But there is a problem. It doesn't draw my game when I press the easy button. Should I post my code for more help?

  • Posts: 266

    Heres the main code

    --# Main
    -- MineSweeper
    -- Reefwing Software (reefwing.com.au)
    --
    -- Version 1.1
    --
    -- A reprisal of the classic MineSweeper game, written entirely on the iPad.
    -- Game icons were built using Spritely, the pixel editor included with Codea.
    --
    -- This demonstration game was built as part of a series of Tutorials on Codea
    -- and programming with Lua for the iPad. These tutorials may be found at
    -- www.codeatuts.blogspot.com.au
    --
    -- To make import of code into Codea easier, each class is available as a separate file
    -- in our dropbox repository. This will also make it easier for reuse of classes in
    -- your own projects.
    
    function setup()
    
       version = 2.0
    
       saveProjectInfo("Description", "Bouncy by Veeral Patel.")
       saveProjectInfo("Author", "Veeral Patel")
       saveProjectInfo("Date", "18th July 2012")
       saveProjectInfo("Version", version)
    
       print("Bouncy v"..version.."\n")
    
       -- Define the game colour palette
    
       whiteColour = color(255, 255, 255)
       blackColour = color(0, 0, 0)
       redColour = color(243, 157, 33, 255)
       blueColour = color(0, 188, 255, 255)
       greenColour = color(45, 226, 23, 255)
    
       -- Keep an eye on your FPS
    
       FPS = 0
       watch("FPS")
    
       timeInterval = 0
       frameCount = 0
    
       -- keep track of your Game State, Tap State, and Game Difficulty
       -- using Finite State Machines.
       --
       -- gameState is the overall state of the game.
       --
       -- tapState is used when the game is running. It toggles the tap function between
       -- revealing a cell and flagging it as a possible mine. The button text of flagButton
       -- indicates the current state.
       --
       -- gameDifficulty allows us to setup a new game with the correct parameters when the
       -- newGameButton is tapped.
    
       stateSplash = 0
       stateMenu = 1
       stateRun = 2
       stateGameOver = 3
    
       gameState = stateSplash
    
      
    
       tapState = stateReveal
    
       stateEasy = 7
       stateMedium = 8
       stateHard = 9
    
       gameDifficulty = stateEasy
    
       -- initialise the game variables and grid matrix
    
       score = 0
    
    
       -- create the 3 menu buttons, they wont be visible until you draw them.
       -- Note that 50 pixels is the minimum height for the default font size
    
       local mButtonSize = vec2(180, 50)
       local mLocX = WIDTH/2 - mButtonSize.x/2
       local mLocY = HEIGHT/2 + 20
    
       easyButton = Button("Easy", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       easyButton.action = function() easyButtonPressed() end
    
       mLocY = mLocY - 80
       mediumButton = Button("Medium", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       mediumButton.action = function() mediumButtonPressed() end
    
       mLocY = mLocY - 80
       hardButton = Button("Hard", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       hardButton.action = function() hardButtonPressed() end
    
       menuBorder = RoundBorder(10, 10, WIDTH - 10, HEIGHT - 10, 1, blueColour, blackColour)
    
       -- create the run screen buttons
    
       mLocX = WIDTH - mButtonSize.x/2 - 25
       mLocY = HEIGHT - 195
       mButtonSize = vec2(100, 50)
    
    
       mLocY = 110 + mButtonSize.y*2
       newGameButton = Button("New", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       newGameButton.action = function() newGameButtonPressed() end
    
       mLocY = 110
       menuButton = Button("Menu", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       menuButton.action = function() menuButtonPressed() end
    
       -- create the splash screen
    
       splashScreen = SplashScreen("Bouncy", 3)
    
       -- Create the twinkling star background
    
       
    
    end
    
    -- Draw routines
    
    function draw()
    
       -- The main drawing function, called 60 times per second if possible.
       -- This sets a black background color
    
       background(blackColour)
    
       -- Calculate and display FPS and track game time if game running.
    
       frameCount = frameCount + 1
       timeInterval = timeInterval + DeltaTime
    
       if timeInterval > 1 then
           if gameTimerOn then
               -- update gameTime roughly every second.
               gameTime = gameTime + 1
           end
           FPS = math.round(frameCount / timeInterval)
           timeInterval = 0
           frameCount = 0
       end
    
       -- Draw appropriate screen based on gameState
    
       if gameState == stateSplash then
           splashScreen: draw()
       elseif gameState == stateMenu then
           drawMenu()
       elseif gameState == stateRun then
           
           
           drawGameButtons()
           
       elseif gameState == stateGameOver then
           
           
           drawGameButtons()
           
           text("Game Won!", WIDTH/2, 60)
       end
    end
    
    function drawGameButtons()
    
       -- These are the buttons visible on the game run screen
    
       
       newGameButton:draw()
       menuButton:draw()
    
    end
    
    
    function drawMenu()
    
       -- Draw the Game Menu Buttons
    
       menuBorder: draw()
    
       font("Arial-BoldMT")
       fill(whiteColour)
       fontSize(20)
       text("Select Game Difficulty", WIDTH/2, HEIGHT/2 + 150)
    
       fill(blueColour)
       fontSize(72)
       text("Bouncy", WIDTH/2, HEIGHT/2 + 220)
    
       easyButton:draw()
       mediumButton:draw()
       hardButton:draw()
    
    end
    
    
    
    function resetGrid()
    
    
    
    end
    
    -- Touch & Button Handling Functions
    
    
    
    function newGameButtonPressed()
    
       resetGrid()
       gameTimerOn = false
    
       if gameDifficulty == stateEasy then
           easyButtonPressed()
       elseif gameDifficulty == stateMedium then
           mediumButtonPressed()
       elseif gameDifficulty == stateHard then
           hardButtonPressed()
       end
    
    end
    
    function menuButtonPressed()
       gameState = stateMenu
       gameTimerOn = false
    end
    
    -- Menu Buttons
    
    function resetGameParameters()
    
       -- Regardless of the game difficulty selected these parameters
       -- need to be reset when a new game is started.
    
       
       gameTime = 0
    
       -- Make sure that the Flag / Show cell button is in the default state.
    
    
       -- Create the cell grid and seed with mines then run game
    
      
       gameState = stateRun
    
    end
    
    function easyButtonPressed()
    
       -- Initialise the parameters which determine difficulty
       -- Namely: number of mines and the grid size
    
       gameDifficulty = stateEasy
       
       resetGameParameters()
    
    end
    
    function mediumButtonPressed()
    
       -- Initialise the parameters which determine difficulty
       -- Namely: number of mines and the grid size
    
       gameDifficulty = stateMedium
    
       resetGameParameters()
    
    end
    
    function hardButtonPressed()
    
       -- Initialise the parameters which determine difficulty
       -- Namely: number of mines and the grid size
    
       gameDifficulty = stateHard
    
       resetGameParameters()
    
    end
    
    function touched(touch)
    
       -- It is important to explicitly state when to handle touches.
       --
       -- If you don't do this based on gameState then for example, when in the
       -- game run state your menu button handling functions will still get called
       -- even if the buttons are not being drawn.
    
       if gameState == stateMenu then
           easyButton:touched(touch)
           mediumButton:touched(touch)
           hardButton:touched(touch)
       elseif gameState == stateRun then
           menuButton:touched(touch)
           newGameButton:touched(touch)
           
       elseif gameState == stateGameOver then
           menuButton:touched(touch)
           newGameButton:touched(touch)
           
       end
    
    end
    
    -- Utility Functions
    
    function math.round(num)
    
       -- math.round function courtesy of @Vega
    
       return math.floor(num + 0.5)
    
    end
    
    
    
    
    

    In addition to this there is the, RoundBorder, SplashScreen, Button, and Fader class from the Minesweeper code

    Hope anyone can help.

  • Posts: 266

    Please reply @Reefwing

  • Posts: 563

    @veeeralp - dude give me a chance, unfortunately giving out free advice doesn't pay very well, so like most folks here I have a day job.

    As to your code above what exactly is the problem? This code will just draw 2 buttons when in the run state. The drawMyGame() function is something you need to write. I have stripped out some more of the code you don't need in an updated version below, streamlined the FPS code and commented where you need to stick you game drawing code.

    function setup()
    
       version = 2.1
    
       saveProjectInfo("Description", "Bouncy by Veeral Patel.")
       saveProjectInfo("Author", "Veeral Patel")
       saveProjectInfo("Date", "18th July 2012")
       saveProjectInfo("Version", version)
    
       print("Bouncy v"..version.."\n")
    
       -- Define the game colour palette
    
       whiteColour = color(255, 255, 255)
       blackColour = color(0, 0, 0)
       redColour = color(243, 157, 33, 255)
       blueColour = color(0, 188, 255, 255)
       greenColour = color(45, 226, 23, 255)
    
       -- Keep an eye on your FPS
    
       FPS = 0
       watch("FPS")
    
       -- keep track of your Game State and Game Difficulty
       -- using Finite State Machines.
       --
       -- gameState is the overall state of the game.
       --
       -- gameDifficulty allows us to setup a new game with the correct parameters when the
       -- newGameButton is tapped.
    
       stateSplash = 0
       stateMenu = 1
       stateRun = 2
       stateGameOver = 3
    
       gameState = stateSplash
    
       stateEasy = 7
       stateMedium = 8
       stateHard = 9
    
       gameDifficulty = stateEasy
    
       -- initialise the game variables
    
       score = 0
    
       -- create the 3 menu buttons, they wont be visible until you draw them.
       -- Note that 50 pixels is the minimum height for the default font size
    
       local mButtonSize = vec2(180, 50)
       local mLocX = WIDTH/2 - mButtonSize.x/2
       local mLocY = HEIGHT/2 + 20
    
       easyButton = Button("Easy", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       easyButton.action = function() easyButtonPressed() end
    
       mLocY = mLocY - 80
       mediumButton = Button("Medium", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       mediumButton.action = function() mediumButtonPressed() end
    
       mLocY = mLocY - 80
       hardButton = Button("Hard", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       hardButton.action = function() hardButtonPressed() end
    
       menuBorder = RoundBorder(10, 10, WIDTH - 10, HEIGHT - 10, 1, blueColour, blackColour)
    
       -- create the run screen buttons
    
       mLocX = WIDTH - mButtonSize.x/2 - 25
       mLocY = HEIGHT - 195
       mButtonSize = vec2(100, 50)
    
       mLocY = 110 + mButtonSize.y*2
       newGameButton = Button("New", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       newGameButton.action = function() newGameButtonPressed() end
    
       mLocY = 110
       menuButton = Button("Menu", vec2(mLocX, mLocY), mButtonSize.x, mButtonSize.y)
       menuButton.action = function() menuButtonPressed() end
    
       -- create the splash screen
    
       splashScreen = SplashScreen("Bouncy", 3)
    
    end
    
    -- Draw routines
    
    function draw()
    
       -- The main drawing function, called 60 times per second if possible.
       -- This sets a black background color
    
       background(blackColour)
    
       -- Calculate and display FPS
    
    FPS = math.round(1/DeltaTime)
    
       -- Draw appropriate screen based on gameState
    
       if gameState == stateSplash then
           splashScreen: draw()
       elseif gameState == stateMenu then
           drawMenu()
       elseif gameState == stateRun then
    
        -- THIS IS WHERE YOU NEED TO PUT THE CODE WHICH 
        -- DRAWS YOUR GAME, OR STICK IT IN A FUNCTION OR
        -- CLASS IF YOU PREFER AND CALL IT FROM HERE!!!!
    
           drawGameButtons()
    
       elseif gameState == stateGameOver then
    
    
           drawGameButtons()
    
           text("Game Won!", WIDTH/2, 60)
       end
    end
    
    function drawGameButtons()
    
       -- These are the buttons visible on the game run screen
    
    
       newGameButton:draw()
       menuButton:draw()
    
    end
    
    
    function drawMenu()
    
       -- Draw the Game Menu Buttons
    
       menuBorder: draw()
    
       font("Arial-BoldMT")
       fill(whiteColour)
       fontSize(20)
       text("Select Game Difficulty", WIDTH/2, HEIGHT/2 + 150)
    
       fill(blueColour)
       fontSize(72)
       text("Bouncy", WIDTH/2, HEIGHT/2 + 220)
    
       easyButton:draw()
       mediumButton:draw()
       hardButton:draw()
    
    end
    
    
    
    function resetGrid()
    
    
    
    end
    
    -- Touch & Button Handling Functions
    
    
    
    function newGameButtonPressed()
    
       if gameDifficulty == stateEasy then
           easyButtonPressed()
       elseif gameDifficulty == stateMedium then
           mediumButtonPressed()
       elseif gameDifficulty == stateHard then
           hardButtonPressed()
       end
    
    end
    
    function menuButtonPressed()
       gameState = stateMenu
    end
    
    -- Menu Buttons
    
    function easyButtonPressed()
    
       -- Initialise the parameters which determine difficulty
    
       gameDifficulty = stateEasy
       gameState = stateRun
    
    end
    
    function mediumButtonPressed()
    
       -- Initialise the parameters which determine difficulty
    
       gameDifficulty = stateMedium
       gameState = stateRun
    
    end
    
    function hardButtonPressed()
    
       -- Initialise the parameters which determine difficulty
    
       gameDifficulty = stateHard
       gameState = stateRun
    
    end
    
    function touched(touch)
    
       -- It is important to explicitly state when to handle touches.
       --
       -- If you don't do this based on gameState then for example, when in the
       -- game run state your menu button handling functions will still get called
       -- even if the buttons are not being drawn.
    
       if gameState == stateMenu then
           easyButton:touched(touch)
           mediumButton:touched(touch)
           hardButton:touched(touch)
       elseif gameState == stateRun then
           menuButton:touched(touch)
           newGameButton:touched(touch)
       elseif gameState == stateGameOver then
           menuButton:touched(touch)
           newGameButton:touched(touch)
       end
    
    end
    
    -- Utility Functions
    
    function math.round(num)
    
       -- math.round function courtesy of @Vega
    
       return math.floor(num + 0.5)
    
    end
    
  • Posts: 266

    Sorry your probably in a different time zone. I used your suggestions and got it to work by putting in the class. Sorry I bothered you. I'm on summer vacation b/c I'm only 15.

  • Posts: 563

    @veeeralp - no bother, glad you got it working.

Sign In or Register to comment.