ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 9
Mitglieder online: Keine
Registrierte Mitglieder: 2116
Neustes Mitglied: onkel_keks

GamePads mit DirectInput abfragen

Neue Antwort erstellen

Kommentare zu GamePads mit DirectInput abfragen

Kommentare zum Artikel GamePads mit DirectInput abfragen.
 

 

Autor Nachricht
 
 
KatoGrinsihara
Member


Anmeldedatum: 27.10.2007
Beiträge: 897

Antworten mit Zitat
BeitragVerfasst am: 05.10.2008, 12:09    Titel:

Eine kleine Kritik von mir.

Für jedes Controlerobjekt, was ich erzeuge, wird DirectInput initialisiert und ein Enum der Controller durchgeführt.
Das ist
A) unschön
B) nicht effektiv.

Ich würde das auf zwei Klassen aufteilen.
Eine Listenklasse EnumControls, die einmalig DirectInput initialisiert und alle angeschlossene Controller sucht.
Für jeden gefundene Controller wird dann eine Objekt der Klasse Control erzeugt und zu der Liste hinzugefügt.
In der Klasse Control befindet sich der code zum abfragen des JoystickState.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


KatoGrinsihara
Member


Anmeldedatum: 27.10.2007
Beiträge: 897

Antworten mit Zitat
BeitragVerfasst am: 05.10.2008, 15:05    Titel:

Ich habe mal das ganze etwas modifiziert.

Zu einem habe ich das wie vorher schon gepostet in zwei Klassen getrennt.
Dann habe ich dafür gesorgt, das die XBOX 360 Controller rausgefilltert werden.
Dazu habe ich einfach die Tatsache ausgenutzt, das die XBOX 360 Controller immer als erste kommen.
Wer das nicht möchte kann denn entsprechende Code wieder rausschmeisen.
Aber das verwenden von beiden Controlerarten Gleichzeit ist kein Problem.

Außerdem habe ich das hollen des JoystickState zusätzlich in eine Try Catch block gepackt.
Bei Test, wo ich den USB - Stecker gezocken habe, hat das Programm manchmal dort ein Fehler verursacht.
Die Sicherheitsabfrage ist also alleine nicht ausreichend.

Hier die Klasse EnumGameController:
Code:

using System;
using System.Collections.Generic;
using System.Text;
using SlimDX.DirectInput;
using Microsoft.Xna.Framework.Input;

namespace WindowsGame1
{
    public class EnumGameController
    {
        public List<GameController> Controllers;

        public EnumGameController(Microsoft.Xna.Framework.Game game)
        {
            Controllers = new List<GameController>();

            DirectInput.Initialize();

            // Geräte suchen
            InputDeviceCollection devices = DirectInput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly);

            if (devices.Count == 0)
            {
                // Kein Gamepad vorhanden
                return;
            }

            //Zähle die Anzahl der angeschlossenen XBOX 360 Controllers
            int startIndex = 0;

            if (GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.One).IsConnected)
            {
                startIndex++;
            }

            if (GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.Two).IsConnected)
            {
                startIndex++;
            }

            if (GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.Three).IsConnected)
            {
                startIndex++;
            }

            if (GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.Four).IsConnected)
            {
                startIndex++;
            }

            if (devices.Count == startIndex)
            {
                // Es sind nur XBOX 360 Controller angeschlossen
                return;
            }

            for (int index = startIndex; index < devices.Count; index++)
            {
                GameController controller = new GameController(game, devices[index].InstanceGuid);
                Controllers.Add(controller);
            }
        }

        public void Release()
        {
            for (;Controllers.Count > 0; )
            {
                GameController controller = Controllers[Controllers.Count - 1];
                Controllers.Remove(controller);

                controller.Release();
                controller = null;
            }

            Controllers = null;
        }
    }
}


Hier die Klasse GameController
Code:

using System;
using System.Collections.Generic;
using System.Text;
using SlimDX.DirectInput;

namespace WindowsGame1
{
    public class GameController

    {
        // Das GamePad
        private Device<JoystickState> joystick;

        // Status des GamePads
        private JoystickState state = new JoystickState();

        public readonly string Name = "";

        public GameController(Microsoft.Xna.Framework.Game game, Guid InstanceGuid)
        {
            // Gamepad erstellen
            joystick = new Device<JoystickState>(InstanceGuid);
           
            //Modelbezeichnung der Gamepads
            Name = joystick.DeviceInformation.ProductName;

            // Das GamePad soll nur reagieren, wenn sich unser Spiel(-fenster) im Vordergrund befindet
            joystick.SetCooperativeLevel(game.Window.Handle, CooperativeLevel.Exclusive | CooperativeLevel.Foreground);

            // Den Zahlenbereich der Achsen auf -1000 bis 1000 setzen
            foreach (DeviceObjectInstance deviceObject in joystick.GetDeviceObjects())
            {
                if ((deviceObject.ObjectType & ObjectDeviceType.Axis) != 0)
                    joystick.GetObjectPropertiesById((int)deviceObject.ObjectType).SetRange(-1000, 1000);
            }

            joystick.Acquire();
        }

        public JoystickState GetState()
        {
            try
            {
                if (joystick.Acquire().IsFailure || joystick.Poll().IsFailure)
                {
                    // Wenn das GamePad nicht erreichbar ist, leeren Status zurückgeben.
                    state = new JoystickState();

                    return state;
                }

                state = joystick.GetCurrentState();
                return state;
            }
            catch
            {
                //GamePad wurde rausgezogen!!
                state = new JoystickState();

                return state;
            }
        }

        public void Release()
        {
            if (joystick != null)
            {
                joystick.Unacquire();
                joystick.Dispose();
            }

            joystick = null;
        }
    }
}


Für dem GameController kommt jetzt EnumGameController in die Variablendeclaration:
Code:

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        EnumGameController joypadsEnum;


Initialize des EnumGameController:
Code:

        protected override void Initialize()
        {
            joypadsEnum = new EnumGameController(this);

            base.Initialize();
        }


Das Aufräumen:
Code:

        protected override void UnloadContent()
        {
            joypadsEnum.Release();
        }


Gleichzeitiges verwend von XBOX360 und Normalen GamePad im Update:
Code:

        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
           
            //Is überhaupt ein Controller vorhanden?
            if (joypadsEnum.Controllers.Count > 0)
            {
                // Aktuellen Status holen
                GameControllerState state = joypadsEnum.Controllers[0].GetState();

                // Wenn Knopf mit dem Index 1 gedrückt wird, das Spiel beenden
               // Knopf mit dem Index 1 != Knopf 1 (Bei mir ist das z.B. Taste 2)
               // In der Joystick device kann man sich übrigens auch die Namen der Knöpfe raushollen.
                if (state.GetButtons()[1])
                {
                    this.Exit();
                }
            }

            base.Update(gameTime);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Apprauuuu
Member


Anmeldedatum: 04.12.2007
Beiträge: 586
Wohnort: Leverkusen/Karlsruhe

Antworten mit Zitat
BeitragVerfasst am: 16.10.2010, 18:31    Titel:

Hallo!
Ich wollte auch die Slim DX- Methode für Gamepads nutzen,
jedoch kann ich den Code nicht kompilieren,
da bei der Zeile
Code:
DirectInput.Initialize();

gemeckert wird.
Angeblich verfügt die Klasse DirectInput über keine Initialize-Methode.
Könnte ich wahrscheinlich eine zu neue Version von SlimDX haben oder woran kann es liegen?
_________________
Derzeitige Projekte:
LOL³Fighters Released: www.lol-fighters.de.vu
Nebenbei entwicklung an neuer Version.
FrenzyWars Hauptaugenpunkt (erst mal Prüfungen -.-) http://www.xnamag.de/forum/viewtopic.php?t=620
Lunacy Derzeit geiced
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer


SteveKr
Administrator


Anmeldedatum: 08.04.2007
Beiträge: 1292
Wohnort: Hessen

Antworten mit Zitat
BeitragVerfasst am: 17.10.2010, 17:14    Titel:

Ja es hat sich einiges geändert im Laufe der Jahre.

DirectInput initialisiert man nun folgendermaßen:
Code:
DirectInput directInput = new DirectInput();


Anstelle von Device<JoystickState> gibt es jetzt eine Joystick-Klasse. Das hat noch ein paar kleinere Änderungen zu folge, die sich aber leicht aus dem Code erschließen.

Ich werde den Artikel im Laufe der nächsten Tage anpassen.

mfg Steve
_________________
Twitter
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


SonicTTH
Neuling


Anmeldedatum: 11.04.2012
Beiträge: 7

Antworten mit Zitat
BeitragVerfasst am: 11.04.2012, 16:41    Titel:

Hi,

Also ich habe den Artikel gelesen und auch nachzuarbeiten versucht, allerdings bin ich auf das selbe problem gestoßen wie einige User hier vor mir. Es ist im grunde wie der SteveKr es sagte, es hat sich einiges verändert.

Gibt es ein neues Tutorial zu diesem Thema irgendwo? Ich suche bereits seit zwei tagen durchs ganze web rund ums thema "xna controller input" oder "xna slimdx input" etc. aber immer wenn ich etwas finde, was brauchbar aussieht, geht es meist um das verwenden von XBOX-Controllern! Ich möchte aber allgemein Controller abfragen über die dafür vorgesehene schnittstelle von windows - also so, wie das in dem tutorial mit slimdx gemacht wird.

Wie gesagt, leider funktioniert dieses tutorial nicht mehr richtig und ich kriegs auch nicht hin das so anzupassen das es geht da ich damit gar keine erfahrung habe.

Gibts einen Lösungsansatz oder Alternativen?

Ich würd mich echt riesig freuen... ^^

Grüße,

SonicTTH
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Luux
Member


Anmeldedatum: 11.12.2011
Beiträge: 118

Antworten mit Zitat
BeitragVerfasst am: 11.04.2012, 18:58    Titel:

SonicTTH hat Folgendes geschrieben:
Hi,

Also ich habe den Artikel gelesen und auch nachzuarbeiten versucht, allerdings bin ich auf das selbe problem gestoßen wie einige User hier vor mir. Es ist im grunde wie der SteveKr es sagte, es hat sich einiges verändert.

Gibt es ein neues Tutorial zu diesem Thema irgendwo? Ich suche bereits seit zwei tagen durchs ganze web rund ums thema "xna controller input" oder "xna slimdx input" etc. aber immer wenn ich etwas finde, was brauchbar aussieht, geht es meist um das verwenden von XBOX-Controllern! Ich möchte aber allgemein Controller abfragen über die dafür vorgesehene schnittstelle von windows - also so, wie das in dem tutorial mit slimdx gemacht wird.

Wie gesagt, leider funktioniert dieses tutorial nicht mehr richtig und ich kriegs auch nicht hin das so anzupassen das es geht da ich damit gar keine erfahrung habe.

Gibts einen Lösungsansatz oder Alternativen?

Ich würd mich echt riesig freuen... ^^

Grüße,

SonicTTH


Wenn es dir um die reine Funktionalität geht, kannst du mit einem kleinen Workaround das ganze umgehen, indem du XPadder verwendest (http://xpadder.com/) bzw. auf dieses Programm verweist. Wäre aber nur eine Notlösung, wenn sich wirklich gar nichts findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


SonicTTH
Neuling


Anmeldedatum: 11.04.2012
Beiträge: 7

Antworten mit Zitat
BeitragVerfasst am: 11.04.2012, 19:39    Titel:

Hm, danke erstmal für den Hinweis.

Aber das ist ja nun wirklich nicht annehmbar für ein spiel zu sagen "wenn du mit nem gamepad spielen willst, besorg dir xpadder" ^^

Das mit dem Gamepad ist vor allem wichtig, weil es sich bei meinem momentanen Projekt um den nachbau eines älteren Spiels handelt, was ich eigentlich schon immer mal machen wollte, aber jetzt erst so wirklich kann... naja und das spiel funktioniert generell so, dass zwei leute an einem computer zocken, splitscreen mäßig, massenhaft gegner und für die finale fassung des spiels würden dann auch einige tasten pro spieler benötigt werden, was gamepads auf jeden fall angebracht macht...

Es wird doch sicherlich eine annehmbare lösung für soetwas geben, oder?

Ausserdem hat der eine User, der glaub ich den Artikel verfasst hat, doch gemeint, dass er das mal neu machen würde... was ist denn mit dem? Gibts den noch?

Grüße,

Sonic
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


SteveKr
Administrator


Anmeldedatum: 08.04.2007
Beiträge: 1292
Wohnort: Hessen

Antworten mit Zitat
BeitragVerfasst am: 12.04.2012, 00:23    Titel:

Ich hab den Artikel entsprechend angepasst. Sollte nun funktionieren.

mfg Steve
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


Luux
Member


Anmeldedatum: 11.12.2011
Beiträge: 118

Antworten mit Zitat
BeitragVerfasst am: 12.04.2012, 09:48    Titel:

SonicTTH hat Folgendes geschrieben:
Hm, danke erstmal für den Hinweis.

Aber das ist ja nun wirklich nicht annehmbar für ein spiel zu sagen "wenn du mit nem gamepad spielen willst, besorg dir xpadder" ^^


Mal ein bisschen OT: Leider ist dies heutzutage zur Normalität geworden. Von den allermeisten Spielen werden - wenn überhaupt - nur XBox-Controller unterstützt. Wer mit einem normalen Controller spielen will, muss dann zu XPadder greifen. Traurig, aber wahr... Mad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


SonicTTH
Neuling


Anmeldedatum: 11.04.2012
Beiträge: 7

Antworten mit Zitat
BeitragVerfasst am: 12.04.2012, 09:52    Titel:

Woah, genial, SteveKr! Ich und zukünftige Generationen danken dir! Smile

Ich hab mich zudem auch noch im xna.mag irc channel etwas rumgetrieben und bin dabei auf einen sehr hilfsbereiten Zeitgenossen gestoßen, der mir auch noch eine Alternative aufzeigte: sharpdx (http://code.google.com/p/sharpdx/).

Wenn man dort den Download "SharpDX-BinAndSamples-2.0.4.zip" wählt, erhält man ebenfalls ein hervorragendes beispiel für eine solche implementation.

@Luux: Ich neige ja sonst nicht zu so einer ausdrucksweise, aber: WTF. Ist aber natürlich auch zu erwarten, wenn solche lösungen wie XNA standartmäßig erstmal nur die xbox controller unterstützen. Unabhängig davon, haben wir aber hier sogar zwei lösungen für entwickler, die was besseres ermöglichen Smile Also lasst uns gemeinsam diese Lösungen nutzen und als Beispiel für die Unterstützung einer Bunten Hardware-Welt vorrangehen! Smile

Grüße,

SonicTTH

Und nochmals Danke, SteveKr!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de