2013-06-13 2 views
1

Вот что у меня есть пушка в моей игре, которую я хочу, чтобы иметь возможность поворачивать пальцем. Я хочу, чтобы наконечник всегда указывал в противоположном направлении, где палец перетаскивается, т. Е. Кончик должен указывать на верхний правый, если палец перетаскивается в левый нижний.Поверните объект, связанный с центром

Я просто не могу понять, как заставить это работать. Я сумел заставить его вращаться, используя следующий код:

local function rotateObj(event) 
    local t = event.target 
    local phase = event.phase 

    if (phase == "began") then 
     display.getCurrentStage():setFocus(t) 
     t.isFocus = true 

     -- Store initial position of finger 
     t.x1 = event.x 
     t.y1 = event.y 

    elseif t.isFocus then 
     if (phase == "moved") then 
      t.x2 = event.x 
      t.y2 = event.y 

      angle1 = 180/math.pi * math.atan2(t.y1 - t.y , t.x1 - t.x) 
      angle2 = 180/math.pi * math.atan2(t.y2 - t.y , t.x2 - t.x) 
      print("angle1 = "..angle1) 
      rotationAmt = angle1 - angle2 

      --rotate it 
      t.rotation = t.rotation - rotationAmt 
      print ("t.rotation = "..t.rotation) 

      t.x1 = t.x2 
      t.y1 = t.y2 

     elseif (phase == "ended") then 

      display.getCurrentStage():setFocus(nil) 
      t.isFocus = false 
     end 
    end 

    -- Stop further propagation of touch event 
    return true 
end 
cannon:addEventListener("touch", rotateObj) 

Хотя это позволяет мне повернуть мою пушку, он не держать кончик реляционные туда, где я тащу. Я понятия не имею, куда даже пойти отсюда.

ответ

1

Вы можете попробовать мой код.

Я также создал игру, подобную вашей, но вы управляете луком и стрелой.

function getAngle(x1,y1,x2,y2) 
    local PI = 3.14159265358 
    local deltaY = y2 - y1 
    local deltaX = x2 - x1 

    local angleInDegrees = (math.atan2(deltaY, deltaX) * 180/PI)*-1 

    local mult = 10^0 

    return math.floor(angleInDegrees * mult + 0.5)/mult 
end 

local arrow = display.newImage("wind_arrow.png") 
arrow.x = display.contentWidth/2 
arrow.y = display.contentHeight/2 
arrow.touch = function(self, event) 
    print(event.phase) 
    if event.phase == "moved" then 
     --If your image is originally pointing to the north use +90 
     --If your image is originally pointing to the east use +180 
     --If your image is originally pointing to the south use +270 
     --If your image is originally pointing to the west use +360 or +0 

     --My wind_arrow.png is point to the east so I use +180 
     --You can use this formula 
     arrow.rotation = (getAngle(arrow.x,arrow.y,event.x,event.y)+180)*-1 
    end 
end 
Runtime:addEventListener("touch",arrow) 
+0

Спасибо! Это сделало именно то, что я хотел. Мало того, что этот код намного меньше моего исходного кода, но он также очень прост в использовании. Весьма признателен! – Cleverbird

+0

На самом деле, я заметил одну небольшую ошибку ... Теперь пушка теперь перемещается всякий раз, когда я касаюсь экрана, а не только при касании пушки. Есть ли способ заставить это работать, только если пользователь касается пушки? – Cleverbird

+0

Я должен начать сначала разобраться в себе, затем задавать вопросы. Это было легко исправлено, изменив прослушиватель событий времени выполнения на: cannon: addEventListener («touch», cannon) – Cleverbird

0

Посмотрите свое первое предложение ifififif.

if (phase == "began") then 
    t.isFocus = true 
elseif t.isFocus then 
    XXX 
end 

это не сработает, если фаза == "началась", потому что если elseif предложение будет вводить один путь. в вашем случае, если вы установили t.isFocus в true, но он не будет сразу оценен в пути elseif.

Смежные вопросы