Пример #1
0
        public StarlingGameSpriteWithHindWeaponized()
        {
            var textures_ped = new StarlingGameSpriteWithPedTextures(
                this.new_tex_crop,
                this.new_texsprite_crop
                );


            var textures_hind       = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            var textures_rocket     = new StarlingGameSpriteWithRocketTextures(this.new_tex_crop);
            var textures_map        = new StarlingGameSpriteWithMapTextures(new_tex_crop);
            var textures_bunker     = new StarlingGameSpriteWithBunkerTextures(new_tex_crop);
            var textures_explosions = new StarlingGameSpriteWithMapExplosionsTextures(new_tex96);

            //this.internalscale = 1.0;
            this.disablephysicsdiagnostics = true;

            this.onbeforefirstframe += (stage, s) =>
            {
                stage.color = 0x75C64F;

                // hind is looking right
                var explosins = new List <ExplosionInfo>();

                for (int i = -12; i < 12; i++)
                {
                    new Image(textures_map.road0()).AttachTo(Content).x = 256 * i;

                    var bunker0 = new PhysicalBunker(textures_bunker, this);
                    bunker0.SetPositionAndAngle(-12 * i, 24);

                    var z = new PhysicalPed(textures_ped, this);

                    z.SetPositionAndAngle(16 * i, 0);
                    z.BehaveLikeZombie();

                    //var exp = new Image(textures_explosions.explosions[0]()).AttachTo(Content);
                    //explosins.Add(exp);
                    //exp.scaleX = 2.0;
                    //exp.scaleY = 2.0;

                    //exp.x = 256 * i;
                }

                #region other units
                for (int i = 3; i < 9; i++)
                {
                    var hind2 = new PhysicalHindWeaponized(textures_hind, textures_rocket, this)
                    {
                        AutomaticTakeoff = true
                    };

                    hind2.SetPositionAndAngle(
                        i * 16, 8, random.NextDouble()
                        );
                }
                #endregion


                #region CreateExplosion
                this.CreateExplosion = (x, y) =>
                {
                    var size = 0.2 + 0.2 * random.NextDouble();

                    sb.snd_explosion.play(
                        sndTransform: new ScriptCoreLib.ActionScript.flash.media.SoundTransform(size)
                        );

                    var exp = new Image(textures_explosions.explosions[0]()).AttachTo(Content);
                    var cm  = new Matrix();

                    cm.translate(-32, -32);
                    cm.scale(5 * size, 5 * size);
                    cm.translate(16 * x, 16 * y);

                    exp.transformationMatrix = cm;

                    explosins.Add(
                        new ExplosionInfo {
                        visual = exp
                    }
                        );
                };
                #endregion


                var hind0 = new PhysicalHindWeaponized(
                    textures_hind, textures_rocket, this
                    );


                current = hind0;


                #region __keyDown

                stage.keyDown +=
                    e =>
                {
                    e.preventDefault();
                    // http://circlecube.com/2008/08/actionscript-key-listener-tutorial/
                    if (e.altKey)
                    {
                        __keyDown[System.Windows.Forms.Keys.Alt] = true;
                    }

                    __keyDown[(System.Windows.Forms.Keys)e.keyCode] = true;
                };

                stage.keyUp +=
                    e =>
                {
                    e.preventDefault();

                    if (!e.altKey)
                    {
                        __keyDown[System.Windows.Forms.Keys.Alt] = false;
                    }

                    __keyDown[(System.Windows.Forms.Keys)e.keyCode] = false;
                };

                #endregion

                bool mode_changepending = false;

                var dx_stop = false;
                var dy_stop = false;
                var dx      = 0.0;
                var dy      = 0.0;

                //              Error: Error #3707: Property can not be set in non full screen mode.
                //at flash.display::Stage/set mouseLock()

                // http://inflagrantedelicto.memoryspiral.com/2012/07/as3-quickie-mouse-lock-and-relative-mouse-coordinates/
                stage.fullScreen +=
                    delegate
                {
                    if (stage.displayState == StageDisplayState.NORMAL)
                    {
                        return;
                    }

                    // http://helpx.adobe.com/flash-player/release-note/fp_114_air_34_release_notes.html
                    // · Mouse Lock feature disabled after entering Full Screen Interactive mode(3174344)
                    //stage.mouseLock = true;
                };



                stage.mouseDown +=
                    e =>
                {
                    if (stage.displayState == StageDisplayState.NORMAL)
                    {
                        return;
                    }

                    __keyDown[Keys.ControlKey] = true;
                };

                stage.doubleClickEnabled = true;
                stage.doubleClick       += delegate
                {
                    if (stage.displayState == StageDisplayState.NORMAL)
                    {
                        stage.displayState = ScriptCoreLib.ActionScript.flash.display.StageDisplayState.FULL_SCREEN;
                        stage.displayState = ScriptCoreLib.ActionScript.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
                        return;
                    }
                };

                stage.mouseUp +=
                    e =>
                {
                    if (stage.displayState == StageDisplayState.NORMAL)
                    {
                        return;
                    }

                    __keyDown[Keys.ControlKey] = false;
                };

                stage.mouseMove +=
                    e =>
                {
                    if (stage.displayState == StageDisplayState.NORMAL)
                    {
                        dx = 0;
                        dy = 0;
                        return;
                    }

                    //dynamic ee = e;

                    //// ReferenceError: Erroe.r #1069: Property movementX not found on flash.events.MouseEvent and there is no default value.
                    //double movementX = ee.me.ovementX;
                    //double movementY = ee.movementY;

                    // http://www.levelxgames.com/2012/11/how-to-overlay-abode-air-sdk-over-flex-sdk/
                    //dx += e.movementX;
                    //dy += e.movementY;
                };

                onsyncframe +=
                    delegate
                {
                    this.Text = new { dx }.ToString();

                    foreach (var item in explosins.ToArray())
                    {
                        item.index++;

                        if (item.index == textures_explosions.explosions.Length)
                        {
                            item.visual.Orphanize();
                            explosins.Remove(item);
                        }
                        else
                        {
                            item.visual.texture = textures_explosions.explosions[item.index]();
                        }
                    }

                    #region mode
                    if (!__keyDown[System.Windows.Forms.Keys.Space])
                    {
                        // space is not down.
                        mode_changepending = true;
                    }
                    else
                    {
                        if (mode_changepending)
                        {
                            (current as PhysicalHind).With(
                                hind1 =>
                            {
                                if (hind1.visual.Altitude == 0)
                                {
                                    hind1.VerticalVelocity = 1.0;
                                }
                                else
                                {
                                    hind1.VerticalVelocity = -0.4;
                                }
                            }
                                );



                            mode_changepending = false;
                        }
                    }
                    #endregion

                    if (dx < 0)
                    {
                        __keyDown[Keys.Left]  = true;
                        __keyDown[Keys.Right] = false;
                        __keyDown.forcex      = (Math.Abs(dx) / 100.0).Min(1.0);
                        dx      = 0;
                        dx_stop = true;
                    }
                    else if (dx > 0)
                    {
                        __keyDown[Keys.Right] = true;
                        __keyDown[Keys.Left]  = false;
                        __keyDown.forcex      = (Math.Abs(dx) / 100.0).Min(1.0);
                        dx      = 0;
                        dx_stop = true;
                    }
                    else
                    {
                        if (dx_stop)
                        {
                            __keyDown[Keys.Left]  = false;
                            __keyDown[Keys.Right] = false;
                        }
                        dx_stop = false;

                        __keyDown.forcex = 1.0;
                    }

                    if (dy < 0)
                    {
                        __keyDown[Keys.Up]   = true;
                        __keyDown[Keys.Down] = false;
                        __keyDown.forcey     = (Math.Abs(dy) / 200.0).Min(1.0);
                        dy_stop = true;
                    }
                    else if (dy > 0)
                    {
                        __keyDown[Keys.Up]   = false;
                        __keyDown[Keys.Down] = true;
                        __keyDown.forcey     = (Math.Abs(dy) / 200.0).Min(1.0);
                        dy_stop = true;
                    }
                    else
                    {
                        if (dy_stop)
                        {
                            __keyDown[Keys.Up]   = false;
                            __keyDown[Keys.Down] = false;
                        }
                        dy_stop = false;

                        __keyDown.forcey = 1.0;
                    }

                    current.SetVelocityFromInput(__keyDown);



                    #region simulate a weapone!
                    if (__keyDown[System.Windows.Forms.Keys.ControlKey])
                    {
                        if (syncframeid % 3 == 0)
                        {
                            sb.snd_missleLaunch.play();
                            hind0.FireRocket();
                        }
                    }
                    #endregion
                };
            };
        }
        public StarlingGameSpriteWithTestDriversSync()
        {
            var textures_map = new StarlingGameSpriteWithMapTextures(new_tex_crop);

            var textures_ped = new StarlingGameSpriteWithPedTextures(this.new_tex_crop, this.new_texsprite_crop);
            var textures_jeep = new StarlingGameSpriteWithJeepTextures(this.new_tex_crop);
            var textures_tank = new StarlingGameSpriteWithTankTextures(new_texsprite_crop);
            var textures_hind = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            var textures_rocket = new StarlingGameSpriteWithRocketTextures(this.new_tex_crop);

            var textures_bunker = new StarlingGameSpriteWithBunkerTextures(this.new_tex_crop);

            this.onbeforefirstframe += (stage, s) =>
            {
                #region :ego
                var ego = new PhysicalPed(textures_ped, this)
                {
                    Identity = sessionid + ":ego"
                };

                ego.SetPositionAndAngle(
                    random.NextDouble() * -8,
                    random.NextDouble() * -8,
                    random.NextDouble() * Math.PI
                );

                current = ego;
                #endregion


                #region KeySample
                var __keyDown = new KeySample();

                stage.keyDown +=
                   e =>
                   {
                       // http://circlecube.com/2008/08/actionscript-key-listener-tutorial/
                       if (e.altKey)
                           __keyDown[System.Windows.Forms.Keys.Alt] = true;

                       __keyDown[(System.Windows.Forms.Keys)e.keyCode] = true;
                   };

                stage.keyUp +=
                 e =>
                 {
                     if (!e.altKey)
                         __keyDown[System.Windows.Forms.Keys.Alt] = false;

                     __keyDown[(System.Windows.Forms.Keys)e.keyCode] = false;
                 };

                #endregion

                new PhysicalBunker(textures_bunker, this) { Identity = "bunker:0" }.SetPositionAndAngle(0, -24);

                var hind0 = new PhysicalHindWeaponized(textures_hind, textures_rocket, this)
                {
                    Identity = ":1",

                    AutomaticTakeoff = true,
                    AutomaticTouchdown = true

                };

                hind0.SetPositionAndAngle(-12, -12);

                new Image(textures_map.touchdown()).AttachTo(Content).y = 256;

                new PhysicalJeep(textures_jeep, this) { Identity = ":2" }.SetPositionAndAngle(0, -12);
                new PhysicalTank(textures_tank, this) { Identity = ":3" }.SetPositionAndAngle(12, -12);





                #region other
                Func<string, RemoteGame> other = __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var already_known_other = others.FirstOrDefault(k => k.__egoid == __egoid);

                    if (already_known_other == null)
                    {
                        already_known_other = new RemoteGame
                        {
                            __egoid = __egoid,

                            // this
                            __syncframeid = this.syncframeid
                        };

                        others.Add(already_known_other);
                    }


                    return already_known_other;
                };
                #endregion


                #region __at_sync
                __at_sync += __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var o = other(__egoid);

                    o.__syncframeid++;
                    // move on!
                };
                #endregion

                #region __at_SetVerticalVelocity
                __at_SetVerticalVelocity +=
                    (string __sessionid, string identity, string value) =>
                    {
                        var o = other(__sessionid);

                        var u = this.units.FirstOrDefault(k => k.Identity == identity);

                        (u as PhysicalHind).With(hind1 => hind1.VerticalVelocity = double.Parse(value));

                        (u as PhysicalPed).With(
                              physical0 =>
                              {
                                  //                                  BCL needs another method, please define it.
                                  //Cannot call type without script attribute :
                                  //System.Convert for Boolean ToBoolean(Double) used at

                                  var LayOnTheGround = double.Parse(value);

                                  if (LayOnTheGround == 1)
                                      physical0.visual.LayOnTheGround = true;
                                  else
                                      physical0.visual.LayOnTheGround = false;




                              }
                          );

                    };
                #endregion

                #region __at_SetVelocityFromInput
                __at_SetVelocityFromInput +=
                    (
                        string __egoid,
                        string __identity,
                        string __KeySample,
                        string __fixup_x,
                        string __fixup_y,
                        string __fixup_angle

                        ) =>
                    {
                        var o = other(__egoid);

                        var u = this.units.FirstOrDefault(k => k.Identity == __identity);

                        if (u == null)
                            if (o.ego == null)
                            {
                                // the only object we can be creating implicitly is
                                // the remote ego

                                u = new PhysicalPed(textures_ped, this)
                                {
                                    Identity = __identity,
                                    RemoteGameReference = o
                                };

                                u.SetPositionAndAngle(
                                    double.Parse(__fixup_x),
                                    double.Parse(__fixup_y),
                                    double.Parse(__fixup_angle)
                                );

                                o.ego = u;
                            }


                        // set the input!


                        u.SetVelocityFromInput(
                            new KeySample
                            {
                                value = int.Parse(__KeySample),

                                fixup = true,

                                x = double.Parse(__fixup_x),
                                y = double.Parse(__fixup_y),
                                angle = double.Parse(__fixup_angle)

                            }
                        );

                    };
                #endregion


                #region __at_enterorexit
                __at_enterorexit += (__egoid, __from, __to) =>
                {
                    var o = other(__egoid);

                    var ufrom = this.units.FirstOrDefault(k => k.Identity == __from);
                    var uto = this.units.FirstOrDefault(k => k.Identity == __to);

                    (ufrom as PhysicalPed).With(
                        candidatedriver =>
                        {
                            if (uto != null)
                                if (uto.driverseat != null)
                                    if (uto.driverseat.driver == null)
                                    {
                                        // and the devil enters
                                        uto.RemoteGameReference = o;

                                        candidatedriver.body.SetActive(false);

                                        uto.driverseat.driver = candidatedriver;
                                        candidatedriver.seatedvehicle = uto;
                                    }
                        }
                    );

                    (uto as PhysicalPed).With(
                        driver =>
                        {
                            if (ufrom != null)
                                if (ufrom.driverseat != null)
                                    if (ufrom.driverseat.driver == driver)
                                    {
                                        // relinguish that vehicle. no longer posessed :)
                                        ufrom.RemoteGameReference = null;

                                        // stop the vehicle
                                        ufrom.SetVelocityFromInput(new KeySample());

                                        // get out of the lift..
                                        ufrom.driverseat.driver = null;

                                        driver.seatedvehicle = null;
                                        driver.body.SetActive(true);
                                    }
                        }
                    );

                };
                #endregion



                bool entermode_changepending = false;
                bool mode_changepending = false;

                onsyncframe += delegate
                {

                    #region mode
                    if (!__keyDown[System.Windows.Forms.Keys.Space])
                    {
                        // space is not down.
                        mode_changepending = true;
                    }
                    else
                    {
                        if (mode_changepending)
                        {
                            (current as PhysicalHind).With(
                                hind1 =>
                                {
                                    if (hind1.visual.Altitude == 0)
                                        hind1.VerticalVelocity = 1.0;
                                    else
                                        hind1.VerticalVelocity = -0.4;

                                    __raise_SetVerticalVelocity(
                                        "" + this.sessionid,
                                        hind1.Identity,
                                        "" + hind1.VerticalVelocity
                                    );
                                }
                            );

                            (current as PhysicalPed).With(
                                 physical0 =>
                                 {
                                     if (physical0.visual.LayOnTheGround)
                                         physical0.visual.LayOnTheGround = false;
                                     else
                                         physical0.visual.LayOnTheGround = true;


                                     //                                     BCL needs another method, please define it.
                                     //Cannot call type without script attribute :
                                     //System.Convert for Double ToDouble(Boolean) used at

                                     var value = 0;
                                     if (physical0.visual.LayOnTheGround)
                                         value = 1;

                                     __raise_SetVerticalVelocity(
                                         "" + this.sessionid,
                                         physical0.Identity,
                                         "" + value
                                     );

                                 }
                             );




                            mode_changepending = false;



                        }
                    }
                    #endregion



                    #region entermode_changepending
                    if (!__keyDown[System.Windows.Forms.Keys.Enter])
                    {
                        // space is not down.
                        entermode_changepending = true;
                    }
                    else
                    {
                        if (entermode_changepending)
                        {
                            entermode_changepending = false;

                            // enter another vehicle?

                            var candidatedriver = current as PhysicalPed;
                            if (candidatedriver != null)
                            {
                                var target =
                                     from candidatevehicle in units
                                     where candidatevehicle.driverseat != null

                                     // can enter if the seat is full.
                                     // unless we kick them out before ofcourse
                                     where candidatevehicle.driverseat.driver == null

                                     let distance = new __vec2(
                                         (float)(candidatedriver.body.GetPosition().x - candidatevehicle.body.GetPosition().x),
                                         (float)(candidatedriver.body.GetPosition().y - candidatevehicle.body.GetPosition().y)
                                     ).GetLength()

                                     where distance < 6

                                     orderby distance ascending
                                     select new { candidatevehicle, distance };

                                target.FirstOrDefault().With(
                                    x =>
                                    {
                                        Console.WriteLine(new { x.distance });

                                        __raise_enterorexit(
                                           "" + this.sessionid,
                                           candidatedriver.Identity,
                                           x.candidatevehicle.Identity
                                       );

                                        //current.loc.visible = false;
                                        current.body.SetActive(false);

                                        x.candidatevehicle.driverseat.driver = candidatedriver;
                                        candidatedriver.seatedvehicle = x.candidatevehicle;

                                        move_zoom = 1;
                                        current = x.candidatevehicle;





                                        //if (current.body.GetType() == Box2D.Dynamics.b2Body.b2_dynamicBody)
                                        //{
                                        //    hud.texture = textures_ped.hud_look_goggles();
                                        //}
                                        //else
                                        //{
                                        //    hud.texture = textures_ped.hud_look_building();
                                        //}

                                        //switchto(x.x);

                                        // fast start
                                        //(current as PhysicalHind).With(
                                        //    hind => hind.VerticalVelocity = 1
                                        //);
                                    }
                                );
                            }
                            else
                            {
                                (current.driverseat.driver as PhysicalPed).With(
                                    driver =>
                                    {
                                        // stop the vehicle
                                        current.SetVelocityFromInput(new KeySample());

                                        // get out of the lift..
                                        current.driverseat.driver = null;

                                        driver.seatedvehicle = null;
                                        driver.body.SetActive(true);


                                        // crashland?
                                        //(current as PhysicalHind).With(
                                        //    hind => hind.VerticalVelocity = -1
                                        //);

                                        __raise_enterorexit(
                                             "" + this.sessionid,
                                             current.Identity,
                                             driver.Identity
                                         );

                                        current = driver;
                                        //hud.texture = textures_ped.hud_look();
                                        move_zoom = 1;
                                    }
                                );
                            }

                        }
                    }
                    #endregion



                    current.SetVelocityFromInput(__keyDown);

                    #region simulate a weapone!
                    if (__keyDown[System.Windows.Forms.Keys.ControlKey])
                        if (syncframeid % 3 == 0)
                        {
                            (this.current as PhysicalHindWeaponized).With(
                                h =>
                                {
                                    //sb.snd_missleLaunch.play();

                                    h.FireRocket();
                                }
                            );

                        }
                    #endregion

                    __raise_SetVelocityFromInput(
                         "" + sessionid,
                         current.Identity,
                         "" + current.CurrentInput.value,
                         "" + current.body.GetPosition().x,
                         "" + current.body.GetPosition().y,
                         "" + current.body.GetAngle()
                     );


                    // tell others this sync frame ended for us
                    __raise_sync("" + sessionid);
                };


            };
        }
        public StarlingGameSpriteWithHindWeaponized()
        {
            var textures_ped = new StarlingGameSpriteWithPedTextures(
                this.new_tex_crop,
                this.new_texsprite_crop
                );


            var textures_hind = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            var textures_rocket = new StarlingGameSpriteWithRocketTextures(this.new_tex_crop);
            var textures_map = new StarlingGameSpriteWithMapTextures(new_tex_crop);
            var textures_bunker = new StarlingGameSpriteWithBunkerTextures(new_tex_crop);
            var textures_explosions = new StarlingGameSpriteWithMapExplosionsTextures(new_tex96);

            //this.internalscale = 1.0;
            this.disablephysicsdiagnostics = true;

            this.onbeforefirstframe += (stage, s) =>
            {
                stage.color = 0x75C64F;

                // hind is looking right
                var explosins = new List<ExplosionInfo>();

                for (int i = -12; i < 12; i++)
                {
                    new Image(textures_map.road0()).AttachTo(Content).x = 256 * i;

                    var bunker0 = new PhysicalBunker(textures_bunker, this);
                    bunker0.SetPositionAndAngle(-12 * i, 24);

                    var z = new PhysicalPed(textures_ped, this);

                    z.SetPositionAndAngle(16 * i, 0);
                    z.BehaveLikeZombie();

                    //var exp = new Image(textures_explosions.explosions[0]()).AttachTo(Content);
                    //explosins.Add(exp);
                    //exp.scaleX = 2.0;
                    //exp.scaleY = 2.0;

                    //exp.x = 256 * i;
                }

                #region other units
                for (int i = 3; i < 9; i++)
                {
                    var hind2 = new PhysicalHindWeaponized(textures_hind, textures_rocket, this)
                    {
                        AutomaticTakeoff = true
                    };

                    hind2.SetPositionAndAngle(
                        i * 16, 8, random.NextDouble()
                    );





                }
                #endregion


                #region CreateExplosion
                this.CreateExplosion = (x, y) =>
                {
                    var size = 0.2 + 0.2 * random.NextDouble();

                    sb.snd_explosion.play(
                        sndTransform: new ScriptCoreLib.ActionScript.flash.media.SoundTransform(size)
                    );

                    var exp = new Image(textures_explosions.explosions[0]()).AttachTo(Content);
                    var cm = new Matrix();

                    cm.translate(-32, -32);
                    cm.scale(5 * size, 5 * size);
                    cm.translate(16 * x, 16 * y);

                    exp.transformationMatrix = cm;

                    explosins.Add(
                    new ExplosionInfo { visual = exp }
                    );

                };
                #endregion


                var hind0 = new PhysicalHindWeaponized(
                    textures_hind, textures_rocket, this
                    );


                current = hind0;


                #region __keyDown

                stage.keyDown +=
                   e =>
                   {
                       e.preventDefault();
                       // http://circlecube.com/2008/08/actionscript-key-listener-tutorial/
                       if (e.altKey)
                           __keyDown[System.Windows.Forms.Keys.Alt] = true;

                       __keyDown[(System.Windows.Forms.Keys)e.keyCode] = true;
                   };

                stage.keyUp +=
                 e =>
                 {
                     e.preventDefault();

                     if (!e.altKey)
                         __keyDown[System.Windows.Forms.Keys.Alt] = false;

                     __keyDown[(System.Windows.Forms.Keys)e.keyCode] = false;
                 };

                #endregion

                bool mode_changepending = false;

                var dx_stop = false;
                var dy_stop = false;
                var dx = 0.0;
                var dy = 0.0;

                //              Error: Error #3707: Property can not be set in non full screen mode.
                //at flash.display::Stage/set mouseLock()

                // http://inflagrantedelicto.memoryspiral.com/2012/07/as3-quickie-mouse-lock-and-relative-mouse-coordinates/
                stage.fullScreen +=
                    delegate
                    {
                        if (stage.displayState == StageDisplayState.NORMAL)
                            return;

                        // http://helpx.adobe.com/flash-player/release-note/fp_114_air_34_release_notes.html
                        // · Mouse Lock feature disabled after entering Full Screen Interactive mode(3174344)
                        //stage.mouseLock = true;

                    };



                stage.mouseDown +=
                    e =>
                    {
                        if (stage.displayState == StageDisplayState.NORMAL)
                        {
                            return;
                        }

                        __keyDown[Keys.ControlKey] = true;
                    };

                stage.doubleClickEnabled = true;
                stage.doubleClick += delegate
                {
                    if (stage.displayState == StageDisplayState.NORMAL)
                    {
                        stage.displayState = ScriptCoreLib.ActionScript.flash.display.StageDisplayState.FULL_SCREEN;
                        stage.displayState = ScriptCoreLib.ActionScript.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
                        return;
                    }
                };

                stage.mouseUp +=
                    e =>
                    {
                        if (stage.displayState == StageDisplayState.NORMAL)
                        {
                            return;
                        }

                        __keyDown[Keys.ControlKey] = false;
                    };

                stage.mouseMove +=
                     e =>
                     {
                         if (stage.displayState == StageDisplayState.NORMAL)
                         {
                             dx = 0;
                             dy = 0;
                             return;
                         }

                         //dynamic ee = e;

                         //// ReferenceError: Erroe.r #1069: Property movementX not found on flash.events.MouseEvent and there is no default value.
                         //double movementX = ee.me.ovementX;
                         //double movementY = ee.movementY;

                         // http://www.levelxgames.com/2012/11/how-to-overlay-abode-air-sdk-over-flex-sdk/
                         //dx += e.movementX;
                         //dy += e.movementY;
                     };

                onsyncframe +=
                   delegate
                   {
                       this.Text = new { dx }.ToString();

                       foreach (var item in explosins.ToArray())
                       {
                           item.index++;

                           if (item.index == textures_explosions.explosions.Length)
                           {
                               item.visual.Orphanize();
                               explosins.Remove(item);
                           }
                           else
                           {
                               item.visual.texture = textures_explosions.explosions[item.index]();
                           }
                       }

                       #region mode
                       if (!__keyDown[System.Windows.Forms.Keys.Space])
                       {
                           // space is not down.
                           mode_changepending = true;
                       }
                       else
                       {
                           if (mode_changepending)
                           {
                               (current as PhysicalHind).With(
                                   hind1 =>
                                   {
                                       if (hind1.visual.Altitude == 0)
                                           hind1.VerticalVelocity = 1.0;
                                       else
                                           hind1.VerticalVelocity = -0.4;

                                   }
                               );






                               mode_changepending = false;



                           }
                       }
                       #endregion

                       if (dx < 0)
                       {
                           __keyDown[Keys.Left] = true;
                           __keyDown[Keys.Right] = false;
                           __keyDown.forcex = (Math.Abs(dx) / 100.0).Min(1.0);
                           dx = 0;
                           dx_stop = true;
                       }
                       else if (dx > 0)
                       {
                           __keyDown[Keys.Right] = true;
                           __keyDown[Keys.Left] = false;
                           __keyDown.forcex = (Math.Abs(dx) / 100.0).Min(1.0);
                           dx = 0;
                           dx_stop = true;
                       }
                       else
                       {
                           if (dx_stop)
                           {
                               __keyDown[Keys.Left] = false;
                               __keyDown[Keys.Right] = false;
                           }
                           dx_stop = false;

                           __keyDown.forcex = 1.0;
                       }

                       if (dy < 0)
                       {
                           __keyDown[Keys.Up] = true;
                           __keyDown[Keys.Down] = false;
                           __keyDown.forcey = (Math.Abs(dy) / 200.0).Min(1.0);
                           dy_stop = true;
                       }
                       else if (dy > 0)
                       {
                           __keyDown[Keys.Up] = false;
                           __keyDown[Keys.Down] = true;
                           __keyDown.forcey = (Math.Abs(dy) / 200.0).Min(1.0);
                           dy_stop = true;
                       }
                       else
                       {
                           if (dy_stop)
                           {
                               __keyDown[Keys.Up] = false;
                               __keyDown[Keys.Down] = false;
                           }
                           dy_stop = false;

                           __keyDown.forcey = 1.0;
                       }

                       current.SetVelocityFromInput(__keyDown);



                       #region simulate a weapone!
                       if (__keyDown[System.Windows.Forms.Keys.ControlKey])
                           if (syncframeid % 3 == 0)
                           {
                               sb.snd_missleLaunch.play();
                               hind0.FireRocket();
                           }
                       #endregion
                   };
            };

        }
        public StarlingGameSpriteWithTestDrivers()
        {
            var textures_ped = new StarlingGameSpriteWithPedTextures(this.new_tex_crop, this.new_texsprite_crop);
            // ??
            //<Reference Include="FlashHeatZeeker.UnitHindControl">
            //  <HintPath>..\packages\FlashHeatZeeker.UnitHindControl.1.0.0.0\lib\FlashHeatZeeker.UnitHindControl.dll</HintPath>
            //</Reference>
            // "X:\jsc.svn\examples\actionscript\svg\FlashHeatZeeker\packages\FlashHeatZeeker.UnitHindControl.1.0.0.0\lib\FlashHeatZeeker.UnitHindControl.dll"
            // "X:\jsc.svn\examples\actionscript\svg\FlashHeatZeeker\packages\FlashHeatZeeker.UnitHind.1.0.0.0\lib\FlashHeatZeeker.UnitHind.dll"
            var textures_hind = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            var textures_jeep = new StarlingGameSpriteWithJeepTextures(this.new_tex_crop);
            var textures_tank = new StarlingGameSpriteWithTankTextures(this.new_texsprite_crop);
            var textures_cannon = new StarlingGameSpriteWithCannonTextures(this.new_tex_crop);
            var textures_bunker = new StarlingGameSpriteWithBunkerTextures(this.new_tex_crop);
            var textures_map = new StarlingGameSpriteWithMapTextures(new_tex_crop);
            var textures_rocket = new StarlingGameSpriteWithRocketTextures(this.new_tex_crop);

            this.disablephysicsdiagnostics = true;



            // ????
            this.onbeforefirstframe += (stage, s) =>
            {
                var hud = new Image(textures_ped.hud_look()).AttachTo(this);


                for (int i = 0; i < 32; i++)
                {
                    new Image(textures_map.hill1()).AttachTo(Content).With(
                        hill =>
                        {
                            hill.x = 2048.Random();
                            hill.y = 2048.Random();
                        }
                    );

                    new Image(textures_map.hole1()).AttachTo(Content).With(
                        hill =>
                        {
                            hill.x = 2048.Random();
                            hill.y = 2048.Random();
                        }
                    );

                    new Image(textures_map.grass1()).AttachTo(Content).With(
                        hill =>
                        {
                            hill.x = 2048.Random();

                            var y = -2048.Random() - 512 - 256;
                            hill.y = y;
                        }
                    );
                }

                for (int i = 0; i < 128; i++)
                {


                    var x = 2048.Random();
                    var y = -2048.Random() - 512 - 256;

                    new Image(textures_map.tree0_shadow()).AttachTo(Content).MoveTo(x + 16, y + 16);
                    new Image(textures_map.tree0()).AttachTo(Content).MoveTo(x, y);
                }
                for (int i = -12; i < 12; i++)
                {
                    new Image(textures_map.road0()).AttachTo(Content).x = 256 * i;
                }

                new Image(textures_map.touchdown()).AttachTo(Content).MoveTo(256, -256);
                new Image(textures_map.touchdown()).AttachTo(Content).y = 256;

                new PhysicalHindWeaponized(textures_hind, textures_rocket, this) { AutomaticTakeoff = true }.SetPositionAndAngle((128 + 256) / 16, -128 * 1.5 / 16);
                new PhysicalTank(textures_tank, this).SetPositionAndAngle(128 / 16, 128 * 3 / 16);

                new Image(textures_map.tree0_shadow()).AttachTo(Content).y = 128 + 16;
                new Image(textures_map.tree0()).AttachTo(Content).y = 128;

                // can I have 
                // new ped, hind, jeep, tank
                current = new PhysicalPed(textures_ped, this);


                // 12 = 34FPS
                #region other units
                for (int i = 3; i < 9; i++)
                {
                    var cannon2 = new PhysicalCannon(textures_cannon, this);

                    cannon2.SetPositionAndAngle(
                        i * 16, -32, random.NextDouble()
                    );



                    if (i % 3 == 0)
                    {
                        new PhysicalBunker(textures_bunker, this).SetPositionAndAngle(
                            i * 16, -16, random.NextDouble()
                        );
                    }
                    else if (i % 3 == 1)
                    {
                        new PhysicalWatertower(textures_bunker, this).SetPositionAndAngle(
                            i * 16, -16, random.NextDouble()
                        );
                    }
                    else
                    {
                        new PhysicalSilo(textures_bunker, this).SetPositionAndAngle(
                            i * 16, -16, random.NextDouble()
                        );
                    }

                    var hind2 = new PhysicalHindWeaponized(textures_hind, textures_rocket, this)
                    {
                        AutomaticTakeoff = true
                    };

                    hind2.SetPositionAndAngle(
                        i * 16, 8, random.NextDouble()
                    );


                    var jeep2 = new PhysicalJeep(textures_jeep, this);


                    jeep2.SetPositionAndAngle(
                        i * 16, 16, random.NextDouble()
                    );



                    var tank2 = new PhysicalTank(textures_tank, this);

                    tank2.SetPositionAndAngle(
                        i * 16, 24, random.NextDouble()
                    );


                    var ped2 = new PhysicalPed(textures_ped, this);

                    ped2.SetPositionAndAngle(
                        i * 16, 32, random.NextDouble()
                    );


                }
                #endregion




                #region __keyDown

                stage.keyDown +=
                   e =>
                   {
                       // http://circlecube.com/2008/08/actionscript-key-listener-tutorial/
                       if (e.altKey)
                           __keyDown[System.Windows.Forms.Keys.Alt] = true;

                       __keyDown[(System.Windows.Forms.Keys)e.keyCode] = true;
                   };

                stage.keyUp +=
                 e =>
                 {
                     if (!e.altKey)
                         __keyDown[System.Windows.Forms.Keys.Alt] = false;

                     __keyDown[(System.Windows.Forms.Keys)e.keyCode] = false;
                 };

                #endregion

                bool entermode_changepending = false;
                bool mode_changepending = false;

                onframe +=
                    delegate
                    {
                        #region hud
                        {
                            var cm = new Matrix();

                            cm.scale(0.5, 0.5);
                            cm.translate(16, stage.stageHeight - 64 - 24);

                            hud.transformationMatrix = cm;
                        }
                        #endregion
                    };

                onsyncframe +=
                    delegate
                    {


                        #region entermode_changepending
                        if (!__keyDown[System.Windows.Forms.Keys.Enter])
                        {
                            // space is not down.
                            entermode_changepending = true;
                        }
                        else
                        {
                            if (entermode_changepending)
                            {
                                entermode_changepending = false;

                                // enter another vehicle?

                                var candidatedriver = current as PhysicalPed;
                                if (candidatedriver != null)
                                {
                                    var target =
                                         from candidatevehicle in units
                                         where candidatevehicle.driverseat != null

                                         // can enter if the seat is full.
                                         // unless we kick them out before ofcourse
                                         where candidatevehicle.driverseat.driver == null

                                         let distance = new __vec2(
                                             (float)(candidatedriver.body.GetPosition().x - candidatevehicle.body.GetPosition().x),
                                             (float)(candidatedriver.body.GetPosition().y - candidatevehicle.body.GetPosition().y)
                                         ).GetLength()

                                         where distance < 6

                                         orderby distance ascending
                                         select new { candidatevehicle, distance };

                                    target.FirstOrDefault().With(
                                        x =>
                                        {
                                            Console.WriteLine(new { x.distance });

                                            //current.loc.visible = false;
                                            current.body.SetActive(false);


                                            x.candidatevehicle.driverseat.driver = candidatedriver;
                                            candidatedriver.seatedvehicle = x.candidatevehicle;

                                            current = x.candidatevehicle;

                                            if (current.body.GetType() == Box2D.Dynamics.b2Body.b2_dynamicBody)
                                            {
                                                hud.texture = textures_ped.hud_look_goggles();
                                            }
                                            else
                                            {
                                                hud.texture = textures_ped.hud_look_building();
                                            }

                                            //switchto(x.x);
                                        }
                                    );
                                }
                                else
                                {
                                    (current.driverseat.driver as PhysicalPed).With(
                                        driver =>
                                        {
                                            current.driverseat.driver = null;
                                            driver.seatedvehicle = null;
                                            current.SetVelocityFromInput(new KeySample());

                                            // crashland?
                                            (current as PhysicalHind).With(
                                                hind => hind.VerticalVelocity = -1
                                            );


                                            current = driver;
                                            current.body.SetActive(true);
                                            hud.texture = textures_ped.hud_look();
                                        }
                                    );
                                }

                            }
                        }
                        #endregion



                        #region mode
                        if (!__keyDown[System.Windows.Forms.Keys.Space])
                        {
                            // space is not down.
                            mode_changepending = true;
                        }
                        else
                        {
                            if (mode_changepending)
                            {
                                (current as PhysicalHind).With(
                                    hind1 =>
                                    {
                                        if (hind1.visual.Altitude == 0)
                                            hind1.VerticalVelocity = 1.0;
                                        else
                                            hind1.VerticalVelocity = -0.4;

                                    }
                                );

                                (current as PhysicalPed).With(
                                 physical0 =>
                                 {
                                     if (physical0.visual.LayOnTheGround)
                                         physical0.visual.LayOnTheGround = false;
                                     else
                                         physical0.visual.LayOnTheGround = true;

                                 }
                             );




                                mode_changepending = false;



                            }
                        }
                        #endregion


                        current.SetVelocityFromInput(__keyDown);




                        #region simulate a weapone!
                        if (__keyDown[System.Windows.Forms.Keys.ControlKey])
                            if (syncframeid % 3 == 0)
                            {
                                (this.current as PhysicalHindWeaponized).With(
                                    h =>
                                    {
                                        //sb.snd_missleLaunch.play();

                                        h.FireRocket();
                                    }
                                );

                            }
                        #endregion
                    };
            };
        }