下面这个要下载嘛? 游戏启动不了 点开始游戏弹一个窗口说游戏正在steam执行初始设置置 然后就没了

1626人阅读
游戏编程(8)
&键盘概述:&& 当我们在键盘上按下一个键时,字符就神奇的出现在了屏幕上.键盘跟系统之间的交互是非常烦琐的,但作为游戏程序员的我们必须理解这里面的奥秘,为以后的开发扫平障碍.&& 当我们按下或者是释放一个键时,一个信号将被传送给键盘的微处理器,随后键盘微处理器将向计算机系统&申请&一个中断,同时系统从键盘那里获得了一个字符码,从而使得系统得知到底是那个键被按下或者释放,微处理器给计算机系统传送的那个字符码被称作扫描码.下图让我们有个更为清晰的理解:
&这里需要指出的是一个扫描码的大小是一个字节,其中低7位(即bit0-6)表示哪个键被操作,而最高位代表是被按下还是被释放.所以我们所能处理的最多的键的数目是128.windows中的键盘处理:&& 想在windows平台上混碗饭吃的人如果不懂消息机制的话那将很难,正是windows的消息机制使得对于键盘的处理变的简单.首先windows把扫描码转换为虚拟码和ASCII码,然后通过消息机制来告诉程序员某个键被按下了.虚拟码只是将原来的扫描码在windows里进行了包装,用VK_A而不是30来表示A.而ASCII码是为了实现扫描码和字符之间的对应关系的,在ASCII码里面,A 和 a所对应的ASCII码是不同的,最多表示128种不同的字符.为了能表示更多的字符,有时候要用到扩展的ASCII码,所谓扩展就是增添了一位附加信息,这样就使得可以表示的字符数目达到了256个,但是仍然不能达到要求,这也是Unicode产生的原因之一.到了Unicode每个字符用16个比特位来表示,所以总共能表示65535种字符,满足了目前所有需求.&& 对于接收到的虚拟码或者ASCII码如何处理就取决于程序员了,如果我们想用来做文字处理,那么我们就把字符插入到编辑区域.对于游戏来说大多是控制游戏中的各种角色的.windows中鼠标的处理:&&& 鼠标相对于键盘来说就更加简单了,因为鼠标上的&零件&实在是太少了.当我们按下一个键时就给系统发送一个信号,释放时同样要向系统发送信号.鼠标每隔一个很小的时间间隔就想系统报告它的移动信息等,鼠标的驱动程序读入这些数据然后转换成相应的形式.然而用传统的消息机制来处理鼠标消息是很慢的,有时候不能满足游戏的需要,因为每个鼠标消息都要传送给消息处理过程,然后再被插入到相应的消息队列等待处理,这对于游戏的实时性来说是很不利的,玩家可不想在自己发出命令后要过一段时间才有反应,要的是速度!& && 从上面的表述我们发现,传统的windows输入处理都要先由设备驱动程序处理,然后再交给系统处理,最后才再给相应的应用程序.为什么不绕开系统而让设备驱动程序跟应用程序直接交互呢?这就是DirectInput的原理.&& DirectInput基础:&& DirectInput用一组COM对象来表示输入系统和具体的输入设备.最主要的对象 IDirectInput8,用来初始化输入系统和创建输入设备对象.DirectInput COM 对象IDirectInput8&&&&&&&&&& 最中要的DirectInput COM对象,其他所有的对象都要通过它来创建.IDirectInputDevice8&&&& 用来表示输入设备的COM对象,每种输入设备都与之对应的COM设备对象.IDirectInputEffect&&&&& 用来实现反馈效果的COM对象.
&&&&& 所有的输入设备都使用同一个接口对象来处理:IDirectInputDevice8.每种设备都以此为基础再加上各自的特有信息.下图可以帮我们理解:
IDirectInput8创建各种IDirectInputDevice8,然后由IDirectInputDevice8来创建IDirectInputEffect对象.
IDirectInput8组件对象包含一组函数用来初始化数据系统,获得输入设备接口.用的最多的是以下两个函数:IDirectInput8::EnumDevices()& 和 IDirectInput8::CreateDevice().在以后的学习中我们会详细的介绍这两个函数.DirectInput的初始化:&& 为了使用DirectInput,我们首先要在程序文件中包含&DInput.h&,并且连接DInput8.lib.IDirectInput8对象代表了整个输入系统,所以它是最重要的,看下面的代码:IDirectInput8 g_pDI; // 声明全局的IDirectInput8对象DirectInplut为我们提供了DirectInput8Create()帮助器函数,下面是它的原型:
HRESULT WINAPI DirectInput8Create(HINSTANCE hInstance, // 应用程序实例DWORD dwVersion, // DIRECTINPUT_VERSIONREFIID riidltf, // IID_IDirectInput8LPVOID *ppvOut, // 要创建对象的指针LPUNKNOWN pUnkOuter); // set to NULL
这个函数中的大多数参数取默认值即可,我们只需要提供所要创建对象的指针即可.下面我们来看一个完整的创建对象的例子:IDirectInput8 *g_pDI; // global DirectInput objectint PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, /LPSTR szCmdLine, int nCmdShow){&&& HRESULT&&& hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, / &&&&&&&&&&&&& IID_IDirectInput8, (void**)&g_pDI, NULL);&&&& // return failure if an error occurred&&& if(FAILED(hr))&&&&&& return FALSE;&&& // Go on with program here初始化输入系统就这么几句代码搞定了,下面我们就来创建具体的输入设备.输入设备的创建:&&& 很高兴我们又一次地站在了巨人的肩膀上,微软在简化输入系统方面做了很多工作,这就使得我们学习起来很轻松.我们可以使用同一个COM对象来处理系统中所有的输入设备.各种输入设备的创建和使用是极为类似的,我们首先给出创建和使用它们的步骤,见下表:创建和使用输入设备的步骤:步骤&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 使用到的接口函数Obtain a device GUID&&&&&&&&&&&&&&&&&&&&&&&&& IDirectInput8::EnumDevicesCreate the device COM object&&&&&&&&&&& IDirectInput8::CreateDeviceSet the data format&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& IDirectInputDevice8::SetDataFormatSet the cooperative level&&&&&&&&&&&&&&&&&&&& IDirectInputDevice8::SetCooperativeLevelSet any special properties&&&&&&&&&&&&&&&&&& IDirectInputDevice8::SetPropertyAcquire the device&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& IDirectInputDevice8::AcquirePoll the device&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& IDirectInputDevice8::PollRead in data&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& IDirectInputDevice8::GetDeviceState
别忘记了首先要声明一个设备对象指针:IDirectInputDevice8 *pDID下面我们来逐一说明每个步骤:获得唯一设备号:&&& 系统中的每个输入设备都有一个GUID(全局唯一标识),要想使用输入设备,我们就必须先得到它的GUID.对于键盘和鼠标来说这个工作是很简单的,因为DirectInput分别为它们定义了GUID_SysKeyboard和GUID_SysMouse.但是对于其它的输入设备,我们必须通过枚举来获得它们的GUID:HRESULT IDirectInput8::EnumDevices(DWORD dwDevType, //所要枚举的设备类型LPDIENUMCALLBACK lpCallback, //每当找到一个该类型的设备时将自动调用该函数LPVOID pvRef, // 可以把它当成上面回调函数的参数DWORD dwFlags); // 标志位下面是dwFlags的取值:
& DIEDFL_ALLDEVICES All installed devices are enumerated. This is the default behavior. DIEDFL_ATTACHEDONLY Only attached and installed devices. DIEDFL_FORCEFEEDBACK Only devices that support force feedback. DIEDFL_INCLUDEALIASES Include devices that are aliases for other devices. DIEDFL_INCLUDEHIDDEN Include hidden devices.DIEDFL_INCLUDEPHANTOMS Include phantom (placeholder) devices. 下面是回调函数的声明:BOOL CALLBACK DIEnumDevicesProc(LPDIDEVICEINSTANCE lpddi, // 设备结构LPVOID pvRef);lpddi是一个指向DIDEVICEINSTANCE结构的指针,它包含了当前所找到设备一些信息.下面是它的详细定义:typedef struct {DWORD dwS // Size of this structureGUID guidI // device GUIDGUID guidP // OEM supplied GUID of deviceDWORD dwDevT // Device typeTCHAR tszInstanceName[MAX_PATH]; //Name of deviceTCHAR tszProductName[MAX_PATH]; //Name of productGUID guidFFD // GUID of force-feedback driverWORD wUsageP // Usage page if an HID deviceWORD wU // Usage code if an HID device} DIDEVICEINSTANCE;下面就让我们来看一个具体的例子,它的功能是枚举系统中的所有输入设备,当找到一个后就弹出一对话框,根据我们的选择来决定是继续枚举还是停止运行:IDirectInput8 *g_pDI;BOOL InitDIAndEnumAllDevices(HWND hWnd,HINSTANCE hInst){&if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION,IID_IDirectInput8, (void**)&g_pDI, NULL)))&&&&&&&& return FALSE;&&& g_pDI-&EnumDevices(DI8DEVCLASS_ALL, EnumDevices,(LPVOID)hWnd, DIEDFL_ALLDEVICES);&&& return TRUE;}BOOL CALLBACK EnumDevices(LPCDIDEVICEINSTANCE pdInst, LPVOID pvRef){&&& int R&// Display a message box with name of device found&&& Result = MessageBox((HWND)pvRef, pdInst-&tszInstanceName,&&&&&&&&&&& &Device Found&, MB_OKCANCEL);&&& // Tell it to continue enumeration if OK pressed&&& if(Result == IDOK)&&&&&&& return DIENUM_CONTINUE;&&& // Stop enumeration&&& return DIENUM_STOP;}然后把InitDIAndEnumAllDevices()插入到程序的相应位置就可以了.
设备对象的创建:&& 现在我们已经有了GUID,接下来就是要创建具体的设备接口对象了,这个工作是有下面这个函数来完成的:&& HRESULT IDirectInput8::CreateDevice(&&&&&&&&&&&&&& REFGUID rguid, // GUID of device to create, predefined or from enumeration&&&&&&&&&&&&&& LPDIRECTINPUTDEVICE *lplpDirectInputDevice, // pointer to the object you&re creating&&&&&&&&&&&&&& LPUNKNOWN pUnkOuter); // NULL - not used& 它的参数都很明了,这里我们就不再多说,直接来看一个例子:&& IDirectInputDevice8 *pDID&& HRESULT hr = g_pDI-&CreateDevice(DeviceGUID, &pDIDevice, NULL);& 或许感觉这个例子还是不够具体,我们就来看看如何使用键盘:&& IDirectInputDevice8 *pDID&& HRESULT hr = pDI-&CreateDevice(GUID_SysKeyboard,&pDIDevice, NULL);设置数据格式:&& 各种输入设备发送的信息都是不同的,所以我们无法以一种固定的格式来接收所有的输入信息,所以我们需要为每个输入设备都设置一种数据格式以便来正确的接受来自设备的数据,设置工作由下面这个函数来完成:&& HRESULT IDirectInputDevice8::SetDataFormat(LPCDIDATAFORMAT lpdf);该函数只有一个参数,一个指向DIDATAFORMAT结构的指针,下面我们来这个函数的具体定义:typedef struct {&&&& DWORD dwS // Size of this structure&&&& DWORD dwObjS // Size of DIOBJECTDATAFORMAT structure&&&& DWORD dwF // Flags determining if device works in absolute mode (DIDF_ABSAXIS) or relative (DIDF_RELAXIS)&&&& DWORD dwDataS // Size of data packets received from device (in multiples of 4)&&&& DWORD dwNumO // Number of objects in the rgodf array&&&& LPDIOBJECTDATAFORMAT // Address to an array of DIOBJECTDATAFORMAT structures.&&&& } DIDATAFORMAT, *LPDIDATAFORMAT;&&& 又是一个讨厌的数据结构,尽管它不是很复杂,但是我们见到的类似的数据结构实在是太多了,好在大多数情况下不用我们自己来创建其实例,因为DirectInput已经预定义好了一些:Device&&&&&&&&&&&&&&&&&&&&&&&& Data Structure&&&&&&&&&&&&&&&&&&&&&& ExampleKeyboard&&&&&&&&&&&&&&&&&&& c_dfDIKeyboard&&&&&&&&&&& pDIDevice-&SetDataFormat(&c_dfDIKeyboard);Mouse&&&&&&&&&&&&&&&&&&&&&&&& c_dfDIMouse&&&&&&&&&&&&&& pDIDevice-&SetDataFormat(&c_dfDIMouse);Joystick&&&&&&&&&&&&&&&&&&&&&& c_dfJoystick&&&&&&&&&&&&& pDIDevice-&SetDataFormat(&c_dfDIJoystick);&&& 我们又一次站在了巨人的肩膀上,尽情享受着前人的果实,感觉着实舒服.如果你对他们的工作感到不屑,或者想自己开发这些,我不太赞同,不要重复发明轮子!设置设备的共享等级:&&& 游戏中往往使用多个输入设备,鼠标,键盘,游戏杆,甚至更多.但这里面有一个我们不得不考虑的问题:当我们使用这些输入设备的时候是否允许其它的应用程序同时使用.我们可以很霸道地独占这些设备,但这并不是最好的选择.让我们来看看如何设置吧:&& HRESULT IDirectInputDevice8::SetCooperativeLevel(&&&&&&&&&&&&&&&&&&& HWND hWnd, // handle to the parent window&&&&&&&&&&&&&&&&&&& DWORD dwFlags);// flags determining how to share accesshWnd是窗口句柄,dwFlags可以从以下值中选择:
等级&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 详细描述DISCL_NONEXCLUSIVE&&&&&&&&&& 允许其他程序使用,并且不会干扰其他应用程序的使用DISCL_EXCLUSIVE&&&&&&&&&&&&& 独占模式,其它应用都不能使用DISCL_FOREGROUND&&&&&&&&&&&& 前台模式,也就是说使用它的程序必须处于激活状态,如果它失去焦点就会自动失去设备,再它重新获得焦点的时候必须重新获得设备使用权DISCL_BACKGROUND&&&&&&&&&&&& 后台模式,无论是否激活都能使用DISCL_NOWINKEY&&&&&&&&&&&&&& This disables the Windows logo key.&& 当我们设置这些标志时,或者DISCL_EXCLUSIVE 或者 DISCL_NONEXCLUSIVE,并且要跟DISCL_FOREGROUND 或者DISCL_BACKGROUND 合起来使用.我们建议大家这样来组合:&&&&& pDIDevice-&SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);设置特殊属性:&&& 除了前面我们所设置的属性外,我们还可以设置一些更为高级的属性.比如是使用相对坐标还是绝对坐标,相对坐标是相对上一次移动了的坐标,而绝对坐标是以一点为原点来算的.我们还可以来设置数据缓冲,我们可以来设置缓冲区的大小从而以我们喜欢的节奏来处理数据,所有的设置都是通过下面的代码来实现的:HRESULT IDirectInputDevice8::SetProperty(&&&&&&&&&&&&&&&&& REFGUID rguidProp, // GUID of property&&&&&&&&&&&&&&&&& LPCDIPROPHEADER pdiph); // DIPROPHEADER containing data about the property being set下面是DIPROPRHEADER的定义:typedef struct {&&&&&& DWORD dwS // Size of the enclosing structure&&&&&& DWORD dwHeaderS // Size of this structure&&&&&& DWORD dwO // What value we&re setting&&&&&& DWORD dwH // How you&re setting the value&&&&& } DIPROPHEADER, *LPDIPROPHEADER;可以参阅DirectX SDK了解具体如何来使用上述代码来设置相应的属性.获得设备:&&& 在设备能被使用之前首先要得到它,这样才能使得我们的程序能接触到设备,不管设备是共享还是独占的.这里有一点需要注意:其它应用程序也是可以获得设备,所以必要的时候我们还要重新获得设备.&& 那我们怎么知道什么时候该获得设备呢?第一次通常是创建设备对象时,使用设备之前.其它时候就是其它程序夺取了使用权之后.下面的代码用来获得设备:&&&&&&&&&&&&& HRESULT IDirectInputDevice8::Acquire();&我们还可以释放:&&&&&&&&&&&&& HRESULT IDirectInputDevice8::Unacquire();
为了避免在运行期间出现错误,接下来应该调用下面这句:HRESULT IDirectInputDevice8::Poll();这个函数的调用能够保证数据的正确性.数据的读入:&&& 终于,我们能够从输入设备中读入数据了,这个过程是由IDirectInputDevice8::GetDeviceState()来完成的.下面是它的原型:HRESULT IDirectInputDevice8::GetDeviceState(&&&&&&&&&&&&&&&&& DWORD cbData,&&& // 数据缓冲区的大小&&&&&&&&&&&&&&&&& LPVOID lpvData); // 数据缓冲区第二个参数是需要的数据缓冲区,对于各种不同的数据设备数据缓冲区是不同的.下面是一段读入数据的代码:BOOL ReadDevice(IDirectInputDevice8 *pDIDevice, &&&&&&&&&&&&&&&&&&&&&&&&&&& void *DataBuffer, long BufferSize){&&&& HRESULT&&&& while(1) &&&& {&&&&&&&& // Poll device&&&&&&&& g_pDIDevice-&Poll();&&&&&&&& // Read in state&&&&&&&& if(SUCCEEDED(hr = g_pDIDevice-&GetDeviceState(BufferSize,(LPVOID)DataBuffer)))&&&&&&&&&&&&&&&&&&&& // Return on an unknown error&&&&&&&& if(hr != DIERR_INPUTLOST && hr != DIERR_NOTACQUIRED)&&&&&&&&&&&& return FALSE;&&&&&&& // Reacquire and try again&&&&&&& if(FAILED(g_pDIDevice-&Acquire()))&&&&&&&&&&&& return FALSE;&&&& } &&&& // Return a success&&&& return TRUE;}下面我们来看看具体的处理键盘和鼠标的例子.键盘的处理:IDirectInputDevice8*InitKeyboard(HWND hWnd, IDirectInput8 *pDI){&&&&& IDirectInputDevice8 *pDID&&&&& // Create the device object&&&&& if(FAILED(pDI-&CreateDevice(GUID_SysKeyboard, &&&&&&&&&&&&&&&&&&&& &pDIDevice, NULL)))&&&&&&&&& return NULL;&&&&& // Set the data format&&&&& if(FAILED(pDIDevice-&SetDataFormat(&c_dfDIKeyboard))) &&&&& {&&&&&&&& pDIDevice-&Release();&&&&&&&& return NULL;&&&&& }&&&&& // Set the cooperative mode&&&&& if(FAILED(pDIDevice-&SetCooperativeLevel(hWnd, &&&&&&&&&&&&&&&&&&&&&&& DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))&&&&& {&&&&&&&&&&& pDIDevice-&Release();&&&&&&&&&&& return NULL;&&&&& }&&&&& // Acquire the device for use&&&&& if(FAILED(pDIDevice-&Acquire()))&&&&& {&&&&&&&&&& pDIDevice-&Release();&&&&&&&&&& return NULL;&&&&&& }&&&&&& // Everything was a success, return the pointer&&&&&& return pDID}上面的代码并不难理解,因为都是按照我们前面的讲述来的,所以这里就不再重复.这里只是做好了初始化的工作,在开始读数据之前我们首先要理解键盘的数据是如何保存的.我们必须提供一个256字节的数组,每个字节保存一个键的信息.所以我们一共可以处理256个键.每个键有两个状态:按下或者释放.为了查看键的状态通过查看相应字节的最高位(位7),如果是1则被按下,否则是处于释放状态.&& char KeyStateBuffer[256];&& if((pDIDKeyboard = InitKeyboard(g_hWnd, g_pDI)) != NULL) && {&&&&&& // read in the data&&&&&& ReadData(pDIDKeyboard, (void*)KeyStateBuffer, 256);&& }&& #define KeyState(x) ((KeyStateBuffer[x] & 0x80) ? TRUE : FALSE)&& if(KeyState(VK_LEFT) == TRUE) && {&&&&& // Left arrow is being pressed&& }鼠标的处理:&&&& 鼠标的初始化跟键盘的一样,只不过是将数据格式由键盘改成了鼠标.这里就不再重复那些代码了.&&&& 处理鼠标时需要调用DirectInputDevice8::GetDeviceState()函数,该函数填充了一个DIMOUSESTATE结构体,它里面包含了关于鼠标的信息:typedef struct {&&&&&&&&&& LONG lX; // Relative change in X coordinate&&&&&&&&&& LONG lY; // Relative change in Y coordinate&&&&&&&&&& LONG lZ; // Relative change in Z coordinate&&&&&&&&&& BYTE rgbButtons[4]; // Button pressed flags&&&&&&&& } DIMOUSESTATE, *LPDIMOUSESTATE;注意,这里的坐标值是相对的,而我们要想得到绝对位置就必须维护两个全局变量来保存绝对位置:IDirectInputDevice8 *pDIDM// The mouse coordinateslong g_MouseXPos = 0, g_MouseYPos = 0;// The data buffer to store the mouse stateDIMOUSESTATE MouseSif((pDIDMouse = InitMouse(g_hWnd, g_pDI)) != NULL) {&&&& // read in the data&&&& ReadData(pDIDMouse, (void*)MouseState, sizeof(DIMOUSESTATE));&&&& // update the absolute coordinates&&&& g_MouseXPos += MouseState.lX;&&&& g_MouseYPos += MouseState.lY;}#define MouseButtonState(x) ((MouseState.rgbButtons[x] & /0x80) ? TRUE : FALSE)
小结:在这段时间里我们学习了如何更快的处理输入,为以后做好游戏打好坚实的基础.&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:39335次
排名:千里之外
原创:14篇
评论:17条
(1)(1)(1)(1)(2)(1)(1)(1)(4)(1)(4)(2)您的举报已经提交成功,我们将尽快处理,谢谢!
反复安装`清理电脑垃圾`装游戏的时候`放在一个大一点的盘里面看看`安装好在线更新`不行再检查更新`多来几次`应该可以解决`首先要确认你电脑的一切驱动要装好`不要...
大家还关注为什么下了刀塔一点运行游戏就是正在执行初始设置_百度知道SupARC平台常见问题帮助
一.平台无法连接网络
1.被防火墙阻止
解决方法:“开始菜单→设置→控制面板→Windows防火墙→例外→添加程序”
选择街游的程序文件(SupARC.exe),允许平台连接互联网。
被安全软件阻止
将SupARC.exe设置为受信任软件。
2.电脑的端口被封闭
解决方法:“开始菜单→设置→控制面板→Windows防火墙→例外→添加端口”
将"403","513","514","8000","8001"之类的UDP端口解封。
3.路由的端口被封闭
参照路由器的说明书,开放上述端口。
4.网络运营商封闭端口
目前只能向运营商致电,要求开放端口。
5.在平台只能观战,但无法连接进行游戏
有可能是服务器在某个时间抽风了。如果一直没恢复正常,应该找网络运营商确认端口是不是被封了。平台是P2P的,如果运营商封掉P2P功能,有可能导致平台连不上。
或者尝试修改端口或者配置文件来解决。
1,游戏设置,固定端口,输入目标值,修改值请见下面第3条
2,配件文件修改方法:
1)用记事本等文本编辑程序打开SupARC文件夹下的config.xml,
2)找到-1这一行。
3)修改-1的数值,范围是2~65534,最好设置1000以上的数值,比如8080。修改完毕后保存,之后需要重开平台。如果不行就多试几次。
二.程序无法正常运行
1.初始化失败
部分用户使用的修改版WindowsXP,会产生初始化失败问题。
安装.net framework 2.0 或者这个VC2005库库就可以解决。
.net FrameWork 2.0下载地址(22.5MB)
vc2005库下载地址(4.3MB)
2.出现0x000000不能read
“右击桌面空白处→属性→设置→颜色质量”,将色深修改为32位色。
3.出现ListBox报错。
下载MSXML新版本,一般4.0以上的就可以了。
4.准备就绪后报错
实质是inetinfo.exe出错,是gamelsp.dll这个socket hook引起的,实际上是27代理引起的。
处理方法很简单至少有3种,利用
1)](使用时一定小心,别点错了。)将之移除,OK。如果没有安装过其他的lsp,XP sp2直接使用
2)netsh winsock reset catalog (没实验过,理论上应该可以)
3)还可以用360在全面诊断中找到 gamelsp的4个项目,修复,然后将gamelsp重命名,之后按住电源按钮关机。
然后到windows/system32目录下,将gamelsp.dll重命名为gamelsp2.dll就OK了。
三.平台的环境要求
1.单机游戏对硬件要求很低,联网的话,CPU要2.4GHz,内存512MB。
2.特别指出,如果联机《街头霸王3.3》,硬件要更为强劲才行,因为CPS3的模拟本身就很占资源。
3.系统软件方面,***作系统WinXP-Win7都可以,只要保证系统里有最新版本的DirectX9即可。
4.网速只要能打到512K(ADSL的最低资费)即可,当然此时不能再额外占用网络资源了,比如迅雷下载BT下载PPS等。
四.网速的影响
一.平台指示网速的标准是延时,单位是ms( 毫秒-millisecond,1秒=1'000毫秒)。
1.大厅里会显示房间的延时,数值越小双方连起来越好。而显示为问号的很可能无法连接。
2.处于同一个内网的用户,彼此看到的房间延时也是问号,但是联机完全没问题,而且联机时指示的延时会是个位数甚至是0ms.
3.一般来说,延时在60ms内不会影响游戏体验。不过只要保证延时稳定,即使延时更高一些也没有太大问题。
4.不同网络之间联机,比如电信、网通、教育网之间很可能无法联机,就算连上延时也不低。当然,如果保证延时稳定,也不是无法游戏。
5.和国外玩家也能联机,我连过两名不同的国外玩家,最高的延时是390ms。由于延时稳定,我们打了40分钟的Kof2002,没有感觉到多痛苦。
6.如果延时不稳定,从20ms到200ms乱跳,会让人很难受,比延时稳定150ms都难受。(这条只是个人经验)
五.联机时一些注意事项及建议
1.平台采用的是P2P技术,双方玩家只要有一方网络卡,就会影响彼此。为此我们建议,联机时请保证关闭快车、迅雷、BT、电驴等下载软件,以及网络电视、网络视频等消耗大量网络资源的软件。
2.针对上一条补充说明,住宿舍而且使用路由器的学生,在和其他玩家联机时,最好提前说明一下,省得同网络的同学在打开网页时会不定时造成延时上升影响游戏体验。
3.游戏时感觉到卡,也许不是因为彼此网络的问题,而是某一方甚至双方的硬件配置不行。请更新硬件驱动或者升级硬件。
4.选择房间时,请选择有MS值的房间,没有MS值就意味无法连接(除同局域网内)!
六.延迟设置
“游戏设置”有一项,内容是“延时&抖动”,平台默认值是3。如果是在平台内路人战,个人推荐使用默认值。
1.这个数值本身的意思是,从玩家输入指令到系统响应指令,系统强制造成的延时。
2.数值越低,那么延迟带来的手感误差越小。而为此付出的代价则是,双方延时如果比较大,画面很容易跳帧或者不同步。
150ms以内,使用默认3的设置,不需要理会
100ms以内,与个别玩家设置数值2画面会多少抖动,不过不严重,和大部分用户在100ms以内用2还是很合适
50ms以内,已经不需要解说了,当然是将数值调整到1
20ms以内,设置0或者1都行,感觉上变化不是很大
以上的功能请在与朋友约好的情况下使用,先连接一下看看网络如何,再确定你们应该设置多少的延迟。
七.游戏的输入设备
平台支持键盘、手柄、摇杆等设备,而且为了在方便玩家的同时不破坏游戏的平衡性,为每个游戏设置了四套组合键。
1.键盘无法被识别
确认键盘本身正常。如果依然不能识别,安装最新版本的Direct。
2.X-BOX 360手柄驱动(1MB)
3.游戏设置的“优化出招”
优化且仅优化Kof2002的"←↙↓↘→","→↘↓↙←"两个半圆指令。
八.平台无法正确显示的问题
1.对于FX52XX显卡一定要安装N家的驱动,不要装微软的,否则无出错打不开平台,出现这种情况升级显卡驱动。(75MB)
2.nVidia FX系列显卡或其他N卡,文字乱码的情况,只要开启OpenGL功能即可。
启动平台时,平台如果检测到正在使用nVidia显卡,会弹出对话框帮助开启OpenGL;用记事本等文本处理软件打开平台根目录(SupARC文件夹)下的Config.xml文件,将0修改为1,保存。
3.拉伸窗口无法正常显示
平台更新后增加自由拉伸窗口的功能,但是针对N显卡好象还有点问题,开OpenGL字体可以看清了,但是双击最大化窗口后,图象会变形,或者游戏画面变大显示不全,但是关了OpenGL就可以解决这个问题。所以有和我一样情况的用户可以选择要字体,否则不可以自由拉伸窗口大小,只能支持到800×600。超过这个就会出现上面所述情况,或者和我一样,选择关闭OpenGL让字体模糊去吧,这样画面就可以自由拉伸。
4.更换平台的字体
1)打开SupARC/GUIData/fonts目录
2)打开控制面板,字体
选定一个中文字体,Ctrl+c复制,Ctrl+v粘贴到SupARC/GUIData/fonts
3)用记事本打开SupARC/GUIData/fonts目录下的chinese.font
4)chinese.font内容如下:
Filename调整字体名字,字体名字就是新复制的那个文件的名字。
Size调整字体大小,修改后保存
例如:我这里的文件名是STCAIYUN.TTF
修改后的chinese.font如下,没调整字体大小
5.将平台窗口最大化
1)在游戏设置里,将“禁用窗口拉伸”的复选框去掉。
2)游戏时按下Table键,将游戏画面充斥整个窗口。
3)点击标题栏的“最大化”按钮,或者双击标题栏(这两个选项等效)
4)窗口最大化。完毕。
5)平台在Table切换之后,窗口大小***作方法和网页浏览器***作一致,想自定义调节窗口大小的朋友可以按照网页浏览器的***作方式进行调整,在边缘时指针会隐藏
九.游戏无法正常运行
1.游戏本身平台支持,但是是我自己找来的Rom
平台支持原版的游戏文件,各种修改版的Rom无法正常运行。论坛的下载资源都是原版的,如果不确定手头的游戏平台是否支持,请从街游论坛下载对应游戏。
2.缺失Bios
运行SNK的游戏(Kof系列、合金弹头系列、月华剑士系列等),需要有neogeo.zip这个Bios,运行PGM的游戏(西游记系列、三国战纪系列等)需要有pgm.zip这个Bios。请下载到SupARC/Roms文件夹下。下载地址见“一”
3.游戏放到Roms文件夹下也不行
请确保游戏是以zip格式的压缩包的形式放进Roms文件夹内,没有修改过名字,不要将zip格式的压缩包解压缩。
十、路由器后DMZ主机设置简单图解后DM
路由器后DMZ主机设置简单图解
要注意的是,图片只作为参考,具体参数请以您机器的实际情况为准。
一、获得本机网络参数
⒈“开始→运行”,输入「cmd」并回车,启动命令行。
⒉在命令行状态下,输入「ipconfig /all」并回车(注意,斜杠前面有个空格),可以得到本机网络参数,如图所示。
⒊记下「IP地址」、「默认网关」、「子网掩码」三个参数,如果有必要,将「首选DNS服务器」和「备用DNS服务器」一并记录下来。
二、指定本机IP地址
⒈“开始→设置→控制面板”,启动“网络连接”。(如果桌面上有“网上邻居”图标,右击并选择“属性(R)”也可以启动,而且更快捷)。
⒉“LAN或高速Internet”栏里,右击“本地连接”并选择“属性(R)”。由于本地连接可以任意设置名称,请以实际情况为准。
⒊双击“TCP/IP协议”(全程如图所示)。
⒋将“自动获得IP地址”单选框替换为“使用下面的IP地址”,并依次填入刚才记录下的本机IP等信息。最后点击“确定”,保存退出。
三、设置路由器DMZ
⒈启动浏览器,在地址栏里输入「子网掩码」并回车,本例为“192.168.1.1”。打开路由器设置页面。
⒉在弹出的窗口处,输入路由器的用户名及密码,注意密码的大小写。
目前常见的路由器,默认用户名及密码都是小写的「admin」,部分旧式路由器,默认的用户名及密码可能为「administrator」、「guest」中的一种,详情请参看路由器的使用说明书。
⒊不同型号的路由器设置界面存在差异,本帖不一一列举。总之,找到DMZ设置页面,启动DMZ功能,填入本机「IP地址」,保存并退出。
四、设置完毕后的注意事项
在此提醒各位玩家/用户。在通常情况下,路由器是禁止广域网直接访问局域网内计算机的,启用DMZ功能后,则将该机器开放给广域网,从而实现双向通信。因此开启DMZ相当于不经路由器,直接连入Internet。为此我们建议广大玩家/用户在启用DMZ功能时同时开启防火墙软件减小风险。同时,如果因为启用DMZ功能导致您的计算机出现一切问题,本帖/本论坛不承担任何责任,请您谨慎考虑后再做决定。
十一.不能创建UDP发送Socket
使用360或者其他修复LSP工具修复!
还有玩家反映使用360加入信任列表就好了!
11:01:23 进行编辑
行至水穷处 坐看云起时
一般我的是有问题,把原来的平台删除了,直接重新下载平台就OK咯。任何问题都不是问题。哈哈哈。
『傲天ぜ隻手遮天』谁与争锋!
很有用,不过还是连接不上,不知为何?跟好友打不了,反倒是随机就可以用,纳闷 ING
密码找回问题求助!!!!!!!!知道注册时的邮箱!!!!!!版主看到请回复
游戏更新不了
平台打开了 下面有进程 但按下面的图标就是显示不出来
我一登陆进去就报错,卸载重装N次也没用。有哪位大神知道咋解决?
回复7楼谁敢说比我菜我跟谁急:你里面的文件删掉了,吧平台卸了再装吧!
求助!新的WIN7系统,顺利安装平台,色深也调到32位,但每次打开游戏都无法正常运行,还显示下面这样的指令,完全不知所措,求大神帮助!
发送短消息}

我要回帖

更多关于 spring初始化执行方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信