I'm new to the Corona SDK(and I also suck in trigonometry) and I'm trying to achieve this:
Shoot a bullet from the player, towards the direction of the point the user touched, but always with ethe same speed, regardless of how far the touch was from the player.
I have tried several solutions. After some research I saw that I should calculate the angle from the two deltas in degrees, and then use the cos and sin of the angle as the x and y values respectively. But when I try to do so, I get pretty random results.
The closer I was able to get from what I want to achieve was to use the delta variables as the X and Y (multiplied by the speed factor). It worked, but then the speed varied based on how far from the player I touched and I want the speed to be fixed.
Here's my latest code(using sin and cos)
local math, physics = require("math"), require('physics')
physics.start()
physics.setGravity( 0, 0 )
display.setStatusBar( display.HiddenStatusBar )
local screenW, screenH = display.contentWidth, display.contentHeight
local playerX, playerY = (screenW / 2), (screenH / 2)
local player = display.newRect( 0, 0, 30, 30 )
player.x = playerX
player.y = playerY
-- local sinT = display.newText("", 100, 10)
-- local cosT = display.newText("", 100, 30)
local angleT = display.newText("", 100, 70)
local function onScreenTouch( event )
if (event.phase == "began") then
speed = 3
deltaX = event.x - playerX
deltaY = event.y - playerY
angle = math.atan2( deltaY, deltaX ) * 180 / math.pi
-- sin, cos = math.sin( angle ), math.cos( angle )
-- sinT.text = sin
-- cosT.text = cos
angleT.text = angle
bullet = display.newRect( 0, 0, 6, 6 )
bullet.x = playerX
bullet.y = playerY
physics.addBody( bullet )
bullet:setLinearVelocity( math.cos( angle ) * speed, math.sin( angle ) * speed )
end
end
Runtime:addEventListener( "touch", onScreenTouch )
deltaX
anddeltaY
and normalize them. Then scale them by the speed you want. \$\endgroup\$ – MichaelHouse♦ Sep 25 '13 at 5:21