Pickray for selection
コード例 #1
0
        public float DrawBug(BugState state, Pickray pickray, bool selected)
        {
            Matrix matrix = Matrix.CreateRotationY((float)(state.Direction * Math.PI) / 180);

            matrix.M41 = (state.PositionX) - playgroundWidth;
            matrix.M43 = (-state.PositionY) + playgroundHeight;
            foreach (var mesh in bug.Meshes)
            {
                foreach (BasicEffect eff in mesh.Effects)
                {
                    eff.World      = matrix;
                    eff.View       = camera.ViewMatrix;
                    eff.Projection = camera.ProjectionMatrix;


                    if (mesh.Name == "Sphere02" || mesh.Name == "Sphere03")
                    {
                        eff.LightingEnabled = false;

                        // change the bugs eye color depending on its vitality
                        eff.EmissiveColor = Vector3.Lerp(new Vector3(1, 0, 0), new Vector3(0f, 0.6f, 1f), state.Vitality / 1000f);
                    }
                    else if (mesh.Name == "Sphere01")
                    {
                        eff.LightingEnabled = true;
                        eff.DiffuseColor    = new Vector3(0.1f, 0.1f, 0.1f);
                        eff.EmissiveColor   = new Vector3(0f, 0f, 0f);

                        eff.PreferPerPixelLighting          = true;
                        eff.DirectionalLight0.Enabled       = true;
                        eff.DirectionalLight0.Direction     = LIGHT_0_DIRECTION;
                        eff.DirectionalLight0.DiffuseColor  = new Vector3(1, 1, 1);
                        eff.DirectionalLight0.SpecularColor = new Vector3(0.6f, 1f, 1f);//new Vector3(0.7f, 0.3f, 0f);//

                        eff.DirectionalLight1.Enabled = false;
                        eff.DirectionalLight2.Enabled = false;
                    }
                    else
                    {
                        eff.LightingEnabled = false;
                    }
                }
                mesh.Draw();
            }
            BoundingSphere sphere = getBoundingSphere(bug, matrix);


            float?distance = sphere.Intersects(new Ray(pickray.Origin, pickray.Direction));

            if (distance != null)
            {
                return(distance.Value);
            }

            return(0.0f);
        }
コード例 #2
0
        public float DrawFruit(FruitState state, Pickray pickray, bool selected)
        {
            Matrix matrix = Matrix.CreateTranslation(state.PositionX - playgroundWidth, 0, -state.PositionY + playgroundHeight);

            matrix.M11 = state.Radius / 4.5f;
            matrix.M22 = state.Radius / 4.5f;
            matrix.M33 = state.Radius / 4.5f;
            foreach (var mesh in apple.Meshes)
            {
                foreach (BasicEffect eff in mesh.Effects)
                {
                    eff.World      = matrix;
                    eff.View       = camera.ViewMatrix;
                    eff.Projection = camera.ProjectionMatrix;

                    eff.LightingEnabled = true;
                    eff.DiffuseColor    = new Vector3(0.6f, 0.7f, 0.1f);
                    eff.EmissiveColor   = new Vector3(0.1f, 0.3f, 0f);

                    eff.DirectionalLight0.Enabled       = true;
                    eff.DirectionalLight0.Direction     = LIGHT_0_DIRECTION;
                    eff.DirectionalLight0.DiffuseColor  = new Vector3(0.7f, 0.4f, 0f);
                    eff.DirectionalLight0.SpecularColor = new Vector3(0.1f, 0.5f, 0f);

                    eff.DirectionalLight1.Enabled      = true;
                    eff.DirectionalLight1.Direction    = LIGHT_1_DIRECTION;
                    eff.DirectionalLight1.DiffuseColor = new Vector3(0.3f, 0.1f, 0f);

                    eff.DirectionalLight2.Enabled       = false;
                    eff.DirectionalLight2.Direction     = LIGHT_2_DIRECTION;
                    eff.DirectionalLight2.DiffuseColor  = new Vector3(0.3f, 0.4f, 0f);
                    eff.DirectionalLight2.SpecularColor = new Vector3(0.1f, 0.5f, 0f);
                }
                mesh.Draw();
            }

            //// Check for pickray-collision

            float?distance = getBoundingSphere(apple, matrix).Intersects(new Ray(pickray.Origin, pickray.Direction));

            if (distance.HasValue)
            {
                return(distance.Value);
            }

            return(0.0f);
        }
コード例 #3
0
        public float DrawSugar(SugarState state, Pickray pickray, bool selected)
        {
            Matrix matrix = Matrix.CreateTranslation(state.PositionX - playgroundWidth,
                                                     0, -state.PositionY + playgroundHeight);

            matrix.M11 = matrix.M22 = matrix.M33 = state.Radius / 50.0f;
            foreach (var mesh in sugar.Meshes)
            {
                foreach (BasicEffect eff in mesh.Effects)
                {
                    eff.World      = matrix;
                    eff.View       = camera.ViewMatrix;
                    eff.Projection = camera.ProjectionMatrix;

                    eff.LightingEnabled = true;
                    eff.DiffuseColor    = new Vector3(0.85f, 0.85f, 0.75f);
                    eff.EmissiveColor   = new Vector3(0.3f, 0.3f, 0.25f);

                    eff.DirectionalLight0.Enabled      = true;
                    eff.DirectionalLight0.DiffuseColor = new Vector3(1, 1, 1);
                    eff.DirectionalLight0.Direction    = LIGHT_0_DIRECTION;

                    eff.DirectionalLight1.Enabled      = true;
                    eff.DirectionalLight1.DiffuseColor = new Vector3(1, 1, 1);
                    eff.DirectionalLight1.Direction    = LIGHT_1_DIRECTION;

                    eff.DirectionalLight2.Enabled      = true;
                    eff.DirectionalLight2.DiffuseColor = new Vector3(1, 1, 1);
                    eff.DirectionalLight2.Direction    = LIGHT_2_DIRECTION;
                }
                mesh.Draw();
            }

            float?distance = getBoundingSphere(sugar, matrix).Intersects(new Ray(pickray.Origin, pickray.Direction));

            if (distance.HasValue)
            {
                return(distance.Value);
            }

            return(0.0f);
        }
コード例 #4
0
        public float DrawAnthill(int colony, AnthillState state, Pickray pickray, bool selected)
        {
            Matrix         matrix       = Matrix.CreateTranslation(state.PositionX - playgroundWidth, 0, -state.PositionY + playgroundHeight);
            BoundingSphere collisionBox = new BoundingSphere(
                new Vector3(state.PositionX - playgroundWidth, 0, -state.PositionY + playgroundHeight),
                state.Radius);

            // Cone
            var mesh = anthill.Meshes[0];

            foreach (BasicEffect eff in mesh.Effects)
            {
                eff.World      = matrix;
                eff.View       = camera.ViewMatrix;
                eff.Projection = camera.ProjectionMatrix;

                eff.LightingEnabled = true;
                eff.EmissiveColor   = new Vector3(0.1f, 0.05f, 0f);

                eff.DirectionalLight0.Enabled      = true;
                eff.DirectionalLight0.Direction    = LIGHT_0_DIRECTION;
                eff.DirectionalLight0.DiffuseColor = new Vector3(0.4f, 0.4f, 0.4f);

                eff.DirectionalLight1.Enabled      = true;
                eff.DirectionalLight1.Direction    = LIGHT_1_DIRECTION;
                eff.DirectionalLight1.DiffuseColor = new Vector3(0.1f, 0.1f, 0.2f);

                eff.DirectionalLight2.Enabled      = true;
                eff.DirectionalLight2.Direction    = LIGHT_2_DIRECTION;
                eff.DirectionalLight2.DiffuseColor = new Vector3(0.1f, 0.1f, 0.2f);
            }
            mesh.Draw();

            // Bar
            mesh = anthill.Meshes[1];
            foreach (BasicEffect eff in mesh.Effects)
            {
                eff.World      = matrix;
                eff.View       = camera.ViewMatrix;
                eff.Projection = camera.ProjectionMatrix;

                eff.LightingEnabled = true;
                eff.EmissiveColor   = new Vector3(0.5f, 0.5f, 0.5f);

                eff.DirectionalLight0.Enabled   = true;
                eff.DirectionalLight0.Direction = LIGHT_0_DIRECTION;

                eff.DirectionalLight1.Enabled   = true;
                eff.DirectionalLight1.Direction = LIGHT_1_DIRECTION;

                eff.DirectionalLight2.Enabled   = true;
                eff.DirectionalLight2.Direction = LIGHT_2_DIRECTION;
            }
            mesh.Draw();

            // Flag
            mesh = anthill.Meshes[2];
            foreach (BasicEffect eff in mesh.Effects)
            {
                eff.World      = matrix;
                eff.View       = camera.ViewMatrix;
                eff.Projection = camera.ProjectionMatrix;

                eff.LightingEnabled = true;
                eff.EmissiveColor   = playerColors[colony - 1];

                eff.DirectionalLight0.Enabled   = true;
                eff.DirectionalLight0.Direction = LIGHT_0_DIRECTION;

                eff.DirectionalLight1.Enabled   = true;
                eff.DirectionalLight1.Direction = LIGHT_1_DIRECTION;

                eff.DirectionalLight2.Enabled   = true;
                eff.DirectionalLight2.Direction = LIGHT_2_DIRECTION;
            }
            mesh.Draw();


            // Check for pickray-collision
            float?distance = collisionBox.Intersects(new Ray(pickray.Origin, pickray.Direction));

            if (distance.HasValue)
            {
                return(distance.Value);
            }
            return(0.0f);
        }
コード例 #5
0
        public float DrawAnt(int colony, AntState state, Pickray pickray, bool selected)
        {
            Matrix  matrix   = Matrix.CreateRotationY((float)(state.Direction * Math.PI) / 180);
            Vector3 position = new Vector3(state.PositionX - playgroundWidth, 0, -state.PositionY + playgroundHeight);

            matrix.M41 = position.X;
            matrix.M43 = position.Z;

            foreach (var mesh in ant.Meshes)
            {
                foreach (BasicEffect eff in mesh.Effects)
                {
                    eff.World      = matrix;
                    eff.View       = camera.ViewMatrix;
                    eff.Projection = camera.ProjectionMatrix;

                    eff.LightingEnabled = true;
                    if (mesh.Name == "Sphere01" || mesh.Name == "Sphere02")
                    {
                        // eff.EmissiveColor = playerColors[colony];
                        eff.DiffuseColor = playerColors[colony - 1];
                    }
                    else
                    {
                        // eff.EmissiveColor = new Vector3(0, 0, 0);
                        eff.DiffuseColor = 0.2f * playerColors[colony - 1];//new Vector3(0.2f, 0.2f, 0.2f);
                    }

                    //eff.SpecularColor = new Vector3(0.5f, 0.5f, 0.5f) + playerColors[colony];

                    eff.DirectionalLight0.Enabled       = true;
                    eff.DirectionalLight0.Direction     = LIGHT_0_DIRECTION;
                    eff.DirectionalLight0.DiffuseColor  = new Vector3(1, 1, 1);
                    eff.DirectionalLight0.SpecularColor = new Vector3(1f, 1f, 1f);// + playerColors[colony];

                    eff.DirectionalLight1.Enabled      = true;
                    eff.DirectionalLight1.DiffuseColor = new Vector3(1, 1, 1);
                    eff.DirectionalLight1.Direction    = LIGHT_1_DIRECTION;

                    eff.DirectionalLight2.Enabled      = true;
                    eff.DirectionalLight2.DiffuseColor = new Vector3(1, 1, 1);
                    eff.DirectionalLight2.Direction    = LIGHT_2_DIRECTION;
                }
                mesh.Draw();
            }

            // Draw sugar-block, if ant has sugar loaded
            if (state.LoadType == LoadType.Sugar)
            {
                Matrix sugarWorld =
                    Matrix.CreateScale(2)
                    * Matrix.CreateTranslation(new Vector3(-1.5f, 4, 0))
                    * matrix;

                foreach (var mesh in box.Meshes)
                {
                    foreach (BasicEffect eff in mesh.Effects)
                    {
                        eff.World      = sugarWorld;
                        eff.View       = camera.ViewMatrix;
                        eff.Projection = camera.ProjectionMatrix;


                        eff.TextureEnabled = false;
                        eff.DiffuseColor   = Color.White.ToVector3();
                    }
                    mesh.Draw();
                }
            }


            // Debug info
            if (showDebugInfo)
            {
                Color   color       = new Color(playerColors[state.ColonyId - 1]);
                Vector3 antPosition = position + Vector3.Up;

                float sightRadius = state.ViewRange;
                debugRenderer.DrawHorizontalCircle(antPosition, sightRadius, 16, color);

                if (state.TargetType != TargetType.None)
                {
                    Vector3 targetPos = new Vector3(state.TargetPositionX - playgroundWidth, 1, -state.TargetPositionY + playgroundHeight);
                    debugRenderer.DrawLine(antPosition, targetPos, color);
                }
            }

            float?distance = getBoundingSphere(ant, matrix).Intersects(new Ray(pickray.Origin, pickray.Direction));

            if (distance.HasValue)
            {
                return(distance.Value);
            }


            return(0.0f);
        }
コード例 #6
0
        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            GraphicsDevice.DepthStencilState = DepthStencilState.Default;

            SimulationState state = CurrentState;

            if (state == null)
            {
                return;
            }

            DrawSky();

            effect.CurrentTechnique.Passes[0].Apply();
            effect.Projection = camera.ProjectionMatrix;
            effect.View       = camera.ViewMatrix;

            DrawPlayground();

            Selection selectedItem  = new Selection();
            Pickray   pickray       = camera.Pickray;
            Point     mousePosition = camera.MousePosition;

            // Selektionsinfos zurücksetzen
            selectedItem.SelectionType = SelectionType.Nothing;
            selectedItem.Item          = null;
            float distanceToSelectedItem = VIEWRANGE_MAX * VIEWRANGE_MAX;


            // Draw Bugs
            float distance;

            foreach (var bug in state.BugStates)
            {
                if ((distance = DrawBug(bug, pickray, false)) > 0)
                {
                    if (distance < distanceToSelectedItem)
                    {
                        distanceToSelectedItem     = distance;
                        selectedItem.Item          = bug;
                        selectedItem.SelectionType = SelectionType.Bug;
                    }
                }
            }

            // Draw Sugar
            foreach (var sugar in state.SugarStates)
            {
                if ((distance = DrawSugar(sugar, pickray, false)) > 0)
                {
                    if (distance < distanceToSelectedItem)
                    {
                        distanceToSelectedItem     = distance;
                        selectedItem.Item          = sugar;
                        selectedItem.SelectionType = SelectionType.Sugar;
                    }
                }
            }

            // Draw Fruit
            foreach (var fruit in state.FruitStates)
            {
                if ((distance = DrawFruit(fruit, pickray, false)) > 0)
                {
                    if (distance < distanceToSelectedItem)
                    {
                        distanceToSelectedItem     = distance;
                        selectedItem.Item          = fruit;
                        selectedItem.SelectionType = SelectionType.Fruit;
                    }
                }
            }

            // Draw Colony Base
            foreach (var colony in state.ColonyStates)
            {
                // Draw AntHills
                foreach (var anthill in colony.AnthillStates)
                {
                    if ((distance = DrawAnthill(colony.Id, anthill, pickray, false)) > 0)
                    {
                        if (distance < distanceToSelectedItem)
                        {
                            distanceToSelectedItem      = distance;
                            selectedItem.Item           = anthill;
                            selectedItem.SelectionType  = SelectionType.Anthill;
                            selectedItem.AdditionalInfo = CurrentState.ColonyStates[anthill.ColonyId - 1].ColonyName;
                        }
                    }
                }

                // Draw Ants
                foreach (var ant in colony.AntStates)
                {
                    // Debug Messages aktualisieren
                    if (!string.IsNullOrEmpty(ant.DebugMessage))
                    {
                        DebugMessage msg;
                        if (debugMessages.ContainsKey(ant.Id))
                        {
                            msg = debugMessages[ant.Id];
                        }
                        else
                        {
                            msg = new DebugMessage();
                            debugMessages.Add(ant.Id, msg);
                        }

                        msg.CreateRound = state.CurrentRound;
                        msg.Message     = ant.DebugMessage;
                    }

                    // Draw
                    if ((distance = DrawAnt(colony.Id, ant, pickray, false)) > 0)
                    {
                        if (distance < distanceToSelectedItem)
                        {
                            distanceToSelectedItem      = distance;
                            selectedItem.Item           = ant;
                            selectedItem.SelectionType  = SelectionType.Ant;
                            selectedItem.AdditionalInfo = CurrentState.ColonyStates[ant.ColonyId - 1].ColonyName;
                        }
                    }
                }

                // Remove old Messages
                foreach (var key in debugMessages.Keys.ToArray())
                {
                    DebugMessage msg = debugMessages[key];
                    if (state.CurrentRound - msg.CreateRound > DebugMessage.ROUNDS_TO_LIFE)
                    {
                        debugMessages.Remove(key);
                    }
                }
            }

            // Draw Marker
            foreach (var colony in state.ColonyStates)
            {
                foreach (var marker in colony.MarkerStates)
                {
                    DrawMarker(colony.Id, marker);
                }
            }

            // render all sprites in one SpriteBatch.Begin()-End() cycle to save performance
            spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied);



            // Draw debug ant-thoughts
            if (showDebugInfo)
            {
                foreach (var colony in CurrentState.ColonyStates)
                {
                    foreach (var ant in colony.AntStates)
                    {
                        // Draw actual debug text
                        if (debugMessages.ContainsKey(ant.Id))
                        {
                            DebugMessage msg       = debugMessages[ant.Id];
                            Vector3      pos       = new Vector3(ant.PositionX - playgroundWidth, 4, -ant.PositionY + playgroundHeight);
                            Vector2      screenPos = debugRenderer.WorldToScreen(pos, new Vector2(0, -20));
                            Color        boxCol    = new Color(0.5f * playerColors[ant.ColonyId - 1]);
                            boxCol.A = 128;
                            DrawTextBox(msg.Message, screenPos, boxCol, Color.White);
                        }
                    }
                }
            }

            // Draw Infobox
            DrawInfobox(state);

            // Draw Info-Tag at selected item
            if (selectedItem.SelectionType != SelectionType.Nothing)
            {
                string line1;
                string line2;
                switch (selectedItem.SelectionType)
                {
                case SelectionType.Ant:

                    AntState ameise  = (AntState)selectedItem.Item;
                    string   antName = NameHelper.GetFemaleName(ameise.Id);
                    line1 = string.Format(Strings.HovertextAntLine1, antName, selectedItem.AdditionalInfo);
                    line2 = string.Format(Strings.HovertextAntLine2, ameise.Vitality);
                    break;

                case SelectionType.Anthill:
                    line1 = Strings.HovertextAnthillLine1;
                    line2 = string.Format(Strings.HovertextAnthillLine2, selectedItem.AdditionalInfo);
                    break;

                case SelectionType.Bug:
                    BugState bugState = (BugState)selectedItem.Item;
                    string   bugName  = NameHelper.GetMaleName(bugState.Id);
                    line1 = string.Format(Strings.HovertextBugLine1, bugName);
                    line2 = string.Format(Strings.HovertextBugLine2, bugState.Vitality);
                    break;

                case SelectionType.Fruit:
                    FruitState fruitState = (FruitState)selectedItem.Item;
                    line1 = Strings.HovertextFruitLine1;
                    line2 = string.Format(Strings.HovertextFruitLine2, fruitState.Amount);
                    break;

                case SelectionType.Sugar:
                    SugarState sugar = (SugarState)selectedItem.Item;
                    line1 = Strings.HovertextSugarLine1;
                    line2 = string.Format(Strings.HovertextSugarLine2, sugar.Amount);
                    break;

                default:
                    line1 = String.Empty;
                    line2 = String.Empty;
                    break;
                }

                // Text an Mausposition ausgeben
                if (line1 != String.Empty || line2 != String.Empty)
                {
                    DrawInfoTag(mousePosition, line1, line2);
                }
            }


            spriteBatch.End();

            base.Draw(gameTime);
        }