2016-11-20 14 views
1

Я использую this simple virtual joystick module, я пытаюсь заставить своего игрока вращаться в 360-градусном направлении в соответствии с углом джойстика, но он не работает правильно.360 виртуальный поворот джойстика

Вот наиболее соответствующий код из модуля:

local radToDeg = 180/math.pi 
local degToRad = math.pi/180 

-- where should joystick motion be stopped? 
local stopRadius = outerRadius - innerRadius 

local directionId = 0 
local angle = 0 
local distance = 0 

function joystick:touch(event) 

     local phase = event.phase 

     if((phase=='began') or (phase=="moved")) then 
      if(phase == 'began') then 
       stage:setFocus(event.target, event.id) 
      end 
      local parent = self.parent 
      local posX, posY = parent:contentToLocal(event.x, event.y) 
      angle = (math.atan2(posX, posY)*radToDeg)-90 
      if(angle < 0) then 
       angle = 360 + angle 
      end 

      -- could expand to include more directions (e.g. 45-deg) 
      if((angle>=45) and (angle<135)) then 
       directionId = 2 
      elseif((angle>=135) and (angle<225)) then 
       directionId = 3 
      elseif((angle>=225) and (angle<315)) then 
       directionId = 4 
      else 
       directionId = 1 
      end 

      distance = math.sqrt((posX*posX)+(posY*posY)) 

      if(distance >= stopRadius) then 
       distance = stopRadius 
       local radAngle = angle*degToRad 
       self.x = distance*math.cos(radAngle) 
       self.y = -distance*math.sin(radAngle) 
      else 
       self.x = posX 
       self.y = posY 
      end 

     else 
      self.x = 0 
      self.y = 0 
      stage:setFocus(nil, event.id) 

      directionId = 0 
      angle = 0 
      distance = 0 
     end 
     return true 
    end 

function joyGroup:getAngle() 
    return angle 
end 

Вот как я пытаюсь переместить плеер после установки джойстика:

local angle = joyStick.getAngle() 
player.rotation = angle 

angle и player.rotation имеют точно такой же но игрок вращается в другом направлении, чем джойстик, потому что поворот по умолчанию для джойстика 0 направлен вправо (восток), и он идет против часовой стрелки.

ответ

2

Пробег: player.rotation = -angle. player и joystick должны вращаться в одном направлении.

С модулем simpleJoystick вы получите (в градусах)

СЕВЕР - 90

WEST - 180

ВОСТОК - 0/360

ЮГ - 270

Если вы хотите get

NORTH - 0

WEST - 90

ВОСТОК - 270

ЮГ - 180

изменить код в модуле simpleJoystick как этот

... 
angle = (math.atan2(posX, posY)*radToDeg)-180 
... 
self.x = distance*math.cos(radAngle + 90*degToRad) 
self.y = -distance*math.sin(radAngle + 90*degToRad) 
... 
+0

"-угол + 90" сделал трюк, но теперь проблема в том, что вращение по умолчанию игрока всегда будет 90 (вправо), поскольку я использую это в «enterFrame». Могу ли я сделать поворот 0 самого джойстика в направлении вверх (север), чтобы он стал таким же, как и объект, который вращается? – Abdou023

+0

Я не уверен, что вы хотите, но я отредактировал свой ответ, чтобы решить вашу последнюю проблему. – ldurniat

+0

Большое спасибо. Так оно и было. – Abdou023