コード例 #1
0
        //===========================================================

        /*-------------------------------------
         *
         * Translate function
         *
         * moves the block position, at the
         * gamelogic level, I am unconcerned
         * about what is happening with the
         * pixels on-screen.
         *
         * ---------------------------------*/

        public void BlockTranslate(int deltaX, int deltaY)
        {
            BlockPosition.X += deltaX;
            BlockPosition.Y += deltaY;

            //-- now update the collision zone

            CollisionZone.Translate(deltaX, deltaY);
        }
コード例 #2
0
        public void TestCollisionZoneCollision()
        {
            CollisionZone <Bullet> TestCollisionZone = new CollisionZone <Bullet>(2000, 100, -500, -500);

            Vector2[] LocalPoints1 = CreateCube(Vector2.Zero, 40);
            Vector2[] LocalPoints2 = CreateCube(Vector2.Zero, 40);

            TestCollisionZone.AddToZone(new Bullet(null, LocalPoints1, 5, 5));
            TestCollisionZone.AddToZone(new Bullet(null, LocalPoints2, 5, 5));
            Assert.AreEqual(true, DetectCollisionBetweenSelfAndOthers(TestCollisionZone, TestCollisionZone.ListObjectInZoneAndOverlappingParents.First.Value));
        }
コード例 #3
0
        private static void BuildZone(int key2, int XPos, int YPos, QuadTree quad, int key3 = 0)
        {
            CollisionZone ca = null;

            switch (key2)
            {
            case 'C':
                ca                  = CollisionZoneFactory.Instance.CheckpointZone(new Point(XPos, 0), new Point(40, quad.Bounds.Height));
                ca.LookingFor       = AbstractEntity.EntityType.Mario;
                ca.Position         = new Vector2(XPos, YPos);
                ca.RaiseEnterEvent += Stage.HandleCheckpoint;
                break;

            case 'F':
                ca                  = CollisionZoneFactory.Instance.Flag(new Point(XPos + 16, YPos));
                ca.Position         = new Vector2(XPos + 16, YPos);
                ca.RaiseEnterEvent += Stage.HandleGameEnd;
                ca.LookingFor       = AbstractEntity.EntityType.Mario;
                break;

            case 'A':
                ca          = CollisionZoneFactory.Instance.Castle(new Point(XPos, YPos));
                ca.Position = new Vector2(XPos, YPos);
                break;

            case 'S':
                ca                             = CollisionZoneFactory.Instance.SmallDoor(new Point(XPos, YPos));
                ca.Position                    = new Vector2(XPos, YPos);
                ((WarpZone)ca).NextArea        = key3 - '0';
                ca.RaiseEnterEvent            += Stage.level.HandleInteractEnter;
                ca.RaiseLeaveEvent            += Stage.level.HandleInteractLeave;
                ((WarpZone)ca).RaiseWarpEvent += Stage.HandleWarp;
                ca.LookingFor                  = AbstractEntity.EntityType.Mario;
                break;

            case 'L':
                ca          = CollisionZoneFactory.Instance.LockedDoorZone(new Point(XPos, YPos));
                ca.Position = new Vector2(XPos, YPos);
                for (int i = 0; i < 4; i++)
                {
                    KeyHoleBlock b = (KeyHoleBlock)BlockFactory.Instance.KeyHoleBlock();
                    b.Position = new Vector2(XPos + 32 * (i - 1), YPos - b.Texture.Height - 32);
                    ((LockedDoor)ca).KeyHoles.Add(b);
                    quad.Insert(b);
                }
                ca.LookingFor                  = AbstractEntity.EntityType.Mario;
                ca.RaiseEnterEvent            += Stage.level.HandleInteractEnter;
                ca.RaiseLeaveEvent            += Stage.level.HandleInteractLeave;
                ((WarpZone)ca).NextArea        = key3 - '0';
                ((WarpZone)ca).RaiseWarpEvent += Stage.HandleWarp;
                break;
            }
            quad.Insert(ca);
        }
コード例 #4
0
        private bool DetectCollisionBetweenSelfAndOthers(CollisionZone <Bullet> BulletCollisions, Bullet ActiveBullet)
        {
            System.Collections.Generic.HashSet <Bullet> Obstacles = BulletCollisions.GetCollidableObjects(ActiveBullet);
            foreach (Bullet ActivePlayer in Obstacles)
            {
                if (ActivePlayer.Collision.CollideWith(ActiveBullet.Collision, Vector2.Zero, out _, out _, out _))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #5
0
        public void TestCollisionZoneAdd()
        {
            CollisionZone <Bullet> TestCollisionZone = new CollisionZone <Bullet>(2000, 100, -500, -500);

            Vector2[] LocalPoints1 = CreateCube(Vector2.Zero, 40);
            Vector2[] LocalPoints2 = CreateCube(Vector2.Zero, 5);

            TestCollisionZone.AddToZone(new Bullet(null, LocalPoints1, 5, 5));
            TestCollisionZone.AddToZone(new Bullet(null, LocalPoints2, 5, 5));
            Assert.AreEqual(2, TestCollisionZone.ListObjectInZoneAndOverlappingParents.Count);
            Assert.AreEqual(2, TestCollisionZone.ArraySubZone[25].ListObjectInZoneAndOverlappingParents.Count);
            Assert.AreEqual(TestCollisionZone.ArraySubZone[25], TestCollisionZone.ListObjectInZoneAndOverlappingParents.First.Value.Collision.ListParent.Find(TestCollisionZone.ArraySubZone[25]).Value);
            Assert.AreEqual(TestCollisionZone.ArraySubZone[25], TestCollisionZone.ListObjectInZoneAndOverlappingParents.First.Next.Value.Collision.ListParent.Find(TestCollisionZone.ArraySubZone[25]).Value);
        }
コード例 #6
0
ファイル: Layer.cs プロジェクト: Wargamer3/Project-Eternity
 public Layer(FightingZone Owner)
 {
     ListDelayedOnlineCommand  = new List <DelayedExecutableOnlineScript>();
     WorldCollisions           = new CollisionZone <WorldPolygon>(1, 1, 0, 0);
     ListWorldCollisionPolygon = new List <WorldPolygon>();
     ListImages             = new List <SimpleAnimation>();
     ListProp               = new List <Prop>();
     ListSpawnPointTeam     = new List <SpawnPoint>();
     ListSpawnPointNoTeam   = new List <SpawnPoint>();
     ListVisualEffects      = new List <SimpleAnimation>();
     DicRobot               = new Dictionary <uint, RobotAnimation>();
     DicWeaponDrop          = new Dictionary <uint, WeaponDrop>();
     ListVehicle            = new List <Vehicle>();
     ListRobotToAdd         = new List <RobotAnimation>();
     ListRobotToRemove      = new List <uint>();
     ListWeaponDropToAdd    = new List <WeaponDrop>();
     ListWeaponDropToRemove = new List <uint>();
     GroundLevelCollision   = new Polygon();
     ListAttackCollisionBox = new List <Projectile>();
     this.Owner             = Owner;
 }
コード例 #7
0
        public void UpdateCollisionZone(CollisionZone cz)
        {
            //return;

            Vector3 hitNormal = Vector3.zero;
            float   hitDist   = 0;
            int     count     = 0;
            float   radius    = cz.radius * VertExmotionBase.GetScaleFactor(transform);

            Vector3 collisionCenter = transform.TransformPoint(cz.positionOffset);// transform.position + transform.rotation * cz.positionOffset;

            cz.collisionVector = Vector3.zero;

            if (Physics.CheckSphere(collisionCenter, radius, m_layerMask.value))
            {
                cz.collisionVector = Vector3.zero;

                //				//test
                //				Collider[] hitColliders = Physics.OverlapSphere(collisionCenter, m_collisionZones[0].radius, m_layerMask);
                //				int j = 0;
                //				while (j < hitColliders.Length)
                //				{
                //					Debug.Log("collide " + hitColliders[j].name);
                //					hitColliders[j].ClosestPointOnBounds( transform.position );
                //					j++;
                //				}


                for (int a = 0; a < 6; ++a)//WIP : check collision on each axis
                //int a = 0;
                {
                    Vector3 dir = Vector3.zero;
                    switch (a)
                    {
                    case 0: dir = m_sensor.transform.forward; break;

                    case 1: dir = -m_sensor.transform.forward; break;

                    case 2: dir = m_sensor.transform.up; break;

                    case 3: dir = -m_sensor.transform.up; break;

                    case 4: dir = m_sensor.transform.right; break;

                    case 5: dir = -m_sensor.transform.right; break;
                    }


                    //cz.hits = Physics.SphereCastAll(collisionCenter - dir * radius / 2f, radius * m_collisionScaleFactor, dir, radius / 2f, m_layerMask.value, QueryTriggerInteraction.Collide);
                    cz.hits = Physics.SphereCastAll(collisionCenter - dir * radius, radius * m_collisionScaleFactor, dir, radius, m_layerMask.value, QueryTriggerInteraction.Collide);



                    for (int i = 0; i < cz.hits.Length; ++i)
                    {
                        //Debug.Log("collision "+Vector3.Distance (cz.hits [i].point, collisionCenter));

                        //Debug.DrawLine(cz.hits[i].collider.ClosestPointOnBounds(transform.position), transform.position);

                        if (m_ignoreColliders.Contains(cz.hits[i].collider))
                        {
                            continue;
                        }

                        Vector3 hitPos = cz.hits[i].point;

                        float debugoffset = .01f;
#if KVTM_DEBUG
                        Debug.DrawLine(cz.hits[i].collider.ClosestPointOnBounds(transform.position) + Vector3.up * a * debugoffset, transform.position + Vector3.up * a * debugoffset, Color.blue);
#endif
                        //Vector3 hitPos = cz.hits [i].collider.ClosestPointOnBounds(transform.position);

                        //if (Vector3.Distance (cz.hits [i].point, collisionCenter) < radius  )
                        if (Vector3.Distance(hitPos, collisionCenter) < radius)
                        {
                            /*
                             * hitNormal = cz.hits[i].normal.normalized;
                             * //hitNormal += (collisionCenter-cz.hits [i].point ).normalized;
                             * hitNormal += (collisionCenter - hitPos).normalized;
                             * hitNormal.Normalize();
                             */

                            hitNormal = -(hitPos - collisionCenter).normalized;


                            //if (Vector3.Dot ((transform.position - hits [i].point).normalized, hits [i].normal) >= 0)
                            if (Vector3.Dot((collisionCenter - hitPos).normalized, -dir) > 0)
                            {
                                //hitDist += (radius - Vector3.Distance(hitPos, collisionCenter));
                                hitDist += (radius - Vector3.Distance(hitPos, collisionCenter)) / 6f;
                                count++;
                            } /*
                               * else
                               * {
                               * if (cz.hits[i].collider as SphereCollider == null)
                               * {
                               *     hitNormal = (-dir + cz.hits[i].normal).normalized;
                               *     hitDist = radius;
                               * }
                               * else
                               * {
                               *     hitNormal = cz.hits[i].normal.normalized;
                               *     hitDist = radius - Vector3.Distance(hitPos, collisionCenter);
                               * }
                               * }*/
                             //count++;
                        }     /*
                               *             else
                               *             {
                               *                     hitDist = cz.radius;
                               *                     hitNormal = (-m_sensor.transform.forward + cz.hits[i].normal).normalized;
                               *             }*/
                    }

                    if (count > 0)
                    {
                        cz.collisionVector += hitNormal.normalized * hitDist * 2f;
                    }/*
                      * else
                      * {
                      * cz.collisionVector += hitNormal.normalized * radius * 2f;
                      * }*/
                }

                //cz.collisionVector /= 6f;
            }
            else
            {
                cz.collisionVector = Vector3.zero;
            }
        }
コード例 #8
0
ファイル: Layer.cs プロジェクト: Wargamer3/Project-Eternity
        public Layer(FightingZone Owner, BinaryReader BR)
            : this(Owner)
        {
            Dictionary <string, Prop> DicPropsByName = Prop.GetAllPropsByName();

            int ListPolygonCount = BR.ReadInt32();
            WorldCollisions = new CollisionZone <WorldPolygon>((int)Math.Max(Owner.CameraBounds.Width * 1.5, Owner.CameraBounds.Height * 1.5),
                                                               50,
                                                               (int)(Math.Min(Owner.CameraBounds.X * 1.5, -Owner.CameraBounds.X * 1.5)),
                                                               (int)(Math.Min(Owner.CameraBounds.Y * 1.5, -Owner.CameraBounds.Y * 1.5)));

            for (int P = 0; P < ListPolygonCount; P++)
            {
                int ArrayVertexCount = BR.ReadInt32();

                Vector2[] ArrayVertex = new Vector2[ArrayVertexCount];
                for (int V = 0; V < ArrayVertexCount; V++)
                {
                    ArrayVertex[V] = new Vector2(BR.ReadSingle(), BR.ReadSingle());
                }

                bool BlockBullets = BR.ReadBoolean();
                bool IsPlatform   = BR.ReadBoolean();

                WorldPolygon NewPolygon;
                if (GameScreen.GraphicsDevice != null)
                {
                    NewPolygon = new WorldPolygon(ArrayVertex, GameScreen.GraphicsDevice.PresentationParameters.BackBufferWidth, GameScreen.GraphicsDevice.PresentationParameters.BackBufferHeight);
                }
                else
                {
                    NewPolygon = new WorldPolygon(ArrayVertex, 1, 1);
                }

                NewPolygon.BlockBullets = BlockBullets;
                NewPolygon.IsPlatform   = IsPlatform;

                NewPolygon.Collision.ListCollisionPolygon[0].ComputerCenter();
                WorldCollisions.AddToZone(NewPolygon);
                ListWorldCollisionPolygon.Add(NewPolygon);
            }

            int       ArrayGroundLevelCollisionCount = BR.ReadInt32();
            Vector2[] ArrayGroundLevelCollision      = new Vector2[ArrayGroundLevelCollisionCount];
            for (int V = 0; V < ArrayGroundLevelCollisionCount; V++)
            {
                ArrayGroundLevelCollision[V] = new Vector2(BR.ReadSingle(), BR.ReadSingle());
            }
            short[] ArrayGroundLevelCollisionIndex = new short[2];
            ArrayGroundLevelCollisionIndex[0] = 0;
            ArrayGroundLevelCollisionIndex[1] = 1;

            if (GameScreen.GraphicsDevice != null)
            {
                GroundLevelCollision = new Polygon(ArrayGroundLevelCollision, ArrayGroundLevelCollisionIndex, GameScreen.GraphicsDevice.PresentationParameters.BackBufferWidth, GameScreen.GraphicsDevice.PresentationParameters.BackBufferHeight);
            }
            else
            {
                GroundLevelCollision = new Polygon(ArrayGroundLevelCollision, ArrayGroundLevelCollisionIndex, 1, 1);
            }

            int ListImagesCount = BR.ReadInt32();
            ListImages = new List <SimpleAnimation>(ListImagesCount);
            for (int P = 0; P < ListImagesCount; P++)
            {
                SimpleAnimation NewBackground = new SimpleAnimation(BR, true);
                NewBackground.Position = new Vector2(BR.ReadSingle(), BR.ReadSingle());
                NewBackground.Depth    = BR.ReadSingle();

                if (!Owner.IsServer)
                {
                    NewBackground.Load(Owner.Content, "");
                    ListImages.Add(NewBackground);
                }
            }

            int ListPropCount = BR.ReadInt32();
            for (int P = 0; P < ListPropCount; ++P)
            {
                string PropName = BR.ReadString();
                Prop   NewProp  = DicPropsByName[PropName].Copy();
                NewProp.Load(BR, Owner.Content, this, Owner);

                //Props are Client side only.
                if (NewProp.CanRunOnServer || !Owner.IsServer)
                {
                    ListProp.Add(NewProp);
                }
            }

            int ListSpawnPointSPCount = BR.ReadInt32();
            for (int S = 0; S < ListSpawnPointSPCount; ++S)
            {
                ListSpawnPointTeam.Add(SpawnPoint.Load(BR));
            }

            int ListSpawnPointMPCount = BR.ReadInt32();
            for (int S = 0; S < ListSpawnPointMPCount; ++S)
            {
                ListSpawnPointTeam.Add(SpawnPoint.Load(BR));
            }
        }
コード例 #9
0
        private static IBlock BuildBlock(int key2, int key3, int key4, int XPos, int YPos, QuadTree quad, string code, List <Button> buttons)
        {
            IBlock block = null;

            switch (key2)
            {
            case 'A':
                foreach (Button button in buttons)
                {
                    if (!button.Set)
                    {
                        block      = button;
                        button.Set = true;
                        break;
                    }
                }
                break;

            case 'B':
                block = BlockFactory.Instance.BrickBlock();
                if (code.Length == 4)
                {
                    int i = 0;
                    while (code[3] - '0' > i)
                    {
                        BlockCommand(key3, block);
                        i++;
                    }
                }
                else
                {
                    BlockCommand(key3, block);
                }
                break;

            case 'C':
                if (code.Length == 6)
                {
                    block = BlockFactory.Instance.DisappearingBlockSkin((char)key4, char.Parse(code.Substring(4, 1)), char.Parse(code.Substring(5, 1)));
                }
                else if (code.Length == 5)
                {
                    block = BlockFactory.Instance.DisappearingBlockSkin((char)key4, char.Parse(code.Substring(4, 1)));
                }
                else
                {
                    block = BlockFactory.Instance.DisappearingBlockSkin((char)key4);
                }
                buttons[key3 - '0'].RaisePressEvent += ((DisappearingBlock)block).HandleButtonPress;
                break;

            case 'F':
                switch (key3)
                {
                case 'U':
                    block = CreateUndergroundBlock(code[3]);
                    break;

                case 'C':
                    block = BlockFactory.Instance.CastleFloorBlock();
                    break;

                default:
                    block = BlockFactory.Instance.FloorBlock();
                    if (key3 == 'Z')
                    {
                        block.Collidable = false;
                    }
                    break;
                }
                break;

            case 'P':
                block = BuildPipeBlock(key3);
                break;

            case 'Q':
                QuestionBlock qb = BlockFactory.Instance.QuestionBlockQ();
                qb.Position = new Vector2(XPos, YPos);
                ICommand qcmd = null;
                //if key2 == Q, then there valid key3
                switch (key3)
                {
                case 'C':
                    qcmd = new CoinItemCommand(qb);
                    break;

                case 'M':
                    qcmd = new SuperMushroomItemCommand(qb);
                    break;

                case 'F':
                    qcmd = new FireFlowerItemCommand(qb);
                    break;

                case 'S':
                    qcmd = new StarItemCommand(qb);
                    break;

                case 'O':
                    qcmd = new OneUpMushroomItemCommand(qb);
                    break;

                case 'H':
                    block = BlockFactory.Instance.HiddenQuestionBlock();
                    BlockCommand(key3, block);
                    break;

                case 'U':
                    qb.Position = new Vector2(XPos, YPos);
                    qb.StraightToUsed();
                    break;

                default:
                    block = BlockFactory.Instance.QuestionBlock();
                    break;
                }
                if (qcmd != null)
                {
                    quad.Insert(qb);
                    qb.AddCommand(qcmd);
                }
                break;

            case 'R':
                block = BlockFactory.Instance.RockBlock();
                Point size = new Point()
                {
                    X = block.Texture.Width / 3,
                    Y = block.Texture.Height / 3
                };

                block.SourceRectangle = BlockPart(key3, key4, size);
                break;

            case 'T':
                block = BlockFactory.Instance.ToggleBlock();
                for (int i = 3; i < code.Length; i++)
                {
                    buttons[code[i] - '0'].RaisePressEvent += ((ToggleBlock)block).HandleButtonPress;
                }
                if (code[2] == 'H')
                {
                    block.SourceRectangle       = new Rectangle(new Point(0), new Point(block.Texture.Width, block.Texture.Height / 2));
                    block.Collidable            = false;
                    ((ToggleBlock)block).StartY = block.SourceRectangle.Y;
                }
                else
                {
                    block.SourceRectangle       = new Rectangle(new Point(0, block.Texture.Height / 2), new Point(block.Texture.Width, block.Texture.Height / 2));
                    ((ToggleBlock)block).StartY = 32;
                }
                break;

            case 'H':
                block = BlockFactory.Instance.HiddenBrickBlock();
                break;

            case 'W':
                switch (key3)
                {
                case 'U':
                    block = BlockFactory.Instance.WarpUpTop();
                    break;

                case 'L':
                    block = BlockFactory.Instance.WarpLeft();
                    break;

                case 'R':
                    block = BlockFactory.Instance.WarpRight();
                    break;
                }
                ((WarpEntranceBlock)block).Warp            = key4 - '0';
                ((WarpEntranceBlock)block).RaiseWarpEvent += Stage.HandleWarp;
                break;

            case 'I':
                EntityWarpBlock warpBlock = (EntityWarpBlock)BlockFactory.Instance.WarpEntityTop();
                ICommand        wCommand  = null;
                switch (key3)
                {
                case 'C':
                    wCommand = new CoinItemCommand(warpBlock);
                    break;

                case 'M':
                    wCommand = new SuperMushroomItemCommand(warpBlock);
                    break;

                case 'F':
                    wCommand = new FireFlowerItemCommand(warpBlock);
                    break;

                case 'S':
                    wCommand = new StarItemCommand(warpBlock);
                    break;

                case 'O':
                    wCommand = new OneUpMushroomItemCommand(warpBlock);
                    break;

                case 'G':
                    wCommand = new CreateEnemyCommand(AbstractEntity.EntityType.Goomba, warpBlock);
                    break;

                case 'K':
                    wCommand = new CreateEnemyCommand(AbstractEntity.EntityType.GreenKoopa, warpBlock);
                    break;

                case 'R':
                    wCommand = new CreateEnemyCommand(AbstractEntity.EntityType.RedKoop, warpBlock);
                    break;

                case 'P':
                    wCommand = new CreateEnemyCommand(AbstractEntity.EntityType.PiranhaPlant, warpBlock);
                    break;
                }
                warpBlock.Command  = wCommand;
                warpBlock.Position = new Vector2(XPos, YPos);
                Rectangle box = warpBlock.CollisionBox;
                box.X     -= box.Width / 2;
                box.Width *= 2;
                box.Y      = warpBlock.CollisionBox.Y - warpBlock.TrueHeight();
                box.Height = (int)(quad.Bounds.Height - YPos + warpBlock.CollisionBox.Height * 1.5);
                CollisionZone hz = new CollisionZone(box)
                {
                    LookingFor = AbstractEntity.EntityType.Mario
                };
                hz.RaiseEnterEvent += warpBlock.HandleEnterEvent;
                hz.RaiseLeaveEvent += warpBlock.HandleLeaveEvent;
                quad.Insert(warpBlock);
                quad.Insert(hz);
                break;

            case 'Y':
                block = BlockFactory.Instance.PyramidBlock();
                break;
            }
            return(block);
        }