示例#1
0
        public bool TileCollisions(bool tileCollide = true, bool tileTrigger = true, float wallDrag = 0.9f)
        {
            bool collided = false;

            for (int i = -1; i < 2; i++)
            {
                for (int j = -1; j < 2; j++)
                {
                    //if (position == oldPosition)
                    //    return collided; disabled because may cause issues with OnCollide hooks on some tiles, enable later and try again
                    Point currentTilePos = Center.WorldToTileCoords() + new Point(i, j);
                    if (currentWorld.IsTileInWorld(currentTilePos))
                    {
                        //these are by reference iirc
                        FloorBase floorBase = currentWorld.floorLayer[currentTilePos.X, currentTilePos.Y].Base;
                        if (Collide(currentTilePos, floorBase.CollisionRect(), tileCollide ? floorBase.IsSolid() : false) && tileTrigger)
                        {
                            //TODO TODO
                        }

                        WallBase wallBase = currentWorld.wallLayer[currentTilePos.X, currentTilePos.Y].Base;
                        if (Collide(currentTilePos, wallBase.CollisionRect(), tileCollide ? wallBase.IsSolid() : false) && tileTrigger)
                        {
                            //TODO TODO
                        }

                        ObjectBase objectBase = currentWorld.objectLayer[currentTilePos.X, currentTilePos.Y].Base;
                        if (Collide(currentTilePos, objectBase.CollisionRect(), tileCollide ? objectBase.IsSolid() : false) && tileTrigger)
                        {
                            //TODO //tileBase.OnCollide(this)
                        }
                    }
                }
            }
            return(collided);

            bool Collide(Point location, Rectangle[] rectList, bool solid)
            {
                bool hasCollided = false;

                foreach (Rectangle tileRect in rectList)
                {
                    Rectangle testRect = new Rectangle(location.TileToWorldCoords() + tileRect.Location, tileRect.Size);

                    if (testRect.Intersects(Rect))
                    {
                        if (solid)//if solid, so position changing stuff, else just return
                        {
                            if (testRect.Intersects(OldRect))
                            {                                                                                   //anti-stuck
                                position += Vector2.Normalize((Rect.Center - testRect.Center).ToVector2()) * 2; //multiplier at the ned is the distance it moves (speed)
                            }
                            else
                            {
                                if (testRect.Intersects(new Rectangle(new Point((int)position.X, (int)oldPosition.Y), size.ToPoint())))
                                {
                                    position.X  = oldPosition.X;
                                    velocity.X  = 0;
                                    velocity.Y *= wallDrag;
                                }
                                if (testRect.Intersects(new Rectangle(new Point((int)oldPosition.X, (int)position.Y), size.ToPoint())))
                                {
                                    position.Y  = oldPosition.Y;
                                    velocity.Y  = 0;
                                    velocity.X *= wallDrag;
                                }
                            }
                        }
                        hasCollided = true;
                    }
                }
                if (hasCollided)
                {
                    collided = true;
                }
                return(hasCollided);
            }
        }