Это 3-я ступень, я опишу силу тяжести.
Герой уже появился на экране и может передвигаться сверху вниз, благодаря силе тяжести. На следующем этапе я расскажу прыжках, что будет сопровождаться подробным разъяснением.
Используя, конечно, версию AS3. Должен признаться, создание движка платформы интересно, но немного сложнее, чем я ожидал.
ACTIONSCRIPT: tile_size = 20 ;
ground_acceleration = 1 ;
ground_friction = 0.8 ;
air_acceleration = 0.1 ;
air_friction = 0.7 ;
ice_acceleration = 0.15 ;
ice_friction = 0.95 ;
treadmill_speed = 2 ;
max_speed = 3 ;
xspeed = 0;
yspeed = 0;
falling = false ;
gravity = 0.5 ;
level = new Array ( ) ;
level [ 0] = [ 1 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ;
level [ 1 ] = [ 1 , 1 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ;
level [ 2 ] = [ 1 , 1 , 1 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ;
level [ 3 ] = [ 1 , 1 , 1 , 1 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ;
level [ 4 ] = [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 1 , 3 , 3 , 3 , 3 , 1 , 1 , 4 , 4 , 4 , 4 , 1 , 1 ] ;
player = [ 1 , 0] ;
function create_level( l) {
_root .createEmptyMovieClip ( "level_container" , 1 ) ;
level_height = l.length ;
level_width = l[ 0] .length ;
for ( y=0; y< level_height; y++) {
for ( x=0; x< level_width; x++) {
if ( l[ y] [ x] ! = 0) {
t = level_container.attachMovie ( "tile" , "t" +y+"_" +x, _root .level_container .getNextHighestDepth ( ) , { _x :x* tile_size, _y :y* tile_size} ) ;
t.gotoAndStop ( l[ y] [ x] ) ;
}
}
}
x_pos = player[ 0] * tile_size+tile_size/ 2 ;
y_pos = player[ 1 ] * tile_size+tile_size/ 2 +1 ;
level_container.attachMovie ( "hero" , "hero" , _root .level_container .getNextHighestDepth ( ) , { _x :x_pos, _y :y_pos} ) ;
}
create_level( level ) ;
_root .onEnterFrame = function ( ) {
ground_under_feet( ) ;
walking = false ;
if ( Key .isDown ( Key .LEFT ) ) {
xspeed -= speed;
walking = true ;
}
if ( Key .isDown ( Key .RIGHT ) ) {
xspeed += speed;
walking = true ;
}
if ( ! walking) {
xspeed * = friction;
if ( Math .abs ( xspeed) < 0.5 ) {
xspeed = 0;
}
}
if ( xspeed> max_speed) {
xspeed = max_speed;
}
if ( xspeed< -max_speed) {
xspeed = -max_speed;
}
if ( falling) {
yspeed += gravity;
}
xspeed += bonus_speed;
x_pos += xspeed;
y_pos += yspeed;
check_collisions( ) ;
level_container.hero ._x = x_pos;
level_container.hero ._y = y_pos;
xspeed -= bonus_speed;
} ;
function ground_under_feet( ) {
bonus_speed = 0;
left_foot_x = Math .floor ( ( x_pos-6 ) / tile_size) ;
right_foot_x = Math .floor ( ( x_pos+5 ) / tile_size) ;
foot_y = Math .floor ( ( y_pos+9 ) / tile_size) ;
left_foot = level [ foot_y] [ left_foot_x] ;
right_foot = level [ foot_y] [ right_foot_x] ;
if ( left_foot ! = 0) {
current_tile = left_foot;
} else {
current_tile = right_foot;
}
switch ( current_tile) {
case 0 :
speed = air_acceleration;
friction = air_friction;
falling = true ;
break ;
case 1 :
over = "ground" ;
speed = ground_acceleration;
friction = ground_friction;
break ;
case 2 :
over = "ice" ;
speed = ice_acceleration;
friction = ice_friction;
break ;
case 3 :
over = "treadmill" ;
speed = ground_acceleration;
friction = ground_friction;
bonus_speed = -treadmill_speed;
break ;
case 4 :
over = "treadmill" ;
speed = ground_acceleration;
friction = ground_friction;
bonus_speed = treadmill_speed;
break ;
}
}
function check_collisions( ) {
get_edges( ) ;
// collision to the bottom
if ( yspeed> 0) {
if ( ( level [ bottom] [ right ] ! = 0) or ( level [ bottom] [ left ] ! = 0) ) {
y_pos = bottom* tile_size-9 ;
yspeed = 0;
falling = false ;
get_edges( ) ;
}
}
// collision to the left
if ( xspeed< 0) {
if ( ( level [ top] [ left ] ! = 0) or ( level [ bottom] [ left ] ! = 0) ) {
x_pos = ( left +1 ) * tile_size+6 ;
xspeed = 0;
}
}
// collision to the right
if ( xspeed> 0) {
if ( ( level [ top] [ right ] ! = 0) or ( level [ bottom] [ right ] ! = 0) ) {
x_pos = right * tile_size-6 ;
xspeed = 0;
}
}
}
function get_edges( ) {
// right edge
right = Math .floor ( ( x_pos+5 ) / tile_size) ;
// left edge
left = Math .floor ( ( x_pos-6 ) / tile_size) ;
// bottom edge
bottom = Math .floor ( ( y_pos+8 ) / tile_size) ;
// top edge
top = Math .floor ( ( y_pos-9 ) / tile_size) ;
}
скачать исходники