This is a read-only snapshot of the ComputerCraft forums, taken in April 2020.
InputUsername's profile picture

[1.46][Example] Simple mouse controlled menu

Started by InputUsername, 05 November 2012 - 04:02 AM
InputUsername #1
Posted 05 November 2012 - 05:02 AM
Hello and welcome!

Today I made a really simple and quick example:

A mouse controlled menu.


I think it is meant for noobs but can be used by anyone. Please examine the code and if anything's unclear, don't ask me since I'm a noob myself XD.

SpoilerIf you really want to, you may ask ;-)

Tips and improvements (on either the code or the comments) are greatly appreciated.

Download:

pastebin get UiMJPdGT

or

http://pastebin.com/UiMJPdGT

or copy the following code:

Spoiler


--[[		MOUSE MENU TUTORIAL	 ]]--	
--[[ Copyright © 2012 InputUsername ]]--

--[[
State is the variable representing the current menu.
It can be anything as long as it's a string.
It is easier if you keep the string 'state' as short as possible.
]]--
local state = "main"


--[[
Here we define a table containing the options for
the main menu and the menu on the 'info' screen.
]]--
local tMainOptions = { "[ Play ]", "[ Info ]", "[ Quit ]" }
local tInfoOptions = { "[ Credits ]", "[ Back ]" }


--[[
The following lines of code are function definitions for the
draw functions of the menu.
]]--

local function drawMain() -- defines the drawMain function, which obviously draws the main menu

  term.clear()

  term.setCursorPos(2,1)
  term.write("Mouse menu tutorial - by InputUsername")

  for i = 1, #tMainOptions do -- starts a for loop to print all the options in the table 'tMainOptions'
		term.setCursorPos(2,1 + (i * 2)) -- makes the cursor skip a line every time it prints an option
		term.write(tMainOptions[i]) -- prints the menu options as a 'button'
  end

end

local function drawGame() -- defines the drawGame function, which draws the contents of the 'game'

  term.clear()

  term.setCursorPos(2,1)
  term.write("Game!")

  term.setCursorPos(2,3)
  term.write("[ Back ]")
end

local function drawInfo() -- defines the drawInfo function, which is similar to the function 'drawMain()'

  term.clear()

  term.setCursorPos(2,1)
  term.write("Info")

  for i = 1, #tInfoOptions do
		term.setCursorPos(2,1 + (i * 2))
		term.write(tInfoOptions[i])
  end

end

local function drawCredits() -- defines the drawCredits function

  term.clear()

  term.setCursorPos(2,1)
  term.write("Credits")

  term.setCursorPos(2,2)
  term.write("Mouse menu tutorial, [c]2012 InputUsername")
end


--[[
Here we start the menu's functionality
]]--
while true do -- start an infinite loop

  if state == "main" then -- if the current menu is the main menu
		drawMain() -- calls the drawMain() function, which draws the main menu

		local event, button, X, Y = os.pullEvent("mouse_click") -- waits for a mouse click

		if button == 1 then -- if the user clicks with the left button (1 is left, 2 is right)
		  for i = 1, #tMainOptions do -- some 'complicated' code to check where the mouse click was
				if X >= 2 and X <= #(tMainOptions[i]) + 2 and Y == 1 + (i * 2) then
				  if i == 1 then
						state = "play"
				  elseif i == 2 then
					state = "info"
				  elseif i == 3 then
					state = "exit"
				  end
				end
		  end
		end

  elseif state == "play" then
	drawGame() -- draws the contents of the 'game'

		local event, button, X, Y = os.pullEvent("mouse_click") -- waits for a mouse click

		if button == 1 then
		  if X >= 2  and X <= 6 and Y == 3 then
				state = "main"
		  end
		end
  elseif state == "info" then
	drawInfo()

		local event, button, X, Y = os.pullEvent("mouse_click") -- waits for a mouse click

		if button == 1 then
		  for i = 1, #tInfoOptions do
				if X >= 2 and X <= #(tMainOptions[i]) + 2 and Y == 1 + (i * 2) then
				  if i == 1 then
						state = "credits"
				  elseif i == 2 then
						state = "main"
				  end
				end
		  end
		end

  elseif state == "credits" then
	drawCredits() -- draw the credits

		sleep(2) -- wait 2 seconds

		state = "main" -- return to the main menu
  elseif state == "exit" then
	break
  end

end

term.clear()
term.setCursorPos(1,1)

In case the indentation got fudged up, I can't help that, sorry.

Hope I can help anyone with this and thanks for reading.

~Username
InputUsername #2
Posted 05 November 2012 - 11:37 AM
EDIT:

NEWS! I'm reporting this topic straight away.
InputUsername #3
Posted 10 November 2012 - 12:42 PM
Derp. Nobody?
PixelToast #4
Posted 10 November 2012 - 04:48 PM
stop bumping
your rule violating sig is big enough
only bump if you have any information to add and not to just advertise your delightfully creative use of
term.fuckyou()
and
world.implode()

have a nice day
InputUsername #5
Posted 13 November 2012 - 04:48 AM
stop bumping
your rule violating sig is big enough
only bump if you have any information to add and not to just advertise your delightfully creative use of
term.fuckyou()
and
world.implode()

have a nice day

okay.

Now could you please look at my post instead of the bumping and stuff and my signature? Thanks.