在Corona SDK中设置物理对象的线速度来自外部模块

时间:2014-04-03 17:06:21

标签: lua corona physics

我正在制作一款经典的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" )    <--

然后重力功能运行良好,它落在屏幕上。谁能帮助我解决这里发生的事情?

1 个答案:

答案 0 :(得分:0)

好的,我得到了我的问题的答案。当我将播放器的图像初始化为物理对象时,我将其初始化为newPlayer.image,因此当我设置线速度时,我需要放置

    self.image:setLinearVelocity 

而不是

    self:setLinearVelocity

因为self.image,而不是self,是物理对象。