Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sprites que desaparecen en XNA

Iniciado por Xaos, 23 de Abril de 2009, 02:44:08 PM

« anterior - próximo »

Xaos

Buenas:

Hace poco que he comenzado en esto de la programación de videojuegos, y mi andadura, ha comenzado con XNA.
Y la verdad es divertido y satisfactorio.
Pero tengo un problemilla, y me gustaria saber si alguien pudiera echarme una mano.

He hecho dos sprites con animación y movimiento automatico por la pantalla, asi como colision contra los bordes de la ventana.
El problema es, que a los pocos segundos de lanzar el programa, los sprites desaparecen de pantalla y me queda la ventana en blanco.
Alguien me podria decir que puede pasar?
Mas que nada es que no he tocado nada de la estructura que viene por defecto.
Solo he añadido los sprites y les he dado vidilla.

Muchas gracias de antemano.

[EX3]

Así de primeras, como no pongas mas datos difícilmente sabremos nadie decirte nada.

Depura linea a linea el código que hayas implementado para las animaciones por si entraras en un bucle sin fin o cualquier otro error provocado por un despiste al tirar código. Quizás encuentres ahí la razón del "cuelgue". Sin mas información no se decirte otra cosa.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Xaos

El caso es que estoy siguiendo el libro Leraning XNA 3.0 de Aaron Reed. Y aunque los ejercicios, al parecer los tengo correctos, tengo ese problema.
Era por si alguien havia seguido el mismo libros y le habia pasado.

Cuando tenga algo de tiempo, pongo el codigo.
Lo extraño del caso sobre todo es que la animación de los sprites, se hacen bien.
Pero cuando desaparece uno de ellos el otros comienza a saltar frames y despues desparece.
Al rato vuelve a aparecer saltando frames y vuelve a desaparecer XDDDD
Es todo un misterio para mia jejeje

Gracias y un saludo

hawthdown

Cita de: Xaos en 24 de Abril de 2009, 12:07:54 PM
El caso es que estoy siguiendo el libro Leraning XNA 3.0 de Aaron Reed. Y aunque los ejercicios, al parecer los tengo correctos, tengo ese problema.
Era por si alguien havia seguido el mismo libros y le habia pasado.

Cuando tenga algo de tiempo, pongo el codigo.
Lo extraño del caso sobre todo es que la animación de los sprites, se hacen bien.
Pero cuando desaparece uno de ellos el otros comienza a saltar frames y despues desparece.
Al rato vuelve a aparecer saltando frames y vuelve a desaparecer XDDDD
Es todo un misterio para mia jejeje

Gracias y un saludo

Me suena a que te estas equivocando en la cantidad de frames que le asignaste al sprite, osea, cuando vos compriobas si se llego a la cantidad de frames y este debe volver al pricipio, tal vez te equivocas ahi. Pero como dijieron, si no pones algo de codigo mucho no vamos a poder ayudarte.

Saludos!.

Xaos

Aqui les dejo el codigo:

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 Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace AnimatedSprites
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture;
        Texture2D skullTexture;

        //Propiedades threerings
        Point ringFrameSize = new Point(75, 75);
        Point ringCurrentFrame = new Point(0, 0);
        Point ringSheetSize = new Point(6, 8);
        int ringTimeSinceLastFrame = 0;
        int ringMillisecondsPerFrame = 30;
        Vector2 ringPosition = Vector2.Zero;
        const float ringSpeed = 6f;

        //Propiedades Skull
        Point skullFrameSize = new Point(75, 75);
        Point skullCurrentFrame = new Point(0, 0);
        Point skullSheetSize = new Point(6, 8);
        int skullTimeSinceLastFrame = 0;
        int skullMillisecondsPerFrame = 50;

        Vector2 pos1 = Vector2.Zero;
        Vector2 pos2 = Vector2.Zero;
        float speed1 = 4f;
        float speed2 = 4f;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            //TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 30); Refresca cada 30ms
        }

        /// <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);
            texture = Content.Load<Texture2D>(@"images/threerings");
            skullTexture = Content.Load<Texture2D>(@"images/skullball");

            // TODO: use this.Content to load your game content here
        }

        /// <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();

            //Movimiento frames threerings
            ringTimeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
            if (ringTimeSinceLastFrame > ringMillisecondsPerFrame)
            {
                ringTimeSinceLastFrame -= ringMillisecondsPerFrame;
                ++ringCurrentFrame.X;
                if (ringCurrentFrame.X >= ringSheetSize.X)
                {
                    ringCurrentFrame.X = 0;
                    ++ringCurrentFrame.Y;
                    if (ringCurrentFrame.Y >= ringSheetSize.Y)
                        ringCurrentFrame.Y = 0;
                }
            }

            //Movimiento frames skullball
            skullTimeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
            if (skullTimeSinceLastFrame > skullMillisecondsPerFrame)
            {
                skullTimeSinceLastFrame -= skullMillisecondsPerFrame;
                ++skullCurrentFrame.X;
                if (skullCurrentFrame.X >= skullSheetSize.X)
                {
                    skullCurrentFrame.X = 0;
                    ++skullCurrentFrame.Y;
                    if (skullCurrentFrame.Y >= skullSheetSize.Y)
                        ringCurrentFrame.Y = 0;
                }
            }

         
          //Movimiento automatico Threerings
          /*pos1.X += speed1;
            if ((pos1.X > (Window.ClientBounds.Width - ringFrameSize.X)) ||
                (pos1.X < 0))
                speed1 *= -1;

          pos1.Y += speed2;
            if ((pos1.Y > (Window.ClientBounds.Height - ringFrameSize.Y)) ||
                (pos1.Y < 0))
                speed2 *= -1;
           */

           //Movimiento Teclado Threerings
            KeyboardState keyboardState = Keyboard.GetState();
            if (keyboardState.IsKeyDown(Keys.Left))
                ringPosition.X -= ringSpeed;
            if (keyboardState.IsKeyDown(Keys.Right))
                ringPosition.X += ringSpeed;
            if (keyboardState.IsKeyDown(Keys.Up))
                ringPosition.Y -= ringSpeed;
            if (keyboardState.IsKeyDown(Keys.Down))
                ringPosition.Y += ringSpeed;

            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.White);

            // TODO: Add your drawing code here
            spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.FrontToBack, SaveStateMode.None);

            spriteBatch.Draw(texture, ringPosition, new Rectangle(ringCurrentFrame.X * ringFrameSize.X,
            ringCurrentFrame.Y * ringFrameSize.Y, ringFrameSize.X, ringFrameSize.Y), Color.White,
            0, Vector2.Zero, 1, SpriteEffects.None, 0);

            spriteBatch.Draw(skullTexture,new Vector2(100, 100),new Rectangle(skullCurrentFrame.X*skullFrameSize.X,
            skullCurrentFrame.Y*skullFrameSize.Y,skullFrameSize.X,skullFrameSize.Y), Color.White, 0, Vector2.Zero,
            1, SpriteEffects.None, 1);

            spriteBatch.End();

           
            base.Draw(gameTime);
        }
    }
}

Las imagenes las encontraran en google.

threerings.png y skullball.png
Solo las tienen que buscar en la seeción imagenes de google.

Muchas gracias de antemano

Xaos

Y encontre el fallo!!!!!!! Soy un gañan XDDD

      //Movimiento frames threerings
            ringTimeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
            if (ringTimeSinceLastFrame > ringMillisecondsPerFrame)
            {
                ringTimeSinceLastFrame -= ringMillisecondsPerFrame;
                ++ringCurrentFrame.X;
                if (ringCurrentFrame.X >= ringSheetSize.X)
                {
                    ringCurrentFrame.X = 0;
                    ++ringCurrentFrame.Y;
                    if (ringCurrentFrame.Y >= ringSheetSize.Y)
                        ringCurrentFrame.Y = 0;
                }
            }

            //Movimiento frames skullball
            skullTimeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
            if (skullTimeSinceLastFrame > skullMillisecondsPerFrame)
            {
                skullTimeSinceLastFrame -= skullMillisecondsPerFrame;
                ++skullCurrentFrame.X;
                if (skullCurrentFrame.X >= skullSheetSize.X)
                {
                    skullCurrentFrame.X = 0;
                    ++skullCurrentFrame.Y;
                    if (skullCurrentFrame.Y >= skullSheetSize.Y)
                        ringCurrentFrame.Y = 0; (Deveria ser: skullCurrentFrame.Y=0;)
                }
            }
Fallo tonto, pero muy molesto jajajaja

Gracias a todos por vuestra ayuda ^-^

Mars Attacks

#6
Qué malo es el copypaste :)

Por cierto, no sé cómo irán las cosas en XNA, pero en general, si ves que en la programación te han quedado dos estructuras tan similares, ¿por qué no creas una función genérica para ellas y les pasas como parámetro la estructura que tienen que modificar? Es más limpio y fácil de depurar.

Xaos

Si, lo se, pero esque como ya he dicho estoy siguiendo un libro, que a su vez es un curso.
Ahora comienzo el capitulo para hacer clases y todo eso.
Poco a poco jejeje

Un saludo






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.