Проблемы с данными акселерометра в WP7.1? - PullRequest
0 голосов
/ 15 октября 2011

Я делаю простую игру для реализации данных акселерометра, идея в том, что данные акселерометра определяют ускорение шара, который бесцельно задается вопросом на экране, шар не падает с краев экрана, поэтомувсякий раз, когда он ударяется о стену, скорость меняется на противоположную.

Проблема в том, что иногда поведение мяча очень хорошее, и, как и ожидалось, в других случаях оно прыгает по точкам на экране, я не могу отследить проблему, воткод:

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Texture2D BallTexture;
    Vector2 BallPosition;
    Vector2 BallSpeed;
    Vector2 BallAcc;

    float CoFriction = 0.15F;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";


        //set to full screen
        graphics.IsFullScreen = true;

        // Frame rate is 30 fps by default for Windows Phone.
        TargetElapsedTime = TimeSpan.FromTicks(333333);

        // Extend battery life under lock.
        InactiveSleepTime = TimeSpan.FromSeconds(1);
    }


    protected override void Initialize()
    {

        //speed,position,acceleration
        BallSpeed = Vector2.Zero;
        BallAcc = Vector2.Zero;
        BallPosition = new Vector2(240,400);


        //Accelerometer
        Accelerometer acc = new Accelerometer();
        acc.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(readingChanged);
        acc.Start();

        base.Initialize();
    }

    public void readingChanged(object sender, AccelerometerReadingEventArgs e)
    {

        Deployment.Current.Dispatcher.BeginInvoke(() => handleAccChange(e));
    }
    public void handleAccChange(AccelerometerReadingEventArgs e)
    {
        BallAcc.X = -(float)Math.Round((float)e.Y);
        BallAcc.Y = -(float)Math.Round((float)e.X);

    }
    protected override void LoadContent()
    {
        BallTexture = Content.Load<Texture2D>("football2");
        spriteBatch = new SpriteBatch(GraphicsDevice);


    }


    protected override void UnloadContent()
    {

    }


    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        BallSpeed += BallAcc;
        BallPosition += BallSpeed;



        //Check Borders
        if (BallPosition.X < 0 || BallPosition.X > 800 - 51)
        {

            if (BallPosition.X < 0)
                BallPosition.X = 5;
            else if (BallPosition.X > 800 - 51)
                BallPosition.X = 800 - 55;
            BallSpeed.X = -BallSpeed.X * CoFriction;

            if (BallPosition.Y < 0 || BallPosition.Y > 480 - 51)
            {

                if (BallPosition.Y < 0)
                    BallPosition.Y = 5;
                if (BallPosition.Y > 480 - 51)
                    BallPosition.Y = 480 - 55;
                BallSpeed.Y = -BallSpeed.Y * CoFriction;

            }
            base.Update(gameTime);
            return;
        }
        if (BallPosition.Y < 0 || BallPosition.Y > 480 - 51)
        {
            BallSpeed.Y = -BallSpeed.Y*CoFriction;
            if (BallPosition.Y < 0)
                BallPosition.Y = 5;
            if (BallPosition.Y > 480 - 51)
                BallPosition.Y = 480 - 55;

            if (BallPosition.X < 0 || BallPosition.X > 800 - 51)
            {
                BallSpeed.X = -BallSpeed.X*CoFriction;
                if (BallPosition.X < 0)
                    BallPosition.X = 5;
                if (BallPosition.X > 800 - 51)
                    BallPosition.X = 800 - 55;

            }
            base.Update(gameTime);
            return;
        }




        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        spriteBatch.Draw(BallTexture, BallPosition, Color.White);
        spriteBatch.End();


        base.Draw(gameTime);
    }
}

1 Ответ

0 голосов
/ 31 октября 2011

Ну, я новичок в разработке WP7, но VS10 говорит, что Accelerometer.ReadingChanged устарела, и нужно использовать событие .CurrentValueChanged.Остальное кажется почти таким же.Я нашел эту статью: http://www.silverlightshow.net/items/XNA-for-Silverlight-developers-Part-6-Input-accelerometer.aspx

Просто прокрутите вниз до «Некоторые важные заметки о« Манго »»

Удачи, счастливого кодирования

...