Esempio n. 1
0
        public RayCollisions <G> currentRayCollisions <G>(Vector offset, Vector direction) where G : GameObject
        {
            Vector rayStart = Position + offset;
            Vector rayDir   = direction.UnitSafe;

            RayCollisions <G> rayList = new RayCollisions <G>();

            List <G> all = objectManager.getAllObjectsOfType <G>();

            all.ForEach(gob =>
            {
                if (gob != this)
                {
                    RayCollisionInfo info = gob.Bounds.getRayCollisionInfo(rayStart, rayDir);
                    if (info != null)
                    {
                        rayList.Add(new RayCollision <G>(info, gob));
                    }
                }
            });

            rayList.Sort((rc1, rc2) => { if (rc1.Length > rc2.Length)
                                         {
                                             return(1);
                                         }
                                         else
                                         {
                                             return(-1);
                                         } });

            return(rayList);
        }
Esempio n. 2
0
        public override void onUpdate()
        {
            Vector dir = Input.MousePosition - Level.Camera.getScreenCoordinate(Gob.Position);


            dir = Vector.Zero;
            if (Input.isKeyDown(Keys.Right))
            {
                dir.X += 1;
            }
            if (Input.isKeyDown(Keys.Left))
            {
                dir.X -= 1;
            }
            if (Input.isKeyDown(Keys.Up))
            {
                dir.Y -= 1;
            }
            if (Input.isKeyDown(Keys.Down))
            {
                dir.Y += 1;
            }
            if (dir.Equals(Vector.Zero))
            {
                dir.X = Math.Sign(Gob.Velocity.X);
            }
            dir = dir.UnitSafe;

            Gob.LookAngle = dir.Angle - (float)Math.PI / 2;



            Vector start = Gob.GunTipPosition - Gob.Position;


            RayCollisions <Wall> rayColls = Gob.currentRayCollisions <Wall>(start, dir);

            RayCollision rc = null;

            if (rayColls.Count > 0)
            {
                rc = rayColls[0];
                target.Position = rc.ContactPoint;
            }

            RayCollisions <Drone> badguyColls = Gob.currentRayCollisions <Drone>(start, dir);

            if (badguyColls.Count > 0)
            {
                if (rc == null || rc.Length > badguyColls[0].Length)
                {
                    rc = badguyColls[0];
                    target.Position = rc.ContactPoint;
                }
            }

            RayCollisions <Worm> badguyCollsWorms = Gob.currentRayCollisions <Worm>(start, dir);

            if (badguyCollsWorms.Count > 0)
            {
                if (rc == null || rc.Length > badguyCollsWorms[0].Length)
                {
                    rc = badguyCollsWorms[0];
                    target.Position = rc.ContactPoint;
                }
            }


            RayCollisions <FlyBug> badguyCollsBugs = Gob.currentRayCollisions <FlyBug>(start, dir);

            if (badguyCollsBugs.Count > 0)
            {
                if (rc == null || rc.Length > badguyCollsBugs[0].Length)
                {
                    rc = badguyCollsBugs[0];
                    target.Position = rc.ContactPoint;
                }
            }


            if (rayColls.Count > 0)
            {
                target.Position = rc.ContactPoint;
                Vector screenPos = Level.Camera.getScreenCoordinate(Gob.GunTipPosition);

                Bounds           b    = new Bounds(Vector.Zero, new Vector(ScreenWidth, ScreenHeight), 0);
                RayCollisionInfo info = b.getRayCollisionInfo(screenPos, (rc.RayDirection));
                if (info != null)
                {
                    screenPos = info.ContactPoint;

                    screenPos = Level.Camera.getGameCoordinate(screenPos);

                    if ((screenPos - Gob.GunTipPosition).Length < (Gob.GunTipPosition - target.Position).Length)
                    {
                        target.Position = screenPos;
                    }
                }
            }

            bool space = Input.isNewKeyDown(Keys.LeftShift) || Input.isNewKeyDown(Keys.RightControl);

            if (space)
            {
                Log.debug("space");
            }
            if (space && rc != null)
            {
                Log.debug("shoot");
                laserSound.duplicate().setVolume(.4f).play();
                //laserSound.Pan = 0;


                if (rc is RayCollision <Drone> )
                {
                    RayCollision <Drone> brc = (RayCollision <Drone>)rc;
                    brc.Gob.close();
                }

//		            if (rc is RayCollision<Worm>){
//		                RayCollision<Worm> brc = (RayCollision<Worm>) rc;
//		                brc.Gob.close();
//		            }

                if (rc is RayCollision <FlyBug> )
                {
                    RayCollision <FlyBug> brc = (RayCollision <FlyBug>)rc;
                    brc.Gob.close();
                }


                float height = (Rand.Instance.nextFloat() * 20 - 10);

                Tracer tracer = new Tracer(Level);
                tracer.Light.Visible = true;
                float scaleAmt = .9f - (Rand.Instance.nextFloat() * .45f);
                scaleAmt               = 1;
                tracer.Sprite.Scale    = new Vector((rc.Length - 0) * scaleAmt / 10f, .5f + (Rand.Instance.nextFloat() * .3f - .15f));
                tracer.Sprite.Rotation = rc.RayDirection.Angle;
                tracer.Position        = (rc.ContactPoint + rc.RayStart) / 2;
                tracer.Sprite.Color    = Rand.Instance.nextColorVariation(Color.DarkOrange, .1f, .1f, .1f, .2f);
                //tracer.Position += rc.RayDirection * (0 + ((1 - scaleAmt) * (rc.Length)/2 * (Rand.Instance.nextFloat() * 2 - 1)));
                tracer.Position += rc.RayDirection.Perpendicular * height;
                tracer.Decay     = 5;

                tracer = new Tracer(Level);
                tracer.Light.Visible = true;
                //scaleAmt = .9f - (Rand.Instance.nextFloat()*.45f);
                //scaleAmt = (scaleAmt + 0) / 2;
                tracer.Sprite.Scale    = new Vector((rc.Length - 0) * scaleAmt / 10f, .2f + (Rand.Instance.nextFloat() * .3f - .15f));
                tracer.Sprite.Rotation = rc.RayDirection.Angle;
                tracer.Position        = (rc.ContactPoint + rc.RayStart) / 2;
                tracer.Sprite.Color    = Rand.Instance.nextColorVariation(Color.White, .1f, .1f, .1f, 0);
                tracer.Decay           = 4;
                //tracer.Position += rc.rayDirection * (0 + ((1 - scaleAmt) * (rc.Length)/2 * (Rand.Instance.nextFloat() * 2 - 1)));
                //tracer.Position += -rc.RayDirection * (rc.Length/2 - tracer.Sprite.ImageSize.X/2);

                tracer.Position += rc.RayDirection.Perpendicular * height;
                tracer.Dir       = rc.RayDirection;
                tracer.Speed     = 1f;


                SpriteEffect fx = new SpriteEffect(Level);
                fx.Effect        = "smokePlume3";
                fx.Position      = rc.ContactPoint - rc.RayDirection * 10;
                fx.Sprite.Scale *= .4f;
                fx.Frames        = Vector.One * 4;
                fx.Speed         = 2;
                fx.Sprite.Depth  = .3f;
                fx.Sprite.Color  = Color.Orange;
                fx.Light.Visible = true;
                fx.Light.Radius  = 256f;
                float f = 256f;

                fx.OnUpdate = (a) => {
                    f *= .95f;
                    fx.Light.Radius = f;
                };


                fx                 = new SpriteEffect(Level);
                fx.Effect          = "muzzle";
                fx.Position        = rc.RayStart - rc.RayDirection * 10;
                fx.Frames          = new Vector(4, 2);
                fx.Speed           = 2;
                fx.Sprite.Scale   *= .4f;
                fx.Sprite.Rotation = rc.RayDirection.Angle;
                fx.Sprite.Color    = Color.Orange;
            }
        }
Esempio n. 3
0
        public override void onUpdate()
        {
            Vector dir = Input.MousePosition - new Vector(ScreenWidth / 2, ScreenHeight / 2);


            target.Position = Input.MouseGamePosition;
            mouse.Position  = Input.MouseGamePosition;
            Vector start = Gob.GunTipPosition - Gob.Position;
            //dir = Input.MouseGamePosition - start;
            //mouse.Position = Gob.Position + dir.UnitSafe * 200;


            RayCollisions <Wall> rayColls = Gob.currentRayCollisions <Wall>(start, dir);

            RayCollision rc = null;

            if (rayColls.Count > 0)
            {
                rc = rayColls[0];
                target.Position = rc.ContactPoint;
            }

            RayCollisions <Badguy> badguyColls = Gob.currentRayCollisions <Badguy>(start, dir);

            if (badguyColls.Count > 0)
            {
                if (rc == null || rc.Length > badguyColls[0].Length)
                {
                    rc = badguyColls[0];
                    target.Position = rc.ContactPoint;
                }
            }

            if (rc != null)
            {
                Gob.LookAngle = rc.RayDirection.Angle - (float)Math.PI / 2;
            }

            if (rayColls.Count > 0)
            {
                target.Position = rc.ContactPoint;
                Vector screenPos = Level.Camera.getScreenCoordinate(Gob.GunTipPosition);

                Bounds           b    = new Bounds(Vector.Zero, new Vector(ScreenWidth, ScreenHeight), 0);
                RayCollisionInfo info = b.getRayCollisionInfo(screenPos, (rc.RayDirection));
                if (info != null)
                {
                    screenPos = info.ContactPoint;

                    screenPos = Level.Camera.getGameCoordinate(screenPos);

                    if ((screenPos - Gob.GunTipPosition).Length < (Gob.GunTipPosition - target.Position).Length)
                    {
                        target.Position = screenPos;
                    }
                }
            }


            if (Input.isNewMouseDown(MouseButtons.Left) && rc != null)
            {
                laserSound.duplicate().play();
                //laserSound.Pan = 0;


                if (rc is RayCollision <Badguy> )
                {
                    RayCollision <Badguy> brc = (RayCollision <Badguy>)rc;
                    brc.Gob.close();
                }



                float height = (Rand.Instance.nextFloat() * 20 - 10);

                Tracer tracer = new Tracer(Level);
                tracer.Light.Visible = true;
                float scaleAmt = .9f - (Rand.Instance.nextFloat() * .45f);
                scaleAmt               = 1;
                tracer.Sprite.Scale    = new Vector((rc.Length - 0) * scaleAmt / 10f, .5f + (Rand.Instance.nextFloat() * .3f - .15f));
                tracer.Sprite.Rotation = rc.RayDirection.Angle;
                tracer.Position        = (rc.ContactPoint + rc.RayStart) / 2;
                tracer.Sprite.Color    = Rand.Instance.nextColorVariation(Color.DarkOrange, .1f, .1f, .1f, .2f);
                //tracer.Position += rc.RayDirection * (0 + ((1 - scaleAmt) * (rc.Length)/2 * (Rand.Instance.nextFloat() * 2 - 1)));
                tracer.Position += rc.RayDirection.Perpendicular * height;
                tracer.Decay     = 5;

                tracer = new Tracer(Level);
                tracer.Light.Visible = true;
                //scaleAmt = .9f - (Rand.Instance.nextFloat()*.45f);
                //scaleAmt = (scaleAmt + 0) / 2;
                tracer.Sprite.Scale    = new Vector((rc.Length - 0) * scaleAmt / 10f, .2f + (Rand.Instance.nextFloat() * .3f - .15f));
                tracer.Sprite.Rotation = rc.RayDirection.Angle;
                tracer.Position        = (rc.ContactPoint + rc.RayStart) / 2;
                tracer.Sprite.Color    = Rand.Instance.nextColorVariation(Color.White, .1f, .1f, .1f, 0);
                tracer.Decay           = 4;
                //tracer.Position += rc.rayDirection * (0 + ((1 - scaleAmt) * (rc.Length)/2 * (Rand.Instance.nextFloat() * 2 - 1)));
                //tracer.Position += -rc.RayDirection * (rc.Length/2 - tracer.Sprite.ImageSize.X/2);

                tracer.Position += rc.RayDirection.Perpendicular * height;
                tracer.Dir       = rc.RayDirection;
                tracer.Speed     = 1f;


                SpriteEffect fx = new SpriteEffect(Level);
                fx.Effect        = "smokePlume3";
                fx.Position      = rc.ContactPoint - rc.RayDirection * 10;
                fx.Sprite.Scale *= .4f;
                fx.Frames        = Vector.One * 4;
                fx.Speed         = 2;
                fx.Sprite.Color  = Color.Orange;
                fx.Light.Visible = true;
                fx.Light.Radius  = 256f;
                float f = 256f;

                fx.OnUpdate = (a) => {
                    f *= .95f;
                    fx.Light.Radius = f;
                };


                fx                 = new SpriteEffect(Level);
                fx.Effect          = "muzzle";
                fx.Position        = rc.RayStart - rc.RayDirection * 10;
                fx.Frames          = new Vector(4, 2);
                fx.Speed           = 2;
                fx.Sprite.Scale   *= .4f;
                fx.Sprite.Rotation = rc.RayDirection.Angle;
                fx.Sprite.Color    = Color.Orange;
            }
        }
Esempio n. 4
0
 public RayCollision(RayCollisionInfo info)
 {
     this.info = info;
 }