I am or rather was making the slow transition over to DBP, until I discovered the key frame commands in DBC (which are missing from DBP).
So I came up with this demo.
`Animation demo
`By 29 Games
`14 sept 2010
`this program makes a figure using memblocks
`then creates a running animation
gosub GENERAL_SET_UP
gosub STARTING_VARIABLES
gosub MAKE_MODELS
`main loop
do
gosub CONTROLS
gosub POSITION_CAMERA
gosub PRINT_STUFF
sync
loop
end
GENERAL_SET_UP:
sync on
sync rate 65
hide mouse
autocam off
set camera range 1, 3000
cls
return
PRINT_STUFF:
set cursor 0,0
print "Move mouse to view object. LMB to zoom in. RMB to zoom out. Spacebar to reset view."
print "Press upkey to play animation."
print "animation playing : ", object playing(1)
return
STARTING_VARIABLES:
zoom = -15
theta = 180
alpha = 0
hgt = 10 :`height of figure
pose = 0 :`initial pose of figure (standing)
return
MAKE_MODELS:
`syntax: MAKE_FIGURE_OBJECT(object number, height of figure)
MAKE_OBJECT_FIGURE(1,hgt)
color object 1, rgb(0,150,50)
set object ambient 1, rgb(100,150,100)
position object 1, 0,0.1*hgt,0
`syntax: ANIMATE_FIGURE(object number)
`only works correctly in conjunction with MAKE_OBJECT_FIGURE
ANIMATE_FIGURE(1)
return
CONTROLS:
`move camera around object
theta = wrapvalue(theta + mousemovex())
alpha = wrapvalue(alpha + mousemovey())
if mouseclick() = 1 then zoom = zoom + 1
if mouseclick() = 2 then zoom = zoom - 1
if zoom > -2 then zoom = -2
`reset view
if spacekey() = 1 then gosub STARTING_VARIABLES
`start / stop animation
if upkey() = 1
loop object 1,1,7
else
stop object 1
POSE_FIGURE(1,0)
endif
return
POSITION_CAMERA:
position camera 0,0,0
yrotate camera theta
xrotate camera alpha
move camera zoom
return
function ANIMATE_FIGURE(n):
`running animation
POSE_FIGURE(n,1) : set object keyframe n,1 :`full run right foot forward
POSE_FIGURE(n,2) : set object keyframe n,2 :`half run right foot forward
POSE_FIGURE(n,3) : set object keyframe n,3 :`half run right foot down
POSE_FIGURE(n,4) : set object keyframe n,4 :`full run left foot forward
POSE_FIGURE(n,5) : set object keyframe n,5 :`half run left foot forward
POSE_FIGURE(n,6) : set object keyframe n,6 :`half run left foot down
POSE_FIGURE(n,1) : set object keyframe n,7 :`full run right foot forward
endfunction
function POSE_FIGURE(num,p)
if p = 0 then restore _pose_data_00 :`standing
`poses for running
if p = 1 then restore _pose_data_01 :`full run right foot forward
if p = 2 then restore _pose_data_02 :`half run right foot forward
if p = 3 then restore _pose_data_03 :`half run right foot down
if p = 4 then restore _pose_data_04 :`full run left foot forward
if p = 5 then restore _pose_data_05 :`half run left foot forward
if p = 6 then restore _pose_data_06 :`half run left foot down
`rotate limbs
for i = 1 to 11
read ax,ay,az
rotate limb num,i, wrapvalue(ax),wrapvalue(ay),wrapvalue(az)
next i
`standing
_pose_data_00:
data 0, 0, 0 :` 1 mid_body
data 0, 0, 0 :` 2 up_body
data 0, 0, 0 :` 3 head
data 0, 0, 0 :` 4 up_arm left
data 0, 0, 0 :` 5 up_arm right
data 0, 0, 0 :` 6 lo_arm left
data 0, 0, 0 :` 7 lo_arm right
data 0, 0, 0 :` 8 up_leg left
data 0, 0, 0 :` 9 up_leg right
data 0, 0, 0 :` 10 lo_leg left
data 0, 0, 0 :` 11 lo_leg right
`full run right foot forward
_pose_data_01:
data 0, 30, 0 :` 1 mid_body
data 0, 0, 0 :` 2 up_body
data 0, -30, 0 :` 3 head
data -45, 0, 0 :` 4 up_arm left
data 90, 0, 0 :` 5 up_arm right
data -90, 0, 0 :` 6 lo_arm left
data -90, 0, 0 :` 7 lo_arm right
data 30, 0, 0 :` 8 up_leg left
data -60, 0, 0 :` 9 up_leg right
data 90, 0, 0 :` 10 lo_leg left
data 0, 0, 0 :` 11 lo_leg right
`half run right foot forward
_pose_data_02:
data 0, 10, 0 :` 1 mid_body
data 0, 0, 0 :` 2 up_body
data 0, -10, 0 :` 3 head
data -3, 0, 0 :` 4 up_arm left
data 37, 0, 0 :` 5 up_arm right
data -90, 0, 0 :` 6 lo_arm left
data -90, 0, 0 :` 7 lo_arm right
data 0, 0, 0 :` 8 up_leg left
data -30, 0, 0 :` 9 up_leg right
data 90, 0, 0 :` 10 lo_leg left
data 0, 0, 0 :` 11 lo_leg right
`half run right foot down
_pose_data_03:
data 0, -10, 0 :` 1 mid_body
data 0, 0, 0 :` 2 up_body
data 0, 10, 0 :` 3 head
data 37, 0, 0 :` 4 up_arm left
data -3, 0, 0 :` 5 up_arm right
data -90, 0, 0 :` 6 lo_arm left
data -90, 0, 0 :` 7 lo_arm right
data -30, 0, 0 :` 8 up_leg left
data 0, 0, 0 :` 9 up_leg right
data 90, 0, 0 :` 10 lo_leg left
data 0, 0, 0 :` 11 lo_leg right
`full run left foot forward
_pose_data_04:
data 0, -30, 0 :` 1 mid_body
data 0, 0, 0 :` 2 up_body
data 0, 30, 0 :` 3 head
data 90, 0, 0 :` 4 up_arm left
data -45, 0, 0 :` 5 up_arm right
data -90, 0, 0 :` 6 lo_arm left
data -90, 0, 0 :` 7 lo_arm right
data -60, 0, 0 :` 8 up_leg left
data 30, 0, 0 :` 9 up_leg right
data 0, 0, 0 :` 10 lo_leg left
data 90, 0, 0 :` 11 lo_leg right
`half run left foot forward
_pose_data_05:
data 0, -10, 0 :` 1 mid_body
data 0, 0, 0 :` 2 up_body
data 0, 10, 0 :` 3 head
data 37, 0, 0 :` 4 up_arm left
data -3, 0, 0 :` 5 up_arm right
data -90, 0, 0 :` 6 lo_arm left
data -90, 0, 0 :` 7 lo_arm right
data -30, 0, 0 :` 8 up_leg left
data 0, 0, 0 :` 9 up_leg right
data 0, 0, 0 :` 10 lo_leg left
data 90, 0, 0 :` 11 lo_leg right
`half run left foot down
_pose_data_06:
data 0, 10, 0 :` 1 mid_body
data 0, 0, 0 :` 2 up_body
data 0, -10, 0 :` 3 head
data -3, 0, 0 :` 4 up_arm left
data 37, 0, 0 :` 5 up_arm right
data -90, 0, 0 :` 6 lo_arm left
data -90, 0, 0 :` 7 lo_arm right
data 0, 0, 0 :` 8 up_leg left
data -30, 0, 0 :` 9 up_leg right
data 0, 0, 0 :` 10 lo_leg left
data 90, 0, 0 :` 11 lo_leg right
endfunction
function MAKE_OBJECT_FIGURE(num,size)
`the bottom of the figure's feet are 0.6*size from the object position of the figure
dim p#(8,24)
`write figure vertex data to array
restore _figure_part_data
for i = 1 to 8
for j = 1 to 24
read p#(i,j)
p#(i,j) = p#(i,j)*size
next j
next i
`create meshes for body parts
for i = 1 to 8
MAKE_MESH_8_POINTS(i, p#(i,1),p#(i,2),p#(i,3), p#(i,4),p#(i,5),p#(i,6), p#(i,7),p#(i,8),p#(i,9), p#(i,10),p#(i,11),p#(i,12), p#(i,13),p#(i,14),p#(i,15), p#(i,16),p#(i,17),p#(i,18), p#(i,19),p#(i,20),p#(i,21), p#(i,22),p#(i,23),p#(i,24))
next i
`create object and add limbs limb numbers
make object num,1,0 :` 0 lo_body1
add limb num,1,2 :` 1 mid_body
add limb num,2,3 :` 2 up_body
add limb num,3,4 :` 3 head
add limb num,4,5 :` 4 up_arm left
add limb num,5,5 :` 5 up_arm right
add limb num,6,6 :` 6 lo_arm left
add limb num,7,6 :` 7 lo_arm right
add limb num,8,7 :` 8 up_leg left
add limb num,9,7 :` 9 up_leg right
add limb num,10,8 :` 10 lo_leg left
add limb num,11,8 :` 11 lo_leg right
`delete meshes
for i = 1 to 8
delete mesh i
next i
`position limbs and link limbs
offset limb num,1, 0*size,0.148*size,0*size :` 1 mid_body
link limb num,2,1: offset limb num,2, 0*size,0.106*size,0*size :` 2 up_body
link limb num,3,2: offset limb num,3, 0*size,0.052*size,0*size :` 3 head
link limb num,4,2: offset limb num,4, -0.18*size,0.0*size,0*size :` 4 up_arm left
link limb num,5,2: offset limb num,5, 0.18*size,0.0*size,0*size :` 5 up_arm right
link limb num,6,4: offset limb num,6, 0*size,-0.148*size,-0.03*size :` 6 lo_arm left
link limb num,7,5: offset limb num,7, 0*size,-0.148*size,-0.03*size :` 7 lo_arm right
offset limb num,8, -0.075*size,-0.04*size,0*size :` 8 up_leg left
offset limb num,9, 0.075*size,-0.04*size,0*size :` 9 up_leg right
link limb num,10,8: offset limb num,10, 0*size,-0.21*size,0.03*size :` 10 lo_leg left
link limb num,11,9: offset limb num,11, 0*size,-0.21*size,0.03*size :` 11 lo_leg right
`delete array from memory
undim p#(8,24)
`data
_figure_part_data:
`vertex data lower body:
data 0.03,-0.08,0.03, -0.03,-0.08,0.03, 0.03,0.08,0.03, -0.03,0.08,0.03
data 0.03,-0.04,-0.06, -0.03,-0.04,-0.06, 0.03,0.08,-0.03, -0.03,0.08,-0.03
`vertex data mid body:
data 0.03,-0.033,0.03, -0.03,-0.033,0.03, 0.1,0.033,0.045, -0.1,0.033,0.045
data 0.03,-0.033,-0.03, -0.03,-0.033,-0.03, 0.1,0.033,-0.045, -0.1,0.033,-0.045
`vertex data upper body:
data 0.135,-0.037,0.045, -0.135,-0.037,0.045, 0.135,0.037,0.045, -0.135,0.037,0.045
data 0.135,-0.037,-0.053, -0.135,-0.037,-0.053, 0.135,0.037,-0.1, -0.135,0.037,-0.1
`vertex data head:
data 0.03,0.0,0.03, -0.03,0.0,0.03, 0.03,0.094,0.03, -0.03,0.094,0.03
data 0.03,0.015,-0.03, -0.03,0.015,-0.03, 0.03,0.094,-0.06, -0.03,0.094,-0.06
`vertex data upper arm:
data 0.03,-0.083,0.03, -0.03,-0.083,0.03, 0.03,0.027,0.03, -0.03,0.027,0.03
data 0.03,-0.143,-0.03, -0.03,-0.143,-0.03, 0.03,0.027,-0.03, -0.03,0.027,-0.03
`vertex data lower arm:
data 0.03,-0.175,0.06, -0.03,-0.175,0.06, 0.03,-0.065,0.06, -0.03,-0.065,0.06
data 0.03,-0.175,0.00, -0.03,-0.175,0.00, 0.03,-0.005,0.00, -0.03,-0.005,0.00
`vertex data upper leg:
data 0.03,-0.205,0.03, -0.03,-0.205,0.03, 0.03,0.04,0.03, -0.03,0.04,0.03
data 0.03,-0.145,-0.03, -0.03,-0.145,-0.03, 0.03,0.04,-0.03, -0.03,0.04,-0.03
`vertex data lower leg:
data 0.060,-0.35,-0.00, -0.060,-0.35,-0.00, 0.060,-0.005,-0.00, -0.060,-0.005,-0.00
data 0.060,-0.35,-0.14, -0.060,-0.35,-0.14, 0.060,-0.065,-0.07, -0.060,-0.065,-0.07
endfunction
function MAKE_MESH_8_POINTS(num, ax#,ay#,az#, bx#,by#,bz#, cx#,cy#,cz#, dx#,dy#,dz#, ex#,ey#,ez#, fx#,fy#,fz#, gx#,gy#,gz#, hx#,hy#,hz#)
`a = front right bottom, b = front left bottom, c = front right top, d = front left top
`e = back right bottom, f = back left bottom, g = back right top, h = back left top
`there are six sides to a box
num_sides = 6
`memblock number
mem = 1
`header values
num_verts = num_sides * 4
pos_verts = 32
num_norms = num_verts
pos_norms = num_verts*12 + pos_verts
num_faces = num_sides*2
pos_faces = pos_norms + num_norms*12
size_faces = num_faces*7
pos_uv = pos_faces + size_faces*4
`calculate size of memblock
size_mem = 32 + (num_verts + num_norms)*12 + size_faces*4 + num_sides*32
`create the memblock
make memblock mem, size_mem
`write header values to memblock
write memblock dword mem, 0, num_verts
write memblock dword mem, 4, pos_verts
write memblock dword mem, 8, num_norms
write memblock dword mem, 12, pos_norms
write memblock dword mem, 16, num_faces
write memblock dword mem, 20, pos_faces
write memblock dword mem, 24, size_faces
write memblock dword mem, 28, pos_uv
`write vertext data to memblock
`front face
write memblock float mem, 32, ax# : write memblock float mem, 36, ay# : write memblock float mem, 40, az# : `0 vertex
write memblock float mem, 44, bx# : write memblock float mem, 48, by# : write memblock float mem, 52, bz# : `1 vertex
write memblock float mem, 56, cx# : write memblock float mem, 60, cy# : write memblock float mem, 64, cz# : `2 vertex
write memblock float mem, 68, dx# : write memblock float mem, 72, dy# : write memblock float mem, 76, dz# : `3 vertex
`back face
write memblock float mem, 80, fx# : write memblock float mem, 84, fy# : write memblock float mem, 88, fz# : `4 vertex
write memblock float mem, 92, ex# : write memblock float mem, 96, ey# : write memblock float mem, 100, ez# : `5 vertex
write memblock float mem, 104, hx# : write memblock float mem, 108, hy# : write memblock float mem, 112, hz# : `6 vertex
write memblock float mem, 116, gx# : write memblock float mem, 120, gy# : write memblock float mem, 124, gz# : `7 vertex
`left face
write memblock float mem, 128, bx# : write memblock float mem, 132, by# : write memblock float mem, 136, bz# : `8 vertex
write memblock float mem, 140, fx# : write memblock float mem, 144, fy# : write memblock float mem, 148, fz# : `9 vertex
write memblock float mem, 152, dx# : write memblock float mem, 156, dy# : write memblock float mem, 160, dz# : `10 vertex
write memblock float mem, 164, hx# : write memblock float mem, 168, hy# : write memblock float mem, 172, hz# : `11 vertex
`right face
write memblock float mem, 176, ex# : write memblock float mem, 180, ey# : write memblock float mem, 184, ez# : `12 vertex
write memblock float mem, 188, ax# : write memblock float mem, 192, ay# : write memblock float mem, 196, az# : `13 vertex
write memblock float mem, 200, gx# : write memblock float mem, 204, gy# : write memblock float mem, 208, gz# : `14 vertex
write memblock float mem, 212, cx# : write memblock float mem, 216, cy# : write memblock float mem, 220, cz# : `15 vertex
`top face
write memblock float mem, 224, hx# : write memblock float mem, 228, hy# : write memblock float mem, 232, hz# : `16 vertex
write memblock float mem, 236, gx# : write memblock float mem, 240, gy# : write memblock float mem, 244, gz# : `17 vertex
write memblock float mem, 248, dx# : write memblock float mem, 252, dy# : write memblock float mem, 256, dz# : `18 vertex
write memblock float mem, 260, cx# : write memblock float mem, 264, cy# : write memblock float mem, 268, cz# : `19 vertex
`bottom face
write memblock float mem, 272, bx# : write memblock float mem, 276, by# : write memblock float mem, 280, bz# : `20 vertex
write memblock float mem, 284, ax# : write memblock float mem, 288, ay# : write memblock float mem, 292, az# : `21 vertex
write memblock float mem, 296, fx# : write memblock float mem, 300, fy# : write memblock float mem, 304, fz# : `22 vertex
write memblock float mem, 308, ex# : write memblock float mem, 312, ey# : write memblock float mem, 316, ez# : `23 vertex
`write normal data to memblock
restore _normdata
for pos = pos_norms to pos_norms+(num_norms*12)-12 step 12
read x,y,z
write memblock float mem, pos, x
write memblock float mem, pos+4, y
write memblock float mem, pos+8, z
next pos
`write face data to memblock
restore _facedata
for pos = pos_faces to pos_faces+(num_faces*28)-28 step 28
read nvf, va,na, vb, nb, vc,nc
write memblock dword mem, pos, nvf
write memblock dword mem, pos+4, va
write memblock dword mem, pos+8, na
write memblock dword mem, pos+12, vb
write memblock dword mem, pos+16, nb
write memblock dword mem, pos+20, vc
write memblock dword mem, pos+24, nc
next pos
`write UV data to memblock
restore _uvdata
for pos = pos_uv to pos_uv+(num_sides*32)-32 step 32
read ua#,va#, ub#,vb#, uc#,vc#, ud#,vd#
write memblock float mem, pos, ua#
write memblock float mem, pos+4, va#
write memblock float mem, pos+8, ub#
write memblock float mem, pos+12, vb#
write memblock float mem, pos+16, uc#
write memblock float mem, pos+20, vc#
write memblock float mem, pos+24, ud#
write memblock float mem, pos+28, vd#
next pos
`create mesh then create object, delete mesh and memblock
make mesh from memblock num, mem
delete memblock 1
_normdata:
data 0,0,1, 0,0,1, 0,0,1, 0,0,1 :`front
data 0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1 :`back
data -1,0,0, -1,0,0, -1,0,0, -1,0,0 :`left
data 1,0,0, 1,0,0, 1,0,0, 1,0,0 :`right
data 0,1,0, 0,1,0, 0,1,0, 0,1,0 :`top
data 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0 :`bottom
_facedata:
data 3, 0,0, 3,3, 1,1 :`front face 0
data 3, 3,3, 0,0, 2,2 :`front face 1
data 3, 4,4, 7,7, 5,5 :`back face 2
data 3, 7,7, 4,4, 6,6 :`back face 3
data 3, 8,8, 11,11, 9,9 :`left face 4
data 3, 11,11, 8,8, 10,10 :`left face 5
data 3, 12,12, 15,15, 13,13 :`right face 6
data 3, 15,15, 12,12, 14,14 :`right face 7
data 3, 16,16, 19,19, 17,17 :`top face 8
data 3, 19,19, 16,16, 18,18 :`top face 9
data 3, 20,20, 23,23, 21,21 :`bottom face 10
data 3, 23,23, 20,20, 22,22 :`bottom face 11
_uvdata:
data 0.03,0.47, 0.30,0.47, 0.03,0.03, 0.30,0.03 :`front
data 0.03,0.97, 0.30,0.97, 0.03,0.53, 0.30,0.53 :`back
data 0.36,0.47, 0.63,0.47, 0.36,0.03, 0.63,0.03 :`left
data 0.36,0.97, 0.63,0.97, 0.36,0.53, 0.63,0.53 :`right
data 0.69,0.47, 0.97,0.47, 0.69,0.03, 0.97,0.03 :`top
data 0.69,0.97, 0.97,0.97, 0.69,0.53, 0.97,0.53 :`bottom
endfunction
What should happen is that when the upkey is pressed the animation plays, which works fines. When the upkey is released the animation stops and the figure returns to its original standing pose. However, if I time it right and release the upkey just before the last keyframe of the animation (as the right foot comes fully forward) the figure becomes stuck in that pose.
I can't work out why this should be, does anyone have any ideas?
Thanks.