none
XNA - Více stejných spritů

    Dotaz

  • Zdravím,

    jsem začátečník a nevím si rady jak umístit do pasáže více stejných spritů ( I se stejnám loadem - texturou..).

    Mam kod ve stylu:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.GamerServices;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Media;
    using System.Runtime.InteropServices;
    
    namespace XnaModel
    {
        /// <summary>
        /// This is the main type for your game
        /// </summary>
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            // This is a texture we can render.
            Texture2D myTexture;
    
            // Store some information about the sprite's motion.
            Vector2 spriteSpeed = new Vector2(150.0f, 150.0f);
    
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
    
            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }
    
            /// <summary>
            ///
            /// Allows the game to perform any initialization it needs to before starting to run.
            /// This is where it can query for any required services and load any non-graphic
            /// related content.  Calling base.Initialize will enumerate through any components
            /// and initialize them as well.
            /// </summary>
            protected override void Initialize()
            {
                // TODO: Add your initialization logic here
                base.Initialize();
            }
    
            /// <summary>
            /// LoadContent will be called once per game and is the place to load
            /// all of your content.
            /// </summary>
            protected override void LoadContent()
            {
                // Create a new SpriteBatch, which can be used to draw textures.
                spriteBatch = new SpriteBatch(GraphicsDevice);
    
                // TODO: use this.Content to load your game content here
                // Create a new SpriteBatch, which can be used to draw textures.
                myTexture = Content.Load<Texture2D>("a");
            }
    
            /// <summary>
            /// UnloadContent will be called once per game and is the place to unload
            /// all content.
            /// </summary>
            protected override void UnloadContent()
            {
                // TODO: Unload any non ContentManager content here
            }
    
            /// <summary>
            /// Allows the game to run logic such as updating the world,
            /// checking for collisions, gathering input, and playing audio.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            protected override void Update(GameTime gameTime)
            {
                // Allows the game to exit
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                    this.Exit();
    
                // TODO: Add your update logic here
                // Move the sprite around.
    
                MouseState mouseState = Mouse.GetState();
    
                if (canDrop && mouseState.LeftButton == ButtonState.Pressed)
                {
                    spritePosition.X = mouseState.X;
                    spritePosition.Y = mouseState.Y;
         
                    canDrop = false;
                }
                else if (mouseState.LeftButton == ButtonState.Released)
                {
                    canDrop = true;
                    //shot = true;
                }
    
                base.Update(gameTime);
            }
    
            /// <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);
    
                // TODO: Add your drawing code here
                // Draw the sprite.
                //spriteBatch.DrawString(font, "Cannon power: 100", new Vector2(20, 45), Color.White);
    
                spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
                spriteBatch.Draw(myTexture, spritePosition, Color.White);
                spriteBatch.End();
    
                base.Draw(gameTime);
            }
        }
    } <br/>
    


    Takže nevím jak udělat po každém kliknutí nový stejný sprite na posici kurzoru.

     

    Děkuji za odpověd a pomoc.

    3. prosince 2011 14:26

Odpovědi

  • V každém volání metody Draw musíte vždy vykreslit všechno, co má na obrazovce být. Pokud každé kliknutí má přidat nový sprite, tak si pozice všech klinutí musíte někam ukládat - doporučuji třeba List<Vector2>.

    Kolekci vytvořte takhle (deklarace v rámci třídy):

    private List<Vector2> spritePositions = new List<Vector2>();
    




    Nový bod tam přidáte takto:

    spritePositions.Add(spritePosition);
    



    A ve vykreslování použijete foreach cyklus, abyste prošel všechny hodnoty v kolekci:

    foreach (var point in spritePosition) {
        spriteBatch.Draw(myTexture, point, Color.White);
    }
    
    


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz
    • Označen jako odpověď HomeboyCoder 3. prosince 2011 18:03
    3. prosince 2011 15:57
    Přispěvatel

Všechny reakce

  • V každém volání metody Draw musíte vždy vykreslit všechno, co má na obrazovce být. Pokud každé kliknutí má přidat nový sprite, tak si pozice všech klinutí musíte někam ukládat - doporučuji třeba List<Vector2>.

    Kolekci vytvořte takhle (deklarace v rámci třídy):

    private List<Vector2> spritePositions = new List<Vector2>();
    




    Nový bod tam přidáte takto:

    spritePositions.Add(spritePosition);
    



    A ve vykreslování použijete foreach cyklus, abyste prošel všechny hodnoty v kolekci:

    foreach (var point in spritePosition) {
        spriteBatch.Draw(myTexture, point, Color.White);
    }
    
    


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz
    • Označen jako odpověď HomeboyCoder 3. prosince 2011 18:03
    3. prosince 2011 15:57
    Přispěvatel
  • Moc vám děkuji za pomoc ... opravdu děkuji.
    3. prosince 2011 18:52