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

Union_Freedom

Treue Seele

  • »Union_Freedom« ist der Autor dieses Themas

Beiträge: 156

Wohnort: Nähe Hannover

Beruf: Student

  • Private Nachricht senden

1

12.09.2012, 11:52

XNA - Problem mit der Position

Hallo,

ich muss ehrlich gestehen, dass ich leicht verwirrt bin. Ich habe nun die Farseer Physics Engine in mein eigenes XNA-Framework eingebunden.
Die Physik scheint korrekt berechnet zu werden, allerdings habe ich ein Problem mit der Position zum Zeichnen.

So sieht mein Test bisher aus:

(Link)


Merkwürdig ist nun folgendes :
Das Spiel hat eine Auflösung von 1080*720 Bildpunkten. Da ich keine Matrix zum Skalieren verwende, würde ich vermuten, dass die Figur in etwa auf der Hälfte der Höhe sein müsste, also ca. bei Y = 350 bis Y = 400 liegt. Zur Kontrolle lasse ich die Rote DrawTime Angabe auf Y = 450 zeichnen.

Wenn ich jetzt mit dem Debugger direkt in den spriteBatch.draw(...) springe und mir anschaue, wo meine Figur gezeichnet wird steht in
_Rect ( X = 150, Y = 648, Width = 50, Height = 50).

Wie kann das sein? Dann müsste die Figur doch bereits unter dem gezeichneten Text liegen und viel weiter unten im Bildbereich liegen.

Camera.cs

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
                spriteBatch.Begin();
              
                //Welt zeichen

                //Auschnitt Berechnen
                _WorldExtractToDraw.X =  (int)_Position.X;
                _WorldExtractToDraw.Y =  (int)_Position.Y;
                _WorldExtractToDraw.Width = (int)(_Position.X + GameResolution.X * _Scale);
                _WorldExtractToDraw.Height =(int) (_Position.Y + GameResolution.Y * 2.0f * _Scale );

                _World.Draw(spriteBatch , _WorldExtractToDraw);

                spriteBatch.End();
}


World.cs

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
      public void Draw(SpriteBatch spriteBatch, Rectangle WorldExtractToDraw)
        {       
                //Das ist unwichtig
                foreach (Sprite s in Backgrounds)
                {
                    if (RectInExtract(s.Rect, WorldExtractToDraw) == true)
                    {
                        s.Draw(spriteBatch);
                    }
                }
                if (bUseTileManager == false)
                {
                    foreach (Tile T in _Tiles)
                    {
                        if (RectInExtract(T.Rect, WorldExtractToDraw) == true)
                        {
                            T.Draw(spriteBatch);
                        }
                    }
                }
                else
                {
                    TileClusterManager.Draw(spriteBatch, WorldExtractToDraw);
                }

                // für meine Objekte
                foreach (GameObject2D obj in _GameObjects)
                {
                    if (obj.Sprite != null)
                    {
                        if (RectInExtract(obj.Sprite.Rect, WorldExtractToDraw) == true)
                        {
                            obj.Draw(spriteBatch);
                        }
                   }
                 }
            
        }

GameObject2D.cs

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
        public virtual void Draw(SpriteBatch spriteBatch)
        {
            if (ShouldBeDraw == true)
            {
                if (_Sprite != null)
                {
                    _Sprite.Draw(spriteBatch);
                }
            }
        }

Sprite.cs

C#-Quelltext

1
2
3
4
5
6
7
8
        public void Draw(SpriteBatch spriteBatch)
        {
            if (_Animation.Texture != null && _Rect != null)
            {
                spriteBatch.Draw(_Animation.Texture, _Rect, null, Color.White, _Rotation, Center, _Flipped, 0.0f);
                // _Rect hat hier Y = 648 , wird aber trotzdem ca. in der Bildhälfte gezeichnet
            }
        }


Ein weiteres spriteBatch.Begin() rufe ich nicht auf. Das witzige dabei ist, dass die Felder, die gezeichnet werden, alle die Position haben, die sie haben sollten. Also die ganz unten liegenden bei Y = 700 liegen.


Ich bedanke mich schon jetzt.

MfG
Union_Freedom


Edit :
Ich hab mal in die Sprite.cs eine Zeile hinzugefügt.

C#-Quelltext

1
2
3
4
5
6
7
8
        public void Draw(SpriteBatch spriteBatch)
        {
            if (_Animation.Texture != null && _Rect != null)
            {
                spriteBatch.Draw(_Animation.Texture, _Rect, null, Color.White, _Rotation, Center, _Flipped, 0.0f);
                spriteBatch.Draw(_Animation.Texture, new Rectangle(100, 500, 50, 50), Color.White);
            }
        }

Nun siehts so aus.

(Link)
Coder bei: http://crushing-gods.de/ (Folgt uns)
Erste Eindrücke zu Crushing Gods Link

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Union_Freedom« (12.09.2012, 12:07)


2

12.09.2012, 14:05

Es würde helfen wenn du alle Werte angibst die du an SpriteBatch.Draw übergibst. Mit dem was gegeben ist würde ich sagen die Textur ist falsch dimensioniert oder du hast einen negativen Origin.
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

Union_Freedom

Treue Seele

  • »Union_Freedom« ist der Autor dieses Themas

Beiträge: 156

Wohnort: Nähe Hannover

Beruf: Student

  • Private Nachricht senden

3

12.09.2012, 18:45

Rotation = 0.0000009612988
Center ( X = 175 , Y = 673)
FLipped = None
Texture sollte doch eigentlich keine Rolle spielen, weil im Aufruf eine Zeile später die selbe Textur an die richtige Stelle gezeichnet wird.

Texture:
Height = 99
Width = 105


Hoffe das hilft...
Coder bei: http://crushing-gods.de/ (Folgt uns)
Erste Eindrücke zu Crushing Gods Link

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

12.09.2012, 20:52

ich bin mir nicht ganz sicher, aber ich würde sagen, am Center liegt es
probiere einfach mal (0,0) als Center
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Union_Freedom

Treue Seele

  • »Union_Freedom« ist der Autor dieses Themas

Beiträge: 156

Wohnort: Nähe Hannover

Beruf: Student

  • Private Nachricht senden

5

12.09.2012, 22:15

Danke, du hast Recht. Mich wundert es nur, dass mir das jetzt erst auffällt. Ich meine meine letzten Tests vor einem Jahr liefen gut. Naja. Vielen Dank!
Coder bei: http://crushing-gods.de/ (Folgt uns)
Erste Eindrücke zu Crushing Gods Link

Werbeanzeige