game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
De activerings e-mail gemist?
+  Forums
|-+  Werken met Game Maker
| |-+  Tutorials en Uitbreidingen (Moderator: Maarten Baert)
| | |-+  [Scr] Gamecontroller | Press & Release voor knoppen en dpad
Pagina's: [1]
« vorige volgende »
Print
Advertenties

turbodevin
Gebruiker


Offline Offline

Berichten: 267

Rambo in de Rimboe


WWW
« Gepost op: 21 Juni 2011, 13:40:09 »

[Scr] Gamecontroller
Press & Release voor knoppen en dpad

GM-versie:  GameMaker 8
Pro vereist: Nee (volgens mij niet, heb zelf wel PRO)
Niveau: Gemiddeld

Je kunt bij een joystick alleen maar nagaan of een knop wel of niet ingehouden wordt, dit gebeurt met de functie:
GML:
joystick_check_button(id,button)
Ik heb echter een aantal scripts gemaakt met de zelfde functies als:
GML:
keyboard_check_pressed();
// en
keyboard_check_released();
maar dan voor joystick knoppen en het eventuele dpad.
Ik heb wat commentaar in het Engels erbij gezet.


Joystick Initialiseren

Eerst worden er in het script: joystick init() twee arrays aangemaakt.

Dit script moet aan het begin van het spel éénmaal aangeroepen worden.

GML:
globalvar jkey;
globalvar jpov;
var exist;
exist=0;
for (i=1; i<2; i+=1;){
    jkey[i-1,32]=0;
    jpov[i-1,8]=0;
    if (joystick_exists(i)){
        jkey[i-1,0] = joystick_buttons(i)
        jpov[i-1,0]=1;
    }
}



Status van knoppen checken

Het volgende script checked de status van een bepaalde knop en returned deze.
  0: Knop wordt niet ingehouden.
  1: Knop wordt ingehouden.
  2: Knop wordt ingedrukt.
  3: Knop wordt losgelaten.

joystick_check_state(id,button)
GML:
// argument0 = joystick id that should be checked
// argument1 = joystick button that should be checked
var jid, jbut;
jid=argument0;
jbut=argument1;
if (joystick_check_button(jid,jbut)){
    if (jkey[jid-1,jbut]==0){
        jkey[jid-1,jbut]=1;
        // Pressed
        return 2;
    }
    else {
        // Hold
        return 1;
    }
}
else {
    if (jkey[jid-1,jbut]==1){
        jkey[jid-1,jbut]=0;
        // Released
        return 3;
    }
    else {
        // None
        return 0;
    }            
}



Extra scripts voor knoppen

De volgende vier scripts zijn er eigenlijk alleen voor gebruiksgemak, maar als je niet wilt dat er onnodig een script aangeroepen wordt kun je ook in een if-statement controleren wat de status is ipv. een van de vier onderstaande scripts hiervoor te gebruiken.

Omdat ik aanneem dat deze scripts voor zich spreken staat hier geen verder commentaar bij, mocht dit nodig zijn kun je het hieronder melden en dan zet ik er wel wat bij.



joystick_check_button_hold(id,button)
GML:
// argument0 = joystick id that should be checked
// argument1 = joystick button that should be checked
if (joystick_check_state(argument0,argument1)==1){
return 1;
}
else {
return 0;
}

joystick_check_button_not_hold(id,button)
GML:
// argument0 = joystick id that should be checked
// argument1 = joystick button that should be checked
if (joystick_check_state(argument0,argument1)==0){
return 1;
}
else {
return 0;
}

joystick_check_button_pressed(id,button)
GML:
// argument0 = joystick id that should be checked
// argument1 = joystick button that should be checked
if (joystick_check_state(argument0,argument1)==2){
return 1;
}
else {
return 0;
}

joystick_check_button_released(id,button)
GML:
// argument0 = joystick id that should be checked
// argument1 = joystick button that should be checked
if (joystick_check_state(argument0,argument1)==3){
return 1;
}
else {
return 0;
}


Status van dpad checken

Het volgende script checked de status van een bepaalde richting van het dpad en returned deze.
  0: Dpad wordt niet ingehouden.
  1: Dpad wordt ingehouden.
  2: Dpad wordt ingedrukt.
  3: Dpad wordt losgelaten.

dpad_check_state(id,direction)
GML:
// argument0 = joystick id that should be checked
// argument1 = dpad direction that should be checked (0 - 360)
var jid, jdir;
jid=argument0;
jdir=argument1;
if (joystick_pov(jid)==jdir){
    if (jpov[jid-1,(jdir+45)/45]==0){
        jpov[jid-1,(jdir+45)/45]=1;
        // Pressed
        return 2;
    }
    else {
        // Hold
        return 1;
    }
}
else {
    if (jpov[jid-1,(jdir+45)/45]==1){
        jpov[jid-1,(jdir+45)/45]=0;
        // Released
        return 3;
    }
    else {
        // None
        return 0;
    }
}


Extra scripts voor dpad

De volgende vier scripts zijn weer alleen voor gebruiksgemak, maar als je niet wilt dat er onnodig een script aangeroepen wordt kun je ook in een if-statement controleren wat de status is ipv. een van de vier onderstaande scripts hiervoor te gebruiken.

Omdat ik aanneem dat deze scripts voor zich spreken staat hier geen verder commentaar bij, mocht dit nodig zijn kun je het hieronder melden en dan zet ik er wel wat bij.


dpad_check_hold(id,direction)
GML:
// argument0 = joystick id that should be checked
// argument1 = dpad direction that should be checked (0 - 360)
if (dpad_check_state(argument0,argument1)==1){
return 1;
}
else {
return 0;
}
dpad_check_not_hold(id,direction)
GML:
// argument0 = joystick id that should be checked
// argument1 = dpad direction that should be checked (0 - 360)
if (dpad_check_state(argument0,argument1)==0){
return 1;
}
else {
return 0;
}
dpad_check_pressed(id,direction)
GML:
// argument0 = joystick id that should be checked
// argument1 = dpad direction that should be checked (0 - 360)
if (dpad_check_state(argument0,argument1)==2){
return 1;
}
else {
return 0;
}
dpad_check_released(id,direction)
GML:
// argument0 = joystick id that should be checked
// argument1 = dpad direction that should be checked (0 - 360)
if (dpad_check_state(argument0,argument1)==3){
return 1;
}
else {
return 0;
}


Wanneer iemand nog tips heeft om een script sneller te maken, of een andere mededeling heeft hoor ik het graag.

Ik heb deze scripts getest met een Logitech Driving Force GT - racestuur in de volgende demo: 3D Menu Demo

Ik hoop dat jullie er iets aan gehad hebben  Knipoog.

« Laatste verandering: 21 Juni 2011, 21:07:32 door turbodevin »

Naar boven Gelogd

generaallucas
Gebruiker


Offline Offline

Berichten: 2900

Verhalen: klaar terwijl u wacht.


WWW
« Antwoord #1 Gepost op: 21 Juni 2011, 20:08:07 »

bij joystick_check_state, kun je niet beter gewoon return 1, 2, 3 of 4 ipv state gebruiken?


Actionscript 3 - C++ - C# - CSS3 - GML - HTML5 - Javascript - PHP - SQL - Visual Basic - VTask

3DS Max(VRay), Photoshop, Illustrator, Flash, Irrlicht, SDL, CML, OpenGL, Phonegap, Cordova
Naar boven Gelogd

turbodevin
Gebruiker


Offline Offline

Berichten: 267

Rambo in de Rimboe


WWW
« Antwoord #2 Gepost op: 21 Juni 2011, 20:57:45 »

bij joystick_check_state, kun je niet beter gewoon return 1, 2, 3 of 4 ipv state gebruiken?

Klopt, dat had ik in het begin gedaan omdat ik dan beter kon zien wat er gebeurde, maar ben ik vergeten terug te veranderen.

Bedankt Knipoog


Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1]
Print


Topic Informatie
0 geregistreerde leden en 1 gast bekijken dit topic.

Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
www.game-maker.nl © 2003-2020 Nederlandse Game Maker Community