【问题标题】:Setting the linear velocity of a physics object from an external module in Corona SDK从 Corona SDK 中的外部模块设置物理对象的线速度
【发布时间】: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 是否覆盖了我以前的对象,或者它是否添加到它。我也必须研究那个。

标签: lua coronasdk physics


【解决方案1】:

好的,我得到了我的问题的答案。当我将玩家的图像初始化为物理对象时,我将其初始化为newPlayer.image,所以在设置线速度的时候,我需要把

    self.image:setLinearVelocity 

而不是

    self:setLinearVelocity

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多