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

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

21

27.12.2006, 13:02

Trotzdem vertrete ich dennoch die Meinung dass man nicht verkomplizierte Spiele machen muss(bzw. ein Spiel so sein muss) um Spass zu machen...

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

22

27.12.2006, 15:30

Zu dem Problem der Steuerung hab ich irgendwann ma ne Klasse geschrieben, weiß nich, ob du die verwenden willst... hab die mal bisschen überarbeitet:

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
class Keys
{
public:
    Keys()  {}
    ~Keys() {}

    void Update()
    {
        _LastTime=_Time;
        _Time=timeGetTime();
        _TimeDiff=_Time-_LastTime;
        memcpy_s( _Oldkeys, sizeof(_Oldkeys), _Keys, sizeof(_Keys)); // _Oldkeys=_Keys;

        // _Keys neu belegen, Wenn die Taste neu gedrückt ist wird sie mit KeyDownDelayed() sofort erkannt, sonst wird die Druckzeit erhöht

        for (unsigned long i=0; i<256; ++i)
        {
            _Keys[i] = (GetAsyncKeyState(i) & 0x8000)!=0;
            if (_Keys[i] && !_Oldkeys[i])
                _TimeElapsed[i]=100;
            else if (_Keys[i])
                _TimeElapsed[i] += _TimeDiff;
        }
    }

    // Taste neu gedrückt?

    bool KeyPressed(unsigned long vKey)
    {
        return (_Keys[vKey] && !(_Oldkeys[vKey]));
    }

    // Taste grad losgelassen?

    bool KeyReleased(unsigned long vKey)
    {
        return (!(_Keys[vKey]) && _Oldkeys[vKey]);
    }

    // Taste ist gedrückt

    bool KeyDown(unsigned long vKey)
    {
        return (_Keys[vKey]);
    }

    // Taste ist gedrückt und wurde in den letzten 100ms nicht als gedrückt gemeldet

    bool KeyDownDelayed(unsigned long vKey)
    {
        if (_Keys[vKey] && (_TimeElapsed[vKey] >=100))
        {
            _TimeElapsed[vKey]=0;
            return true;
        }
        return false;
    }

private:
    bool _Oldkeys[256];
    bool _Keys[256];
    unsigned long _TimeElapsed[256];

    unsigned long _Time, _LastTime, _TimeDiff;
};


Wenn das Game in einer Schleife läuft muss man nur noch einmal pro schleife Keys::Update() aufrufen, dann kann man den Status der Tasten abfragen - Abfragecodes wie bei GetAsyncKeyState()
KeyDownDelayed() bringt eine Verzögerung von min. 100ms zwischen 2 positiven Auswertungen einer durchgängig gedrückten Taste.
Falls bereits an anderer Stelle Zeitmessungen vorgenommen werden ist es sicher sinnvoll, diesen Wert einfach an Update zu übergeben, anstatt da eine eigene Rechnung zu machen.

Zur Verwendung brauch man nat. eine Instanz der Klasse.

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

23

28.12.2006, 13:07

@Firefly
Ich habe das mit dem kompliziert auf mein Spiel bezogen gemeint.
Wenn einem natürlich ein geniales,neues Spielprinzip einfällt, wie Tetris, dann ist das natürlich etwas anderes.
@grek40
Danke, ist nett gemeint, aber da ich das Spiel nicht weiterentwickeln werde, werde ich es kaum benutzen.

Werbeanzeige