Warsztat.GD

Programowanie => Językoznawstwo => C# => Wątek zaczęty przez: Kamilus w Luty 08, 2014, 10:45:28

Tytuł: Keyboard
Wiadomość wysłana przez: Kamilus w 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
(http://i.imgur.com/RP0kgj2.png)

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
(http://i.imgur.com/9C8s69l.png)

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
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: komorra w 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)
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: Xion w 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 :)
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: Pawelx156 w 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 :)
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: ArekBal w Luty 08, 2014, 14:24:31
Używasz jakichś dodatkowych bibliotek do inputu czy coś? np. Synergy?
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: Kamilus w 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ć?
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: ArekBal w 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.
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: Kamilus w 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;
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: ArekBal w 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.
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: Kamilus w 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?
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: Amplifa w 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
Tytuł: Odp: Keyboard
Wiadomość wysłana przez: ArekBal w 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.