static void processEvent(Common::Event &event) { switch (event.type) { case Common::EVENT_LBUTTONDOWN: mouseLeft = 1; break; case Common::EVENT_RBUTTONDOWN: mouseRight = 1; break; case Common::EVENT_MOUSEMOVE: break; case Common::EVENT_KEYDOWN: switch (event.kbd.keycode) { case Common::KEYCODE_RETURN: case Common::KEYCODE_KP_ENTER: case Common::KEYCODE_KP5: if (allowPlayerInput) { mouseLeft = 1; } break; case Common::KEYCODE_ESCAPE: if (allowPlayerInput) { mouseRight = 1; } break; case Common::KEYCODE_F1: if (allowPlayerInput) { playerCommand = 0; // EXAMINE makeCommandLine(); } break; case Common::KEYCODE_F2: if (allowPlayerInput) { playerCommand = 1; // TAKE makeCommandLine(); } break; case Common::KEYCODE_F3: if (allowPlayerInput) { playerCommand = 2; // INVENTORY makeCommandLine(); } break; case Common::KEYCODE_F4: if (allowPlayerInput) { playerCommand = 3; // USE makeCommandLine(); } break; case Common::KEYCODE_F5: if (allowPlayerInput) { playerCommand = 4; // ACTIVATE makeCommandLine(); } break; case Common::KEYCODE_F6: if (allowPlayerInput) { playerCommand = 5; // SPEAK makeCommandLine(); } break; case Common::KEYCODE_F9: if (allowPlayerInput && !inMenu) { makeActionMenu(); makeCommandLine(); } break; case Common::KEYCODE_F10: if (!disableSystemMenu && !inMenu) { g_cine->makeSystemMenu(); } break; case Common::KEYCODE_F11: renderer->showCollisionPage(true); break; case Common::KEYCODE_MINUS: case Common::KEYCODE_KP_MINUS: g_cine->modifyGameSpeed(-1); // Slower break; case Common::KEYCODE_PLUS: case Common::KEYCODE_KP_PLUS: g_cine->modifyGameSpeed(+1); // Faster break; case Common::KEYCODE_LEFT: case Common::KEYCODE_KP4: moveUsingKeyboard(-1, 0); // Left break; case Common::KEYCODE_RIGHT: case Common::KEYCODE_KP6: moveUsingKeyboard(+1, 0); // Right break; case Common::KEYCODE_UP: case Common::KEYCODE_KP8: moveUsingKeyboard(0, +1); // Up break; case Common::KEYCODE_DOWN: case Common::KEYCODE_KP2: moveUsingKeyboard(0, -1); // Down break; case Common::KEYCODE_KP9: moveUsingKeyboard(+1, +1); // Up & Right break; case Common::KEYCODE_KP7: moveUsingKeyboard(-1, +1); // Up & Left break; case Common::KEYCODE_KP1: moveUsingKeyboard(-1, -1); // Down & Left break; case Common::KEYCODE_KP3: moveUsingKeyboard(+1, -1); // Down & Right break; case Common::KEYCODE_d: if (event.kbd.hasFlags(Common::KBD_CTRL)) { g_cine->getDebugger()->attach(); g_cine->getDebugger()->onFrame(); } // No Break to allow fallthrough to process 'd' without CTRL default: lastKeyStroke = event.kbd.keycode; break; } break; case Common::EVENT_KEYUP: switch (event.kbd.keycode) { case Common::KEYCODE_F11: renderer->showCollisionPage(false); break; case Common::KEYCODE_KP5: // Emulated left mouse button click case Common::KEYCODE_LEFT: // Left case Common::KEYCODE_KP4: // Left case Common::KEYCODE_RIGHT: // Right case Common::KEYCODE_KP6: // Right case Common::KEYCODE_UP: // Up case Common::KEYCODE_KP8: // Up case Common::KEYCODE_DOWN: // Down case Common::KEYCODE_KP2: // Down case Common::KEYCODE_KP9: // Up & Right case Common::KEYCODE_KP7: // Up & Left case Common::KEYCODE_KP1: // Down & Left case Common::KEYCODE_KP3: // Down & Right // Stop ego movement made with keyboard when releasing a known key moveUsingKeyboard(0, 0); break; default: break; } default: break; } }
bool PlayerTaskWin::run() { if (!isIdle()) { CCLOG("PlayerTaskWin::run() - task is not idle"); return false; } //BOOL WINAPI CreateProcess( // _In_opt_ LPCTSTR lpApplicationName, // _Inout_opt_ LPTSTR lpCommandLine, // _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, // _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, // _In_ BOOL bInheritHandles, // _In_ DWORD dwCreationFlags, // _In_opt_ LPVOID lpEnvironment, // _In_opt_ LPCTSTR lpCurrentDirectory, // _In_ LPSTARTUPINFO lpStartupInfo, // _Out_ LPPROCESS_INFORMATION lpProcessInformation //); // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx SECURITY_ATTRIBUTES sa = {0}; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; // Create a pipe for the child process's STDOUT. if (!CreatePipe(&_childStdOutRead, &_childStdOutWrite, &sa, 0) || !SetHandleInformation(_childStdOutRead, HANDLE_FLAG_INHERIT, 0)) { CCLOG("PlayerTaskWin::run() - create stdout handle failed, for execute %s", _executePath.c_str()); cleanup(); return false; } // Create a pipe for the child process's STDIN. if (!CreatePipe(&_childStdInRead, &_childStdInWrite, &sa, 0) || !SetHandleInformation(_childStdInWrite, HANDLE_FLAG_INHERIT, 0)) { CCLOG("PlayerTaskWin::run() - create stdout handle failed, for execute %s", _executePath.c_str()); cleanup(); return false; } ZeroMemory(&_pi, sizeof(_pi)); STARTUPINFO si = {0}; si.cb = sizeof(STARTUPINFO); si.hStdError = _childStdOutWrite; si.hStdOutput = _childStdOutWrite; si.hStdInput = _childStdInRead; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; #define MAX_COMMAND 4096 //MAX_PATH const std::u16string u16command = makeCommandLine(); WCHAR command[MAX_COMMAND]; wcscpy_s(command, MAX_COMMAND, (WCHAR*)u16command.c_str()); BOOL success = CreateProcess(NULL, command, // command line NULL, // process security attributes NULL, // primary thread security attributes TRUE, // handles are inherited 0, // creation flags NULL, // use parent's environment NULL, // use parent's current directory &si, // STARTUPINFO pointer &_pi); // receives PROCESS_INFORMATION if (!success) { CCLOG("PlayerTaskWin::run() - create process failed, for execute %s", _executePath.c_str()); cleanup(); return false; } _outputBuff = new CHAR[BUFF_SIZE + 1]; _outputBuffWide = new WCHAR[BUFF_SIZE]; _state = STATE_RUNNING; cocos2d::Director::getInstance()->getScheduler()->scheduleUpdate(this, 0, false); return true; }