Autor Wątek: Keyboard  (Przeczytany 3735 razy)

Offline Kamilus

  • Użytkownik

# Luty 08, 2014, 10:45:28
Heyo, od pewnego czasu używając XNA walczę z pewnym problemem. Otóż to od pewnego czasu użycie Keyboard.GetState() kończy się błędem.

Próbowałem już nawet przeinstalować XNA jak i VC#, mam XNA w wersji 4.0 (miałem 3.1) i VC# mam w wersji 2010 (miałem 2008), mimo wgrania nowszych wersji problem nie ustępuje, wcześniej tak nie było.

Przykładowa metoda Update z użyciem Keyboard.GetState()
protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            if (Keyboard.GetState().IsKeyDown(Keys.B))
            {
                //Coś tutaj, ale chodzi o to, że ów metoda tak czy siak zwraca błąd
            }
           
            // TODO: Add your update logic here

            base.Update(gameTime);
        }

Kod ładnie się kompiluje, odpalam i...
Cytuj
An invalid operation occurred when trying to query the keyboard state. The result code was 0.

A tu zdjęcie


Na koniec daje link do aplikacji, powinna wyświetlić (u osób które mają Windowsa) błękitne tło, u mnie kończy się to tak


Link do aplikacji
http://www.speedyshare.com/eEqPa/Aplikacja.rar

Proszę o pomoc, przeczesałem cały internet i nie znalazłem nic co by mi pomogło, jedynie to (problem z kompilacją pod Xbox'a, ale autor ma ten sam problem z każdym użyciem ów metody, czyli tak jak ja)
http://xboxforums.create.msdn.com/forums/p/55905/342716.aspx

Wyłączałem anty wirusa i zaporę, nadal to samo

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

  • +1
# Luty 08, 2014, 11:21:31
(Wyłączałeś antywirusa i zaporę i przesyłasz załączony plik exe który wymaga uprawnień admina - <ok> :P)

Wrzuć może kod na jakiś nopaste lub pastebin.

Na moje oko, program wchodzi w pierwszego ifa (GamePad) i się jakoś wykonuje this.Exit(), potem czytasz state keyboardu i bum...

Zobacz breakpointem czy faktycznie wchodzi w this.Exit();

(generalnie zaraz po this.Exit() powinno iść w parze od razu return, bo aplikacja nie powinna nic już wykonywać po stronie XNA po wywołaniu Exit-u)
« Ostatnia zmiana: Luty 08, 2014, 11:24:53 wysłana przez komorra »

Offline Xion

  • Moderator
    • xion.log

# Luty 08, 2014, 12:37:20
Cytuj
(generalnie zaraz po this.Exit() powinno iść w parze od razu return, bo aplikacja nie powinna nic już wykonywać po stronie XNA po wywołaniu Exit-u)
Wprawdzie nie znam się na XNA, ale jak dla mnie funkcja nazwana `Exit` powinna sama zadbać o to, żeby po niej już żaden `return` ani w ogóle nic nie było potrzebne :)

Offline Pawelx156

  • Użytkownik

# Luty 08, 2014, 13:28:12
U mnie wszystko działa. Taki zapis jest Ok.
Co do Exit to nie ma znaczenia gdzie i kiedy zostanie wywołany.

Jak na moje oko to czary w twoim systemie :)

Offline ArekBal

  • Użytkownik

# Luty 08, 2014, 14:24:31
Używasz jakichś dodatkowych bibliotek do inputu czy coś? np. Synergy?

Offline Kamilus

  • Użytkownik

# Luty 09, 2014, 13:47:16
Używam zwykłego XNA
http://pastebin.com/QEq3yCg3

Skoro czary w moim systemie to jakieś pomysły jak je zwalczyć?

Offline ArekBal

  • Użytkownik

# Luty 09, 2014, 16:35:28
Niestety...
1. Interop na GetKeyState // Prostsze wyjście

2. Interop na GetKeyboardState // Trudniejsze rozwiązanie

Myślę, że powinieneś założyć że metoda na XBoxa zadziała i po prostu dla Windowsa będziesz musiał korzystać z powyższych funkcji.

Offline Kamilus

  • Użytkownik

# Luty 09, 2014, 21:11:43
Tzn zaimportować z User32.dll funkcje GetKeyState?

#EDIT Mam mały problem przy używaniu DllImport mam
Cytuj
Error   1   The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?)   C:\Documents and Settings\Bacia\Moje dokumenty\Visual Studio 2010\Projects\WindowsGame4\WindowsGame4\WindowsGame4\Game1.cs   32   10   WindowsGame4

Error   2   The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?)   C:\Documents and Settings\Bacia\Moje dokumenty\Visual Studio 2010\Projects\WindowsGame4\WindowsGame4\WindowsGame4\Game1.cs   32   10   WindowsGame4

#EDIT2 Wystarczyło dodać
using System.Runtime.InteropServices;
« Ostatnia zmiana: Luty 09, 2014, 21:17:05 wysłana przez Kamilus »

Offline ArekBal

  • Użytkownik

# Luty 09, 2014, 22:20:50
Hint1: wystarczy rzutować enuma na inta by właściwy klawisz wskazać.

Hint2: http://www.pinvoke.net/default.aspx/user32/GetKeyState.html
Zamiast ich enuma podstaw enuma XNA.

Albo opakuj tego interopa w swoją metodę, wewnątrz zrzutuj i zwracaj enuma czy bool nacisnięty, podniesiony.
« Ostatnia zmiana: Luty 09, 2014, 22:24:53 wysłana przez ArekBal »

Offline Kamilus

  • Użytkownik

# Luty 09, 2014, 22:53:10
Zaimportowałem GetKeyState, zrobiłem funkcje IsKeyDown i wykorzystałem klasę Keys od XNA, wszystko działa, dziękuje za pomoc. Ostatnie pytanko, orientuje się ktoś jak edytować szablon w VC# 2010?

Offline Amplifa

  • Użytkownik

# Luty 27, 2014, 01:39:06
W internetach pisze ze to nie jest wina ani XNA ani hardware, po prostu antywirus/firewall ma jakis problem z exe i nie pozwala mu pobrac keyboard state, wylacz calkowica/zupdatuj antywira/firewalla i sproboj wykonac pierwszy kod ktory dawales. Nie ma sensu bawic sie z importami dla rzeczy ktore sa w XNA

Offline ArekBal

  • Użytkownik

# Luty 27, 2014, 01:49:14
Nie koniecznie...
Chociażby, oprócz wspomnianego błędu odpalanie mp3 też spowoduje problemy jeżeli masz wyłączony media player w windows.