2013-03-22 22 views
6

Tôi sẽ yêu cầu trợ giúp của bạn về một lỗi khiến tôi phát điên.Lỗi LUA và Corona: Cố gắng gọi phương thức '' (Giá trị Nil) - Lái xe cho tôi Crazy

Ohh ... Tôi đang sử dụng LUA với Corona SDK btw ...

Tôi đang tạo bản sao tàu. Con tàu đang được khởi tạo, tôi có thể truy cập các thuộc tính của nó, nhưng tôi không thể truy cập bất kỳ phương pháp nào !! Thực hiện theo các mã số, tôi không biết phải làm gì:

spaceShip.lua:

require('gameConf') 

spaceShip = {} 
spaceShip.__index = spaceShip 

function spaceShip:New(posX, posY, width, height) 
    local _spaceShip = nil 
    _spaceShip = {} 
    setmetatable(_spaceShip, spaceShip) 

    _spaceShip = display.newRect(posX - width/2, posY - height/2, width, height) 
    _spaceShip:setFillColor(140, 140, 140, 0) 
    _spaceShip.width = width 
    _spaceShip.height = height 

    local shipShape = { -width/2, -height/2, width/2, -height/2, width/2, height/2, -width/2, height/2 } 
    local shipShapeMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipShape} 

    local shipMotor = { -width/2, height/3, width/2, height/3, width/2, height/2, -width/2, height/2 } 
    local shipMotorMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipMotor} 

    physics.addBody(_spaceShip, shipShapeMaterial, shipMotorMaterial) 

    return _spaceShip 
end 

function spaceShip:log() 
    print("ship") 
end 

function spaceShip:applyFrontImpulse() 
    local angle = math.rad(self.rotation) 
    local xComp, yComp = math.cos(angle), -math.sin(angle) 
    local forceMag = 2 

    self:applyLinearImpulse(forceMag * xComp, forceMag * yComp, self.x, self.y) 
end 

và một phần của main.lua

require('camera') 
require('gameConf') 
require('meteor') 
require('spaceShip') 

-- Add Physics 
local physics = require("physics") 
physics.start() 
physics.setDrawMode("hybrid") 
physics.setGravity(0, 0) 

-- Load camera 
local camera = camera:New() 

-- Containers 
meteorManager = {} 
shipManager = {} 

-- Load Vector class 
vector = require "vector" 

-- Create one ship 
local myShip = nil; 
myShip = {} 
myShip = spaceShip:New(600, 200, 30, 60) 
table.insert(shipManager, myShip) 
camera:insert(myShip) 
myShip:log() <----- HERE IS THE ERROR 

rest of the code... 

Các lỗi trong thiết bị đầu cuối là:

2013-03-21 19:18:15.736 Corona Simulator[48347:707] Runtime error: 
2013-03-21 19:18:15.737 Corona Simulator[48347:707] ...t/iOS/Deep Space Harvest/Deep Space Harvest/main.lua:28: attempt to call method 'log' (a nil value) 
stack traceback: 
[C]: in function 'log' 
...t/iOS/Deep Space Harvest/Deep Space Harvest/main.lua:28: in main chunk 

Trả lời

6

Tôi nghi ngờ vấn đề là do đoạn này:

_spaceShip = {} 
setmetatable(_spaceShip, spaceShip) 

_spaceShip = display.newRect(posX - width/2, posY - height/2, width, height) 

Bạn đặt một metatable trên _spaceShip, nhưng sau đó gán một giá trị mới cho nó. Tại thời điểm đó, giá trị mới mà bạn đã gán không có liên kết có thể so sánh được mà bạn đã thiết lập vì nó có giá trị (không phải biến).

Di chuyển setmetatable sau _spaceShip = display.newRect....

+0

Có! Bạn đúng rồi! Tôi đã qua xác định metatable của tôi với một màn hình ... Để sửa, tôi tạo ra một không gian hiển thịShip.body = ... Bây giờ nó đã làm việc !! Cảm ơn bạn! –

+0

Bạn có thể giúp điều này không? http://stackoverflow.com/questions/15716914/object-assignment-lua – user2136963