HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 09.02.2022, 15:22
ImmortalDev
Познающий
Регистрация: 02.12.2019
Сообщений: 86
С нами: 3393864

Репутация: 23
По умолчанию

Всем привет, снова.

У меня есть код, взятый из примеров работы с plugin-sdk, который спавнит пешехода. Я его немного переделал, но проблема конкретно не в этом.

Вот код:

C++:





Код:
float
*
coordinates
=
(
*
(
DWORD
*
)
0xB6F5F0
)
?
(
float
*
)
(
*
(
DWORD
*
)
(
*
(
DWORD
*
)
0xB6F5F0
+
0x14
)
+
0x30
)
:
NULL
;
void
spawncPed
(
)
//(float* car_data)
{
static
int
keyPressTime
=
0
;
Events
::
gameProcessEvent
+=
[
]
{
//&car_data] {
if
(
FindPlayerPed
(
)
&&
KeyPressed
(
VK_F9
)
&&
CTimer
::
m_snTimeInMilliseconds
-
keyPressTime
>
500
)
{
#ifdef GTASA
keyPressTime
=
CTimer
::
m_snTimeInMilliseconds
;
int
modelID
=
pedModelIds
[
rand
(
)
%
250
]
;
CStreaming
::
RequestModel
(
modelID
,
0
)
;
CStreaming
::
LoadAllRequestedModels
(
false
)
;
CPed
*
ped
=
new
CCivilianPed
(
CPopulation
::
IsFemale
(
modelID
)
?
PED_TYPE_CIVFEMALE
:
PED_TYPE_CIVMALE
,
modelID
)
;
if
(
ped
)
{
ped
->
SetPosn
(
coordinates
[
0
]
,
coordinates
[
1
]
,
coordinates
[
2
]
)
;
ped
->
SetOrientation
(
0.0f
,
0.0f
,
0.0f
)
;
CWorld
::
Add
(
ped
)
;
/*ped->PositionAnyPedOutOfCollision();
                            ped->m_pIntelligence->m_TaskMgr.SetTask(new CTaskComplexWanderStandard(4, rand() % 8, true), 4, false);*/
}
while
(
true
)
// Вот тут проблема
{
//ped->SetOrientation(0.0f, 0.0f, 0.0f);
ped
->
SetPosn
(
coordinates
[
0
]
,
coordinates
[
1
]
,
coordinates
[
2
]
)
;
ped
->
UpdatePosition
(
)
;
Sleep
(
1000
)
;
}
#else
CHud
::
SetHelpMessage
(
L
"Not done yet!"
,
true
,
false
)
;
#endif
}
}
;
}


Так вот, я хочу постоянно обновлять позицию педа, чтоб она была равна текущей позиции игрока. Педа он спавнит, все ок, но вот при попытке создать бесконечный цикл, в котором будет постоянно обновляться его координаты, игра тупо крашится и ничего не работает.

Внятной документации по plugin-sdk я не нашел, приходиться изучать все самому методом тыка, но сейчас, нужна помощь знающих людей, ибо я уже не знаю что делать.
 
Ответить с цитированием

  #2  
Старый 09.02.2022, 17:27
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent, что и есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще.
 
Ответить с цитированием

  #3  
Старый 09.02.2022, 19:50
ImmortalDev
Познающий
Регистрация: 02.12.2019
Сообщений: 86
С нами: 3393864

Репутация: 23
По умолчанию

Цитата:
Сообщение от Dark_Knight  

Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще
большое спасибо тебе, пойду дальше разбираться, если что отпишу сюда же

Цитата:
Сообщение от Dark_Knight  

Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent, что и есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще.
Не совсем вкурил, так. Вместо задержки Sleep я должен использовать таймеры.

Вместо цикла, для обновления позиции, я использую gameProcessEvent.

Правильно?

То есть, это должно выглядить как то так?

C++:





Код:
Events
::
gameProcessEvent
+=
[
&
ped
]
{
ped
->
SetPosn
(
coordinates
[
0
]
,
coordinates
[
1
]
,
coordinates
[
2
]
)
;
ped
->
UpdatePosition
(
)
;
//вместо задержки СTimer
}
;
 
Ответить с цитированием

  #4  
Старый 09.02.2022, 22:19
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Да. За CTimer я хз, не работал с ним, но я не вижу тут проверки на указатель и тебе все это можно в общей функе делать. Нет смысла разный код пихать в один и тот же элемент. Хотя кому как удобней)
 
Ответить с цитированием

  #5  
Старый 09.02.2022, 22:25
ImmortalDev
Познающий
Регистрация: 02.12.2019
Сообщений: 86
С нами: 3393864

Репутация: 23
По умолчанию

Цитата:
Сообщение от Dark_Knight  

Да. За CTimer я хз, не работал с ним, но я не вижу тут проверки на указатель и тебе все это можно в общей функе делать. Нет смысла разный код пихать в один и тот же элемент. Хотя кому как удобней)
Спасибо. Кажется, все понял. Пойду писать, проверять, заодно с CTimer получше познакомлюсь.

Проверку на указатель сделаю, само собой

C++:





Код:
static
int
timm
=
500
;
Events
::
gameProcessEvent
+=
[
&
ped
]
{
if
(
FindPlayerPed
(
)
)
{
if
(
ped
)
{
ped
->
SetOrientation
(
0.0f
,
0.0f
,
0.0f
)
;
ped
->
SetPosn
(
coordinates
[
0
]
,
coordinates
[
1
]
,
coordinates
[
2
]
)
;
//ped->UpdatePosition();
timm
=
CTimer
::
m_snTimeInMilliseconds
;
//Sleep(50);
}
}
}
;


Написал такой вот код, но все равно крашит. Что тут не так?

Сейчас кину полный код:

C++:





Код:
void
spawncPed
(
)
//(float* car_data)
{
static
int
keyPressTime
=
0
;
//static int timm = 0;
Events
::
gameProcessEvent
+=
[
]
{
//&car_data] {
if
(
FindPlayerPed
(
)
&&
KeyPressed
(
VK_F9
)
&&
CTimer
::
m_snTimeInMilliseconds
-
keyPressTime
>
500
)
{
#ifdef GTASA
keyPressTime
=
CTimer
::
m_snTimeInMilliseconds
;
int
modelID
=
pedModelIds
[
rand
(
)
%
250
]
;
CStreaming
::
RequestModel
(
modelID
,
0
)
;
CStreaming
::
LoadAllRequestedModels
(
false
)
;
CPed
*
ped
=
new
CCivilianPed
(
CPopulation
::
IsFemale
(
modelID
)
?
PED_TYPE_CIVFEMALE
:
PED_TYPE_CIVMALE
,
modelID
)
;
if
(
ped
)
{
ped
->
SetPosn
(
coordinates
[
0
]
,
coordinates
[
1
]
,
coordinates
[
2
]
)
;
ped
->
SetOrientation
(
0.0f
,
0.0f
,
0.0f
)
;
CWorld
::
Add
(
ped
)
;
/*ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
                            ped->UpdatePosition();
                            CTimer::m_snTimeInMilliseconds - timm > 500;
                            timm = CTimer::m_snTimeInMilliseconds;*/
/*ped->PositionAnyPedOutOfCollision();
                            ped->m_pIntelligence->m_TaskMgr.SetTask(new CTaskComplexWanderStandard(4, rand() % 8, true), 4, false);*/
}
static
int
timm
=
500
;
Events
::
gameProcessEvent
+=
[
&
ped
]
{
if
(
FindPlayerPed
(
)
)
{
if
(
ped
)
{
ped
->
SetOrientation
(
0.0f
,
0.0f
,
0.0f
)
;
ped
->
SetPosn
(
coordinates
[
0
]
,
coordinates
[
1
]
,
coordinates
[
2
]
)
;
//ped->UpdatePosition();
timm
=
CTimer
::
m_snTimeInMilliseconds
;
//Sleep(50);
}
}
}
;
#else
CHud
::
SetHelpMessage
(
L
"Not done yet!"
,
true
,
false
)
;
#endif
}
}
;
}




Хорошо, я решил сделать так. В одном gameProcessEvent, я создаю педа и в нем же постоянно обновляю его позицию.

Только вот незадача, gameProcessEvent это цикл, значит педов будет создаваться дофига и это крашнет игру.

А вне gameProcessEvent создать невозможно, тоже крашнет.

Как быть?

Нужна наводка, пожалуйста, дальше сам разберусь

Я уже и класс пытался создать, чтоб создать новый поток, где будет обновление координат, но это тоже не увенчалось успехом

Всё! Я всё решил, сам разобрался))

Кароче, сPed *ped объявил глобальной переменной, в одной функции создавал самого педа, в другой функции я синхронизировал его с игроком.

После этого, просто

C++:





Код:
plugin
::
Events
::
gameProcessEvent
.
Add
(
spawncped
)
;
plugin
::
Events
::
gameProcessEvent
.
Add
(
sync
)
;


Для обеих функций)))

Спасибо

Dark_Knight​За наводку, видел бы ты радость на моем лице сейчас)
 
Ответить с цитированием

  #6  
Старый 10.02.2022, 20:46
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Самое интересное в том, что это все можно в одну функцию запихать и не мучатся . Если мне еще не показалось, то тут еще у тебя утечка памяти.
 
Ответить с цитированием

  #7  
Старый 10.02.2022, 21:07
ImmortalDev
Познающий
Регистрация: 02.12.2019
Сообщений: 86
С нами: 3393864

Репутация: 23
По умолчанию

Цитата:
Сообщение от Dark_Knight  

Самое интересное в том, что это все можно в одну функцию запихать и не мучатся . Если мне еще не показалось, то тут еще у тебя утечка памяти.
Та я там велосипедов кучу изобрел, пока еще не силен в этом, но буду разбираться.

Благо, написал все таки рабочий вариант.

а тебе +rep
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.