forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Вопрос-Ответ (для новичков) (http://forum.boolean.name/showthread.php?t=7886)

dsd 14.08.2011 18:27

Ответ: Вопрос-Ответ (для новичков)
 
Попробуй b#=int(b#*100)/100 должны остаться токо последние две цифры.

KingMaks 19.08.2011 20:39

Ответ: Вопрос-Ответ (для новичков)
 
А в физиксе лучи сильно нагружают комп? тоесть сколько я могу создать лучей в одной сцене, чтобы средний комп не тормозил? а то даже примерно не представляю 10? 50? 500?

St_AnGer 26.08.2011 19:46

Ответ: Вопрос-Ответ (для новичков)
 
Прошу помощи знающих и разбирающихся, т.к. сам в типах плохо разбираюсь.

Допустим, имеется тип:

Код:

Type cClient
    Field id%
End Type

Соответственно id% - идентификационный номер клиента.
Далее.
Допустим, один из объектов типа cCLient имеет id = 10.

Вопрос: возможно ли без цикла for-each (т.е. без перебора всех объектов типа) достать тот объект из типа, у которого id% = 10, при условии знания что данный объект существует? И если возможно, то как?
Прошу не разводить демагогию на тему "зачем это надо"

moka 26.08.2011 20:04

Ответ: Вопрос-Ответ (для новичков)
 
Т.к. Type в Blitz3D есть по сути итератор объектов, но не реализует как таковой индексации по типу хаш таблиц. Крч, тебе нужно завезьти массив отдельно от типа, он будет выступать в роли списка, и содержать ссылки по индексу на сам объект.

Код:

Dim clients.cClient(MAX_CLIENTS%)
MAX_CLIENT - должна быть константой, максимального числа ID. По сути ты создашь огромный массив, и не факт что он будет всё содержать.

Создавай новый объект сразу в массив и далее работай с ним.

Тебе нужно изучить Handle и Object интерфейсы в Blitz3D, это не просто будет для тебя..

Вот тут отличные примеры: http://www.blitzbasic.com/Community/...hp?topic=75556

EvilChaotic 27.08.2011 02:58

Ответ: Вопрос-Ответ (для новичков)
 
По-моему. Мока хочет, чтобы id объекта соответствовал номеру ячейки в массиве. И так ты действительно сможешь достать некий объект (например с id = 10) из ячейки под номером 10.

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

Самое простое будет выглядеть как=то так:

Код:

Const Dim_size% = 100
Dim Array%[Dim_size - 1]

Type cClient
 Field Id
End Type

Function CreateObject(id)
c.cClient = new cClient
c\id = id
return handle(c)
End Function

Как юзать
Dim Array[9] = CreateObject(9)

Как обращаться к объекту типа
Action(Array[9]) (Что-то делаем с объектом типа под номером 9)

Function Action(h)
c.cClient = Object.cClient(h)
;c\... =  тут что-то делаем с объектом типа
End Function

ЗЫ. Все это очень стремно. Не знаю зачем тебе это понадобилось, если расскажешь подробней то в свободное время напишу нормально.

moka 27.08.2011 05:52

Ответ: Вопрос-Ответ (для новичков)
 
Это типо hash таблица получается. Удобно если нужно делать сетевую игру, где ты знаешь что все объекты имеют свой уникальный ID.
Вот если назначаешь ID, то тут да, нада заботиться о разных вещах..

St_AnGer 27.08.2011 10:37

Ответ: Вопрос-Ответ (для новичков)
 
Цитата:

Сообщение от EvilChaotic (Сообщение 200243)
ЗЫ. Все это очень стремно. Не знаю зачем тебе это понадобилось, если расскажешь подробней то в свободное время напишу нормально.

Цитата:

Сообщение от MoKa (Сообщение 200246)
Это типо hash таблица получается. Удобно если нужно делать сетевую игру, где ты знаешь что все объекты имеют свой уникальный ID.

Вот и ответ.
Я сделал что то наподобие сетевой системы на архитектуре клиент-сервер построенной на UDP протоколе (Udp выбран не случайно, хочу потом на основе этого сделать небольшой сетевой шутер).

Работает правильно, но из за кучи циклов for-each (которые используются мной для прохода по типам) при количестве клиентов больше пяти сервер начинает не сразу читать и отвечать на запросы сообщения клиентов.
Все объекты типа "клиент" имеют свой уникальный ID.
И всё это хорошо работает, если сервер не начинает отсылать всем клиентам банальный запрос пинга (тут происходит первая "пробежка" по типу cClient, которая работает и не подвешивает сервер). А в ответ на эти запросы пинга все клиенты начинают ему отвечать, соответственно в разное время, вот тут происходит ещё куча "пробежек" по типу cClient для поиска ID каждого приславшего клиента.

Т.е. выглядит это так у меня:
1) сервер посылает запрос;
2) каждый клиент получает данный запрос в разное время (соответственно скорости соединения клиента/сервера);
3) каждый клиент обрабатывает запрос;
4) каждый клиент посылает ответ серверу, содержащий id клиента и какие то данные;
5) сервер на каждый ответ проходит циклом for-each по типу cCLient для поиска ID который пришёл от клиента и обрабатывает данные.
далее снова п.1

Я пробовал уже делать стек команд (работает, но прироста к скорости работы сервера много не дало), пробовал сделать отсылание команд клиентам в определённый интервал (вот тут как раз добавилась возможность нормально подключиться ещё двум-трём клиентам). Так же пробовал реализовать одновременно стек команд, выполняющийся по определённому интервалу времени. Всё это либо не помогло, либо помогло, но очень слабо.
Я понимаю, что сервер на блице - это глупость, но хочу попробовать пока что на нём реализовать (сначала на чистом UDP блица, а потом на RakNet'е, если с ним разберусь). Моя архитектура работает, но вот забивается при большом количестве поступивших команд :(

вот для этого я и хочу сразу брать нужный мне id из типа cClient сразу, что бы сервер не грузил себя тучей циклов for-each. Если кто то мне объяснит как вообще реализуется подобное - буду неимоверно благодарен.

Я всё это делал взяв за основу архитектуру сетевой части движка IdTech 2 (Quake II, в котором более-менее разобрался и даже начал вносить свои небольшие изменения в геймплей). Но он то написан на C++, и большинство конструкций я просто не представляю как на блице можно реализовать, да и невозможно это наверно в принципе. В принципе, могу попробовать переделать IdTech 2 под свои нужды для сервера, но я хочу именно разобраться в данном вопросе и создать свой собственный сервер на блице.

зыЖ Свой код приводить не буду, ибо проще изобрести CryEngine 4, чем разобраться в моём творчестве. Да никто этого делать и не будет, наверно.

LLI.T.A.L.K.E.R. 27.08.2011 11:54

Ответ: Вопрос-Ответ (для новичков)
 
А если создать массив
Players_IDs (100)

К определённой ячейке массива привязать Handle(cClient)

Код:

Players_IDs(id)=Handle(cClient)
...
TempClient.cClient=Object.cClient(Players_IDs(id))
TempClient\Name="Player"+Str(id)


Я тоже скоро с этим столкнусь (RakNET)

Gector 28.08.2011 21:00

Ответ: Вопрос-Ответ (для новичков)
 
Как в блице работает гамма? Никак не уловлю принцип.
Нужно для затемнения изображения. Даже функцию нашел. Но мне важно понять принцип).
Справку читал. Никогда не пользовался гаммой но тут вдруг понадобилось).

Nerd 28.08.2011 21:37

Ответ: Вопрос-Ответ (для новичков)
 
Лучше её не трогай - там надо на каждый цвет ставить цвет-замену, что херня.
Цитата:

SetGamma red,green,blue,dest_red#,dest_green#,dest_blue#
After performing one or more SetGamma commands, you must call UpdateGamma.

Gector 28.08.2011 21:42

Ответ: Вопрос-Ответ (для новичков)
 
Цитата:

Сообщение от Nerd96 (Сообщение 200410)
Лучше её не трогай - там надо на каждый цвет ставить цвет-замену, что херня.

Так и думал. Значит не то).

LLI.T.A.L.K.E.R. 02.09.2011 02:03

Ответ: Вопрос-Ответ (для новичков)
 
Хочу купить все FastЛибы, но у меня в инете только WebMoney рубли имеются.

И подскажите пожалуйста его разработчика на этом форуме... Нашёл: Mikhail Vostrikov [MixailV]

Отправил ему сообщения.

pepel 02.09.2011 10:53

Ответ: Вопрос-Ответ (для новичков)
 
Цитата:

Сообщение от LLI.T.A.L.K.E.R. (Сообщение 200932)
Хочу купить все FastЛибы, но у меня в инете только WebMoney рубли имеются.

И подскажите пожалуйста его разработчика на этом форуме... Нашёл: Mikhail Vostrikov [MixailV]

Отправил ему сообщения.

я помню его коекак выцепил в аське, если надо могу аську в личку тебе кинуть, но он тама редко бывает. похожая ситуация, у меня были только яндекс деньги)

KingMaks 02.09.2011 15:08

Ответ: Вопрос-Ответ (для новичков)
 
а как в блице преждевременно покинуть условие if ... endif ?

moka 02.09.2011 16:52

Ответ: Вопрос-Ответ (для новичков)
 
Уф.. Такого не должно быть по логике вообще, у тебя проблемы с логикой и блоками.

Заведи дополнительный true/false и используй его..


Часовой пояс GMT +4, время: 13:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot