Anuncios Google

Lua POO

Buen día, comunidad!

 

Después de un largo tiempo de estar ausente, por fin tengo otro rato libre para comenzar un proyecto, esta vez un shooter 2D y lo sé, será un duro, largo y solitario camino por como están las cosas en la comunidad, sin contar que no hay ports de game engines y api's de físicas para la bonita PSP y claro por la evolución de la internet, ya no es igual que hace 10 años, ¿verdad?. Esta vez, acudo a ustedes por algo de ayuda, pues para el tipo de proyecto es fundamental la POO ya que facilita mucho las cosas pero Lua no pone las cosas de manera fácil, así que tengo un par de dudas respecto a ello, y pues si, Lua no es un lenguaje de programación que domine por lo que no sé si OneLua soporte todas las características del interprete "nativo" de Lua, tales como las metatables, y demás.

Pues estoy tratando de ralizar un menú a modo de pulir mis habilidades en Lua y a la vez de avanzar en proyecto, sin embaro estoy obteniendo errores debido al tratar de acceder a un objeto "nil", siendo más específico en la línea 7 del código "menu.lua". A continuación dejo los fragmentos de código.

Agradeceré cualquier comentario.

 

 

-- MenuItem "class"

 

local MenuItem = {
    text = "",
    primary_color = color.new(104, 169, 221), -- Cornflower Blue
    second_color = color.new(46, 147, 249) -- Dodger Blue
}
 
function MenuItem:print(self, x, y, width, height, selected)
    delta_x = 10
    delta_y = screen.textheight()
    if selected then
        draw.fillrect(x, y, delta_x, delta_y + 2, self.second_color)
        draw.gradrect(x + delta_x, y, width, delta_y + 2, self.primary_color, self.primary_color, self.primary_color, self.primary_color)
    else
        draw.fillrect(x, y, delta_x, delta_y + 2, self.second_color)
        draw.gradrect(x + delta_x, y, width, delta_y + 2, self.second_color, self.second_color, self.second_color, self.second_color)
    end
    screen.print(x + delta_x + 5, y + 1, self.text)
end
 
MenuItem.__index = MenuItem
 
setmetatable(MenuItem, {
    __call = function (cls, ...)
        return cls.new(...)
    end,
})
 
function MenuItem.new(text)
  local self = setmetatable({}, MenuItem)
  self.text = text
  return self
end

 

 

-- Menu "class"

 

dofile('modules/menu/menu_item.lua')
 
local Menu = { 
    option = 1,
    on_menu = false,
    options = {
        MenuItem("Play"),
        MenuItem("Multiplayer"),
        MenuItem("Settings"),
        MenuItem("Credits"),
        MenuItem("Quit")
    }
}
 
function Menu:print()
    -- Print background
    if self.on_menu then
        -- Print Menu
        delta = 3
        title_h = screen.textheight(1)
        screen.print(5, 20, "Halo Zero", 1, color.white, color.black, __ACENTER)
        screen.print(5, 20 + title_h + delta, "Firefight", .8, color.white, color.black, __ACENTER)
 
        y = 136
        text_h = screen.textheight(.8)
 
        for i=1, #self.options do
            self.options[i]:print(5, y + text_h, 100, 10, self.option == i)
            y = y + text_h + delta
        end
 
        buttons.read()
        if buttons.down then
            self.option = self.option + 1
            if self.option >= #self.options then
                self.option = #self.options 
            end
        elseif buttons.up then
            self.option = self.option - 1
            if self.option <= 0 then
                self.option = 1
            end
        end
 
        if buttons.cross then
            if self.option == 1 then
                -- Play
            elseif self.option == 2 then
                -- Multiplayer
            elseif self.option == 3 then
                -- Settings
            elseif self.option == 4 then
                -- Credits
            elseif self.option == 5 then
                os.exit()
            end
        end
    else
        -- Print "press start"
        txt_size = 1
        text = "Halo Zero"
        text_position = {
            (480 / 2) - (screen.textwidth())
        }
 
        txt_size = .8
        text = "Press START"
        text_position = {
            (480 / 2) - (screen.textwidth(text, txt_size) / 2), -- X
            272 - (screen.textheight(txt_size) * 2)
        }
 
        screen.print(text_position[1], text_position[2], text, txt_size, color.white)
 
        buttons.read()
        if buttons.start and not self.on_menu then 
            self.on_menu = true
        end
    end
end
 
Menu.__index = Menu
 
setmetatable(Menu, {
    __call = function (cls, ...)
        return cls.new(...)
    end,
})
 
function Menu.new(text)
    local self = setmetatable({}, Menu)
    return self
end

 

 

 

¡Saludos!

 


--[NO EXISTEN LOS LIMITES =D]--


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de alen1235

Ya no me lo espero

hola yo creo que tu juego va a hacer muy bueno (más si sabes programar), ademas si quieres yo te puedo ayudar con los graficos ^^ un saludo y adios


Soy... ¡Super patata¡, tarara-

Imagen de PerezRE

Hola, alen1235   Agradezco tu

Hola, alen1235

 

Agradezco tu comentario, eso fortalece el ánimo ;)

Logré hacer funcionar lo que expongo en el tema (parece que me estoy puliendo en el lenguaje rápido jaja), solo que no puedo dejar la solución en el tema debido a que se cargan diversos archivos .lua, y ponerlos así creo que no tendría caso.

Por otro lado, hasta ahora sólo puedo decir que el menú está terminado, y actualmente me encuentro trabajando en el motor de físicas, por lo que me vendría bien un poco de ayuda en la parte gráfica.

Te envío o me envías un mensaje privado para organizarnos.

 

¡Saludos!


--[NO EXISTEN LOS LIMITES =D]--

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.