shooting mechanism in hockey game?
Author 
Message 
mapleleafs

Posted: Fri Feb 20, 2004 10:43 pm Post subject: shooting mechanism in hockey game? 


hey, i'm making this hockey game in turing, but i don't know how to make the players shoot the puck properly. here's the general framework that i have for shooting so far:
code: 
Input.Keydown (chars)
if chars ('buttonForShoot') and playerHasPuck = true then
loop
exit when puckCoordinateX >= maxx
puckCoorinateX += 5
end loop
playerHasPuck = false
end if

If i were to use this code in my game, the puck would just go straight at the wall/boards. I need to know how to make the puck go directly at the net, regardless of the location of the player/puck carrier. help is appreciated, and i will put you in my credits if i actually finish making this game.
and by the way, my hockey game will be moving from left and right, not up and down like the old SNES games






Sponsor Sponsor



Tony

Posted: Fri Feb 20, 2004 10:51 pm Post subject: (No subject) 


well first of all, NO. You dont make it into the loop. The force is applied to the puck just once. So you set puck's velocity and let it fly.
As for the direction. Use your trig/pythag knowledge to solve the "puck triangle"
hypotinuse = puck's total velocity
angle = tangent Y/X
solve for X, Y components and those are the compound velocities that will lead the puck straight into the net.

Tony's programming blog. DWITE  a programming contest. 




mapleleafs

Posted: Sat Feb 21, 2004 3:10 pm Post subject: (No subject) 


i kind of understand, but the thing is i don't know trig....
so maybe you can give me the quick and dirty lesson on trigonometry, if not, can give me a nice site to learn from, cuz i am confus






Tony

Posted: Sat Feb 21, 2004 10:24 pm Post subject: (No subject) 


get your hands on a grade 10 math textbook and read the chapter.

Tony's programming blog. DWITE  a programming contest. 




naoki

Posted: Mon Feb 23, 2004 4:39 pm Post subject: (No subject) 


Hmm, try something like About.com and see what they can offer
Basically the idea behind trig is finding a position on a circle. As you know, you can use the radius of the circle and draw a right angled triangle based on it. The height of the triangle is the sin portion and the base length is the cos.
By determining the angle of the applied force of the stick, you can calculate by how much should the puck move in increments






@DRI@N

Posted: Mon May 24, 2004 7:49 pm Post subject: (No subject) 


You could try and make a function to calculate slope...but the problem is it will give you a real number






guruguru

Posted: Mon May 24, 2004 7:59 pm Post subject: (No subject) 


I'll try here.
Lets say the horizontal distance between the puck and net is 15. And the vertical distance is 10.
code: 
/ o
/ t 
/  adjacent = 10
/ 
( 
opposite = 15

To find the angle between the puck and the net, use a trig funtion called tan(). To much to explain how it works, but you can 'give' it the adjacent and opposite side and it will return the angle from the puck to the net.
tan^1 (15/10) = 56 degrees
Ah sorry I got to go. I'll be back in 45 mins to complete this lesson . Maybe someone else can tell you how to implement it.






guruguru

Posted: Mon May 24, 2004 8:43 pm Post subject: (No subject) 


Ok to continue. Lets say you want the total movement value to be 5. Think of 56 degrees as the ration between the x and y velocity values. (56/60). So to find the x velocity:
56 = x
90 TOTAL_MOVEMENT
x = 56 * TOTAL_MOVEMENT / 90
x = 3.1
So for this, the x velocity will be 3.1 pixels / cycle.
Using the same principle, the y value would be:
y = (9056) * TOTAL_MOVEMENT / 90
y = 1.9
The y velcoity is 1.9 pixels / cycle.
To tie everything together... lets say the horizontal distance is 15. The vertical is 10.
code: 
const TOTAL_MOVEMENT := 5
const RADIUS := 5
var puckX, puckY : int
var xVelocity, yVelocity : real
var angle : real
var horDistance : int
var verDistance : int
var netX, netY := 50
puckX := 200
puckY := 150
horDistance := puckX  netX
verDistance := puckY  netY
if verDistance = 0 then % Test for divide by zero
angle := 0
else
angle := arctand (horDistance/verDistance)
end if
xVelocity := angle * TOTAL_MOVEMENT / 90
yVelocity := (90  angle) * TOTAL_MOVEMENT / 90
loop
puckX = round (xVelocity)
puckY = round (yVelocity)
cls
Draw.Oval (netX, netY, RADIUS, RADIUS, blue)
Draw.FillOval (puckX, puckY, RADIUS, RADIUS, black)
delay(100)
end loop

Thats the basics. And you can easily port this code so if the puck is below the net... or going in opposite directions...
Haha me so stupid ! Arctand duh...
EDIT: Fixed code so it actually works !
EDIT: Wow... I gotta fix this code better.







