locked
Movimiento parabolico RRS feed

  • Pregunta

  • Hola, buenas tardes quisiera pedirle ayudas para un trabajo que estoy realizando que como esta en el titulo es sobre el movimiento parabolico con este trabajo estoy recien aprendiendo xna y C#.

    En estos momentos tengo avanzado el trabajo el asunto es que hay algunas cosas que no me resultan que son como fundamentales en el proyecto de primero les explicare lo que llevo hecho.

    1. El cañon gira pero no dispara la bola.
    2. la bola la tengo sobre el cañon.
    3. Solo lanza una vez la bola y no se como puede lanzar mas de una.

    Aquí les dejo lo que llevo hecho para que tengan una idea y les dejare el código abajo de la imagen con el rar del proyecto.

    https://drive.google.com/file/d/0B7oOKA-1UE7ebG5EODN5ZmF5NEk/edit?usp=sharing

    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;
    
    namespace TrioParabolico_V0._2
    {
        /// <summary>
        /// This is the main type for your game
        /// </summary>
        /// 
    
        
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            Texture2D Barrel;
            Texture2D coco;
            //float elapsed;
            float rotacion;
            Vector2 ubicacionPuntero;
            Vector2 centro;
            Vector2 posicion;
            Vector2 direccion;
            SpriteFont debugText;
            Boolean moviendo = false;
    
            float t = 0f;
    
            float v0;
            const float g = -4.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();
    
                /*rotacion = 0f;
                elapsed = 0f;*/
                ubicacionPuntero = new Vector2(30,450);
                rotacion = (float)0.0;
                centro = new Vector2(Barrel.Width / 2, Barrel.Height /2);
                posicion = new Vector2(30 - 21, 450 - 21);
    
            }
    
            /// <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);
                coco = Content.Load<Texture2D>("coco");
                Barrel = Content.Load<Texture2D>("arrow");
                debugText = Content.Load<SpriteFont>("Arial");
                // 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();
    
                //rotacion += (float)gameTime.ElapsedGameTime.TotalSeconds;
                if (Keyboard.GetState().IsKeyDown(Keys.Up)) {
    
                    v0 += 0.1f;
                
                }
    
                if (Keyboard.GetState().IsKeyDown(Keys.Down))
                {
                    v0 -= 0.1f;
                }
                    if (Keyboard.GetState().IsKeyDown(Keys.Left)) {
    
                        //if (rotacion < 0)
                        //{
    
                            rotacion -= 0.1f;
                        //}
                        
                    }
                    if (Keyboard.GetState().IsKeyDown(Keys.Right)) {
    
                        //if (rotacion > 2 * Math.PI)
                        //{
    
                            rotacion += 0.1f;
                        //}
                        
                    }
    
                    if (rotacion > 2 * Math.PI) rotacion = 0.0f;
                    if (rotacion < 0) rotacion = 2 * (float)Math.PI;
    
    
                /*if(cocolanzado.posicion.X = graphics.PreferredBackBufferWidth){
    
                    cocolanzado.direccion *= -1; 
                }*/
                    this.posicion += this.direccion;
                    if (Keyboard.GetState().IsKeyDown(Keys.Space)) {
    
                        if(moviendo == true){
    
                            
    
                            Matrix m = Matrix.CreateRotationZ(rotacion);
                            this.direccion.X += m.M12 * v0;
                            this.direccion.Y += m.M11 * v0;
                            
                            //posicion.X = direccion.X + v0 * (float)Math.Cos(rotacion) * t;
                            //posicion.Y = direccion.Y + v0 * (float)Math.Sin(rotacion) * t - (float)(.5 * g * (t * t));
    
                            t += 0.12f;
                        }
                        
                    }
    
                // TODO: Add your update logic here
    
                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);
    
                
    
                string debugDecimal = "Angulo = " + String.Format("{0:0.##}", rotacion * (180.0f / Math.PI)) + " grados ";
                string VelocidadX = "Velocidad = " + String.Format("{0:0.##}", v0);
                
                spriteBatch.Begin();
                spriteBatch.Draw(Barrel, ubicacionPuntero, null, Color.White, rotacion, centro, 0.6f, SpriteEffects.None, 0);
                spriteBatch.Draw(coco, posicion, null, Color.White);
                spriteBatch.DrawString(debugText, debugDecimal+"\n"+VelocidadX, new Vector2(10, 10), Color.Orange);
    
                spriteBatch.End();
                // TODO: Add your drawing code here
    
                base.Draw(gameTime);
            }
        }
    }

    Aquí les dejare el código que es como el lanzamiento lo que tengo en comentario sería le movimiento parabólico y lo que no esta en comentario es un lanzamiento recto.

     if (Keyboard.GetState().IsKeyDown(Keys.Space)) {
    
                        if(moviendo == true){
    
                            
    
                            Matrix m = Matrix.CreateRotationZ(rotacion);
                            this.direccion.X += m.M12 * v0;
                            this.direccion.Y += m.M11 * v0;
                            
                            //posicion.X = direccion.X + v0 * (float)Math.Cos(rotacion) * t;
                            //posicion.Y = direccion.Y + v0 * (float)Math.Sin(rotacion) * t - (float)(.5 * g * (t * t));
    
                            t += 0.12f;
                        }
                        



    • Editado Thony_Licht martes, 17 de diciembre de 2013 18:18
    martes, 17 de diciembre de 2013 18:13