• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

오른손법칙 공부중에 도저히 해결이 안되는게 있어요

24.05.13 17:12 작성 조회수 87

0

namespace Infrun001

{

internal class Player

{

public int PosY { get; private set; }

public int PosX { get; private set; }

Random Rand = new Random();

Board myBoard;

public enum Dir // 바라보는 방향

{

Up = 0,

Left = 1,

Down = 2,

Right = 3

}

int Direction = (int)Dir.Up;

public void Initialize(int PosY, int PosX, Board _Board)

{

PosY = _PosY;

PosX = _PosX;

myBoard = _Board;

// 바라보고있는방향에서 어떤 방향으로 이동할때의 X,Y좌표의 변화량 이게 Dir이랑 일치

int[] FrontY = new int[] { -1, 0, 1, 0 };

int[] FrontX = new int[] { 0, -1, 0, 1 };

int[] RightY = new int[] { 0, -1, 0, 1 };

int[] RightX = new int[] { 1, 0, -1, 0 };

while (PosX != Board.DestX || PosY != Board.DestY)

{

// 우수법

if (_Board.Tiles[PosY + RightY[Direction], PosX + RightX[Direction]] == Board.TileType.Empty) // 만약 바라보는 방향에서 오른쪽으로 갈수있으면

{

// 바라보는방향을 오른쪽으로 회전후

Direction = (Direction - 1 + 4) % 4;

// 그 방향으로 이동

PosY = PosY + FrontY[Direction];

PosX = PosX + FrontX[Direction];

}

else if (_Board.Tiles[PosY + FrontY[Direction], PosX + FrontX[Direction]] == Board.TileType.Empty) // 만약 바라보는 방향에서 오른쪾이 막혔다면, 정면으로 갈수있는지 확인

{

// 정면으로 이동

PosY = PosY + FrontY[Direction];

PosX = PosX + FrontX[Direction];

}

else

{

// 위에꺼 둘다 안되면, 바라보는 방향에서 왼쪽으로 회전

Direction = (Direction + 1 + 4) % 4;

}

}

}

public const int MoveTick = 100;

public int SumTick = 0;

public void Update(int _Deltatick)

{

SumTick += _Deltatick;

if(SumTick >= MoveTick)

{

SumTick = 0;

// 델타틱을 합쳐서 썸틱을만들고 이 썸틱이 무브틱 100을 넘기기 전까지는 가만히 있다가

// 썸틱이 무브틱100을 넘기는 순간 실행된다 << if문안에있는 여기가 실행된다는것

// 긍까 여기에 플레이어가 움직이는 로직을 넣으면 되지않을가.

}

}

}

}

이렇게 코드를 짜서 연습중인데 43번째 줄에 개체참조가 되지않았다는 오류가 계속 뜨네요 chat gpt에 물어봐도 해결이 안되고 주변에 물어볼사람도 없어서 여기에 질문올려요..

 

if (_Board.Tiles[PosY + RightY[Direction], PosX + RightX[Direction]] == Board.TileType.Empty) 여기에서 계속 오류가 걸리는데 왜그러는건지 모르겠습니다..

답변 2

·

답변을 작성해보세요.

0

코드를 수정하신게 있다면 저도 알기가 힘듭니다.

public void Initialize(int PosY, int PosX, Board _Board)

{

PosY = _PosY;

PosX = _PosX;

myBoard = Board;

여기서
_ 규칙을 바꾸신것인데 맞을까요?
그리고 NULL 크래시는 크래시가 터지는 부분에 breakpoint를 걸고
멈춰서 보면 누가 범인인지가 굉장히 명확합니다.
어떤 참조값이 NULL인지 살펴보시고, 그쪽 로직을 살펴보셔야 합니다.

강의 샘플 코드를 다운받으시고 복붙으로 덮어써서 다른 부분이 없는 것인지 보는 것도 좋습니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.13

안녕하세요, 인프런 AI 인턴입니다.

강감찬님의 오른손 법칙 관련 질문에 대해, 유사한 상황에 대한 해결 방안을 제공한 기존 답변을 추천해 드립니다.

질문하신 if (_Board.Tiles[PosY + RightY[Direction], PosX + RightX[Direction]] == Board.TileType.Empty) 부분에서 “개체참조가 되지 않았다”는 오류가 발생하는 문제는, 대부분 객체가 제대로 초기화되지 않았거나, 참조하려는 배열의 인덱스가 유효한 범위를 초과했을 경우 발생할 수 있습니다. 이러한 종류의 오류는 디버깅을 통해 변수의 상태를 확인하거나, 배열 접근 전에 인덱스의 유효범위를 확인하는 방법으로 해결할 수 있습니다.

이와 관련하여, 오른손 법칙 하다가 막혔습니다..에서 비슷한 문제를 겪고 있는 학습자를 위한 지식공유자님의 답변이 도움될 수 있습니다. 이 답변에서는 배열 범위 초과 문제와 변수 이름이 잘못된 것을 찾아내는 과정을 설명하고 있습니다.

또한, 디버깅이나 실행 시 너무 오래걸립니다…에서는 디버깅 시간이 길어지는 문제를 해결하기 위한 접근법을 공유하고 있습니다. 이러한 과정은 디버깅 활동 중 발생할 수 있는 다양한 문제의 해결 방법을 제시합니다.

오류 메시지 “개체참조가 되지 않았습니다”는 또한 객체가 null인 경우에 나타납니다. 해당 오류를 해결하기 위해서는 _Board 객체나 Tiles 배열이 올바르게 초기화되었는지 확인해 보시기 바랍니다. 배열의 경우 인덱스가 배열의 범위 내에 있는지도 검토해야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.