Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.12.2013, 21:35

C# Problem mit Windows Phone Accelerometer

Ich möchte einen Ball durch Neigung meines Windows Phone Gerätes steuern. Beispiel: Neige ich das Gerät nach links, so bewegt sich der Ball nicht nach links :( Irgendwie funktioniert die Steuerung nicht obwohl ich e.DeviceAcceleration.X und e.DeviceAcceleration.Y im Code abfrage. Weiss zufällig jemand warum die Steuerung des Balls nicht richtig funktioniert? Ich verstehe nicht warum sich der Ball bei mir nicht in die Richtung bewegt in die das Gerät geneigt wird ?(

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Motion motion;
    Texture2D Ball;
    Vector2 BallPos = new Vector2(400, 300);
    Vector2 BallVelocity;

    void motion_CurrentValueChanged(object sender, SensorReadingEventArgs<MotionReading> e)
    {
        UpdateUI(e.SensorReading);
    }

    private void UpdateUI(MotionReading e)
    {               
        float accelerometerX = e.DeviceAcceleration.X;
        float accelerometerY = e.DeviceAcceleration.Y;
        BallPos = new Vector2(BallPos.X +accelerometerX*30f, BallPos.Y + accelerometerY*30f);
    }

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        TargetElapsedTime = TimeSpan.FromTicks(333333);
        InactiveSleepTime = TimeSpan.FromSeconds(1);
        graphics.IsFullScreen = true;
    }

    protected override void Initialize()
    {
        if (Motion.IsSupported)
        {
            motion = new Motion();
            motion.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20);
            motion.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<MotionReading>>(motion_CurrentValueChanged);
            motion.Start();
        }

        base.Initialize();
    }


    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        Message = Content.Load<SpriteFont>("Arial");
        Ball = Content.Load<Texture2D>("ballbig");
    }

    protected override void Update(GameTime gameTime)
    {

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();
          spriteBatch.Draw(Ball, BallPos, null, Color.White, 0, new Vector2(Ball.Width/2,Ball.Height/2), 1f, SpriteEffects.None,1);          
        spriteBatch.End();

        base.Draw(gameTime);
    }
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

23.12.2013, 22:00

Setz doch mal ein paar Breakpoints, z.B. in "UpdateUI".

3

24.12.2013, 11:37

Ich habe die UpdateUI ein wenig verändert, jedoch funktioniert es immer noch nicht richtig. Ich habe keine Ahnung was ich sonst noch ändern könnte :(

C#-Quelltext

1
2
3
4
5
6
7
8
9
  private void UpdateUI(MotionReading e)
    {               
        float accelerometerX = e.DeviceAcceleration.X;
        float accelerometerY = e.DeviceAcceleration.Y;
        speed.X += accelReading.X;
        speed.Y += -accelReading.Y;
        BallPos.X += speed.X * etms;
        BallPos.Y += speed.Y * etms;
    }


etms ist die GameTime:

C#-Quelltext

1
2
3
4
5
   protected override void Update(GameTime gameTime)
        {
            etms = gameTime.ElapsedGameTime.Milliseconds;
            base.Update(gameTime);
        }

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

24.12.2013, 11:51

Hast du schonmal einen Debugger benutzt?
Wenn nein, ist es jetzt höchste Zeit. Wie gesagt, setz dir mal einen Breakpoint in UpdateUI und schau dir an, welche Werte die Variablen so haben.

5

24.12.2013, 12:26

Ich habe mir die Werte angesehen und das einzige was ich festgestellt habe ist dass der Ball sich zu schnell bewegt hat. Deshalb mutipliziere ich jetzt mit 0.01f. Die GameTime habe ich auch mal weggelassen. Trotzdem funktioniert es nicht und ich habe keine Ahnung warum der Ball sich in eine andere Richtung bewegt wie das Gerät geneigt ist ?(

C#-Quelltext

1
2
3
4
5
6
7
8
9
 private void UpdateUI(MotionReading e)
    {               
        float accelerometerX = e.DeviceAcceleration.X;
        float accelerometerY = e.DeviceAcceleration.Y;
        speed.X += accelReading.X;
        speed.Y += -accelReading.Y;
        BallPos.X += speed.X *0.01f;
        BallPos.Y += speed.Y *0.01f;
    }

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

24.12.2013, 13:43

Dann schau doch mal weiter mit dem Debugger, was mit der veränderten Ballposition geschieht.
Bzw. ob die überhaupt dort ankommt, wo der Ball gezeichnet wird.

7

24.12.2013, 14:52

Der Ball wird an die berechnete Position gezeichnet. Ich konnte nur einen minimalen Unterschied bei der ersten Kommastelle festellen. Also BallPos.X += speed.X *0.05f; und BallPos.Y += speed.Y *0.05f; haben fast identische Werte wie BallPos in der Draw-Methode:

C#-Quelltext

1
 spriteBatch.Draw(Ball, BallPos, null, Color.White, 0, new Vector2(Ball.Width/2,Ball.Height/2), 1f, SpriteEffects.None,1);          

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

24.12.2013, 15:01

Dann bewegst du den Ball wohl zu langsam?

9

24.12.2013, 15:36

Der Ball bewegt sich nie in die richtige Richtung, egal wie schnell er sich bewegt. Neige ich mein Windows Phone Gerät nach links, so bewegt sich der Ball nicht nach links.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

24.12.2013, 15:40

Und ist mit den Werten, die das Accelerometer liefert, alles in Ordnung?
Übrigens, in deinem zuletzt geposteten Code werden die beiden Variablen accelerometerX und accelerometerY gar nicht benutzt.

Werbeanzeige