1

我想使用transition.to函数发射子弹,我能够在对象的点击事件上生成子弹,但是当我旋转我的对象时如何改变子弹发射的方向,以及改变角度射击方向..生成子弹的代码如下...请给我一些想法如何实现此功能....谢谢

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

1 回答 1

1

一个简单的解决方案是计算一个点的 x、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)
于 2013-09-02T12:14:34.717 回答