십자 방향 이동을 위한 선택 UI 설치

용자두악용 등 흔히 있는 이런 물건이다.

이번에는 GameMaker Studio2에 설치되어 있기 때문에 JS 스타일의 GML이라는 언어로 구현되었습니다.
특별한 기능을 거의 사용하지 않기 때문에 어떤 언어/게임 엔진이든 응용할 수 있다.
이 논리에서 다음 지시된 index 위치를 얻습니다
이를 토대로 그릴 페이지 수를 계산합니다.

// ここら辺はキーを押した判定のための変数です。
keyLeft = keyboard_check_pressed(ord("A")) || keyboard_check_pressed(vk_left);
keyRight = keyboard_check_pressed(ord("D")) || keyboard_check_pressed(vk_right);
keyUp = keyboard_check_pressed(ord("W")) || keyboard_check_pressed(vk_up);
keyDown = keyboard_check_pressed(ord("S")) || keyboard_check_pressed(vk_down);
keySpace = keyboard_check_pressed(vk_space);


pressX = keyRight - keyLeft;
pressY = keyDown - keyUp;
itemCount = array_length(selectList);

selectCount = selectIndex - startIndex;
posXY = [selectCount  % 2, floor(selectCount / 2)]; // xy座標

// x軸
if(pressX != 0) {
    selectIndex += pressX;

    // 次のページが存在しない場合
    if(selectIndex > itemCount - 1) selectIndex = 0;
    // 前のページが存在しない場合
    if(selectIndex < 0) selectIndex = itemCount - 1;
}


// y軸
if(pressY != 0 && itemCount > 2) {
    var _prev = selectIndex;
    var _nowPage = floor(_prev / 4);
    selectIndex += pressY * 2;

    // 次のページが存在しない場合
    if(selectIndex > itemCount - 1) {
        // アイテム数が奇数の場合かつ1つ前が存在すればそれを返す
        if(itemCount % 2 == 1 && itemCount - 1 >= selectIndex - 1) {
            selectIndex -= 1;
        } else {
            selectIndex = posXY[0];
        }
    }
    // 前のページが存在しない場合
    if(selectIndex < 0) {
        // アイテム数が奇数の場合は最後尾を返す
        if(itemCount % 2 == 1) {
            selectIndex = itemCount - 1;
        } else {
            selectIndex = (itemCount - 1)  - 1 + posXY[0];

        }
    }
}

// ページ位置計算
startIndex = floor((selectIndex) / 4) * 4;
그리고 다른 구성 요소startIndex(ページ位置の始まりのindex位置), selectIndex(現在洗濯中の項目のindex)로 화면을 그리면 됩니다.
선택한 항목은 item[selectIndex] 등으로 취득하면 된다.

주안점


홀수 항목 주의


홀수 항목에 주의하면 짝수와 같이 Y축 방향(위 또는 아래)에서 이동할 수 없습니다.
// アイテム数が奇数の場合かつ1つ前が存在すればそれを返す
if(itemCount % 2 == 1 && itemCount - 1 >= selectIndex - 1) {
    selectIndex -= 1;
} else {
    selectIndex = posXY[0];
}
위에서 말한 것은 처음부터 되돌아올 때(위로 이동할 때), x 좌표를 0으로 조정하고 1은 모두 마지막 index를 나타낸다.
나는 사용자가 자연스럽게 이 점을 느낄 것이라고 생각해서 실시했다.

아래로 이동한 상태에서 뒤로 물러난 2개의 앞부분도 존재한다면 이를 반납한다.
이렇게 하면 아래가 공백 상태에서도 위화감 없는 행동을 할 수 있다.
// アイテム数が奇数の場合かつ1つ前が存在すればそれを返す
if(itemCount % 2 == 1 && itemCount - 1 >= selectIndex - 1) {
    selectIndex -= 1;
} else {
    selectIndex = posXY[0];
}

총결산


사실 처음에는 '페이지 이동 여부' 를 첫 번째 지점으로 가져갔다
논리가 매우 복잡해졌지만 index 기준을 선택한 토대에서 팩스를 할 때 매우 간단하게 실현할 수 있다.
나는 이상한 형세가 나타날 때 관점과 논리의 근본 부분을 재검토하는 것이 매우 중요하다는 것을 다시 배웠다🐕
그리고 위 코드라면 매번 필요 없는 공정까지
나는 성능을 조정하려면 일부 함수화를 조정해서 되돌려야 한다고 생각한다...!(이번엔 게으름을 피웠다)

좋은 웹페이지 즐겨찾기