Como o GMS reconhece o controle do OUYA.

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Como o GMS reconhece o controle do OUYA.

Mensagem por CRP-Max em Qua 04 Set 2013, 09:30

Eu consegui instalar o controle do OUYA no pc, via Bluetooth, fiz toda a calibragem, esta tudo ok, porem o GMS não reconhece ele, nenhum comando de gamepad, funciona, usei este comando para verificar a detecção de um controle no windows, porem ele sempre retorna "Nenhum controle detectado".

Código:
var gp_num = gamepad_get_device_count(); // Isso retorna quantos controles posso ter ao mesmo tempo neste dispositivo, no Windows são 4
 for (var i = 0; i < gp_num; i++;)
    {
    if gamepad_is_connected(i) // Caso algum controle seja detectado
       {
       draw_text(32, 32 + (i * 32), gamepad_get_description(i)); // Aqui deveria aparecer a descrição do controle algo como: OUYA Game Controller
       }
    else
       {
       draw_text(32, 32 + (i * 32), "Nenhum controle detectado");
       }
    }
É mais pratico eu testar o jogo no Windows, para depois passar para o Android, do que ter que compilar só pra teste...

CRP-Max

Ranking : Nota C
Número de Mensagens : 819
Idade : 41
Data de inscrição : 28/10/2008
Notas recebidas : C
Reputação : 29
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por PedroX em Qua 04 Set 2013, 12:17

Parece que você precisa selecionar a opção de controle:

Global Game Settings -> Android -> General -> Bluetooth / iCade

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por CRP-Max em Qua 04 Set 2013, 17:47

PedroX escreveu:Parece que você precisa selecionar a opção de controle:

Global Game Settings -> Android -> General -> Bluetooth / iCade
Na verdade eu já tinha visto isso, mas estas funções são somente para o Android, não fazem efeito no Windows, e o controle do PS3 também é Bluetooth e funciona normalmente, porém eu queria testar direto no controle do OUYA...

CRP-Max

Ranking : Nota C
Número de Mensagens : 819
Idade : 41
Data de inscrição : 28/10/2008
Notas recebidas : C
Reputação : 29
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por saim em Qui 12 Set 2013, 11:16

Posso aproveitar o tópico? Estou com o mesmo problema. Conectei o gamepad na porta USB, os testes do windows funcionam (mostram o botão apertado e tudo), mas o GMS parece não reconhecer o controle como conectado. Coloquei alguns debug messages no create, pra testar, e veja o que resultou:

create:
Código:
var i; for(i := 0; i < 4; i += 1){
    desenhaBot[i] := false;
    }

botao[0] := gp_face1;
botao[1] := gp_face2;
botao[2] := gp_face3;
botao[3] := gp_face4;

if (gamepad_is_supported()){
    show_debug_message("gamepad suportado!");
    }
    else {
        show_debug_message("gamepad não suportado...");
        }

controle := -1;
var gp_num = gamepad_get_device_count();
for (i := 0; i < gp_num; i++;)
    {
    if gamepad_is_connected(i){
        show_debug_message("o gamepad conectado é o " + string(i));
        show_debug_message(gamepad_get_description(i));
        controle := i;
        }
    }
show_debug_message("nControles = " + string(gp_num));
show_debug_message("controle = " + string(controle));
E as mensagens:
debug escreveu:**********************************.
Entering main loop.
**********************************.
Total memory used = 1641266(0x004776fd) bytes
StartGame() - DONE
controle = -1
nControles = 4
gamepad suportado!
Quer dizer, suporta controle, mas não encontra nenhum conectado. Lembrando: o controle está conectado e funcionando no windows, eu testei o jogo como se fosse lançado no windows.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por Kabeção em Sex 13 Set 2013, 19:56

Meu gamepad oficial Xbox 360 não é reconhecido também mas, funciona com as funções joystick_.
Como o Windows tem uma infinidade de modelos diferentes de controles eu uso tanto as funções joystick_ quanto gamepad_ para garantir que a maioria funcione.

Um exemplo:
Código:
globalvar gpad;
gpad = gamepad_is_supported();
gpad_id = -1;   // device id

if gpad {
    var gp_num = gamepad_get_device_count();
    for (var i = 0; i < gp_num; i++;) {
        if gamepad_is_connected(i) {
            gpad_id = i;
            gpad = true;
            break;
        } else {
            gpad = false;
        }
    }
}

if !gpad && os_type = os_windows {
    if joystick_exists(1) {
        gpad = 2;
        gpad_id = 1;
    }
    if joystick_exists(2) {
        gpad = 2;
        gpad_id = 2;
    }
}
Resumindo, se gamepad_is_connected detecta um gamepad então gpad = 1, caso não eu uso joystick_exists, se existir gpad = 2.
Se os dois casos forem falsos, gpad = 0.

Na hora de controlar:
Código:
// eu uso key[constante_tecla] no lugar do usual keyboard_check...
// assim esse script me permitido usar o tecla e o joystick ao mesmo tempo sem dificuldades

var i;
for (i = 0; i < key_n; i += 1) {
    key[i]  = (keyboard_check(akey[i]));
    pkey[i] = (keyboard_check_pressed(akey[i]));
    rkey[i] = (keyboard_check_released(akey[i]));
    
    if gpad = 1 {
        key[i] = key[i] || gamepad_button_check(gpad_id,gp_map[i]);
        pkey[i] = pkey[i] || gamepad_button_check_pressed(gpad_id,gp_map[i]);
        rkey[i] = rkey[i] || gamepad_button_check_released(gpad_id,gp_map[i]);
    }
    if gpad = 2 {
        key[i] = key[i] || joystick_check_button(gpad_id,joy_map[i]);
        // ...
    }
}
Ou usa keyboard_key_press e keyboard_key_release para simular o teclado.

Mover para cima e para baixo
Código:
x += (key[right]-key[left]) * spd;
y += (key[down]-key[up]) * spd;

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por saim em Dom 15 Set 2013, 21:07

Muito bom, Kabeção! Eu já estava pronto pra dar um double-post, dizendo que as funções obsoletas são as que funcionam. A propaganda das novas funções é tão forte que eu ainda não tinha testado as velhas.
MAS seu código termina justamente na parte interessante... As funções velhas não têm checagem de "pressed" e "released", só de "check_button".
Não esquenta, eu posso fazer um "last_situation" ou coisa do tipo e ver se está diferente da atual. Vai ficar um script volumoso, mas o bom dos scripts é que eles podem ser escritos e deixados num canto, sem incomodar com seu volume.

Acho que o problema está resolvido. Quer dizer, eu queria MESMO era fazer o jogo reconhecer meu joystick velho com as novas funções, mas parece que não vai ter jeito. Já que isso não dá pra fazer, o que dá está bem direcionado.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por Kabeção em Dom 15 Set 2013, 21:44

Eu uso keyboard_key_press e keyboard_key_release para facilitar minha vida.

Código:
for (i = 0; i < key_n; i += 1) {
    if gpad = 2 {
    
        if i >= 4 && i <=13 {
            if joystick_check_button(gpad_id,ajoy[i]) {
                keyboard_key_press(akey[i]);
            } else {
                keyboard_key_release(akey[i]);
            }
        }
    }

    key[i]  = (keyboard_check(akey[i]) && tkey);
    pkey[i] = (keyboard_check_pressed(akey[i]) && tkey);
    rkey[i] = (keyboard_check_released(akey[i])  && tkey);

    if gpad = 1 {
        key[i] = key[i]   || (gamepad_button_check(gpad_id,ajoy[i]) && tkey);
        pkey[i] = pkey[i] || (gamepad_button_check_pressed(gpad_id,ajoy[i]) && tkey);
        rkey[i] = rkey[i] || (gamepad_button_check_released(gpad_id,ajoy[i]) && tkey);
    }

}
Em outras palavras, transformo o joystick em um teclado.
O interessante é que enquanto o jogo estiver rodando o joystick simula o teclado em qualquer programa.
Mas entre não me preocupar com isso e perder horas simulando as funções, escolhe não me preocupar, até mesmo porque o destino do jogo não é o computador.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por PedroX em Dom 15 Set 2013, 22:01

Muito bom, Kabeção. Excelente ideia. Ainda estou fazendo meus testes e esse 'script' vai ser usado. Mas vou trocar por variáveis, para não interferir em outros programas e para evitar possíveis transtornos.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por Kabeção em Seg 16 Set 2013, 00:18

Galera, notei o bug hoje enquanto desenvolvia meu jogo.
As funções funcionam depois de reiniciar com game_restart.
Vejam o exemplo que postei no bug tracker http://bugs.yoyogames.com/view.php?id=12351 e digam se acontece o mesmo com vocês.

....

Postando no GMC descobri o problema.
Parece que o GMS só reconhece a conexão do gamepad depois de alguns steps.
Use um alarm e cheque o gamepad depois de 3 steps.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por PedroX em Seg 16 Set 2013, 14:54

Achei mais um pouco de informação no tópico: http://gmc.yoyogames.com/index.php?showtopic=574199

OK pessoal, Windows normalmente não trabalha com controles do PS3. Até aparece no Painel de Controle, mas simplesmente não funciona direito.

Para fazê-los funcionar, você usa MotionInJoy (ou talvez haja outro programa também). Então, nas configurações do MotionInJoy, você escolher diferentes métodos de emulação. Muitos deles são versões DInput, como as opções de controles de PS1/PS2, mas um deles, o XBOX360, torna-o um dispositivo XInput. Então, se configurar o controle como XBOX360, vai usar XInput, e poderá ser usado com as novas funções gamepad*. Mas se configurar o controle como qualquer outro dispositivo, vai usar DInput e só poderá ser usado com as funções de joystick.
Resumindo tudo: você pode usar um emulador no Windows e então usar gamepad_* ou então usar joystick_* no Windows e gamepad_* no Ouya (assim como fez o Kabeção).

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por saim em Ter 17 Set 2013, 15:05

Kabeção escreveu:Galera, notei o bug hoje enquanto desenvolvia meu jogo.
As funções funcionam depois de reiniciar com game_restart.
Vejam o exemplo que postei no bug tracker http://bugs.yoyogames.com/view.php?id=12351 e digam se acontece o mesmo com vocês.

....

Postando no GMC descobri o problema.
Parece que o GMS só reconhece a conexão do gamepad depois de alguns steps.
Use um alarm e cheque o gamepad depois de 3 steps.
Nem. Deve ser o controle, como sugere o Pedro. O meu é o mais genérico do mundo, comprado pra jogar PS2, ele tem duas entradas, uma é usb. Uso o game_restart quantas vezes quiser e continua não encontrando o gamepad - embora o truque do joystick funcione! Ah, e eu procuro pelo gamepad 30 steps depois do jogo iniciado, acho que isso mais do que dá tempo pra qualquer delay.

Agora, deixa eu entender esse lance de transformar o joystick num teclado, enquanto faço meus testes aqui... são funções com as quais não estou familiarizado.
Você escolhe uma tecla e força o windows a apertar a tecla se o botão do joystick estiver apertado, isso a cada step. O jogo vai entender que essa situação mudou de um step pro outro? Tipo "ah, se a tecla estava apertada e não está mais, é na hora de disparar um evento de key_release". É isso? Bacaaana!
Eu me perdi no "tkey". Você chegou a explicar ele? O que é?

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por Kabeção em Ter 17 Set 2013, 18:54

O jogo vai entender que essa situação mudou de um step pro outro?
Sim.
O programa não só simula, ele faz o Windows receber a tecla como se realmente fosse apertada, por isso, enquanto o jogo rodar se você for no bloco de notas e usar o joystick, ele vai funcionar como o teclado.

Eu me perdi no "tkey". Você chegou a explicar ele? O que é?
O que mostrei é apenas um pedaço dos scripts que criei para controlar teclado e joystick.
tkey serve para desativar os controles se for false.
Uso constantes com o nome dos botões (baseados no controle do Xbox360) para facilitar.
Código:
rt=15
lt=14
rs=13
rb=12
ls=11
lb=10
back=9
start=8
ba=7
bb=6
by=5
bx=4
down=3
right=2
up=1
left=0
Código:
akey[up]    = ord('W');
akey[down]  = ord('S');
akey[left]  = ord('A');
akey[right] = ord('D');
/*akey[up]    = vk_up;
akey[down]  = vk_down;
akey[left]  = vk_left;
akey[right] = vk_right;*/
akey[ba]    = vk_space;
akey[bb]    = ord('C');
akey[bx]    = ord('Z');
akey[by]    = ord('V');
akey[start] = vk_enter;
akey[back]  = vk_backspace;
akey[lb]    = ord('Q');
akey[ls]    = ord('E');
akey[rb]    = ord('R');
akey[rs]    = ord('T');
akey[lt]    = ord('Y');
akey[rt]    = ord('U');

// Gamepad
if gpad = 1 {
    ajoy[up]    = gp_padu;
    ajoy[down]  = gp_padd;
    ajoy[left]  = gp_padl;
    ajoy[right] = gp_padr;
    
    ajoy[ba]    = gp_face1;
    ajoy[bb]    = gp_face2;
    ajoy[bx]    = gp_face3;
    ajoy[by]    = gp_face4;
    ajoy[start] = gp_start;
    ajoy[back]  = gp_select;
    ajoy[lb]    = gp_shoulderl;
    ajoy[lt]    = gp_shoulderrb;
    ajoy[ls]    = gp_stickl;
    ajoy[rb]    = gp_shoulderr;
    ajoy[rt]    = gp_shoulderrb;
    ajoy[rs]    = gp_stickr;
}

// Joystick
if gpad = 2 {
    // o valor certo para cada botão é totalmente instável
    // de joystick para joystick então é praticamente obrigatório
    // dar a opção de configurar os controles para o jogador
    ajoy[ba]    = 1;
    ajoy[bb]    = 2;
    ajoy[bx]    = 3;
    ajoy[by]    = 4;
    ajoy[start] = 8;
    ajoy[back]  = 7;
    ajoy[lb]    = 5;
    ajoy[ls]    = 9;
    ajoy[rb]    = 6;
    ajoy[rs]    = 10;
}
E defino um objControle com um depth grande para executar primeiro que os outros objeto e uso o script no Step Begin.
Código:
// gpad_step()
// Definir keys e combo
var i,m,t2;
m = -1;

if gpad = 2 {
    // Dpad
    t2 = joystick_pov(gpad_id);
    
    if t2 != -1 {
        switch (t2) {
            case 0:     t2 = 90; break;
            case 90:    t2 = 0; break;
            case 135:   t2 = 315; break;
            case 180:   t2 = 270; break;
            case 315:   t2 = 135; break;
            case 270:   t2 = 180; break;
        }
    }
    
    // Analogico simula botões direcionais
    if t2 = -1 {
        switch (joystick_direction(gpad_id)) {
            case vk_numpad1: t2 = 225; break;
            case vk_numpad2: t2 = 270; break;
            case vk_numpad3: t2 = 315; break;
            case vk_numpad4: t2 = 180; break;
            case vk_numpad5: t2 = -1; break;
            case vk_numpad6: t2 = 0; break;
            case vk_numpad7: t2 = 135; break;
            case vk_numpad8: t2 = 90; break;
            case vk_numpad9: t2 = 45; break;
        }
    } else {
        //t2 += 90;
    }
    
    // Simular botões direcionais
    i = down;
    if (t2 > 180 && t2 < 360)  {
        keyboard_key_press(akey[i]);
    } else {
        keyboard_key_release(akey[i]);
    }
    
    i = left;
    if (t2 > 90 && t2 < 270) {
        keyboard_key_press(akey[i]);
    } else {
        keyboard_key_release(akey[i]);
    }
    
    i = up;
    if (t2 > 0 && t2 < 180) {
        keyboard_key_press(akey[i]);
    } else {
        keyboard_key_release(akey[i]);
    }
    
    i = right;
    if (t2 = 45 || t2 = 0 || t2 = 315) {
        keyboard_key_press(akey[i]);
    } else {
        keyboard_key_release(akey[i]);
    }
    
    // Gatinhos
    if (joystick_zpos(id) <= -0.5) {
        keyboard_key_press(akey[rt]);
    } else {
        keyboard_key_release(akey[rt]);
    }
    
    if (joystick_zpos(id) >= 0.5) {
        keyboard_key_press(akey[lt]);
    } else {
        keyboard_key_release(akey[lt]);
    }
}

for (i = 0; i < key_n; i += 1) {
    if gpad = 2 {
    
        if i >= 4 && i <=13 {
            if joystick_check_button(gpad_id,ajoy[i]) {
                keyboard_key_press(akey[i]);
            } else {
                keyboard_key_release(akey[i]);
            }
        }
    }

    key[i]  = (keyboard_check(akey[i]) && tkey);
    pkey[i] = (keyboard_check_pressed(akey[i]) && tkey);
    rkey[i] = (keyboard_check_released(akey[i])  && tkey);

    if gpad = 1 {
       key[i] = key[i]   || (gamepad_button_check(gpad_id,ajoy[i]) && tkey);
        pkey[i] = pkey[i] || (gamepad_button_check_pressed(gpad_id,ajoy[i]) && tkey);
        rkey[i] = rkey[i] || (gamepad_button_check_released(gpad_id,ajoy[i]) && tkey);
    }

}
E assim uso as variáveis key,rkey e pkey por todo o jogo.

Código:
x += (key[right]-key[left]) * spd;
y += (key[down]-key[up]) * spd;

if pkey[start] {
    pausar_game();
}

if rkey[bx] ataque_carregado();
É um método que uso já a anos e é sempre a base dos controles dos meus jogos.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por saim em Ter 17 Set 2013, 21:47

Show de bola, Kabeção!

Tentei montar um sistema por conta própria aqui, acabei caindo num bocado de bugs, voltei nesse tópico um monte de vezes, consegui fazer os 4 botões principais funcionar. Amanhã (se tiver tempo), faço o resto dos botões.

Tem Parece ter um erro na sua lógica. Por algum motivo, rkey está sempre retornando true, a menos que a tecla esteja sendo apertada. Deve ser o tal "tkey", que eu não vi ainda como faz... envergonhado 
Mas sem o "tkey", eu fiquei com a impressão que as teclas estão sendo soltas a cada step.

Resolvi da seguinte forma:
Código:
var i;
for (i := 0; i < 4; i += 1) {
    if (gpad == 2) { // se é o joystick que está funcionando
        if joystick_check_button(gpad_id, ajoy[i]) { // se o botão está apertado
            keyboard_key_press(akey[i]); // faz a tecla estar apertada
            }
            else {
                keyboard_key_release(akey[i]); // faz a tecla não estar apertada
                }
        }

    key[i]  := keyboard_check(akey[i]);
    pkey[i] := key[i] && !prevkey[i] //keyboard_check_pressed(akey[i]); //
    rkey[i] := !key[i] && prevkey[i]; //keyboard_check_released(akey[i]); //

    if (gpad == 1) { // se é o gamepad que está funcionando
        key[i]  := gamepad_button_check(gpad_id, ajoy[i]) || key[i];
        pkey[i] := gamepad_button_check_pressed(gpad_id, ajoy[i]) || pkey[i];
        rkey[i] := gamepad_button_check_released(gpad_id, ajoy[i]) || rkey[i];
        }
    prevkey[i] := key[i];
    }
Outra coisa que talvez você não tenha parado pra pensar: dá pra transformar o joystick_pov em direção equivalente à do game maker, sem usar o switch:
Código:
t2 := joystick_pov(gpad_id);
transforma := (360 + 90 - (t2)) mod 360;
Isso pode te facilitar a vida, aí pra cima.

Nossa, é muito código. Depois eu termino de entender tudo (acho que consigo)... Boa noite!


Última edição por saim em Sex 20 Set 2013, 14:16, editado 1 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por PedroX em Ter 17 Set 2013, 22:06

@saim, se você quer apenas testar o jogo no Windows (e não publicar para ele), use o MotionJoy. Você gastará menos tempo nessa parte. O programa é leve.

http://www.baixaki.com.br/download/motioninjoy.htm

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por saim em Qua 18 Set 2013, 19:35

Ah, PedroX, agradeço muito e até estou instalando o programa, aqui, pra ver se funciona com qualquer controle (no primeiro round, continuo mexendo com joystick, não gamepad, mas ainda vou tentar reiniciar a máquina, aprender a mexer direito nisso aqui), mas já que o Kabeção disponibilizou o script completo, aí, acho bacana ter uma forma universal de trabalhar. Daí, eu gravo os scripts e fica o suporte pra controles pelo resto da vida.

Claro que testar os controles de gamepad funcionando como gamepad é primordial, também.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por Kabeção em Qua 18 Set 2013, 22:38

Endendi, então é assim que posso inverter o ângulo em 90 graus.
Pelo visto, keyboard_release ativa o rkey mesmo se a tecla não foi apertada antes.
Antigamente usava variáveis ou invés dessas funções então nem tinha percebido o problema.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por saim em Sex 20 Set 2013, 18:30

Caramba... Agora me caiu a ficha! Desse jeito, eu vou conseguir fazer funcionar o joystick e não sei se o gamepad funciona do jeito certo!

PedroX, testei o motionjoy aqui, ele abre mas não roda. Acaba dando gpad = 2 e o motionjoy trava. Sei lá porque. Talvez seja isso:
MotioninJoy drives your Playstation 3 controller (Sixaxis or Dualshock 3) on windows. By this way your Sixaxis or Dualshock 3 as a general game controller with motion sensor.
Meu controle é um... deixa eu procurar alguma indicação de marca aqui... um "bright games". Vou arrumar alguém com um controle de xbox ou ps3 sobrando.

Kabeção, seu código tem um pouco de erros de digitação. Fui personalizar, acabei alterando um monte de coisa. Eliminei a parte dos "Gatinhos" (suponho que fossem "gatilhos", mas não deu pra ter certeza, já explico porque).
É que ele muda o valor dos "triggers" (por isso acho que eram "gatilhos"), mas em função da posição de alguns eixos do analógico (por isso que eu não tenho certeza).
Como não vi sentido, como os triggers são botões como outros quaisquer, cortei fora.
Eu achava que o point of view era pro analógico. Do jeito que é, o switch até faz sentido (ah, eu mudei o cálculo de transformação, a equação estava errada - corrigi o post anterior, também).

Agora ficou assim:
Pra identificar o controle, não mudei muito:
Código:
// Detecta o joystick ou gamepad conectado (apenas 1) e armazena a sua id.
// Define a variável gpad como "0" se não houver joystick, como "1" se houver um gamepad e como "2" se houver um joystick

globalvar gpad, gpad_id;
gpad := gamepad_is_supported();
gpad_id := -1; // device id

if gpad { // se rola de usar gamepad
    var gp_num := gamepad_get_device_count(); // quantidade de controles conectados
    for (var i := 0; i < gp_num; i++;) { // de controle em controle
        if gamepad_is_connected(i) { // se o tal está conectado
            gpad_id := i; // pega a id do controle
            gpad := true; // pra depois de 0, gpad VOLTA a ser true
            break; // não voltar a ser false
            }
            else { // se não está conectado
                gpad := false; // vira false (e fica false se nenhum estiver conectado)
            }
        }
    }

if (!gpad && os_type := os_windows) { // se não tem nada conectado
    if joystick_exists(1) { // se o joystick 1 existe
        gpad = 2; // gpad não fica false (fica "2")
        gpad_id = 1; // pega a id do controle
        }
    if joystick_exists(2) {
        gpad = 2; // gpad não fica false (fica "2")
        gpad_id = 2; // pega a id do controle
        }
    }

show_debug_message("gpad=" + string(gpad) + "; gpad_id=" + string(gpad_id));
Logo depois, no mesmo create event, eu mapeio os botões. Mudei a ordem toda, pra ficar na mesma sequencia que os números dos botões do joystick. Não que fizesse diferença, mas pra minha cabeça entender melhor.
Código:
// nomes
globalvar bx, by, ba, bb, start, back, lb, ls, rb, rs, lt, rt, akey, ajoy, left, up, right, down, key_n, bot_n;
var i; i := 0;
// na ordem do joystick (mas no joystick, o primeiro botão é 1)
by    := i; i += 1; // 0
bb    := i; i += 1; // 1
ba    := i; i += 1; // 2
bx    := i; i += 1; // 3
lb    := i; i += 1; // 4
rb    := i; i += 1; // 5
lt    := i; i += 1; // 6
rt    := i; i += 1; // 7
start := i; i += 1; // 8
back  := i; i += 1; // 9
ls    := i; i += 1; // 10
rs    := i; i += 1; // 11

bot_n := i; // número de botões (de apertar)

left  := i; i += 1;
up    := i; i += 1;
right := i; i += 1;
down  := i; i += 1;

key_n := i; // número de teclas

// teclado
akey[up]    := vk_up; //akey[up]    := ord('W'); //
akey[down]  := vk_down; // akey[down]  := ord('S'); //
akey[left]  := vk_left; // akey[left]  := ord('A'); //
akey[right] := vk_right; // akey[right] := ord('D'); //

akey[start] := vk_enter;
akey[back]  := vk_backspace;

akey[ba]    := ord('A');
akey[bb]    := ord('S');
akey[bx]    := ord('Q');
akey[by]    := ord('W');
akey[lb]    := ord('E');
akey[lt]    := ord('D');
akey[rb]    := ord('R');
akey[rt]    := ord('F');
akey[rs]    := ord('T');
akey[ls]    := ord('G');

// Gamepad
if (gpad == 1) {
    ajoy[up]    := gp_padu;
    ajoy[down]  := gp_padd;
    ajoy[left]  := gp_padl;
    ajoy[right] := gp_padr;
    
    ajoy[ba]    := gp_face1;
    ajoy[bb]    := gp_face2;
    ajoy[bx]    := gp_face3;
    ajoy[by]    := gp_face4;
    ajoy[start] := gp_start;
    ajoy[back]  := gp_select;
    ajoy[lb]    := gp_shoulderl;
    ajoy[lt]    := gp_shoulderlb;
    ajoy[ls]    := gp_stickl;
    ajoy[rb]    := gp_shoulderr;
    ajoy[rt]    := gp_shoulderrb;
    ajoy[rs]    := gp_stickr;
    }

// Joystick
if (gpad == 2) {
    // o valor certo para cada botão é totalmente instável
    // de joystick para joystick então é praticamente obrigatório
    // dar a opção de configurar os controles para o jogador
    i := 1;
    ajoy[by]    := i; i += 1; // 1
    ajoy[bb]    := i; i += 1; // 2
    ajoy[ba]    := i; i += 1; // 3
    ajoy[bx]    := i; i += 1; // 4
    
    ajoy[lb]    := i; i += 1; // 5
    ajoy[rb]    := i; i += 1; // 6
    ajoy[lt]    := i; i += 1; // 7
    ajoy[rt]    := i; i += 1; // 8
    ajoy[back]  := i; i += 1; // 9
    ajoy[start] := i; i += 1; // 10
    ajoy[ls]    := i; i += 1; // 11
    ajoy[rs]    := i; i += 1; // 12
    }
    
globalvar key, pkey, rkey, prevkey;
for(i := 0; i < key_n; i++){
    key[i] := false;
    pkey[i] := false;
    rkey[i] := false;
    prevkey[i] := false;
    }
Agora, pro step, mudei um bocado. Ou levei um bocado de tempo pra entender, não lembro. Enfim, ficou assim:
Código:
// gpad_step()
// Definir keys e combo
var i, t2;

if (gpad == 2) {
    // Dpad
    if (joystick_pov(gpad_id) != -1){
        t2 := (360 + 90 - (joystick_pov(gpad_id))) mod 360;
        }
        else {
            t2 := -1;
            }
    
    // Analogico simula botões direcionais
    if (t2 == -1) {
        switch (joystick_direction(gpad_id)) {
            case vk_numpad1: t2 := 225; break;
            case vk_numpad2: t2 := 270; break;
            case vk_numpad3: t2 := 315; break;
            case vk_numpad4: t2 := 180; break;
            case vk_numpad5: t2 := -1; break;
            case vk_numpad6: t2 := 0; break;
            case vk_numpad7: t2 := 135; break;
            case vk_numpad8: t2 := 90; break;
            case vk_numpad9: t2 := 45; break;
            }
        }
    
    // Simular botões direcionais
    // down;
    if (t2 > 180 && t2 < 360)  {
        keyboard_key_press(akey[down]);
        } else {
            keyboard_key_release(akey[down]);
            }
    
    // left;
    if (t2 > 90 && t2 < 270) {
        keyboard_key_press(akey[left]);
        } else {
            keyboard_key_release(akey[left]);
            }
    
    // up;
    if (t2 > 0 && t2 < 180) {
        keyboard_key_press(akey[up]);
        } else {
            keyboard_key_release(akey[up]);
            }
    
    // right;
    if (t2 < 90 || t2 > 270 && t2 != -1) {
        keyboard_key_press(akey[right]);
        } else {
            keyboard_key_release(akey[right]);
            }
    }

for (i := 0; i < key_n; i += 1) {
    if (gpad == 2) {
        if (i < bot_n) { // se é um botão "de apertar"
            if joystick_check_button(gpad_id, ajoy[i]) {
                keyboard_key_press(akey[i]);
                } else {
                    keyboard_key_release(akey[i]);
                    }
            }
        }

    key[i]  := (keyboard_check(akey[i]));
    pkey[i] := (key[i] && !prevkey[i]);
    rkey[i] := (!key[i] && prevkey[i]);

    if (gpad == 1) {
        key[i] := key[i]   || (gamepad_button_check(gpad_id, ajoy[i]));
        pkey[i] := pkey[i] || (gamepad_button_check_pressed(gpad_id, ajoy[i]));
        rkey[i] := rkey[i] || (gamepad_button_check_released(gpad_id, ajoy[i]));
        
        // Analogico simula botões direcionais
        key[up]    := key[up]    || (gamepad_axis_value(gpad_id, gp_axislv) <= -0.5;
        key[down]  := key[down]  || (gamepad_axis_value(gpad_id, gp_axislv) >= 0.5;
        key[left]  := key[left]  || (gamepad_axis_value(gpad_id, gp_axislh) <= -0.5;
        key[right] := key[right] || (gamepad_axis_value(gpad_id, gp_axislh) >= 0.5;
        
        }

    prevkey[i] := key[i];
    }

Bom... Eu queria ver se alguém cujo controle é identificado como gamepad (gpad = 1, no exemplo) pudesse testar essa engine.
Eis aqui o link. A cor das bolinhas nos botões deve mudar ao apertar, manter apertado ou soltar algum deles. Como os eventos de apertar e soltar são muito rápidos, fiz uns alarmes; e pra ver a cor de soltar, tem que soltar o botão um tempinho depois de apertar (20 steps).
Ah, tem uma coisa que não está nos scripts: a posição das bolinhas dos direcionais deve variar de acordo com o que você mexer.

Se a engine funcionar toda como gamepad também, fico sossegado pra programar.

Valeu demais, moçada!

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Como o GMS reconhece o controle do OUYA.

Mensagem por Conteúdo patrocinado Hoje à(s) 17:17


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum