游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2880|回复: 10

求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

[复制链接]

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2007-6-1 09:09:00 | 显示全部楼层 |阅读模式

这原先是昨天晚上我改了好久, 也不能让它支持两个手柄, 不知道是哪个关键代码错了. 其实有这方面经验的人只要稍稍指导一下就可以了, 帮帮我好不好?

比如要两个手柄, 是要有两个手柄的GUID呢, 还是要一个? 等等...

无论怎么写, 都不能让另外一个手柄好用...

我不想让你们看令人头疼的海量代码, 我只列出了部分关键代码..

这是照windows 2D游戏编程大师改的. 粘到下面格式就变得非常诡异了....

#include "GameConsole.h"

// GLOBALS ////////////////////////////////////////////////

extern        char buffer[80];                //        used to print text
extern        HWND        main_window_handle;        //        globally track main window
extern        int        window_closed;        //        tracks if window is closed
extern        HINSTANCE        main_instance;        //        globally track hinstance


// directinput globals
LPDIRECTINPUT8        lpdi        = NULL;    // dinput object
LPDIRECTINPUTDEVICE8        lpdikey        = NULL;    // dinput keyboard
LPDIRECTINPUTDEVICE8        lpdimouse        = NULL;    // dinput mouse
LPDIRECTINPUTDEVICE8        lpdijoya        = NULL;    // dinput joystick a
LPDIRECTINPUTDEVICE8        lpdijoyb        = NULL;    // dinput joystick b


GUID                joystickaGUID;        // guid for main joystick
GUID                joystickbGUID;        // guid for slave joystick
//  这步昨天晚上就感觉出好像错了...

char                joyname[80];        // name of joystick

// these contain the target records for all di input packets
DIJOYSTATE                joya_state;        // contains state of joystick a
DIJOYSTATE                joyb_state;        // contains state of joystick b

// demo globals




                /* * * * * * * * * * * * * * * * * * * * * * * *
                 * WIN T2D GAME PROGRAMMING CONSOLE FUNCTIONS  *
                 * * * * * * * * * * * * * * * * * * * * * * * */

BOOL CALLBACK DI_Enum_Joysticks(LPCDIDEVICEINSTANCE lpddi,
                                                                LPVOID guid_ptr)
{
        // this function enumerates the joysticks, but
        // stops at the first one and returns the
        // instance guid of it, so we can create it

        *(GUID*)guid_ptr = lpddi->guidInstance;

        // copy name into global
        strcpy( joyname, (char *)lpddi->tszProductName );

        // stop enumeration after one iteration
        return( DIENUM_STOP );

} // end DI_Enum_Joysticks



        // GAME PROGRAMMING CONSOLE FUNCTIONS ////////////////

int Game_Init(void *parms,  int num_parms)
{
        int index;         // looping var
        char filename[80]; // used to build up files names

        //        joystick creation section ////////////////////////////////

        //        first create the direct input object
        if        ( DirectInput8Create(        main_instance,                                                                DIRECTINPUT_VERSION,
                                IID_IDirectInput8,
                                (void **)&lpdi, NULL ) != DI_OK )
                return( 0 );

        //        是要这么弄两次么?
        lpdi->EnumDevices(        DI8DEVCLASS_GAMECTRL,                                                                DI_Enum_Joysticks,
                        &joystickaGUID,
                        DIEDFL_ATTACHEDONLY        );

        lpdi->EnumDevices(        DI8DEVCLASS_GAMECTRL,
                        DI_Enum_Joysticks,                                                                &joystickbGUID,
                        DIEDFL_ATTACHEDONLY        );


        if        ( lpdi->CreateDevice( joystickaGUID, &lpdijoya, NULL ) != DI_OK )        return( 0 );
        if        ( lpdi->CreateDevice( joystickaGUID, &lpdijoyb, NULL ) != DI_OK )        return( 0 );
        //  如果第二方程的第一个参数我用joystickbGUID 会错的. 但是用joystickaGUID的话..也不对啊..       

        //        set cooperation level
        if        ( lpdijoya->SetCooperativeLevel( main_window_handle,
                                        DISCL_NONEXCLUSIVE |
                                        DISCL_BACKGROUND ) != DI_OK )
                return( 0 );

        if        ( lpdijoyb->SetCooperativeLevel( main_window_handle,                                                                 DISCL_NONEXCLUSIVE |
                                        DISCL_BACKGROUND ) != DI_OK )
                return( 0 );


        //        set data format
        if        ( lpdijoya->SetDataFormat( &c_dfDIJoystick ) != DI_OK )        return( 0 );
        if        ( lpdijoyb->SetDataFormat( &c_dfDIJoystick ) != DI_OK )        return( 0 );

//////////////////////////////////////////////////////////////////////////
//     好了, 到此为止了, 估计问题就在上面的这些语句里面了, 但是我就是不知道怎么解决....

//////////////////////////////////////////////////////////////////////////

        //        set the range of the joystick
        DIPROPRANGE        joy_axis_range;

        // first x axis
        joy_axis_range.lMin = -1;
        joy_axis_range.lMax =  1;

        joy_axis_range.diph.dwSize                        = sizeof(DIPROPRANGE);
        joy_axis_range.diph.dwHeaderSize        = sizeof(DIPROPHEADER);
        joy_axis_range.diph.dwObj                        = DIJOFS_X;
        joy_axis_range.diph.dwHow                        = DIPH_BYOFFSET;

        lpdijoya->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );

        // first x axis
        joy_axis_range.lMin = -2;
        joy_axis_range.lMax =  2;

        joy_axis_range.diph.dwObj                        = DIJOFS_X;
        joy_axis_range.diph.dwHow                        = DIPH_BYOFFSET;
       
        lpdijoyb->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );

        // now y-axis
        joy_axis_range.lMin = -1;
        joy_axis_range.lMax =  1;

        joy_axis_range.diph.dwObj                        = DIJOFS_Y;
        joy_axis_range.diph.dwHow                        = DIPH_BYOFFSET;

        lpdijoya->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );
        lpdijoyb->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );


//////////////////////////////////////////////////////////////////////////

        // and now the dead band

        DIPROPDWORD dead_band; // here's our property word

        dead_band.diph.dwSize       = sizeof(dead_band);
        dead_band.diph.dwHeaderSize = sizeof(dead_band.diph);
        dead_band.diph.dwObj        = DIJOFS_X;
        dead_band.diph.dwHow        = DIPH_BYOFFSET;

        // 10% will be used on both sides of the range +/-
        dead_band.dwData            = 1000;

        // finally set the property
        lpdijoya->SetProperty( DIPROP_DEADZONE, &dead_band.diph );
        lpdijoyb->SetProperty( DIPROP_DEADZONE, &dead_band.diph );

        dead_band.diph.dwSize       = sizeof(dead_band);
        dead_band.diph.dwHeaderSize = sizeof(dead_band.diph);
        dead_band.diph.dwObj        = DIJOFS_Y;
        dead_band.diph.dwHow        = DIPH_BYOFFSET;

        // 10% will be used on both sides of the range +/-
        dead_band.dwData            = 1000;

        // finally set the property
        lpdijoya->SetProperty( DIPROP_DEADZONE, &dead_band.diph );
        lpdijoyb->SetProperty( DIPROP_DEADZONE, &dead_band.diph );

        // acquire the joystick
        if        ( lpdijoya->Acquire() != DI_OK )        return( 0 );
        if        ( lpdijoyb->Acquire() != DI_OK )        return( 0 );


///////////////////////////////////////////////////////////
} // end Game_Init

///////////////////////////////////////////////////////////


谁能帮我稍稍看一下, 说一下关键所在啊?

在此谢谢了[em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3]


[em3] [em3] [em3] [em3] [em3] [em4] [em2] [em2] [em3]

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2007-6-1 09:10:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

贴上来之后格式都大走样了.....

7

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2007-6-1 09:30:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

我想:单手柄应该和双手柄一样,不用创建lpdijoyb
LPDIRECTINPUTDEVICE8 lpdijoya = NULL;    // dinput joystick a
LPDIRECTINPUTDEVICE8 lpdijoyb = NULL;    // dinput joystick b
让lpdijoya工作先

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2007-6-1 14:33:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

那么这样只有一个手柄啊, 另外一个手柄的性质怎么设置呢?

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-6-1 15:47:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

在EnumDevices里找到不同名字的两个设备的GUID再根据GUID来创建设备。

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2007-6-1 16:09:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

// directinput globals
LPDIRECTINPUT8 lpdi = NULL;    // dinput object
LPDIRECTINPUTDEVICE8 lpdijoya = NULL;    // dinput joystick a
LPDIRECTINPUTDEVICE8 lpdijoyb = NULL;    // dinput joystick b

GUID joystickaGUID; // guid for main joystick
GUID joystickbGUID; // guid for slave joystick

    ..............

    if ( lpdi->CreateDevice( joystickaGUID, &lpdijoya, NULL ) != DI_OK ) return( 0 );
    if ( lpdi->CreateDevice( joystickbGUID, &lpdijoyb, NULL ) != DI_OK ) return( 0 );
    ..............

    你是说这样么?我昨天晚上这样做的结果是失败的。
    我不能得到另外一个手柄的GUID了!

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-6-1 17:25:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

因为你没有得到正确的GUID,所以,你自己需要继续检查相关代码。

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2007-6-1 17:35:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

关键是, 具体的应该怎么做呢?

你们有谁具体的写过呢?

GUID joystickbGUID; // guid for slave joystick

    ..............

    if ( lpdi->CreateDevice( joystickbGUID, &lpdijoyb, NULL ) != DI_OK ) return( 0 );

但是除了这种方法,我还能用什么方法呢?

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2007-6-1 19:44:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

?在我?有一??手柄是好用的,剩下那个死活弄不起来,你们究竟谁真正会做,并且做过啊?!?!?!

如果我只用一个GUID,设置的两个性能都是手柄1的。
如果申请两个GUID,第二个是申请不到的。

究竟应该怎么写啊? 大侠们,你们不是高手么?

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-6-2 04:16:00 | 显示全部楼层

Re:求助, 我的双手柄代码究竟错在哪里?(只需要你指导部分

不是申请两个GUID,而是找到两个不同的GUID。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表