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

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

11

14.09.2013, 15:19

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;
                }
            }


Kann man auch als

C#-Quelltext

1
2
if (keyState.IsKeyDown(Keys.NumPad1))
    Zeichnen1 = !Zeichnen1


schreiben ;)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

12

14.09.2013, 15:21

Quellcode

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


Und wenn du dann nur einmal zeichnen möchtest:

Quellcode

1
2
3
4
5
if( Zeichnen1 )
{
    Draw(...);
    Zeichnen1 = false;    //Kommentier die Zeile aus, wenn du jedes mal zeichnen möchtest, wenn NumPad1 gedrückt ist.
}

ProfessorEich

unregistriert

13

14.09.2013, 16:58

Danke erst mal für die Hilfe!

Jedoch will ich nicht, dass die Texture nur gezeichnet wird wenn ich die Taste gedrückt halte, sondern wenn ich 1x drücke soll die Texture bleiben, beim wiederholten Drücken soll sie wieder verchwinden.

btw: das Zeichnen nach else ist im Code auch als Zeichnen1 vermerkt.

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

14

14.09.2013, 22:10

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Pseudo-Code
if( Key_X_Down )
{
    X_Down = true;
    X_Pressed = false;
}
else
if( Key_X_Up )
{
    X_Pressed = X_Down;
    X_Down = false;
}

if( X_Pressed )
{
    //Hier deine Logik.
}

ProfessorEich

unregistriert

15

15.09.2013, 11:38

Kann sein, dass ich etwas falsch mache, aber bei mir funktioniert das auch nicht, da x_down ja gleich wieder false wird, d.h. die Texture blitzt nur kurz auf.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

15.09.2013, 14:25

Hier ist ein Tutorial auf das du vielleicht mal einen Blick werfen solltest. Es geht erst um C# und hinterher genauer um XNA. Das wird dir mit Sicherheit schon mal ordentlich weiter helfen. Was dein Problem mit den Tasten angeht, du kannst den aktuellen Zustand der Tastatur speichern. Wenn du dir jetzt den aktuellen Zustand der Tastatur speicherst und den Zustand der Tastatur beim letzen Update Durchlauf, dann kannst du damit eine Menge anfangen. Wie du an den Zustand kommst, hast du ja schon raus gefunden. In deinem Fall "keyState". Diese Variable ist ja vom Typ KeyboardState. Wenn du dir jetzt zwei Variablen von diesem Typ in deiner Klasse speicherst, kannst du darin die beiden Zustände der Tastatur ablegen. Als Beispiel nenne ich die Beiden Variablen mal "currentState" und "lastState".

C#-Quelltext

1
2
KeyboardState currentState;
KeyboardState lastState;


In deiner Update Funktion musst du dafür sorgen, dass currentState den aktuellen Zustand der Tastatur beinhaltet und lastState den vom letzten Frame. Also einfach am Anfang von "Update" folgendes machen:

C#-Quelltext

1
2
lastState = currentState; // currentState hat in diesem Moment noch den Zustand vom letzten Frame. Diesen wollen wir speichern.
currentState = Keyboard.GetState(); // hier wird currentState nun auf den aktuellen Zustand gesetzt.


Jetzt einfach mal 4 Beispiele, was man damit so machen kann:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(currentState.IsKeyDown(Keys.A))
{
// Taste A wird aktuell gedrückt
}
if(currentState.IsKeyUp(Keys.A))
{
// Taste A wird aktuell nicht gedrückt
}
if(currentState.IsKeyDown(Keys.A) && lastState.IsKeyUp(Keys.A))
{
// Tasta A wird in diesem Moment runter gedrückt. Auch wenn die Taste im nächsten Frame noch gedrückt wird ist die Abfrage nur beim ersten mal true
}
if(currentState.IsKeyUp(Keys.A) && lastState.IsKeyDown(Keys.A))
{
// Taste A wird in diesem Moment losgelassen. Auch hier ist die Abfrage nur in dem Frame true.
}


Das ganze kannst du dir jetzt noch in eine extra Klasse stecken die dann Methoden für diese 4 Möglichkeiten bekommt. Sowas wie:

C#-Quelltext

1
2
3
4
public bool IsKeyHit(Keys key)
{
    return currentState.IsKeyDown(key) && lastState.IsKeyUp(key);
}


Nur als Beispiel. Aber wie gesagt, arbeite vielleicht auch mal das oben genannte Tutorial durch. Das wird schon ne Menge helfen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

ProfessorEich

unregistriert

17

15.09.2013, 15:05

Vielen Dank, für ihre ausführliche und korrekte Antwort, das habe ich gesucht!

Auch der von ihnen angegebene Link ist gut für mich als Einsteiger gut geeignet. :thumbsup:

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

18

16.09.2013, 15:09

Gern geschehen. Hier im Forum sagen wir übrigens Du zueinander:)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige