2017-05-14 4 views
0

Ich schreibe mein erstes Lua-Skript mit love2d und ich bin mir nicht sicher, warum ich den Fehler "main.lua: 4 versuche, globalen 'Player' einen Tabellenwert aufzurufen". Meine 2-Skripte sind unter: --Main.luaVersuch, Spieler einen Tabellenwert anzurufen

require("player") 
function love.load() 
    p = Player() 
end 

function love.update(dt) 
    p:update(dt) 
end 

function love.draw() 
    p:draw() 
end 

--Player.lua

Player = {} 
    --variables for the player (size, position, speed) 

function Player:new() 
    o = { 
    x = 30, 
    y = 30, 
    w = 20, 
    h = 20, 
    speed = 300, 
     } 
    setmetatable(player, { __index = Player }) 
end 

function Player:update(dt) 
    if love.keyboard.isDown("a") then 
    player.x = player.x - player.speed * dt 
    end 
    if love.keyboard.isDown("d") then 
    player.x = player.x + player.speed * dt 
    end 
    if love.keyboard.isDown("w") then 
    player.y = player.y + player.speed * dt 
    end 
    if love.keyboard.isDown("s") then 
    player.y = player.y - player.speed * dt 
    end 
    end 

function Player:draw() 
    love.graphics.rectangle("fill", o.x, o.y, o.w, os.h) 
end 

Antwort

1

Sie haben eine Player Tabelle, eine Klasse implementieren. Das ist ein Tisch, den Sie nicht wie p = Player() nennen sollten. Rufen Sie die new() Methode statt:

function love.load() 
    p = Player:new() 
end 

Auch scheint es Fehler gibt es auch in diesem new(). Sie deklarieren globale o Variable (sollte wirklich lokal sein), und Sie geben player statt o zurück, und es gibt keine player dort überhaupt. Fix es wie folgt aus:

function Player:new() 
    local player = { 
    x = 30, 
    y = 30, 
    w = 20, 
    h = 20, 
    speed = 300, 
     } 
    return setmetatable(player, { __index = Player }) 
end 
+0

Hallo, danke für die Antwort, dein Vorschlag hat den ersten Fehler behoben, aber ein anderer Fehler trat in Zeile 8 in der Funktion love.update auf. "Versuch, globalen 'p' einen Nullwert zu indexieren –

+1

Ich zeigte eine Lösung, aber diese Korrektur hat auch einen Fehler :) Die letzte Zeile sollte' return setmetatable (player, ... blah-blah) 'lauten. Sie haben erstellt ein Objekt, setze sein Metatable, aber es gab es nicht vom Konstruktor zurück. Antwort bearbeitet. – Vlad

0

Versuchen zu vermeiden, globale Variablen wie Spieler in player.lua, dies ist nach Ärger

Dies sollte funktionieren:

main.lua

Spieler .lua

local Player = {} 

function Player:new() 
    local player = { 
    x = 30, 
    y = 30, 
    w = 20, 
    h = 20, 
    speed = 300, 
    } 
    self.__index = self 
    return setmetatable(player, self) 
end 

function Player:update(dt) 
    if love.keyboard.isDown("a") then 
    self.x = self.x - self.speed * dt 
    end 
    if love.keyboard.isDown("d") then 
    self.x = self.x + self.speed * dt 
    end 
    if love.keyboard.isDown("w") then 
    self.y = self.y + self.speed * dt 
    end 
    if love.keyboard.isDown("s") then 
    self.y = self.y - self.speed * dt 
    end 
    end 

function Player:draw() 
    love.graphics.rectangle("fill", self.x, self.y, self.w, self.h) 
end 

return Player 
Verwandte Themen