PDA

Просмотр полной версии : [Вопрос] Уменьшение количества кода связанной с объектами и заменой текстур.



KillStreak
06.03.2017, 08:21
У меня имеется определенное количество объектов и помимо этого каждому объекту была заменена текстура. Вопрос, как можно присвоить сразу всем конкретным объектам текстуру одного вида в одной строчке. Что бы не приходилось постоянно прописывать возле каждого объекта его текстуру, спасибо. И если подобных объектов много, можно ли как-то оптимизировать данный процесс?




#include <a_samp>
#include <streamer>

#define MAX_OBJECTS_TEXTURE 999
new object[MAX_OBJECTS_TEXTURE];


object[0] = CreateDynamicObject(1111, 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000);
SetDynamicObjectMaterial(object[0], 0, 0, "none", "none", 0x00000000);

object[1] = CreateDynamicObject(1111, 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000);
SetDynamicObjectMaterial(object[1], 0, 0, "none", "none", 0x00000000);

object[2] = CreateDynamicObject(1111, 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000);
SetDynamicObjectMaterial(object[2], 0, 0, "none", "none", 0x00000000);

object[3] = CreateDynamicObject(1111, 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000);
SetDynamicObjectMaterial(object[3], 0, 0, "none", "none", 0x00000000);

object[4] = CreateDynamicObject(1111, 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000);
SetDynamicObjectMaterial(object[4], 0, 0, "none", "none", 0x00000000);

object[5] = CreateDynamicObject(1111, 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000);
SetDynamicObjectMaterial(object[5], 0, 0, "none", "none", 0x00000000);

Daniel_Cortez
06.03.2017, 08:46
Для таких целей есть циклы.

Можете посмотреть примеры циклов while, do и for в любых учебниках по C/C++ (синтаксис похожий на тот, что в Pawn) либо в нашем учебнике (http://pro-pawn.ru/showthread.php?4082) (хотя там примеры могут оказаться слишком простыми, а некоторая информация - устаревшей).

UPD: Касаемо вашего случая, можно поместить координаты объектов в отдельный массив, а создание объектов и установку материалов вынести в цикл.


const NUM_MY_TEXTURED_OBJECTS = 5;
new const my_textured_obj_coords[NUM_MY_TEXTURED_OBJECTS][6] =
{
{ 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000 },
{ 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000 },
{ 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000 },
{ 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000 },
{ 1000.39999, 2000.49999, 30.59999, 0.00000, 90.00000, 90.00000 }
};
new my_textured_objs[NUM_MY_TEXTURED_OBJS];
for (new i = 0; i < NUM_MY_TEXTURED_OBJS; i++)
{
my_textured_objs[i] = CreateDynamicObject(
1111,
my_textured_obj_coords[i][0], my_textured_obj_coords[i][1], my_textured_obj_coords[i][2],
my_textured_obj_coords[i][3], my_textured_obj_coords[i][4], my_textured_obj_coords[i][5]
);
SetDynamicObjectMaterial(my_textured_objs[i], 0, 0, "none", "none", 0x00000000);
}


P.S.: Код не проверял; надеюсь, что рабочий.
P.P.S.: В CreateDynamicObject параметры сгруппированы и перенесены на отдельные строки для лучшей читаемости (чтобы не пришлось прокручивать горизонтальный ползунок, чтобы прочесть длинную строку), на оптимальность кода это никак не влияет (http://pro-pawn.ru/showthread.php?12736).

KillStreak
06.03.2017, 08:53
Для таких целей есть циклы.

Можете посмотреть примеры циклов while, do и for в любых учебниках по C/C++ (синтаксис похожий на тот, что в Pawn) либо в нашем учебнике (http://pro-pawn.ru/showthread.php?4082) (хотя там примеры могут оказаться слишком простыми, а некоторая информация - устаревшей).

Это будет как-то положительно влиять на объем выделяемой памяти, станет лучше или ничего не изменится?

UPD: А можно координаты объектов упаковать в массиве и как это повлияет на память в моде? Вопрос к теме ''Упаковать данные о расположении объектов'' (http://pro-pawn.ru/showthread.php?15014-%D0%A3%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BE-%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2). Я прекрасно знаю что код в одну строчку никак не влияет на оптимизацию, я предполагал решение данного вопроса в плане читаемости и навигации в моде. Вообще кроме как оформления кода и улучшения его читаемости, есть ли смысл этим заниматься или проще хранить всё как есть?

DeimoS
06.03.2017, 10:56
Вообще кроме как оформления кода и улучшения его читаемости, есть ли смысл этим заниматься или проще хранить всё как есть?

Проще хранить всё как есть.
А в случае с объектами, проще закинуть код в инклуд и забыть о них.

KillStreak
06.03.2017, 11:36
Проще хранить всё как есть.
А в случае с объектами, проще закинуть код в инклуд и забыть о них.

Зато если хранить в моде то его не украдут на хостинге. Хотя это бред)

DeimoS
06.03.2017, 13:55
Зато если хранить в моде то его не украдут на хостинге. Хотя это бред)

Эмм, так инклуды не нужно заливать на хостинг. При компиляции, одержимое всех подключённых инклудов попадает в amx файл, который и нужно держать на хостинге для работы сервера. Всё остальное (pwn и инклуды) держать там не обязательно

Daniel_Cortez
06.03.2017, 14:57
Это будет как-то положительно влиять на объем выделяемой памяти, станет лучше или ничего не изменится?
В большинстве случаев этим можно уменьшить требования к памяти за счёт более компактного байткода, сгенерированного компилятором. Но в некоторых ситуациях всё же можно уйти в минус, если слишком мало повторов, которые вы заменяете на цикл.
На вашем месте я бы обо всём этом не задумывался. Вам не обязательно знать устройство виртуальной машины AMX и что выдаёт на выходе компилятор, чтобы писать хороший код. Что имеет значение, так это грамотная структуризация кода. Например, хорошей практикой считается замена повторяющегося кода на цикл, как в примере выше, либо его вынос в отдельную функцию, если один и тот же код повторяется в разных функциях.

KillStreak
06.03.2017, 16:53
Эмм, так инклуды не нужно заливать на хостинг. При компиляции, одержимое всех подключённых инклудов попадает в amx файл, который и нужно держать на хостинге для работы сервера. Всё остальное (pwn и инклуды) держать там не обязательно

Ну это еще раз доказывает моё незнание и неопытность. Это информация будет для меня полезна, спасибо.