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

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

1

28.09.2004, 18:45

Tastendruck über Array

Nabend zusammen,

bis gerade programmierte ich fröhlich vor mich hin .... blablabla... bis ich auf dieses Problem stieß. Bin mir nicht sicher, obs wirklich ein Problem ist, oder einfach nur ein Blackout :rolleyes: ??? :(

Wäre nett, wenn mir mal wieder kompetent geholfen werden könnte ;)
Also:
Ich habe ein Array m_bKey[256], in dem (wie vielleicht bekannt aus dem SDK) für gedrückte Tasten jeweils true gesetzt wird.
Wird also die Taste 150 gedrückt, ist m_bKey[150] = true.
Nun möchte ich aber mit dieser Methode Tastendrücke einlesen und nicht (nur) eine Bewegung durchführen. Unschön kann man ja über Switch und viele Ifs arbeiten, aber gibt es eine einfachere Methode?
Ich möchte also einfach, wenn zum Beispiel "A" gedrückt wird, das an meinen String std::string strInput ein A angehängt wird.
Irgendwie hab' ich momentan ein Black-Out. Bitte um Hilfe... :)

Eine Überlegung war, dass ich die Nummer des auf true gesetzten Elements des Array in einen char konvertiere. Aber kann ich, wenn ich einen int auf einen char konvertiere, bestimmte Zeichen bekommen? Umgekehrt kann man ja ein Zeichen in einen Int casten, um den Zeichencode zu erhalten; aber kommt man mit dieser Überlegung hier weit? Vielen Dank :)

Danke
unsigned int
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Dark

Frischling

  • Private Nachricht senden

2

28.09.2004, 22:37

Meinst du, dass eine If/For-Schleife zu langsam wäre? Wenn eine Taste gedrückt wird, setzt du eine Variable (z.B "Update") auf "true". Und wenn "Update" "true" ist, gehst du eben die 256 Tasten durch und setzt danach "Update" auf "false".

Kann sein, dass das geistiger Dünnpfiff ist, aber ich versuch trotzdem zu helfen :)

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

3

29.09.2004, 14:21

danke für den versuch ;)

Aber gibts nich was besseres, als alle 256 Tasten durch zu gehen? Das klingt nach Nonsense... oder zumindest nach schlampigem, langsamen und unschönem Code ;)
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Anonymous

unregistriert

4

29.09.2004, 15:11

Es gibt keine andere Möglichkeit, als jeden wert zu prüfen, denn dieses Array sagt einem nur, ob taste zyx gedrückt worde oder nicht. Und man kann ein Bool Array nicht eifnach in ein Char Array umcasten.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

5

29.09.2004, 19:15

Es kann sein, dass ich das völlig missverstehe. Ich weiss auch nicht, ob der Index in dem Array der ascii Wert ist. Aber als Ideenanregung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
for(i=0; i<256; i++)
  if (m_bKey[i])
  {
    if(isprint(i))
    {
      char c = static_cast<char>( i);
      strInput += c;
    }
    break;
  }
"Games are algorithmic entertainment."

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

6

29.09.2004, 21:34

Hab ichauch so gedacht, aber was Passiert, wenn ich zum Beispiel eine der 'F'-Tasten drücke!? Wenn ich zum Beispiel die Taste 27 (die Zahl nenn ich nur als Beispiel) drücke, dann wandelt er die 27 ja auch in ein char um, und das ist ja dann kein Buchstabe sondern irgend ein Zeichen. Wenn ich dann zum Beispiel F1 drücke, fügt der dann ein '&'-Zeichen hinzu (nur mal als Beispiel).

Wie auch, ich dachte, es gäbe vielleicht ne einfache Lösung, aber da ich heute mittag schon die Hoffnung zumindest zum Teil aufgegeben hatte, eine einfachere und schönere Möglichkeit zu finden, habe ich jetzt IFs verwendet... naja... ;)
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

7

29.09.2004, 21:52

Ok, ich habe meinen Code leicht überarbeitet ;).

Es gibt übrigens eine grosse Zahl an "character classification routines", Du kannst also statt "isprint" auch etwas anderes nehmen und z.B. nur alfanumerische Zeichen in Deinen String übernehmen.
"Games are algorithmic entertainment."

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

8

29.09.2004, 22:12

Wie immer danke, Osram :)

Aber auch danke an die anderen, werde das noch lösen.... ;) :)
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

9

29.09.2004, 22:19

Hi,

ich bin mal net so :)

Quellcode aus dem Buch :D

C-/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
// ###########################################################################

// Datei:        keyboard.h

// ###########################################################################

// Autor:        Patrick Ullmann

// Erstellt:     12.09.2004

// Änderungen:   12.09.2004 (Patrick)  Datei erstellt

// ###########################################################################

// Beschreibung: Tastaturmanager


#ifndef __keyboard_h___12_09_2004___12918521044545484740413214668302127078332_
#define __keyboard_h___12_09_2004___12918521044545484740413214668302127078332_

// I N C L U D E S ###########################################################

#include "manager.h"

// D E F I N I T I O N E N ###################################################

namespace novum
{
    class keyboard;
} // Namespace


// S T R U K T U R E N #######################################################

namespace novum
{
class keyboard : public manager
{ 
public: 
        // Con- und Destructor

    keyboard            (void); 
    ~keyboard           (void); 

        // Funktion gibt die ID des Managers wieder

    inline virtual int getID    (void) { return (m_id); } 

        // ### Hauptfunktionen der Manager

    void restore        (void);
    void clear          (void);
    void update         (void);

        // ### Nebenfunktionen dieses Managers 


        // Setze die gedrückten und losgelassenen Tasten

    void setPressedKey  (unsigned int key);
    void setReleasedKey (unsigned int key);

        // Welche Taste wurde/wird gedrückt?

    bool isPressed      (unsigned int key);
    bool isReleased     (unsigned int key);

protected:
        // ID des Managers

    int     m_id; 

        // Speicherung der Tasten

    bool    m_currKey[256];
    bool    m_oldKey[256];
}; 
} // Namespace


#endif


C-/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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// ###########################################################################

// Datei:        keyboard.cpp

// ###########################################################################

// Autor:        Patrick Ullmann

// Erstellt:     12.09.2004

// Änderungen:   12.09.2004 (Patrick)  Datei erstellt

// ###########################################################################

// Beschreibung: Tastaturmanager


// I N C L U D E S ###########################################################

#include "keyboard.h"

// F U N K T I O N E N #######################################################

namespace novum
{
// ///////////////////////////////////////////////////////////////////////////

// PUBLIC Constructor

//

// ///////////////////////////////////////////////////////////////////////////

keyboard::keyboard (void) : m_id (0xFF000001)
{
        // Alles auf 'false' setzen

    restore ();
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC Destructor

//

// ///////////////////////////////////////////////////////////////////////////

keyboard::~keyboard (void)
{
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC 

//

// Setzt alle Einträge im Array auf 'false'.

// ///////////////////////////////////////////////////////////////////////////

void keyboard::restore (void)
{
        // Durchlaufe alle Einträge und setze sie auf 'false'.

    for (int i=0; i<256; ++i)
    {
        m_oldKey[i] = m_currKey[i] = false;
    }
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC 

//

// Setzt alle alten Einträge auf die neuen Einträge.

// ///////////////////////////////////////////////////////////////////////////

void keyboard::update (void)
{
        // Aus neu mach alt für den nächsten Frame. :-D

    for (int i=0; i<256; ++i)
    {
        m_oldKey[i] = m_currKey[i];
    }
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC 

//

// Setzt alle Einträge im Array auf 'false'.

// ///////////////////////////////////////////////////////////////////////////

void keyboard::clear (void)
{
    restore ();
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC 

//

// Setzt den Momentan gedrücken Key auf 'true'.

// ///////////////////////////////////////////////////////////////////////////

void keyboard::setPressedKey (unsigned int key)
{
        // Den gedrückten key auf 'true' setzen.

    if (key < 256 && key >= 0)
    {
        m_currKey[key] = true;
    }
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC 

//

// Setzt den Momentan losgelassenen Key auf 'false'.

// ///////////////////////////////////////////////////////////////////////////

void keyboard::setReleasedKey (unsigned int key)
{
        // Den losgelassenen key auf 'false' setzen.

    if (key < 256 && key >= 0)
    {
        m_currKey[key] = false;
    }
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC 

//

// Abfrage ob Key gedrückt ist.

// ///////////////////////////////////////////////////////////////////////////

bool keyboard::isPressed (unsigned int key)
{
        // Na welcher Key wird gedrückt?

    return ((key < 256 && key >= 0) ? this->m_currKey[key] : false);
}

// ///////////////////////////////////////////////////////////////////////////

// PUBLIC 

//

// Abfrage ob Key losgelassen wurde.

// ///////////////////////////////////////////////////////////////////////////

bool keyboard::isReleased (unsigned int key)
{
        // Welche Taste wurde gerade losgelassen?

    if (key < 256 && key >= 0)
    {
        if ((this->m_oldKey[key] == true) && (this->m_currKey[key] == false))
        {
            return (true);
        }
    }
    return (false);
}

} // Namespace


und nun die Übergabe der Informationen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    case WM_KEYUP:                              
        {                                       
            MANAGEMENT.getManager<novum::keyboard>()->setReleasedKey (wParam);  
        } break;                                
    case WM_KEYDOWN:                            
        {                                       
            MANAGEMENT.getManager<novum::keyboard>()->setPressedKey (wParam);   
        } break;


und abfrage:

C-/C++-Quelltext

1
2
            if (MANAGEMENT.getManager<novum::keyboard>()->isReleased (VK_ESCAPE))
                break;


die Update-Funktion muss in jedem Durchlauf der Hauptschleife aufgerufen werden.

Der Code ist leider nicht mehr sehr Frisch :) Aber funktioniert und in der Buchversion gibt es auch noch paar andere feine funktionen wie z.B. getChar (); ;)

- Patrick

edit: ahja, wenn du sowas schon machst, mach UNICODE rein :) (Nur mal so vorausgedacht :))

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

10

30.09.2004, 14:18

Danke für den hochexklusiven Code aus dem Buch ^_^

Wieso sollte ich Unicode machen? Kannst du mir das kurz erklären?
Wieso kann ich nicht das in etwa so machen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//...

if(m_bKey['A'] == true)
{
    cRueckgabe = 'A';
}
return cRueckgabe;
//...

  


?
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Werbeanzeige