Alright, so simplistic approach - Conveyor already contains a class called SimpleArtStrip - this does what you want, but the way it is written, it will always keep the selected game in the same slot. Using it is as simple as this:
fe.load_module("conveyor")
local strip = SimpleArtStrip("snap", 5, 0, 0, 800, 200, 10)
But breaking down how the conveyor class works - Conveyor is a class which when instantiated, creates multiple objects for you. You pass it some parameters and its code creates the objects based on your parameters. The conveyor class has an array of objects that it will work with - and any class that extends Conveyor will define what that object is. This is done with a separate class called a ConveyorSlot.
The conveyor class has an example extended class called SimpleArtStrip - which makes use of an extended SimpleArtStripSlot class to define and position objects - in this case it just makes a bunch of artwork objects.
Most of conveyor relates to transitioning/animating the objects - positioning each of them when you move through the list.
If you want to make your own custom objects however, you can. You can make a class which contains its own surface, adds multiple objects to that surface, and if you want, could handle animating and positioning them based on where the user is in the list. That would go something like this:
class GameMenu {
surface = null
objects = null
count = 0
constructor( x, y, w, h, num, parent = ::fe ) {
surface = parent.add_surface(w,h)
surface.set_pos(x, y)
count = num
objects = []
local index = -floor( count / 2 )
local obj_width = surface.width / count
for( local i = 0; i < count; i++) {
local obj = surface.add_artwork("snap", -1, -1, 1, 1)
obj.set_pos( obj_width * i, 0, obj_width, h )
obj.preserve_aspect_ratio = true
obj.index_offset = index
objects.push( obj )
index++
}
::fe.add_transition_callback(this, "on_transition")
}
function set_pos( x, y, w, h ) {
surface.set_pos( x, y, w, h )
}
function on_transition(ttype, var, ttime) {
//set object positions
if ( ttype == Transition.FromOldSelection )
local index = -floor( count / 2 )
for ( local i = 0; i < objects.len(); i++ ) {
objects[i].index_offset = index
index++
}
}
}
local menu = GameMenu( 50, 50, 900, 200, 5 )
This is a more simplistic "custom object" - it creates its on surface, it creates the objects on that surface, and when the game changes, it adjust the objects index offset. You'd have to do more if you wanted to animate them and so forth. Even this is not complete, as you need to handle scenarios like list changes, etc... but hopefully that gives you an idea on what can be done.