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

ProfessorEich

unregistriert

1

13.09.2013, 16:10

[gelöst] Über Tastendruck eine Texture zeichnen lassen

Hallo Community,

ich arbeite zur Zeit mit C# und Xna an einem Spiel. Leider bin ich ein totaler Anfänger in diesem Gebiet und hätte deshalb eine Frage bezüglich einer Fehlermeldung:

Ich will über eine Klasse, die sich in Update aktualisiert, eine Texture zeichnen lassen, wenn ich die Taste "4" drücke.

Das steht in der Klasse:

C#-Quelltext

1
2
namespace Back_to_Glory{  class Animationen_Attacken_  {
        public static  void Draw(GameTime gameTime)  {            Game1.spriteBatch.Begin();  Game1.spriteBatch.Draw(Game1.Blow2, Game1.RechteckFeuer, new Rectangle(80, 20, 40, 70), Color.White);  Game1.spriteBatch.End();  }  }}



In Update steht folgendes:

C#-Quelltext

1
            if (keyState.IsKeyDown(Keys.NumPad4))  { Animationen_Attacken_.Draw(gameTime);  }



Das Programm zeichnet jedoch nichts.. :(
Woran kann das liegen?


Über eine schnelle Antwort würde ich mich freuen.


mfg ProfessorEich

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ProfessorEich« (15.09.2013, 15:07)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

13.09.2013, 16:23

Das steht in der Klasse:

C#-Quelltext

1
2
3
4
5
6
7
8
9
namespace Back_to_Glory{
    class Animationen_Attacken_  {
        public static  void Draw(GameTime gameTime)  {
            Game1.spriteBatch.Begin();
            Game1.spriteBatch.Draw(Game1.Blow2, Game1.RechteckFeuer, new Rectangle(80, 20, 40, 70), Color.White);
            Game1.spriteBatch.End();
        }
    }
}



In Update steht folgendes:

C#-Quelltext

1
2
3
            if (keyState.IsKeyDown(Keys.NumPad4))  {
                Animationen_Attacken_.Draw(gameTime);
            }

Vermutlich meinst du mit "In Update" die Update-Methode deiner Game-Klasse (in deinem Fall scheinbar Game1).
Guck dir doch mal die "Draw" Methode der gleichen Klasse an, dann dürftest du sehen, dass dort ebenfalls Code steht, mit dessen Hilfe etwas gezeichnet wird (standardmäßig ein "vornflowerblue"er Hintergrund). Dies wird nach der Update-Methode ausgeführt, wodurch deine Textur gar nicht zu sehen ist - sie wird einfach "übermalt".

Du solltest dir aber auch mal Objektorientierung ansehen. Du scheinst in deiner "Game1" Klasse einige statische Variablen (also "Klassenvariablen") zu haben, die nicht statisch sein sollten.
[Nachtrag:]
Außerdem ist die "Animationen_Attacken_" Klasse, so wie du sie bisher verwendest, ziemlich unsinnig. Die eine Methode, die du darin hast, könntest du genauso gut als nicht-statische Methode in deiner Game1-Klasse haben und dir dadurch die ganzen statischen Variablen ersparen.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

3

13.09.2013, 16:24

Draw aufrufe innerhalb eines Updates sind erstens nicht der richtige Weg und zweitens funktioniert das wie du siehst eh nicht ;)

Anstatt direkt im Update zu zeichnen legst du dir einfach eine Variable an, die du dann im Update entsprechend setzt, wenn die Taste gedrückt wurde. Im Draw überprüfst du dann, ob die Variable den richtigen Wert hat und zeichnest dann.

ProfessorEich

unregistriert

4

13.09.2013, 16:25

Du hattest Recht - Problem gelöst, danke! (bezogen auf Sacaldur)

Trotzdem danke an deinen Tipp Sylence, werde mir diese Alternative mal anschauen.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

13.09.2013, 16:27

Auch wenn dieses eine Problem vorerst gelöst ist, solltest du das, was ich geschrieben habe, nicht einfach ignorieren. Auf Dauer wirst du mit diesem Stil mehr Probleme haben, als eigentlich nötig wären.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

ProfessorEich

unregistriert

6

13.09.2013, 16:36

Eigentlich bin ich totaler Anfänger und weiß leider nicht mal was der Unterschied einer statischen und nicht statischen Variable ist, hab das aus nem Tutorial. ?(

Werde mich diesbezüglich aber erkundigen.

ProfessorEich

unregistriert

7

13.09.2013, 16:45

Habe deinen Weg getestet Sylence, jedoch will ich Klassen anlegen, damit meine Game1-Klasse nicht zu unübersichtlich wird, was momentan eh schon der Fall ist.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

13.09.2013, 16:52

Ich habe nie gesagt, dass die Variable in die Game1 Klasse rein soll.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

9

13.09.2013, 17:31

Wie bereits geschrieben: Am besten schaust du dir ein wenig was zum Thema "Objektorientierung" an. Wenn du mit der Objektorientierung vertrauter bist, dann weist du nicht nur, was der Unterschied zwischen einer statischen Variable (oder "Klassenvariable") und einer "normalen" Variable (oder "Membervriable" bzw. "Instanzvariable") ist, sondern weißt auch, wann welche eingesetzt werden sollte und welche Folgen das hat. Außerdem weißt du dann auch, wofür Klassen eigentlich da sind und wann man sie wie verwenden soll.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

ProfessorEich

unregistriert

10

14.09.2013, 13:49

Bin gerade dabei mich im Thema Objektorientierung einzulesen.

Mittlerweile habe ich mein Problem nach folgendem Tipp gelöst:

Zitat

Anstatt direkt im Update zu zeichnen legst du dir einfach eine Variable an, die du dann im Update entsprechend setzt, wenn die Taste gedrückt wurde. Im Draw überprüfst du dann, ob die Variable den richtigen Wert hat und zeichnest dann.

- Sylence


jedoch ergibt sich nun folgendes Problem:

Wenn ich die Taste "4" drücke besteht nur eine 50 prozentige Wahrscheinlichkeit, dass die Texture tatsächlich gemalt wird, da "keysdown" sich viel zu schnell updatet, sodass ich zu langsam bin für quasi nur einen Tastendruck (ich hoffe ihr versteht was ich mein). Wie lautet der Befehl um genau einen Tastendruck auszugeben, egal wie lange ich die Taste gedrückt halte?

Das ist mein Code:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
            if (keyState.IsKeyDown(Keys.NumPad1))
            {
                if (Zeichnen1 == false)
                {
                    Zeichnen1 = true;
                }
                else
                {
                    Zeichnen = false;
                }
            }

Werbeanzeige