【问题标题】:How to fire a bullet using transition.to function and changing the bullet angle and direction while firing in corona sdk如何在 corona sdk 中使用 transition.to 功能发射子弹并改变子弹的角度和方向
【发布时间】:2013-08-29 05:28:54
【问题描述】:

我想使用 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 )

【问题讨论】:

    标签: lua coronasdk


    【解决方案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-08-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 2014-01-07
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多