Menu Buttons?

Monkey Forums/Monkey Programming/Menu Buttons?

zoqfotpik(Posted 2012) [#1]
I want to be able to make buttons for a menu, and to feed in a function for the button to execute at create time.

In Blitzmax I would use a function pointer. How is it best done in Monkey?


GC-Martijn(Posted 2012) [#2]
Use your mouseX() and mouseY() with the button position.

If(mouseX() and mouseY() is inside(button xy) and TouchDown(0))
a button click
Endif


zoqfotpik(Posted 2012) [#3]
Right but let's say we have button objects stored in a list and created at runtime.

At runtime, how do we attach functions to those buttons?

In Max you can pass a function pointer, eg "createbutton(x, y, myfunction)"

What is the equivalent in Monkey? I know we don't have function pointers and that there are workarounds but I'm wondering what the best method would be in this case.


Shinkiro1(Posted 2012) [#4]
Interface Callback
  Method Run:Void()
End

Class SampleFunction Implements Callback
  Method Run:Void()
    Print "Done"
  End
End

Class YourButtonClass
  Field funcPointer:Callback
  
  Method SetCallbackWhenDone:Void (c:Callback)
    funcPointer = c
  End

  Method Update:Void()
    If someCondition
      funcPointer.Run()
    End
  End
End


The SampleFunction class acts like a callback function. Now you can set it like this:
button.SetCallbackWhenDone (New SampleFunction)



zoqfotpik(Posted 2012) [#5]
Forgot to thank you for your good help. I've been reading the eckels pattern books, lots of good stuff in there.


NoOdle(Posted 2012) [#6]
you can also use recursion. you can call a function based on a string matching its name; I created a class that mimicked function pointers. It wasn't much slower than direct calling; I was storing as much of the information as possible in the instance...


zoqfotpik(Posted 2012) [#7]
So to use recursion thus you would call a manager function with the wrapper name and it would then call itself with the inner private name of the function? I supPose doing it this way you could construct functions in various ways at runtime, moving the function addressing from namespace into string space. ..