--- title: Main menu animation sample brief: In this sample project, you learn effects to present a main menu. --- # Main menu animation - sample project In this sample project which you can [open from the editor](/manuals/project-setup/) or [download from GitHub](https://github.com/defold/sample-main-menu-animation), we demonstrate effects to present a main menu. The menu contains a background and two menu items. This project is ready setup with a menu.gui and menu.gui_script applied with code shown below. Image assets are added to an atlas named images.atlas and are applied to nodes in menu.gui. Each of the background and the two menu items, have the same animations applied to them, but with different delays. This is set up in `init()` below. The first animations is to have each node fade in while being scaled from 70% to 110%. This is done in `anim1()`. During the following animations, the scale is animated back and forth from 110% to 98%, to 106% and then to 100%. This gives the bouncing effect and is done in `anim2()`, `anim3()` and `anim4()`. The background has a special slight fade out at the end, which is applied in `anim5()`. ```lua -- file: menu.gui_script -- the functions animX represents the animation time-line -- first is anim1 executed, when finished anim2 is executed, etc -- anim1 to anim4 creates a bouncing rubber effect. -- anim5 fades down alpha and is only used for the background local function anim5(self, node) if gui.get_node("background") == node then -- special case for background. animate alpha to 60% local to_color = gui.get_color(node) to_color.w = 0.6 gui.animate(node, gui.PROP_COLOR, to_color, gui.EASING_OUTCUBIC, 2.4, 0.1) end end local function anim4(self, node) -- animate scale to 100% local s = 1 gui.animate(node, gui.PROP_SCALE, vmath.vector4(s, s, s, 0), gui.EASING_INOUTCUBIC, 0.24, 0, anim5) end local function anim3(self, node) -- animate scale to 106% local s = 1.06 gui.animate(node, gui.PROP_SCALE, vmath.vector4(s, s, s, 0), gui.EASING_INOUTCUBIC, 0.24, 0, anim4) end local function anim2(self, node) -- animate scale to 98% local s = 0.98 gui.animate(node, gui.PROP_SCALE, vmath.vector4(s, s, s, 0), gui.EASING_INOUTCUBIC, 0.24, 0, anim3) end local function anim1(node, d) -- set scale to 70% local start_scale = 0.7 gui.set_scale(node, vmath.vector4(start_scale, start_scale, start_scale, 0)) -- get current color and set alpha to 0 to fade up local from_color = gui.get_color(node) local to_color = gui.get_color(node) from_color.w = 0 gui.set_color(node, from_color) -- animate alpha value from 0 to 1 gui.animate(node, gui.PROP_COLOR, to_color, gui.EASING_INOUTCUBIC, 0.4, d) -- animate scale from %70 to 110% local s = 1.1 gui.animate(node, gui.PROP_SCALE, vmath.vector4(s, s, s, 0), gui.EASING_INOUTCUBIC, 0.4, d, anim2) end function init(self) -- start animations for all nodes -- background, button-boxes and text are animated equally -- d is the animation start delay local d = 0.4 anim1(gui.get_node("new_game"), d) anim1(gui.get_node("new_game_shadow"), d) anim1(gui.get_node("new_game_button"), d) d = 0.3 anim1(gui.get_node("quit"), d) anim1(gui.get_node("quit_shadow"), d) anim1(gui.get_node("quit_button"), d) d = 0.1 anim1(gui.get_node("background"), d) end ```