Edit in JSFiddle

/**
* Elevator Action
* Crafty JS
*/



Crafty.init(50, 600, 400); //start the game with 50FPS and 600 x 400 stage

Crafty.canvas();

//Initialize the sprite
Crafty.sprite(32, "http://craftyjs.com/demos/elevatoraction/images/sprite.png", {
    player: [1,2,1,2],
    door: [0,2,1,2],
    reddoor: [0,0,1,2],
    light: [6,0,1,1]
});

//initialize sounds
Crafty.audio.add({"shoot": "http://craftyjs.com/demos/elevatoraction/sounds/shoot.wav", 
                  "quake": "http://craftyjs.com/demos/elevatoraction/sounds/quake.wav",
                  "spark": "http://craftyjs.com/demos/elevatoraction/sounds/spark.mp3"})
            .settings({volume: 0.2});

//create the bullet component
Crafty.c("bullet", {
    bullet: function(dir) {
        this.bind("enterframe", function() {
            this.move(dir, 15);
            if(this.x > Crafty.viewport.width || this.x < 0) 
                this.destroy();
        });
        return this;
    }
});

Crafty.scene("title", function() {
    Crafty.background("#111");
    
    Crafty.sprite("http://craftyjs.com/demos/elevatoraction/images/title.png", {
        title: [0,0, 430, 396]
    })
    Crafty.e("2D, DOM, title").attr({x: Crafty.viewport.width / 2 - 215});
    Crafty.e("2D, DOM, mouse").attr({x: Crafty.viewport.width / 2 - 75, y: 290, w: 142, h: 74}).bind("click", function(e) {
        Crafty.scene("main");
    });
});



Crafty.scene("main", function() {
    Crafty.background("#b1c7b5");
    //Create the player
    var player = Crafty.e("2D, player, DOM, gravity, controls, twoway, collision, animate, audio, health");
    player.attr({"y":1, z: 30, facingRight: true}).gravity("floor").twoway(3)
    .bind("keydown", function(e) {
        if(e.keyCode === Crafty.keys.SP) {
            if(!this.shoot) {
                this.shoot = true;
                this.delay(function() {
                    this.shoot = false;
                }, 100);
                
                this.stop();
                Crafty.audio.play("shoot");
                
                var bx, dir;
                if(this.facingRight) {
                    this.sprite(5,2,1,2);
                    bx = this.x + 32;
                    dir = 'e';
                } else {
                    this.sprite(5,0,1,2);
                    bx = this.x - 5;
                    dir = 'w';
                }
                
                Crafty.e("2D, DOM, color, bullet").attr({x: bx, y: this.y + 31, w: 5, h: 2, z:50}).color("rgb(250,0,0)").bullet(dir);
                var old = this.pos();
                this.trigger("change",old);
            }
        }
        if(e.keyCode === Crafty.keys.D || e.keyCode === Crafty.keys.RA) this.facingRight = true;
        if(e.keyCode === Crafty.keys.A || e.keyCode === Crafty.keys.LA) this.facingRight = false;
    })
    .bind("change", function() {
        if(this.__move.right && !this.isPlaying("walk_right")) {
            this.sprite(1,2,1,2);
            this.stop();
            this.animate("walk_right", 20);
        }
        if(this.__move.left && !this.isPlaying("walk_left")) {
            this.sprite(1,0,1,2);
            this.stop();
            this.animate("walk_left", 20);
        }
        
    })
    .bind("keyup", function(e) {
        if(e.keyCode === Crafty.keys.D || e.keyCode === Crafty.keys.RA || e.keyCode === Crafty.keys.A || e.keyCode === Crafty.keys.LA) this.stop();
    }).animate("walk_left", 1, 0, 4).animate("walk_right", 1, 2, 4);
    
    //Generate some doors
    for(var i = 1; i <= 10; i++) {
        var door = Crafty.e("2D, door, DOM, explosive");
        door.attr({x: 250, y: i*80, z: i});
        
        var red = Crafty.e("2D, reddoor, DOM, explosive");
        red.attr({x: 450, y: i*80, z: i});
    }
    
    
    
    Crafty.c("barrier", {
        west: null,
        east: null,
        north: null,
        south: null,
        obj: null,
        
        barrier: function(x,y,w,h, obj) {
            if(!this.has("2D")) this.addComponent("2D");
            this.attr({x: x, y: y, w: w, h: h});
            this.obj = obj;
            var self = this;
            
            this.west = Crafty.e("2D, hit, collision").attr({x: x, y: y, w: 1, h:h}).collision(obj, function() {
                self.collide('w');
            });
            
            this.east = Crafty.e("2D, hit, collision").attr({x: x + w - 1, y: y, w: 1, h:h}).collision(obj, function() {
                self.collide('e');
            });
            
            this.north = Crafty.e("2D, hit").attr({x: x, y: y, w: w, h:1});
            this.south = Crafty.e("2D, hit, collision").attr({x: x, y: y + h - 1, w: w, h: 1}).collision(obj, function() {
                self.collide('s');
            });
            
            /*
            this.bind("change", function() {
                this.north.attr({x: this.x, y: this.y, w: this.w, h:1});
                this.south.attr({x: this.x, y: this.y + this.h - 1, w: this.w, h: 1});
                this.east.attr({x: this.x + this.w - 1, y: this.y, w: 1, h: this.h});
                this.west.attr({x: this.x, y: this.y, w: 1, h: this.h});
            });*/
            
            return this;
        },
        
        collide: function(dir) {
            this.obj.move(dir, this.obj._speed);
        }
    });
    
    var barrier = Crafty.e("barrier, DOM, image").barrier(0,544,Crafty.viewport.width / 2,20, player).image("http://craftyjs.com/demos/elevatoraction/images/girder.png", "repeat-x");
    barrier.north.addComponent("floor");
    
    var floor1 = Crafty.e("barrier, DOM, image").barrier(0, 224, Crafty.viewport.width / 2, 20, player).image("http://craftyjs.com/demos/elevatoraction/images/girder.png", "repeat-x");
    floor1.north.addComponent("floor");
    
    var floor3 = Crafty.e("barrier, DOM, image").barrier(Crafty.viewport.width / 2 + 50, 224, Crafty.viewport.width / 2, 20, player).image("http://craftyjs.com/demos/elevatoraction/images/girder.png", "repeat-x");
    floor3.north.addComponent("floor");
    
    var floor4 = Crafty.e("barrier, DOM, image").barrier(Crafty.viewport.width / 2 + 50, 544, Crafty.viewport.width / 2, 20, player).image("http://craftyjs.com/demos/elevatoraction/images/girder.png", "repeat-x");
    floor4.north.addComponent("floor");
    
    Crafty.c("shaker", {
        shaker: function(duration) {
            var current = Crafty.frame();
                    
            this.bind("enterframe", function(e) {
                if(e.frame - current >= duration) {
                    this.unbind("enterframe");
                    return;
                }
                var xmove = Crafty.randRange(-5,5),
                    ymove = Crafty.randRange(-5,5);
                    
                Crafty.viewport.x += xmove;
                Crafty.viewport.y += ymove;
                
                this.delay(function() {
                    Crafty.viewport.x -= xmove;
                    Crafty.viewport.y -= ymove;
                }, 100);
                
            });
        }
    });
    Crafty.e("shaker");
    
    Crafty.c("elevator", {
        dir: 's',
        speed: 1,
        
        init: function() {
            this.bind("enterframe", function() {
                if(this.y <= 0)
                    this.dir = 's';
                if(this.y >= Crafty.viewport.height - this.h)
                    this.dir = 'n';
                 
                this.move(this.dir, this.speed);
                top.move(this.dir, this.speed);
                bottom.move(this.dir, this.speed);
                rope.move(this.dir, this.speed);
                rope2.move(this.dir, this.speed);
                
                if(this.inside(player)) {
                    player.move(this.dir, this.speed);
                }
            });
        },
        
        inside: function(rect) {
            return this.x < rect.x + rect.w && this.x + this.w > rect.x &&
                   rect.y >= this.y && rect.y + rect.h <= this.y + this.h;
        }
    });
    
    Crafty.c("flicker", {
        flicker: function(duration, to, from) {
            var current = Crafty.frame();
            this.bind("enterframe", function(e) {
                if(e.frame - current >= duration) {
                    this.unbind("enterframe");
                    return;
                }
                Crafty.background((e.frame % 2) ? from : to);
            });
        }
    });
    
    var elevator = Crafty.e("2D, DOM, color, elevator").color("rgb(200,200,200)").attr({x: Crafty.viewport.width / 2, y:0, w: 50, h: 80});
    var top = Crafty.e("2D, barrier, DOM, color").barrier(elevator.x, elevator.y, elevator.w, 5, player).color("rgb(100,100,100)").attr("z",1);
    top.north.addComponent("floor");
    
    var bottom = Crafty.e("2D, DOM, floor, color, bottom").color("rgb(100,100,100)").attr({x: elevator.x, y: elevator.y + elevator.h - 5, w: elevator.w, h: 5, z:1});
    var rope = Crafty.e("2D, DOM, color").color("rgb(30,30,30)").attr({x: elevator.x + 23, y: Crafty.viewport.height * -1, h: Crafty.viewport.height, w: 2});
    var rope2 = Crafty.e("2D, DOM, color").color("rgb(60,60,60)").attr({x: elevator.x + 28, y: Crafty.viewport.height * -1, h: Crafty.viewport.height, w: 1});
    
    group = Crafty.group(elevator, top, bottom, rope, rope2);
    var shaker = Crafty.e("shaker");
    var flicker = Crafty.e("flicker");
    
    for(var k=1; k <= 10; k++) {
        var light = Crafty.e("2D, DOM, light, collision, audio").attr({x: 100 * k, y: 244}).collision("bullet", function(e) {
            this.addComponent("gravity").gravity("floor").bind("hit", function() {
                Crafty.audio.play("quake").play("spark");
                shaker.shaker(50);
                flicker.flicker(50, "#222", "#b1c7b5");
                this.delay(function() {
                    Crafty.background("#b1c7b5");
                },5000);
                this.destroy();
            });
            e.destroy();
        });
    }
});

Crafty.scene("title"); //play title screen

<h1>Elevator Action</h1>
<h3>User Arrows to Move; Space to Shoot ...</h3>
body, html { margin:0; padding:0; overflow:hidden }