C# Objekt z.B. Würfel in xna mit Menü anzeigen

JonathanS

Newbie
Registriert
Apr. 2011
Beiträge
5
Hallo!

ich bin neu in Xna, studiere Angewandte Informatik und habe ein größeres Problem mit
meinem Projekt.

Es sollen Bauklötze auswählbar sein, die man dann plaziert.
Auf diesen Bauklötzen sollen neue plaziert werden können.
Einen Würfel in Xna habe ich fertig bekommen, ein kleines anfangsmenü auch(Testphase).

Wenn ich beide in eins stecken will, wird kurz der Würfel mit dem Menü angezeigt, dann verschwindet der Würfel jedoch.
Jetzt habe ich es einfach nicht hinbekommen den Würfel anzuzeigen plus das Menü.

In meiner Draw Routine habe ich das hier unter anderem:

spriteBatch.Begin();

for(int i=0;i<NUMBER_OF_BUTTONS; i++)
spriteBatch.Draw(button_texture, button_rectangle, button_color);
spriteBatch:End();

genau hier wird also das Menü gezeichnet, jedoch verschwindet einfach mein Würfel!

davor habe ich einen Teil des Würfel Codes:


GraphicsDevice.Clear(Color.CornflowerBlue);


// --- Back Face Culling aus-/einschalten ---------------------------------
RasterizerState rasterizerState1 = new RasterizerState();
rasterizerState1.CullMode = CullMode.None;

graphics.GraphicsDevice.RasterizerState = rasterizerState1;


SamplerState Sampler1 = new SamplerState();
Sampler1 = SamplerState.LinearClamp;
graphics.GraphicsDevice.SamplerStates[0] = Sampler1;


// --- Passes der aktuellen Technique durchlaufen und anwenden -------
foreach (EffectPass Pass in Effect.CurrentTechnique.Passes)
{
// --- effekt anwenden -------------------------------------------
Pass.Apply();

// --- Primitive rendern -----------------------------------------
//graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);

graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 4, 2);

graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 8, 2);

graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 12, 2);

graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 16, 2);

graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 20, 2);

graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 24, 2);



}

weiß jemand was ich meine?
wie kann ich beide Teile auf dem Bildschirm halten?


Über Hilfe würde ich mich sehr freuen

Vielen Dank

Jonathan
 
A) Benutze CODE-Tags.
B) XNA ist tot. Wenn du gerade erst dabei bist dich einzuarbeiten, wechsel auf ein anderes Framework etc.
 
Poste mal deine Draw Methode vollständig in CODE Tags eingepackt. So kann man momentan garnichts sehen bzw. ist nun unklar wie das bei dir aussieht. Kann sein das es entscheidend ist in welcher Reihenfolge du zeichnest bzw. wo das Clear auftaucht. Deswegen wäre der unveränderte Code besser. Kannst ja dann an entscheidenden Punkten noch Kommentarzeilen einbauen ...

Gruß
Rossibaer
 
Also ich programmiere noch nicht lange in xna.
Für jemanden der das schon länger programmiert könnte das Problem einfach sein.


Das hier ist meine ganze Draw Routine:


Code:
protected  override void Draw(GameTime gameTime)
        {
           //Viewport ist wohl auch nicht so wichtig.
           //Viewport originalViewport = GraphicsDevice.Viewport;

           //GraphicsDevice.V
           //Hier ist mein graphics Clear, kann das auch ein Problem sein, das das hier steht??
           GraphicsDevice.Clear(Color.CornflowerBlue);



            // --- Back Face Culling aus-/einschalten ---------------------------------
            RasterizerState rasterizerState1 = new RasterizerState();
            rasterizerState1.CullMode = CullMode.None;

            graphics.GraphicsDevice.RasterizerState = rasterizerState1;

            //Das hier ist nur probiert und kann wahrscheinlich weggelassen werden
            SamplerState Sampler1 = new SamplerState();
            Sampler1 = SamplerState.LinearClamp;
            graphics.GraphicsDevice.SamplerStates[0] = Sampler1;


            // --- Passes der aktuellen Technique durchlaufen und anwenden -------
            foreach (EffectPass Pass in Effect.CurrentTechnique.Passes)
            {
                // --- effekt anwenden -------------------------------------------
                Pass.Apply();

                //Das hier ist für den Würfel:

                // --- Primitive rendern -----------------------------------------
                //graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

                graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);

                graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 4, 2);

                graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 8, 2);

                graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 12, 2);

                graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 16, 2);

                graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 20, 2);

                graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 24, 2);



            }


            //Hier wird mein kleines Test Menü gezeichnet
            //GraphicsDevice.Clear(background_color);
            //Klammere ich diese Zeilen aus kommt der Würfel wieder!
            //Dann ist aber natürlich mein Menü weg!
            spriteBatch.Begin();

            for (int i = 0; i < NUMBER_OF_BUTTONS; i++)
            {
                spriteBatch.Draw(button_texture[i], button_rectangle[i], button_color[i]);
            }
            spriteBatch.End();
            //Hier ist der Würfel weg

            //UnloadContent();
            //base.SuppressDraw();

            base.Draw(gameTime);
            //base.SuppressDraw();
        }


zur Sicherheit wollte ich euch noch diese Routine auch zeigen:
Code:
protected override void Initialize()
        {

            //Das hier ist für das Menü
            int x = 100;
            int y = 100;

            for (int i = 0; i < NUMBER_OF_BUTTONS; i++)
            {
                button_state[i] = BState.UP;
                button_color[i] = Color.White;
                button_timer[i] = 0.0;
                button_rectangle[i] = new Rectangle(x, y, BUTTON_WIDTH, BUTTON_HEIGHT);
                y += BUTTON_HEIGHT;
            }
            IsMouseVisible = true;
            background_color = Color.CornflowerBlue;



          //Ab hier ist es wieder für den Würfel
            // --- Kamera aufsetzen -------------------------------------------------
            Initialize_View();
            // --- Basis ---------------------------------
            base.Initialize();
        }




Das hier ist die Load Content Routine für den Baukasten

protected override void LoadContent()
        {


            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);






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

            button_texture[BLAU_BUTTON_INDEX] =
                Content.Load<Texture2D>(@"Images/Blau");
            button_texture[GRUEN_BUTTON_INDEX] =
                Content.Load<Texture2D>(@"Images/Gruen");
            button_texture[ROT_BUTTON_INDEX] =
                Content.Load<Texture2D>(@"Images/Rot");
            button_texture[GELB_BUTTON_INDEX] =
                Content.Load<Texture2D>(@"Images/Gelb");
            button_texture[SCHWARZ_BUTTON_INDEX] =
                Content.Load<Texture2D>(@"Images/Schwarz");






            // --- Graphik Daten erzeugen ----------------------------------------
            Geometrie(LengthOfCube);

            // --- Effekt erzeugen -----------------------------------------------
            Initialize_Effekt();

        }


//Die Geometrie Funktion ist komplett für den Würfel

 public void Geometrie(float LengthOfCube)
        {
            // --- Vertex-Beschreibung, nur Position und Farbe -------------------
            VertexBeschreibung = new VertexDeclaration(new VertexElement[]
                    {
                    new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),          // Position
                    new VertexElement(12, VertexElementFormat.Color, VertexElementUsage.Color, 0)               // Farbe
                    }
            );


            // --- Vertex Buffer initialisieren -----------------------------------
            vertexBuffer = new VertexBuffer(
                                graphics.GraphicsDevice,            // Device
                                VertexBeschreibung,                 // Vertextyp
                              24,                                  // Anzahl Vertices
                                BufferUsage.None);                  // Benuzung

            // --- Vertex-Daten für eine Quadrat definieren -----------------------
            VertexPositionColor[] Vertices = new VertexPositionColor[24];

            //
            //                 y
            //                2 o
            //                 |
            //                 |
            //   -------------------------------  x
            //                 |
            //       1 o       |        o 3
            //
            //   z = 0
            //

            // Unterer Boden1

            Vertices[0].Position = new Vector3(-LengthOfCube / 2, -LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[0].Color = Color.Red;

            Vertices[1].Position = new Vector3(-LengthOfCube / 2, LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[1].Color = Color.Red;

            Vertices[2].Position = new Vector3(LengthOfCube / 2, -LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[2].Color = Color.Red;

            Vertices[3].Position = new Vector3(LengthOfCube / 2, LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[3].Color = Color.Red;

            //Ende UntererBoden
            //Begin obere Seite des Würfels

            Vertices[4].Position = new Vector3(LengthOfCube / 2, -LengthOfCube / 2, LengthOfCube / 2);
            Vertices[4].Color = Color.Blue;

            Vertices[5].Position = new Vector3(LengthOfCube / 2, LengthOfCube / 2, LengthOfCube / 2);
            Vertices[5].Color = Color.Blue;

            Vertices[6].Position = new Vector3(-LengthOfCube / 2, -LengthOfCube / 2, LengthOfCube / 2);
            Vertices[6].Color = Color.Blue;

            Vertices[7].Position = new Vector3(-LengthOfCube / 2, LengthOfCube / 2, LengthOfCube / 2);
            Vertices[7].Color = Color.Blue;
            //Ende der oberen Seite des Würfels

            //Begin rechte Seite des Würfels

            Vertices[8].Position = new Vector3(LengthOfCube / 2, LengthOfCube / 2, LengthOfCube / 2);
            Vertices[8].Color = Color.Yellow;

            Vertices[9].Position = new Vector3(LengthOfCube / 2, LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[9].Color = Color.Yellow;

            Vertices[10].Position = new Vector3(LengthOfCube / 2, -LengthOfCube / 2, LengthOfCube / 2);
            Vertices[10].Color = Color.Yellow;

            Vertices[11].Position = new Vector3(LengthOfCube / 2, -LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[11].Color = Color.Yellow;
            //Ende der rechten Seite des Würfels

            //Begin der linken Seite des Würfels
            Vertices[12].Position = new Vector3(-LengthOfCube / 2, -LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[12].Color = Color.Green;

            Vertices[13].Position = new Vector3(-LengthOfCube / 2, LengthOfCube / 2, -LengthOfCube / 2);
            Vertices[13].Color = Color.Green;

            Vertices[14].Position = new Vector3(-LengthOfCube / 2, -LengthOfCube / 2, LengthOfCube / 2);
            Vertices[14].Color = Color.Green;

            Vertices[15].Position = new Vector3(-LengthOfCube/2, LengthOfCube/2, LengthOfCube/2);
            Vertices[15].Color = Color.Green;
            //Ende der linken Seite des Würfels

            //Begin der vorderen Seite des Würfels
            Vertices[16].Position = new Vector3(-LengthOfCube/2, -LengthOfCube/2, -LengthOfCube/2);
            Vertices[16].Color = Color.Brown;

            Vertices[17].Position = new Vector3(-LengthOfCube/2, -LengthOfCube/2, LengthOfCube/2);
            Vertices[17].Color = Color.Brown;

            Vertices[18].Position = new Vector3(LengthOfCube/2, -LengthOfCube/2, -LengthOfCube/2);
            Vertices[18].Color = Color.Brown;

            Vertices[19].Position = new Vector3(LengthOfCube/2, -LengthOfCube/2, LengthOfCube/2);
            Vertices[19].Color = Color.Brown;
            //Ende der vorderen Seite des Würfels

            //Begin der hinteren Seite des Würfels
            Vertices[20].Position = new Vector3(-LengthOfCube/2, LengthOfCube/2, -LengthOfCube/2);
            Vertices[20].Color = Color.Cyan;

            Vertices[21].Position = new Vector3(-LengthOfCube/2, LengthOfCube/2, LengthOfCube/2);
            Vertices[21].Color = Color.Cyan;

            Vertices[22].Position = new Vector3(LengthOfCube/2, LengthOfCube/2, -LengthOfCube/2);
            Vertices[22].Color = Color.Cyan;

            Vertices[23].Position = new Vector3(LengthOfCube/2, LengthOfCube/2, LengthOfCube/2);
            Vertices[23].Color = Color.Cyan;
            //Ende der hinteren Seite des Würfels


            // --- Vertex-Daten in den Vertexbuffer schreiben --------------------
            vertexBuffer.SetData<VertexPositionColor>(Vertices);

            // --- den Vertexbuffer in die Graphikkarte schreiben ----------------
            graphics.GraphicsDevice.SetVertexBuffer(vertexBuffer);

        }

Code:
protected override void Update(GameTime gameTime)
        {



            // TODO: Add your update logic here



            // get elapsed frame time in seconds
            frame_time = gameTime.ElapsedGameTime.Milliseconds / 1000.0;

            // update mouse variables
            MouseState mouse_state = Mouse.GetState();
            mx = mouse_state.X;
            my = mouse_state.Y;
            prev_mpressed = mpressed;
            mpressed = mouse_state.LeftButton == ButtonState.Pressed;

            update_buttons();






            // --- Exit --------------------------------------------------
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            KeyboardState CurrentState = Keyboard.GetState();
            if (CurrentState.IsKeyDown(Keys.F1))
            {
                graphics.ToggleFullScreen();
            }

            if (CurrentState.IsKeyDown(Keys.Escape))
            {
                this.Exit();
            }

            // --- Rechteck drehen ---------------------------------------
            CurrentMouseState = Mouse.GetState();
            if (CurrentMouseState.LeftButton == ButtonState.Pressed)
            {
                float fX, fY;
                fX = MathHelper.ToRadians(CurrentMouseState.X - LastMouseState.X);
                fY = MathHelper.ToRadians(CurrentMouseState.Y - LastMouseState.Y);

                WeltMatrix *= Matrix.CreateRotationY(fX) * Matrix.CreateRotationX(-fY);
            }
            //float y, z;
            System.Threading.Thread.Sleep(10);
            Vector3 Position;
            Position.X = 0.1f;
            Position.Y = 0;
            Position.Z = 0;
            SetPosition(Position);
            Effect.World = WeltMatrix;
            Effect.View = ViewMatrix;
            Effect.Projection = ProjMatrix;

            base.Update(gameTime);

            LastMouseState = CurrentMouseState;

        }

Also ich bin leider schon hintendran mit dem Projekt.

Über eure Hilfe bin ich sehr dankbar!

Normalerweiße muss man das ja können wenn man xna programmiert zwei Sachen zusammenanzuzeigen.
Deshalb denke ich das wenn jemand xna hier noch kann er das lösen könnte.

Vielen vielen Dank für eure Hilfe!!


Jonathan
 
Also die Seite hat mir etwas geholfen, ich habe einfach mein sprite.Begin() weiter an den anfang von der Draw Methode geschoben,
und danach habe ich noch meine eigene Geometrie für den Würfel zwischen sprite.Begin() und sprite.Draw() geschoben.

Danach habe ich den Würfel mit dem Menü angezeigt bekommen!

Jetzt habe ich aber leider ein weiteres Problem.
Der Würfel wird nicht richtig angezeigt, die vorderstes Seite, des Würfels ist oft durchsichtig, was sie nicht sein sollte.
Ihrgend wie ist das spriteBatch dafür verantwortlich.
Denn wenn ich das spriteBatch.Begin() und spriteBatch.Draw() weglassen mit .End() auch dann wird zwar das Menü nicht gezeichnet,
der Würfel sieht aber genau so aus wie er aussehen soll!

Es liegt also weiterhin ihrgendwie an dieser spritebatch.Begin() .Draw() und .End()!

Der Würfel an sich wird jetzt aber dargestellt!

Vielen Dank erst einmal für die bisjetzige Hilfe!!
 
Öh, hatte damals ein Projektheft für meine persönlichen Sachen gemacht, habe mir damals eine Stunde lang mit sowas aufgeregt. In dem Heft ist irgendwo eine ganze DINA4-Seite belegt mit (auf Englisch) "DIE VERTICES MÜSSEN IM UHRZEIGERSINN ANGEGEBEN WERDEN" (oder andersherum, ich weiß es nicht mehr genau). Das liegt daran, dass so unterschieden wird in welche Richtung die Normalen zeigen.
 
Zurück
Oben