2013-08-26 24 views
1

我想使用transition.to函數發射子彈,我可以在物體的點擊事件上生成子彈,但是當我旋轉我的物體時,如何改變子彈被擊發的方向, 並且還改變了射擊方向上的角度。生成子彈的代碼如下... 請給我一些想法如何實現這一點功能....感謝如何使用transition.to發射子彈,並在發射光暈時改變子彈的角度和方向sdk

display.setStatusBar(display.HiddenStatusBar) 


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

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

       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 


         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 

     return true 
end 

local function shootfunc(event) 
local getxpos=event.target.x 
local getypos=event.target.y 
local laser = display.newRect(1,1,10,35) 
laser.x = getxpos 
laser.y = getypos 
laser:setFillColor(240,200,0) 
transition.to(laser, { time = 800,x = 600, y = 20 }) 
end 

local shot= display.newRect(1,1,40,100) 
shot.x = 450; shot.y = 700 
shot:setFillColor(240,200,0) 


shot:addEventListener("touch", rotateObj) 

shot:addEventListener("tap", shootfunc) 

回答

1

一個簡單的解決方案是計算X,A點的y座標即從你的槍以相同的角度爲一定距離(你的子彈的範圍內)的槍。

display.setStatusBar(display.HiddenStatusBar) 

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

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

     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) 
      rotationAmt = angle1 - angle2 
      t.rotation = t.rotation - rotationAmt 

      t.x1 = t.x2 
      t.y1 = t.y2 
     elseif (phase == "ended") then 
      display.getCurrentStage():setFocus(nil) 
      t.isFocus = false 
     end 
    end 

    return true 
end 

-- forward declare `gun` so `shootfunc` can "see" it 
local gun 

--[[ 
Returns x, y coordinates of a point `distance` units out 
along a line at `angle` degrees. 
]]-- 
local function pointAtDistance(angle, distance) 
    -- Convert angle to radians as lua math functions expect radians 
    local r = math.rad(angle) 
    local x = math.cos(r) * distance 
    local y = math.sin(r) * distance  

    return x, y 
end 

local function shootfunc(event) 
    local laser = display.newRect(0, 0,10, 35)  
    laser:setFillColor(240, 0, 0) 

    -- Laser should come out of gun barrel so we get a point 
    -- along the guns barrel to come out of 
    local tipX, tipY = pointAtDistance(gun.rotation - 90, (gun.height/2) + (laser.height/2)) 
    laser.x = gun.x + tipX 
    laser.y = gun.y + tipY 

    -- distance to shoot bullet (anywhere offscreen is sufficient) 
    local distance = 1000 

    -- Make bullet match angle of gun 
    laser.rotation = gun.rotation 

    -- We actually want to shoot perpendicular to our angle 
    local shootAngle = laser.rotation - 90 

    -- Plot x, y target for bullet based on rotation 
    local x, y = pointAtDistance(shootAngle, distance) 
    local targetX = laser.x + x 
    local targetY = laser.y + y  

    -- Remove the bullet when we're done with it 
    local function destroy() 
     laser:removeSelf() 
    end 

    transition.to(laser, { 
     time = 800, 
     -- Fade to invisble 
     alpha = 0, 
     x = targetX, 
     y = targetY, 
     -- Destroy when done 
     onComplete = destroy 
    }) 
end 

-- Use a group for the gun so we can add other objects to it 
gun = display.newGroup() 
gun.x = display.contentCenterX 
gun.y = display.contentCenterY 

-- The shape of the gun 
local gunBody = display.newRect(-20, -50, 40, 100) 
gunBody:setFillColor(240, 200, 0) 
gun:insert(gunBody) 

-- A site on the gun so we can tell where it's pointed 
local site = display.newRect(-5, -55, 10, 20) 
site:setFillColor(100, 200, 50) 
gun:insert(site) 

gun:addEventListener("touch", rotateObj) 
gun:addEventListener("tap", shootfunc)