forked from: MASSMEDIAN合体ゲーム forked from: massmedian challenge

by Jenya forked from MASSMEDIAN合体ゲーム forked from: massmedian challenge (diff: 2)
ゲーム作ってみた。
お題の趣旨とは大幅にズレてるけど・・・。

◆ ゲームのルール
マウスで文字を拾って「MASSMEDIAN」にしてください。
右2つは白くないとダメです。
完成したらクリアタイムが表示されます。
♥0 | Line 783 | Modified 2012-03-15 06:28:30 | MIT License | (replaced)
play

ActionScript3 source code

/**
 * Copyright Jenya ( http://wonderfl.net/user/Jenya )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yGLR
 */

// forked from nemu90kWw's MASSMEDIAN合体ゲーム forked from: massmedian challenge
// forked from checkmate's massmedian challenge

/*
 * ゲーム作ってみた。
 * お題の趣旨とは大幅にズレてるけど・・・。
 * 
 * ◆ ゲームのルール
 * マウスで文字を拾って「MASSMEDIAN」にしてください。
 * 右2つは白くないとダメです。
 * 完成したらクリアタイムが表示されます。
 */

package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.ColorMatrixFilter;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.ui.Mouse;
    import flash.utils.getTimer;
    
    [SWF(width="456", height="465", frameRate="50")]
    public class Begineer extends Sprite
    {
        //-------------------------------//
        // Use properties as follows.
        //-------------------------------//
        private var _sliceList:Array;
        private var grp_char:Array = null;
        
        private var buffer:BitmapData;
        private var screen:Sprite;
        
        private var count:int;
        private var action:String;
        private var bgcolor:uint;
        private var bg:Shape;
        private var buffer2:BitmapData;
        
        private var textfield:TextField;
        private var textfield2:TextField;
        
        private var massmedian:Array;
        private var massmedian_width:int;
        
        private var player:Object;
        private var charpool:Array;
        private var particlepool:Array;
        
        private var time:Number;
        
        private var mouse_x:Number = 0;
        private var mouse_y:Number = 0;
        private var mouse_down_temp:Boolean = false;
        private var mouse_down:Boolean = false;
        private var mouse_press:Boolean = false;
        private var mouse_release:Boolean = false;
        
        private var Player:Function = function():void
        {
            var count:int = -1;
            
            this.x = 0;
            this.y = 0;
            this.action = "act_title";
            this.deleteflag = false;
            
            this.formation = new Array();
            
            var light:Shape = new Shape();
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(48, 48, 0, -24, -24);
            light.graphics.beginGradientFill
            (
                "radial",
                [0xFFFFFF, 0xFFFFFF],
                [0.5, 0],
                [0x40, 0xFF],
                matrix
            );
            light.graphics.drawRect(-24, -24, 48, 48);
            light.graphics.endFill();
            
            this.main = function():void
            {
                count++;
                for(var i:int = 0; i < this.formation.length; i++)
                {
                    if(this.formation[i].action != "act_player"
                        || this.formation[i].deleteflag == true)
                    {
                        this.formation.splice(i, 1);
                        i--;
                    }
                }
                
                this[this.action]();
                return;
            };
            
            this.draw = function(buffer:BitmapData):void
            {
                matrix.identity();
                matrix.translate(mouse_x, mouse_y);
                buffer.draw(light, matrix);
                return;
            };
            
            this.getWidth = function():int
            {
                var result:int = 0;
                for(var i:int = 0; i < this.formation.length; i++)
                {
                    result += this.formation[i].getWidth();
                }
                return result;
            };
            
            this.changeAction = function(name:String):void
            {
                this.action = name;
                
                count = -1;
                return;
            };
            
            var logo_size:Number;
            this.act_title = function():void
            {
                var i:int;
                
                if(count == 0)
                {
                    this.x = 465/2;
                    this.y = 210;
                    
                    logo_size = 450;
                }
                
                if(count >= 70 && count < 80)
                {
                    this.y -= 4;
                }
                
                var temp_x:int = this.x - this.getWidth() / 2;
                for(i = 0; i < this.formation.length; i++)
                {
                    if(i == 0)
                    {
                        temp_x += this.formation[i].getWidth()/2;
                    }
                    
                    this.formation[i].x = (this.formation[i].x + (temp_x + Math.cos(count/10-i/2+7)*(logo_size+5))) / 2;
                    this.formation[i].y = (this.formation[i].y + (this.y + Math.sin(count/10-i/2+7)*(logo_size+5))) / 2;
                    
                    logo_size /= 1.0075;
                    
                    if(i < this.formation.length - 1)
                    {
                        temp_x += this.formation[i].getWidth()/2 + this.formation[i+1].getWidth()/2;
                    }
                }
                return;
            };
            
            this.act_main = function():void
            {
                this.x = mouse_x;
                this.y = mouse_y;
                
                var temp:int = this.x - this.getWidth() / 2;
                for(var i:int = 0; i < this.formation.length; i++)
                {
                    if(i == 0)
                    {
                        temp += this.formation[i].getWidth()/2;
                    }
                    
                    this.formation[i].x = (this.formation[i].x + temp) / 2;
                    this.formation[i].y = (this.formation[i].y + this.y) / 2;
                    
                    if(i < this.formation.length - 1)
                    {
                        temp += this.formation[i].getWidth()/2 + this.formation[i+1].getWidth()/2;
                    }
                }
                return;
            };
            
            this.act_complete = function():void
            {
                this.x = 465/2;
                this.y = 200;
                
                var temp:int = this.x - this.getWidth() / 2;
                for(var i:int = 0; i < this.formation.length; i++)
                {
                    if(i == 0)
                    {
                        temp += this.formation[i].getWidth()/2;
                    }
                    
                    this.formation[i].x = (this.formation[i].x + temp) / 2;
                    this.formation[i].y = (this.formation[i].y + this.y) / 2;
                    
                    if(i < this.formation.length - 1)
                    {
                        temp += this.formation[i].getWidth()/2 + this.formation[i+1].getWidth()/2;
                    }
                }
                return;
            };
        };
        
        public var Character:Function = function(x:Number = 0, y:Number = 0, type:int = 0, action:String = "act_player"):void
        {
            var count:int = -1;
            this.deleteflag = false;
            
            this.x = x;
            this.y = y;
            this.type = type;
            this.action = action;
            this.visible = true;
            
            var vx:Number = 0;
            var vy:Number = 0;
            var div:Number = 0;
            
            this.main = function():void
            {
                count++;
                
                this[this.action]();
                return;
            };
            
            this.changeAction = function(name:String):void
            {
                this.action = name;
                
                count = -1;
                return;
            };
            
            this.draw = function(buffer:BitmapData):void
            {
                buffer.copyPixels
                (
                    grp_char[this.type],
                    grp_char[this.type].rect,
                    new Point(this.x-grp_char[this.type].width/2, this.y-grp_char[this.type].height/2),
                    null,
                    null,
                    true
                );
                return;
            };
            
            this.getWidth = function():int
            {
                return grp_char[this.type].width;
            };
            
            this.getHeight = function():int
            {
                return grp_char[this.type].height;
            };
            
            this.isOutside = function():Boolean
            {
                if(this.x < -64)
                {
                    return true;
                }
                else if(this.y < -64)
                {
                    return true;
                }
                else if(this.x > 465+64)
                {
                    return true;
                }
                else if(this.y > 465+64)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            };
            
            this.vanish = function():void
            {
                this.deleteflag = true;
                return;
            };
            
            this.act_player = function():void
            {
                return;
            };
            
            this.act_item = function():void
            {
                if(count == 0)
                {
                    vy = 1.8;
                    div = 7+Math.random()*2;
                }
                
                this.x += Math.cos(count/(div*2)+Math.PI/2);
                this.y += Math.sin(count/div);
                
                if(this.y > 465-10)
                {
                    vy = -1.8;
                }
                
                this.y += vy;
                
                if(this.isOutside() == true)
                {
                    this.vanish();
                }
                return;
            };
            
            this.act_futtobi = function():void
            {
                if(count == 0)
                {
                    vx = -4 + Math.random()*8;
                    vy = -6 - Math.random()*4;
                }
                
                this.x += vx;
                this.y += vy;
                
                vy += 0.3;
                
                this.visible = !this.visible;
                
                if(this.isOutside() == true)
                {
                    this.vanish();
                }
                return;
            };
        };
        
        private var Particle:Function = function(x:int, y:int, dir:Number, speed:Number):void
        {
            this.deleteflag = false;
            
            this.x = x;
            this.y = y;
            var dir:Number = dir;
            var speed:Number = speed;
            var size:Number = 16;
            
            this.main = function():void
            {
                this.x += Math.cos(Math.PI/128*dir)*speed;
                this.y += Math.sin(Math.PI/128*dir)*speed;
                
                speed /= 1.1;
                size -= 0.5;
                if(size <= 1) {this.vanish();}
                return;
            };
            
            this.draw = function(buffer:BitmapData):void
            {
                buffer.fillRect(new Rectangle(this.x-size/2, this.y-size/2, size, size), 0xFFFFFF);
                return;
            };
            
            this.vanish = function():void
            {
                this.deleteflag = true;
                return;
            };
        };
        
        //-------------------------------//
        // Change functions as follows.
        //-------------------------------//
        public function updateEnterFrame( e:Event ):void
        {
            if(grp_char == null)
            {
                init();
            }
            
            if(mouse_down_temp == true)
            {
                if(mouse_down == false)
                {
                    mouse_press = true;
                }
                else
                {
                    mouse_press = false;
                }
                
                mouse_down = true;
                mouse_release = false;
            }
            else
            {
                if(mouse_down == true)
                {
                    mouse_release = true;
                }
                else
                {
                    mouse_release = false;
                }
                
                mouse_down = false;
                mouse_press = false;
            }
            
            count++;
            
            buffer.lock();
            buffer2.lock();
            main();
            draw();
            buffer.unlock();
            buffer2.unlock();
            
            return;
        }
        
        private function init():void
        {
            Wonderfl.capture_delay(5);
            stage.quality = StageQuality.BEST;
            
            var temp:BitmapData = new BitmapData(262, 34, true);
            temp.draw(this, new Matrix(0.5, 0, 0, 0.5, 0, 0));
            bgcolor = temp.getPixel(0, 0);
            
            temp.applyFilter
            (
                temp,
                new Rectangle(0, 0, 200, 34),
                new Point(0, 0),
                new ColorMatrixFilter
                ([
                    0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0,
                    -1, 0, 0, 0, 230
                ])
            );
            temp.applyFilter
            (
                temp,
                new Rectangle(200, 0, 62, 34),
                new Point(200, 0),
                new ColorMatrixFilter
                ([
                    0, 0, 0, 0, 255,
                    0, 0, 0, 0, 255,
                    0, 0, 0, 0, 255,
                    0, 1, 0, 0, 0
                ])
            );
            
            for each(var o:DisplayObject in _sliceList)
            {
                removeChild(o);
            }
            
            bg = new Shape();
            bg.graphics.beginFill(bgcolor, 0.2);
            bg.graphics.drawRect(0, 0, 465, 465);
            bg.graphics.endFill();
            
            grp_char = new Array();
            var cell:BitmapData;
            
            cell = new BitmapData(33, 29);
            cell.copyPixels(temp, new Rectangle(4, 3, 33, 29), new Point(0, 0));
            grp_char.push(cell);
            cell = new BitmapData(28, 29);
            cell.copyPixels(temp, new Rectangle(37, 3, 28, 29), new Point(0, 0));
            grp_char.push(cell);
            cell = new BitmapData(21, 29);
            cell.copyPixels(temp, new Rectangle(87, 3, 21, 29), new Point(0, 0));
            grp_char.push(cell);
            cell = new BitmapData(20, 29);
            cell.copyPixels(temp, new Rectangle(143, 3, 20, 29), new Point(0, 0));
            grp_char.push(cell);
            cell = new BitmapData(25, 29);
            cell.copyPixels(temp, new Rectangle(163, 3, 25, 29), new Point(0, 0));
            grp_char.push(cell);
            cell = new BitmapData(11, 29);
            cell.copyPixels(temp, new Rectangle(189, 3, 11, 29), new Point(0, 0));
            grp_char.push(cell);
            cell = new BitmapData(28, 29);
            cell.copyPixels(temp, new Rectangle(200, 3, 28, 29), new Point(0, 0));
            grp_char.push(cell);
            cell = new BitmapData(28, 29);
            cell.copyPixels(temp, new Rectangle(229, 3, 28, 29), new Point(0, 0));
            grp_char.push(cell);
            
            massmedian = [0, 1, 2, 2, 0, 3, 4, 5, 6, 7];
            for(var i:int = 0; i < massmedian.length; i++)
            {
                massmedian_width += grp_char[massmedian[i]].width;
            }
            
            player = new Player();
            charpool = new Array();
            particlepool = new Array();
            
            buffer = new BitmapData(465, 465, false, bgcolor);
            buffer2 = new BitmapData(465, 465, false, bgcolor);
            screen = new Sprite();
            screen.graphics.beginBitmapFill(buffer);
            screen.graphics.drawRect(0, 0, buffer.width, buffer.height);
            
            addChild(screen);
            
            screen.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            screen.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            
            count = -1;
            stage.quality = StageQuality.LOW;
            
            changeScene("act_title");
            return;
        }
        
        private function onMouseMove(event:Event):void
        {
            mouse_x = event.target.mouseX;
            mouse_y = event.target.mouseY;
            
            flash.ui.Mouse.hide();
            return;
        }
        
        private function onMouseDown(event:Event):void
        {
            mouse_down_temp = true;
            return;
        }
        
        private function onMouseUp(event:Event):void
        {
            mouse_down_temp = false;
            return;
        }
        
        private function main():void
        {
            var i:int;
            this[action]();
            
            player.main();
            for(i = 0; i < charpool.length; i++)
            {
                charpool[i].main();
                if(charpool[i].deleteflag == true)
                {
                    charpool.splice(i, 1);
                    i--;
                }
            }
            for(i = 0; i < particlepool.length; i++)
            {
                particlepool[i].main();
                if(particlepool[i].deleteflag == true)
                {
                    particlepool.splice(i, 1);
                    i--;
                }
            }
            return;
        }
        
        private function draw():void
        {
            var i:int;
            
            buffer2.colorTransform(buffer2.rect, new ColorTransform(-1, -1, -1, 1, 255, 255, 255, 0));
            for(i = 0; i < charpool.length; i++)
            {
                if(charpool[i].visible == false)
                {
                    continue;
                }
                charpool[i].draw(buffer2);
            }
            buffer2.colorTransform(buffer2.rect, new ColorTransform(-1, -1, -1, 1, 255, 255, 255, 0));
            buffer2.scroll(0, 1);
            buffer2.draw(bg);
            
            buffer.fillRect(buffer.rect, bgcolor);
            buffer.copyPixels(buffer2, buffer2.rect, new Point(0, 0));
            
            player.draw(buffer);
            for(i = 0; i < charpool.length; i++)
            {
                if(charpool[i].visible == false)
                {
                    continue;
                }
                charpool[i].draw(buffer);
            }
            for(i = 0; i < particlepool.length; i++)
            {
                particlepool[i].draw(buffer);
            }
            return;
        }
        
        private function changeScene(name:String):void
        {
            action = name;
            count = -1;
            return;
        }
        
        private function addCharacter(char:Object):Object
        {
            charpool.push(char);
            return char;
        }
        
        private function addItem(x:int, y:int, type:int):Object
        {
            var char:Object = new Character(x, y, type, "act_item");
            return addCharacter(char);
        }
        
        private function addParticle(x:int, y:int, dir:Number, speed:Number):Object
        {
            var particle:Object = new Particle(x, y, dir, speed);
            particlepool.push(particle);
            return particle;
        }
        
        private function act_title():void
        {
            if(count == 0)
            {
                var x:int = 50;
                for(var i:int = 0; i < massmedian.length; i++)
                {
                    player.formation.push(addCharacter(new Character(x, 100, massmedian[i])));
                }
            }
            
            var format:TextFormat;
            if(count == 70)
            {
                format = new TextFormat();
                format.font = "_等幅";
                format.bold = true;
                format.size = 28;
                format.color = 0xFFFFFF;
                format.align = TextFormatAlign.CENTER;
                
                textfield2 = new TextField();
                textfield2.defaultTextFormat = format;
                textfield2.text = "合体ゲーム";
                textfield2.x = 0;
                textfield2.y = 200;
                textfield2.width = 465;
                textfield2.selectable = false;
                textfield2.mouseEnabled = false;
                
                addChild(textfield2);
            }
            
            if(count == 80)
            {
                format = new TextFormat();
                format.font = "_sans";
                format.bold = true;
                format.size = 24;
                format.color = 0xFFFF00;
                format.align = TextFormatAlign.CENTER;
                
                textfield = new TextField();
                textfield.defaultTextFormat = format;
                textfield.text = "CLICK TO START";
                textfield.x = 0;
                textfield.y = 300;
                textfield.width = 465;
                textfield.selectable = false;
                textfield.mouseEnabled = false;
                
                addChild(textfield);
            }
            
            if(count >= 80)
            {
                if(count % 80 == 0)
                {
                    textfield.visible = true;
                }
                if(count % 80 == 60)
                {
                    textfield.visible = false;
                }
                
                if(mouse_press == true)
                {
                    for each(var o:Object in charpool)
                    {
                        if(o.type != 6)
                        {
                            o.changeAction("act_futtobi");
                        }
                    }
                    removeChild(textfield);
                    removeChild(textfield2);
                    player.changeAction("act_main");
                    changeScene("act_game");
                    return;
                }
            }
            return;
        }
        
        private function act_game():void
        {
            if(count == 0)
            {
                time = getTimer();
            }
            
            if(count % 50 == 0)
            {
                addItem(20+Math.random()*425, -16-Math.random()*40, Math.floor(Math.random()*8));
            }
            
            collision_item();
            
            if(player.formation.length == massmedian.length)
            {
                for(var i:int = 0; i < player.formation.length; i++)
                {
                    if(player.formation[i].type != massmedian[i])
                    {
                        return;
                    }
                }
                
                for(var j:int = 0; j < charpool.length; j++)
                {
                    if(charpool[j].action != "act_player")
                    {
                        charpool[j].changeAction("act_futtobi");
                    }
                }
                time = (getTimer() - time)/1000;
                
                player.changeAction("act_complete");
                changeScene("act_complete");
                return;
            }
            return;
        }
        
        private function collision_item():void
        {
            for(var i:int = 0; i < player.formation.length; i++)
            {
                for(var j:int = 0; j < charpool.length; j++)
                {
                    if(charpool[j].action == "act_item")
                    {
                        if((player.formation[i].x-player.formation[i].getWidth()/2 < charpool[j].x)
                         && (player.formation[i].y-player.formation[i].getHeight()/2 < charpool[j].y)
                         && (player.formation[i].x+player.formation[i].getWidth()/2 > charpool[j].x)
                         && (player.formation[i].y+player.formation[i].getHeight()/2 > charpool[j].y))
                        {
                            for(var k:int = 0; k < 8; k++)
                            {
                                addParticle(player.formation[i].x, player.formation[i].y, k*32, 6);
                            }
                            if(player.formation.length < massmedian.length)
                            {
                                if(player.formation[i].x > charpool[j].x)
                                {
                                    player.formation.splice(i, 0, charpool[j]);
                                }
                                else
                                {
                                    player.formation.splice(i+1, 0, charpool[j]);
                                }
                            }
                            else
                            {
                                player.formation[i].changeAction("act_futtobi");
                                player.formation.splice(i, 1, charpool[j]);
                            }
                            charpool[j].changeAction("act_player");
                            return;
                        }
                    }
                }
            }
            return;
        }
        
        private function act_complete():void
        {
            if(count == 0)
            {
                var format:TextFormat = new TextFormat();
                format.font = "_明朝";
                format.bold = true;
                format.size = 60;
                format.color = 0xFFFFFF;
                format.align = TextFormatAlign.CENTER;
                
                textfield = new TextField();
                textfield.defaultTextFormat = format;
                textfield.text = "完成";
                textfield.x = 0;
                textfield.y = 280;
                textfield.width = 465;
                textfield.selectable = false;
                textfield.mouseEnabled = false;
                
                format = new TextFormat();
                format.font = "_等幅";
                format.bold = true;
                format.size = 24;
                format.color = 0xFFFFFF;
                format.align = TextFormatAlign.CENTER;
                
                textfield2 = new TextField();
                textfield2.defaultTextFormat = format;
                textfield2.text = "Time : "+time+"秒";
                textfield2.x = 0;
                textfield2.y = 360;
                textfield2.width = 465;
                textfield2.selectable = false;
                textfield2.mouseEnabled = false;
                
                addChild(textfield);
                addChild(textfield2);
            }
            
            if(count >= 120)
            {
                if(mouse_press == true)
                {
                    for(var i:int = 0; i < player.formation.length; i++)
                    {
                        player.formation[i].vanish();
                    }
                    removeChild(textfield);
                    removeChild(textfield2);
                    player.changeAction("act_title");
                    changeScene("act_title");
                    return;
                }
            }
            return;
        }
        
        //-------------------------------//
        // Do not change following codes.
        //-------------------------------//
        public function Begineer(){
            var ctxt  :LoaderContext = new LoaderContext(true);
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onLoadComplete );
            loader.load( new URLRequest("http://swf.wonderfl.net/static/assets/massmedian.png"), ctxt );
        }
        
        public function onLoadComplete(e:Event):void {
            var loader:Loader = LoaderInfo( e.target ).loader;
            loader.contentLoaderInfo.removeEventListener( Event.COMPLETE, onLoadComplete );
            
            var bitmapdata:BitmapData = new BitmapData( loader.width, loader.height, true, 0xFF0000 );
            bitmapdata.draw( loader );
            
            _sliceList = sliceBanner( bitmapdata, bitmapdata.width );
            
            addEventListener( Event.ENTER_FRAME, updateEnterFrame );
        }
        
        
        private function sliceBanner( banner:BitmapData, length:int = 100 ):Array{
            var sliceList:Array = [];
            var w:int = Math.floor( banner.width/length );
            var h:int = Math.floor( banner.height );
            
            var t:int = Math.ceil( banner.width - w*length );
            var mat:Matrix = new Matrix();
                
            for( var i:int = 0; i<length; i++ ) {
                var bmpd :BitmapData = new BitmapData( w, h, true, 0xFFFF00 );
                mat.tx = -w*i;
                bmpd.draw( banner, mat );
                var part:DisplayObject = addChild( new Bitmap( bmpd ) );
                part.x = w*i;
                sliceList.push( part );
            }
            return sliceList;
        }
        
    }
}