@Serjio-Grig
Тот самый никто (=

Почему крашится игра (и редактор) при показе/скрытии курсора?

Здравствуйте.
Имеется:
MyGamemode, в котором установлены по умолчанию Pawn и PlayerController в примерно таком виде:
#include “MyPawn.h”
#include “MyController.h”


DefaultPlayerController = AMyController::StaticClass();
DefaultPawn = AMyPawn::StaticClass();


Мой Controller имеет в себе метод
public:
    bool bCursorStatus;
    void AMyController::UpdateCursorStatus(bool bNewCursorStatus, EMouseCursor::Type NewCursor);

Где мы, в зависимости от значения bNewCursorStatus показываем/скрываем курсор.

Имеется некий Pawn, где в:
.h file:
#include “MyController.h”
...
AMyController * GameController;
...
public:
    void CursorManagment();


.CPP file:

void AMyPawn::CursorManagment() {
    if(GameController->bCursorStatus) {
        GameController->UpdateCursorStatus(false, EMouseCursor::Hand);
    }
    else {
        GameController->UpdateCursorStatus(true, EMouseCursor::Hand);
    }

Так же пробовал в данном методе просто устанавливать:
GameController->bMouseShowCursor = false;

CursorManagment() вызывается по нажатию клавиши Left Ctrl.

Но редактор благополучно выпиливается (крашится) сразу после нажатия Ctrl.

В коде ошибок нет (сейчас пишу с телефона, мог переврать названия аргументов/методов), компилируется без ошибок.

Крашится именно при попытке изменить видимость курсора и пр. его атрибуты в теле данного метода обоими способами.

Хотелось бы узнать причину и решение данной проблемы (скрытие/показ курсора по нажатию клавиши из C++).
Для обработки нажатия использую BindAction у PlayerInputComponent с IE_Released, клавиша выставлена в Project Settings в Action Mapping.
В то же время, если не изменять в теле этого метода параметры курсора, а, к примеру, выводить что-то через GEngine->AddOnScreenDebugMessage(), то все работает.
  • Вопрос задан
  • 144 просмотра
Решения вопроса 3
WNeZRoS
@WNeZRoS
Если краш происодит и с однострочным кодом
GameController->bMouseShowCursor = false;
то проблема явно в том что GameController не инициализирован или указывает на уже освобождённую память.
Ответ написан
myjcom
@myjcom Куратор тега C++

Имеется некий Pawn, где в:
.h file:
#include “MyController.h”
...
AMyController * GameController; - никуда не указывает.
...
public:
void CursorManagment();
Ответ написан
@Serjio-Grig Автор вопроса
Тот самый никто (=
Проблема решена. Всем спасибо за ответы.
Решение проблемы:
.h:
#include “MyController.h”
...
AMyController* GameController;


.cpp:
/** Constructor **/
GameController = Cast<AMyController>(UGameplayStatics::GetPlayerController(GetWorld(), 0));

/** Use **/
void AMyPawn::CursorManagment() {
    if(GameController->bCursorStatus) {
        GameController->UpdateCursorStatus(false, EMouseCursor::Default);
    }
     else {
        GameController->UpdateCursorStatus(true, EMouseCursor::Default);
    }
}


Проблема действительно была в неправильном получении экземпляра контроллера.

Всем продуктивного кода! :)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы