ユーザ用ツール

サイト用ツール


x88000

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
x88000 [2021/01/13 15:41] – 作成 arakix88000 [2021/01/14 09:37] (現在) – [カーソルキーの機能を変える(Windows版)] araki
行 27: 行 27:
   * コンパイルエラー(''LPDWORD''に変換できない)を起こす''uint32_t''宣言の変数をすべて''DWORD''宣言に変更する。   * コンパイルエラー(''LPDWORD''に変換できない)を起こす''uint32_t''宣言の変数をすべて''DWORD''宣言に変更する。
   * ライブラリ''dinput.lib''および''dinput.dll''はそれぞれ''dinput8.lib''および''dinput8.dll''に置き換える。   * ライブラリ''dinput.lib''および''dinput.dll''はそれぞれ''dinput8.lib''および''dinput8.dll''に置き換える。
 +  * DirectInput8 のインスタンスが作成されるようにする。(''X88irectX.cpp''内376行目付近から -- 下記)
 +
 +<code>
 +#if 0
 +    typedef HRESULT WINAPI DirectInputCreateProc(
 +        HINSTANCE, DWORD, IDirectInput**, IUnknown*);
 +    DirectInputCreateProc* pprocDirectInputCreate = (DirectInputCreateProc*)
 +        GetProcAddress(,_hlibDInput, "DirectInputCreateA");
 +    if (pprocDirectInputCreate == NULL) {
 +        return false;
 +    }
 +    HRESULT hResult;
 +    // Direct Input
 +    hResult = pprocDirectInputCreate(
 +        (HINSTANCE)GetModuleHandle(NULL),
 +        DIRECTINPUT_VERSION, &m_pDI, NULL);
 +#else
 +    typedef HRESULT WINAPI DirectInput8CreateProc(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);
 +    DirectInput8CreateProc *pprocDirectInput8Create = (DirectInput8CreateProc*)
 +        GetProcAddress(m_hlibDInput, "DirectInput8Create");
 +    if (pprocDirectInput8Create == NULL)
 +    {
 +        return false;
 +    }
 +    HRESULT hResult = pprocDirectInput8Create((HINSTANCE)GetModuleHandleW(NULL), DIRECTINPUT8_VERSION, IID_IDrectInput8W, (LPVOID*)&m_pDI, NULL);
 +#endif
 +    if (hResult != DI_OK) {
 +        return false;
 +    }
 +</code>
 +(''StdHeader.h'' 160行目付近の ''#define DIRECTINPUT_VERSION 0x0300'' の下に、''#define DIRECTINPUT8_VERSION 0x0800''を追加しておく。)
  
 以上を修正するとバイナリを得ることができる。 以上を修正するとバイナリを得ることができる。
行 38: 行 69:
 なので、キー入力処理に手を入れて、カーソルキーの処理を変更する。 なので、キー入力処理に手を入れて、カーソルキーの処理を変更する。
 なお、ゲームによって、2,4,6,8または1,2,3,5で上下左右の割り当てになっているので、メニューから切り替えられるようにしておく。 なお、ゲームによって、2,4,6,8または1,2,3,5で上下左右の割り当てになっているので、メニューから切り替えられるようにしておく。
 +
 +{{::x88000:x88cursorkey.png?600|カーソルキーの割り付け変更}}
  
 === リソース(メニュー)の作成 === === リソース(メニュー)の作成 ===
 +
 +リソースエディターで、メニューを追加する。
 +''IDR_MAINMENU''(日本語)および''IDR_MAINMENU_E''(英語)の二つがあるので、両方に追加する。
 +{{::x88000:x88menu.png?600|X88000カーソルキーメニュー}}
 +
 +それぞれのIDシンボルは以下のようにする。
 +
 +  * IDM_CURSORKEYS_CURSOR
 +  * IDM_CURSORKEYS_2468
 +  * IDM_CURSORKEYS_1235
 +
 === 処理タイプフラグの追加 === === 処理タイプフラグの追加 ===
  
行 68: 行 112:
  
 === メニュー処理の実装 === === メニュー処理の実装 ===
 +
 +''X88Frame.cpp''内''CX88Frame::WndProc()''処理内に追加(汚い)
 +<code>
 + case IDM_VERSION:
 + OnHelpMenuCommand(LOWORD(wParam));
 + break;
 +#if 1
 + case IDM_CURSORKEYS_CURSOR:
 + m_cursorMode = 0;
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_CURSOR, MFS_CHECKED);
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_2468, MFS_UNCHECKED);
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_1235, MFS_UNCHECKED);
 + break;
 + case IDM_CURSORKEYS_2468:
 + m_cursorMode = 1;
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_CURSOR, MFS_UNCHECKED);
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_2468, MFS_CHECKED);
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_1235, MFS_UNCHECKED);
 + break;
 + case IDM_CURSORKEYS_1235:
 + m_cursorMode = 2;
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_CURSOR, MFS_UNCHECKED);
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_2468, MFS_UNCHECKED);
 + CheckMenuItem(GetMenu(hwnd), IDM_CURSORKEYS_1235, MFS_CHECKED);
 + break;
 +#endif
 + }
 + break;
 +</code>
 +本来は、ラジオボタンにするべきだろうが、今時のメニューはどうするべきなのかちゃんとわかってないので、汚い処理になっている。
  
 === キー処理の変更 === === キー処理の変更 ===
  
 +''X8Frame.cpp''内'' CX88Frame::UpdateAllKeyMatrics()''処理内に以下の変更。
 +<code>
 + } else {
 + bShift = IsKeyPressed(VK_SHIFT);
 + }
 +#if 0
 + bool bUpArrow = IsKeyPressed(VK_UP),
 + bRightArrow = IsKeyPressed(VK_RIGHT);
 + if (X88k().PC88().Z80Main().GetBasicMode() ==
 + CPC88Z80Main::BASICMODE_N80V1)
 + {
 + if (IsKeyPressed(VK_DOWN)) {
 + bShift = bUpArrow = true;
 + }
 + if (IsKeyPressed(VK_LEFT)) {
 + bShift = bRightArrow = true;
 + }
 + }
 +#else
 + bool bUpArrow = false, bRightArrow = false;
 + if (m_cursorMode == 0||IsKeyPressed(VK_CONTROL))
 + {
 + bUpArrow = IsKeyPressed(VK_UP);
 + bRightArrow = IsKeyPressed(VK_RIGHT);
 + if (X88k().PC88().Z80Main().GetBasicMode() ==
 + CPC88Z80Main::BASICMODE_N80V1)
 + {
 + if (IsKeyPressed(VK_DOWN)) {
 + bShift = bUpArrow = true;
 + }
 + if (IsKeyPressed(VK_LEFT)) {
 + bShift = bRightArrow = true;
 + }
 + }
 + }
 + else
 + {
 + if (IsKeyPressed(VK_DOWN) || IsKeyPressed(VK_LEFT) || IsKeyPressed(VK_RIGHT) || IsKeyPressed(VK_UP))
 + {
 + if (m_cursorMode == 1)
 + {
 + X88k().SetKeyMatrics(0x00, 2, IsKeyPressed(VK_DOWN));
 + X88k().SetKeyMatrics(0x00, 4, IsKeyPressed(VK_LEFT));
 + X88k().SetKeyMatrics(0x00, 6, IsKeyPressed(VK_RIGHT));
 + X88k().SetKeyMatrics(0x01, 0, IsKeyPressed(VK_UP));
 + }
 + else
 + {
 + X88k().SetKeyMatrics(0x00, 2, IsKeyPressed(VK_DOWN));
 + X88k().SetKeyMatrics(0x00, 1, IsKeyPressed(VK_LEFT));
 + X88k().SetKeyMatrics(0x00, 3, IsKeyPressed(VK_RIGHT));
 + X88k().SetKeyMatrics(0x00, 5, IsKeyPressed(VK_UP));
 + }
 + return;
 + }
 + }
 +#endif
 + X88k().SetKeyMatrics(0x00, 0, IsKeyPressed(VK_NUMPAD0));
 + X88k().SetKeyMatrics(0x00, 1, IsKeyPressed(VK_NUMPAD1));
 +...
 +        }
 +        else
 +        {
 +            bShift = IsKeyPressed(DIK_LSHIFT, DIK_RSHIFT);
 +        }
 +#if 0
 +        bool bUpArrow = IsKeyPressed(DIK_UP),
 +            bRightArrow = IsKeyPressed(DIK_RIGHT);
 +        if (X88k().PC88().Z80Main().GetBasicMode() ==
 +                CPC88Z80Main::BASICMODE_N80V1)
 +        {
 +            if (IsKeyPressed(DIK_DOWN)) {
 +                bShift = bUpArrow = true;
 +            }
 +            if (IsKeyPressed(DIK_LEFT)) {
 +                bShift = bRightArrow = true;
 +            }
 +        }
 +#else
 + bool bUpArrow = false, bRightArrow = false;
 + if (m_cursorMode == 0||IsKeyPressed(DIK_LCONTROL, DIK_RCONTROL))
 + {
 + bUpArrow = IsKeyPressed(DIK_UP);
 + bRightArrow = IsKeyPressed(DIK_RIGHT);
 + if (X88k().PC88().Z80Main().GetBasicMode() ==
 + CPC88Z80Main::BASICMODE_N80V1)
 + {
 + if (IsKeyPressed(DIK_DOWN)) {
 + bShift = bUpArrow = true;
 + }
 + if (IsKeyPressed(DIK_LEFT)) {
 + bShift = bRightArrow = true;
 + }
 + }
 + }
 + else
 + {
 + if (IsKeyPressed(DIK_DOWN) || IsKeyPressed(DIK_LEFT) || IsKeyPressed(DIK_RIGHT) || IsKeyPressed(DIK_UP))
 + {
 + if (m_cursorMode == 1)
 + {
 + X88k().SetKeyMatrics(0x00, 2, IsKeyPressed(DIK_DOWN));
 + X88k().SetKeyMatrics(0x00, 4, IsKeyPressed(DIK_LEFT));
 + X88k().SetKeyMatrics(0x00, 6, IsKeyPressed(DIK_RIGHT));
 + X88k().SetKeyMatrics(0x01, 0, IsKeyPressed(DIK_UP));
 + }
 + else
 + {
 + X88k().SetKeyMatrics(0x00, 2, IsKeyPressed(DIK_DOWN));
 + X88k().SetKeyMatrics(0x00, 1, IsKeyPressed(DIK_LEFT));
 + X88k().SetKeyMatrics(0x00, 3, IsKeyPressed(DIK_RIGHT));
 + X88k().SetKeyMatrics(0x00, 5, IsKeyPressed(DIK_UP));
 + }
 + return;
 + }
 + }
 +#endif
 +        X88k().SetKeyMatric(0x00, 0, IsKeyPressed(DIK_NUMPAD0));
 +</code>
  
 +''#if 0''で無効化しているのがもともとのカーソルキー処理。 
 +PC-8001などは、カーソルキーが縮退((上下と左右がそれぞれ一つのキーにまとめられ、シフトキーの有無で向きを変えていた。))しているので、その処理をしている。 
 +ここで、''m_cursorMode''が0かコントロールキーが押されていたら、カーソルキーとして処理し、そうでなければ、テンキーの振りをするだけである。
x88000.1610520084.txt.gz · 最終更新: 2021/01/13 15:41 by araki