在 Corona SDK 中,从外部模块设置物理对象的线性速度

我正在制作一个经典 RPG 游戏,需要一些关于手柄移动的帮助。玩家应该能够用拇指控制一个圆形垫来让角色朝任意方向移动。这应该和 FPS 游戏中的移动板很相似,它控制角色的左/右和前/后移动。构建角色的代码如下:

    local player = {}
    local player_mt = { __index = player }

    function player.new( --[[ 玩家实例的参数 ]]-- )
      local newPlayer = { --[[ 玩家属性 ]]-- }

      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( --[[ 玩家参数 ]]-- )

    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" )    <--

然后重力函数就可以正常操作,它会直接从屏幕下掉。有谁能帮我解决这里发生了什么?

点赞
用户3014065
用户3014065

好的,我已经找到了答案。当我将玩家的图像作为物理对象初始化时,我将其初始化为newPlayer.image,因此当我设置线性速度时,我需要放置

    self.image:setLinearVelocity

而不是

    self:setLinearVelocity

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

2014-04-04 19:58:05