我想使用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 )
答案 0 :(得分: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)