예제 #1
0
 private void init()
 {
     //_rigidbody = gameObject.getComponent<Rigidbody>();
     _terrain   = Root.instance.RootObject.getScript <Terrain>();
     _transform = gameObject.transform2();
     _bounds    = AxisAlignedBox.FromDimensions(_transform.DerivedPosition, new Vector2(32, 48));
 }
예제 #2
0
        private void ongui()
        {
            var aabb = AxisAlignedBox.FromDimensions(new Vector2(0, 0), new Vector2(256, 256));

            //var p = _player.transform.DerivedPosition;
            var worldAABB = mainCamera.worldBounds;
            var p0        = worldAABB.Minimum;
            var p1        = worldAABB.Maximum;
            var scale     = 128f / _settings.SectorHalfSize;


            p0.X = Utility.Clamp(p0.X, _settings.SectorHalfSize, -_settings.SectorHalfSize) * scale;
            p0.Y = Utility.Clamp(p0.Y, _settings.SectorHalfSize, -_settings.SectorHalfSize) * scale;
            p1.X = Utility.Clamp(p1.X, _settings.SectorHalfSize, -_settings.SectorHalfSize) * scale;
            p1.Y = Utility.Clamp(p1.Y, _settings.SectorHalfSize, -_settings.SectorHalfSize) * scale;

            worldAABB.SetExtents(p0, p1);
            worldAABB.Center = worldAABB.Center;

            aabb.Center      += transform.DerivedPosition;
            worldAABB.Center += transform.DerivedPosition;

            graphics.Draw(aabb, new Color(Color.Black, 0.5f));
            graphics.DrawRect(aabb, new Color(Color.Green, 0.5f));

            var aliens = _targets.get(Vector2.Zero, _settings.SectorSize, TargetFilters.Aliens);

            foreach (var alien in aliens)
            {
                var p = alien.transform.DerivedPosition * scale;
                graphics.DrawRect(AxisAlignedBox.FromDimensions(p + transform.DerivedPosition, Vector2.One * 2), new Color(Color.Red, 0.5f));
            }

            graphics.DrawRect(worldAABB, new Color(Color.White, 0.5f));
        }
예제 #3
0
        private void fixedupdate()
        {
            var thisSprite = this.gameObject.getScript <Sprite>();
            var thisaabb   = AxisAlignedBox.FromDimensions(transform.DerivedPosition, thisSprite.size);
            var player     = rootObject.find("player");

            if (player != null)
            {
                var playerSprite = player.getScriptWithChildren <Sprite>();
                var playeraabb   = AxisAlignedBox.FromDimensions(player.transform.DerivedPosition, playerSprite.size);

                if (playeraabb.Intersects(thisaabb))
                {
                    var playerController = player.getScriptWithChildren <PlayerController>();
                    this.gameObject.destroy();
                    if (type == PowerUpType.Damage)
                    {
                        playerController.damageModifier += 0.1f;
                    }
                    else if (type == PowerUpType.Defense)
                    {
                        playerController.defenseModifier += 0.1f;
                    }
                    //else if (type == PowerUpType.Speed)
                    //    playerController.MaxAcceleration += 0.5f;
                }
            }
        }
예제 #4
0
        private void queryBroadphaseAABB(CollisionQuery query, List <Collision> collisions)
        {
            if (query.flag.CheckFlags(Physics.QUERY_WORLD))
            {
                var screenAABB = query.aabb;
                var wx0        = Math.Floor(screenAABB.X0 / tileSize);
                var wx1        = Math.Ceiling(screenAABB.X1 / tileSize);
                var wy0        = Math.Floor(screenAABB.Y0 / tileSize);
                var wy1        = Math.Ceiling(screenAABB.Y1 / tileSize);

                var minX = (int)Math.Max(0, wx0);
                var maxX = (int)Math.Min(_width.Number, wx1);
                var minY = (int)Math.Max(0, wy0);
                var maxY = (int)Math.Min(_height.Number, wy1);

                var hs = tileSize * Game.WORLD_SCALE * Vector2.One;
                //var aabb = AxisAlignedBox.FromRect(Vector2.Zero, hs);
                var mtv = MinimumTranslationVector.Zero;
                for (var y = minY; y < maxY; y++)
                {
                    for (var x = minX; x < maxX; x++)
                    {
                        if (tiles[x, y].tileType != MapTileType.Room)
                        {
                            var aabb = AxisAlignedBox.FromDimensions(new Vector2(x, y) * tileSize * Game.WORLD_SCALE + hs / 2, hs);

                            if (query.aabb.Intersects(aabb))
                            {
                                collisions.Add(new Collision(Physics.QUERY_WORLD, gameObject, aabb));
                            }
                        }
                    }
                }
            }
        }
예제 #5
0
 private void update()
 {
     if (input.WasLeftMousePressed)
     {
         var aabb = AxisAlignedBox.FromDimensions(transform.DerivedPosition, _sprite.material.textureSize);
         var p    = mainCamera.screenToWorld(input.MousePosition);
         if (aabb.Intersects(p))
         {
             gameObject.sendMessage("spriteclicked");
         }
     }
 }
예제 #6
0
        public static GameObject prefabCamera(this GameObject parent)
        {
            var go = parent.createChild("camera");

            go.createScript <Camera>();

            var trackObject = go.createScript <TrackObject>();

            trackObject.objectName   = "player";
            trackObject.keepInBounds = AxisAlignedBox.FromDimensions(Vector2.Zero, new Vector2(300, 150));

            return(go);
        }
예제 #7
0
        public virtual void UpdateBounds()
        {
            if (boundsDirty)
            {
                abb.IsNull = true;
                Vector3 widthVector = Vector3.Zero;
                foreach (ChainSegment seg in chainSegmentList)
                {
                    if (seg.head != SEGMENT_EMPTY)
                    {
                        for (int e = seg.head; ; ++e)
                        {
                            // Wrap forwards
                            if (e == maxElementsPerChain)
                            {
                                e = 0;
                            }
                            Element elem = chainElementList[seg.start + e];
                            widthVector.x = widthVector.y = widthVector.z = elem.width;
                            abb           = AxisAlignedBox.FromDimensions(elem.position, widthVector * 2.0f);

                            if (e == seg.tail)
                            {
                                break;
                            }
                        }
                    }
                }
                // Set the current radius
                if (abb.IsNull)
                {
                    boundingRadius = 0.0f;
                }
                else
                {
                    boundingRadius = (float)Math.Sqrt(Math.Max(abb.Minimum.LengthSquared, abb.Maximum.LengthSquared));
                }
                boundsDirty = false;
            }
        }
예제 #8
0
 protected override void onInit()
 {
     inited = true;
     _shape = new Shape(AxisAlignedBox.FromDimensions(_offset, _size));
 }
예제 #9
0
 private void render()
 {
     graphics.DrawRect(19, AxisAlignedBox.FromDimensions(Vector2.Zero, SectorSize * Vector2.One), Color.Pink);
 }
예제 #10
0
        private void fixedupdate()
        {
            if (!shape.IsNull)
            {
                var p = gameObject.transform.DerivedPosition;
                shape.Center = p;

                if (_velocity != Vector2.Zero)
                {
                    var m = _velocity * Root.instance.time.deltaTime;

                    var sweep = AxisAlignedBox.FromDimensions(shape.Center, shape.Size);
                    sweep.Center = p + m;
                    sweep.Merge(shape);

                    Root.instance.RootObject.broadcast("queryBroadphaseAABB", new CollisionQuery(QUERY_WORLD, this.gameObject, sweep), broadphase);

                    var dx = Math.Abs(m.X);
                    var dy = Math.Abs(m.Y);
                    var sx = Math.Sign(m.X);
                    var sy = Math.Sign(m.Y);
                    var px = new Vector2(sx, 0);
                    var py = new Vector2(0, sy);

                    while (dx > 0 || dy > 0)
                    {
                        if (dx > dy)
                        {
                            shape.Center = p + px;
                            var collided = hasCollision(shape);
                            if (collided && dy <= 0)
                            {
                                dx = 0;
                            }
                            if (!collided)
                            {
                                p.X += sx;
                            }
                            dx--;
                        }
                        else
                        {
                            shape.Center = p + py;
                            var collided = hasCollision(shape);
                            if (collided && dx <= 0)
                            {
                                dy = 0;
                            }
                            if (!collided)
                            {
                                p.Y += sy;
                            }
                            dy--;
                        }
                    }

                    shape.Center = p;
                    gameObject.transform.DerivedPosition = p;
                }
            }
            broadphase.Clear();
        }