Good Physics question! This is the sort of thing I would like to include in my 'virtual science lab' I'm dreaming up, so I've just written some simple code which might help both of us.
Basically, with projectile motion, it's easiest to split the motion up into seperate x, y, and z components, then think about what the motion will be doing in each of those directions. In the program below I've remarked pretty much every line so you should hopefully see what I've done and why. I've written it in DBpro, so I don't know if you will need to change anything to get it working in classic. I've included variables to affect air resistance (headwind) and crosswind.
Once it's running, control the initial angle (the trajectory) with the up and down arrow keys, and press space to fire the cannon.
Rem Project: cannon
Rem Created: 31/07/2004 01:01:01
sync on
hide mouse
`make cannon ball
make object sphere 1,10
`make cannon
make object box 2,24,12,12
`set camera
make camera 1
position camera 1,200,0,-300
`restart point
restart:
`define variables
`number of bounces
bounce=0 `leave this alone
`position of ball x,y,z
x#=0
y#=0
z#=0
`velocity of cannon ball
v#=3 `set this to whatever you like, and
`adjust camera position accordingly.
`velocity x,y,z - leave these alone
vx#=0
vy#=0
vz#=0
`acceleration x,y,z
ax#=0 `(deceleration due to air resistance - leave at zero)
ay#=0.02 `(deceleration due to gravity)
az#=0 `(acceleration due to cross wind.
` Set - for right, + for left, between 0 and about 0.01)
`air resistance
ar#=0.006 `(set between 0 and about 0.02)
`intitial trajectory
traj#=45 `leave this alone
`set cannon position
position object 1,0,0,0
position object 2,0,0,0
zrotate object 2,-45
`main loop
do
`set trajectory of cannon using arrow keys
if upkey()=1 then traj#=traj#+1
if downkey()=1 then traj#=traj#-1
zrotate object 2, traj#
`apply trajectory to initial velocity
vx#=v#*cos(traj#) `(horizontal velocity)
vy#=v#*sin(traj#) `(vertical velocity)
`check for cannon being fired
if spacekey()=1 then gosub firecannon
sync
loop
firecannon:
do
x#=x#+vx# `increase x position by velocity amount
ax#=vx#*ar# `deceleration is proportional to air resistance
vx#=vx#-ax# `decrease velocity by deceleration amount
y#=y#+vy# `increase y position by velocity amount
vy#=vy#-ay# `decrease velocity by deceleration due to gravity
z#=z#+vz# `change z position by velocity amount
vz#=vz#+az# `increase velocity by acceleration due to crosswind
`move cannonball
position object 1,x#,y#,z#
`bounce when ball hits the ground
if y#<0
y#=1
vy#=vy#*-0.6
bounce=bounce+1
if bounce>5 then goto restart
endif
sync
loop
Hope it helps - let me know if you want any further explanation of projectile motion.