【发布时间】:2014-04-05 03:58:05
【问题描述】:
我正在开发一款经典的 RPG,需要一些基于操纵杆的移动方面的帮助。玩家应该能够使用他用拇指移动的圆形垫向任何方向移动角色。这在 FPS 游戏中应该很熟悉,其中一个垫子控制角色的左/右和向前/向后移动。我构建角色的代码是这样的:
local player = {}
local player_mt = { __index = player }
function player.new( --[[ parameters for player instance ]]-- )
local newPlayer = { --[[ player attributes here ]]-- }
newPlayer.image = display.newImage("testImage.png")
physics.addBody( newPlayer.image, "kinematic" )
return setmetatable( newPlayer, player_mt )
end
这是移动角色的功能(仍然在同一个.lua文件中):
function player:startMoving( xMotion, yMotion)
self:setLinearVelocity( xMotion*player.speedModifier, yMotion*player.speedModifier)
end
现在在我测试所有函数的 main.lua 文件中,我初始化一个新播放器,为操纵杆创建一个圆圈,为其添加一个触摸事件侦听器,并使用它来调用我的移动函数:
local physics = require("physics")
physics.start()
local player = require("player")
local myPlayer = player.new( --[[player params]]-- )
myControl = display.newCircle( 300, 300, 100 )
myControl:setFillColor( 100, 100, 100 )
myControl:addEventListener( "touch", controlCharacter )
function controlCharacter( event )
if( event.phase == "began" ) then
x = myControl.x
y = myControl.y
elseif( event.phase == "moved" ) then
myControl.x = event.x
myControl.y = event.y
myPlayer:startMoving( myControl.x - event.x, myControl.y - event.y )
elseif( event.phase == "ended" ) then
myControl.x = x
myControl.y = y
end
end
当我运行它时,我收到以下错误:尝试调用方法“setLinearVelocity”(一个零值)。就好像它没有将玩家识别为物理对象,但是如果我将 player.lua 文件中的玩家物理对象类型更改为动态,
physics.addBody( newPlayer.image, "kinematic" ) ___
|
physics.addBody( newPlayer.image, "dynamic" ) <--
然后重力功能运行正常,它从屏幕上掉下来。谁能帮我看看这里发生了什么?
【问题讨论】:
-
local player_mt = { __intex = player }和intex是您的实际代码中的错字还是只是在这里?setLinearVelocity函数从何而来? -
抱歉,这是从文件中引入代码的拼写错误。我让我的帖子更简洁,在这个过程中犯了一个错误。 __intex 在我的代码中实际上是 __index 。 setLinearVelocity 函数包含在 main.lua 文件中所需的物理库中。
-
你在其他地方调用setLinearVelocity成功了吗? lua 应该如何从播放器对象中找到函数? addBody 是否以某种方式修改其索引表?
-
不,我什至不能直接从 main.lua 调用它...我想我最好去弄清楚那个。 setLinearVelocity 函数在调用physics.addBody 时添加到播放器对象。我不知道 addBody 是否覆盖了我以前的对象,或者它是否添加到它。我也必须研究那个。