예제 #1
0
파일: MainScene.cs 프로젝트: andi2/ld32-1
        public MainScene()
            : base("Unconventional")
        {
            BackgroundColor = Program.Background;
            Camera.LocalCoord = Engine.Resolution / 2f;

            if (!GameStarted)
            {
                var logo = new LogoElement(Interface, Interface.Size / 2f + new Vector2(0f, 32f));
                var menu = new MenuElement(Interface, new Cog.Vector2(0f, Interface.Size.Y / 2f + logo.Size.Y + 8f), Program.Font16);
                var info = new TextElement(Interface, new Cog.Vector2(Interface.Size.X / 2f, Interface.Size.Y - 8f), Program.Font12,
                    "A game made in 48 hours for Ludum Dare 32 and LBS Game Awards 2015", Cog.Modules.Renderer.HAlign.Center, Cog.Modules.Renderer.VAlign.Bottom);

                InterfaceElements.Add(logo);
                InterfaceElements.Add(menu);
                InterfaceElements.Add(info);

                menu.AddOption("Start Game", () =>
                {
                    GameStarted = true;
                });
                menu.AddOption("Quit", () =>
                {
                    Engine.SceneHost.Pop();
                });
            }

            World = CreateObject<World>(Vector2.Zero);

            if (!GameStarted)
            {
                Camera.WorldCoord += new Vector2(328f, 0f);
                startMove = Camera.WorldCoord;
            }

            if (World.LevelNum > 0)
            {
                moveProgress = -1f;
            }

            RegisterEvent<UpdateEvent>(0, Update);
        }
예제 #2
0
        public virtual void PhysicsUpdate(PhysicsUpdateEvent ev)
        {
            World = ((MainScene)Scene).World;
            Speed.Y += Gravity * ev.DeltaTime;

            relPosAcc += Speed * ev.DeltaTime;

            while (Mathf.Abs(relPosAcc.X) >= 1f)
            {
                int sign = relPosAcc.X > 0f ? 1 : -1;
                if (IsFree(new Vector2(sign, 0f)))
                {
                    if (!IsFree(new Vector2(0f, 1f)) && IsFree(new Vector2(sign, 1f)))
                    {
                        if (!IsFree(new Vector2(sign, 2f)))
                            LocalCoord += new Vector2(0f, 1f);
                        else if (!IsFree(new Vector2(sign, 3f)))
                            LocalCoord += new Vector2(0f, 2f);
                    }
                    LocalCoord += new Vector2(sign, 0f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -1f)))
                {
                    LocalCoord += new Vector2(sign, -1f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -2f)))
                {
                    LocalCoord += new Vector2(sign, -2f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -3f)))
                {
                    LocalCoord += new Vector2(sign, -3f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -4f)))
                {
                    LocalCoord += new Vector2(sign, -4f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -5f)))
                {
                    LocalCoord += new Vector2(sign, -5f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -6f)))
                {
                    LocalCoord += new Vector2(sign, -6f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -7f)))
                {
                    LocalCoord += new Vector2(sign, -7f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -8f)))
                {
                    LocalCoord += new Vector2(sign, -8f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -9f)))
                {
                    LocalCoord += new Vector2(sign, -9f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -10f)))
                {
                    LocalCoord += new Vector2(sign, -10f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -11f)))
                {
                    LocalCoord += new Vector2(sign, -11f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -12f)))
                {
                    LocalCoord += new Vector2(sign, -12f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -13f)))
                {
                    LocalCoord += new Vector2(sign, -13f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -14f)))
                {
                    LocalCoord += new Vector2(sign, -14f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -15f)))
                {
                    LocalCoord += new Vector2(sign, -15f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -16f)))
                {
                    LocalCoord += new Vector2(sign, -16f);
                    relPosAcc.X -= sign;
                }
                else
                {
                    relPosAcc.X = 0f;
                    Speed.X = 0f;
                    break;
                }
            }
            while (Mathf.Abs(relPosAcc.Y) >= 1f)
            {
                int sign = relPosAcc.Y > 0f ? 1 : -1;
                if (IsFree(new Vector2(0f, sign)))
                {
                    LocalCoord += new Vector2(0f, sign);
                    relPosAcc.Y -= sign;
                }
                else
                {
                    if (Speed.Y >= 200f)
                    {
                        const int count = 10;
                        Program.Ground.Play();

                        for (int i = 0; i < count; i++)
                        {
                            dustSystem.Add(new Particle
                            {
                                Coordinate = WorldCoord + new Vector2(-Size.X / 2f + ((float)i / ((float)count - 1f)) * Size.X * .5f, Size.Y / 2f),
                                Scale = new Vector2(4f, 4f),
                                Speed = new Vector2(-1f, 0f).Rotate(Angle.FromDegree(45f + Engine.RandomFloat() * 90f)) * 200f,
                                Life = 1f + Engine.RandomFloat() * 0.1f,
                            });
                        }
                    }

                    relPosAcc.Y = 0f;
                    Speed.Y = 0f;
                    break;
                }
            }

            ReEvaluateIsOnGround();

            if (IsOnGround)
                Speed.X = Mathf.Max(0f, Mathf.Abs(Speed.X) - GroundFriction * ev.DeltaTime) * (Speed.X < 0f ? -1f : 1f);
            else
                Speed.X = Mathf.Max(0f, Mathf.Abs(Speed.X) - AirFriction * ev.DeltaTime) * (Speed.X < 0f ? -1f : 1f);
        }