Я написал эту функцию для перемещения выбранных предметов:
using System.Collections;
using System.Collections.Generic;
private void MoveListboxItems(int step, ListBox lb) {
/* 'step' should be:
* -1 for moving selected items up
* 1 for moving selected items down
* 'lb' is your ListBox
* see examples how to call below this function
*/
try {
// do only something when really an item is selected
if (lb.SelectedIndex > -1) {
// get some needed values - they change while we manipulate the listbox
// but we need them as they was original
IList SelectedItems = lb.SelectedItems;
IList SelectedIndices = lb.SelectedIndices;
// set some default values
int selIndex = -1;
int newIndex = -1;
int selCount = SelectedItems.Count;
int lc = 0;
int mc = 0;
string moveOldValue = string.Empty;
string selectedItemValue = string.Empty;
if (step == 1) {
mc = selCount - 1;
} else {
mc = lc;
}
// enter the loop through the selected items
while (lc < selCount) {
selectedItemValue = string.Empty;
moveOldValue = string.Empty;
try {
// get the item that should get moved
selectedItemValue = SelectedItems[mc].ToString();
selIndex = Convert.ToInt32(SelectedIndices[mc]);
} catch {
selIndex = -1;
}
// gen index for new place
newIndex = selIndex + step;
try {
// get the old value from the place where the item get moved
moveOldValue = lb.Items[newIndex].ToString();
} catch { /* do nothing */ }
try {
if (!String.IsNullOrEmpty(selectedItemValue) && !String.IsNullOrEmpty(moveOldValue) && selIndex != -1 && newIndex != -1 && !lb.SelectedIndices.Contains(newIndex)) {
// move selected item
lb.Items.RemoveAt(newIndex);
lb.Items.Insert(newIndex, selectedItemValue);
// write old value back to the old place from selected item
lb.Items.RemoveAt(selIndex);
lb.Items.Insert(selIndex, moveOldValue);
// hold the moved item selected
lb.SetSelected(newIndex, true);
}
} catch { /* do nothing */ }
lc++;
if (step == 1) {
mc -= step;
} else {
mc = lc;
}
}
}
} catch { /* do nothing */ };
}
// examples how i call the function above
void BtnLbUp_Click(object sender, EventArgs e) {
MoveListboxItems(-1, this.lbMyList);
}
void BtnLbDown_Click(object sender, EventArgs e) {
MoveListboxItems(1, this.lbMyList);
}
Half-Life 2, Counter-Strike: Source и т. Д. Используют движок Valves Source. Valve имеет вики для разработчиков , которая охватывает множество вещей (это довольно круто, проверьте это!) ...
Эти статьи могут вас заинтересовать:
Методы компенсации задержки в клиент-серверных системах. Протокол, дизайн и оптимизация игры
Я глядел на эту книгу. Мои познания в математике невелики ... но есть ключ:
Для понимания таких вещей, если у вас есть творческий ум и хорошее понимание абстрактной природы структур и математических принципов у вас все должно быть в порядке. Моя умственная арифметика довольно скудна по любым стандартам, но я люблю читать о дискретной математике из-за ее абстрактной природы.
Я бы не считал себя очень хорошим математиком в числовом смысле, но как разработчик программного обеспечения. Мне нравится думать, что у меня математический (или механический) ум.
Я бы не стал ' Я слишком беспокоюсь о своей числовой силе , но больше о природе математики и личности концепций, лежащих в основе информатики. Если у вас хороший ум в программировании, возможно, попробуйте улучшить это с помощью комбинаторики / дискретной / конкретной математики (которая, помимо теории счета, во многих случаях избегает сухих чисел ).
Я нашел свою любовь к вещам как компиляторы, изучающие теорию множеств, и я бы не хотел сдавать математику A-level без большого количества зубрежки!
Попробуйте, что вам терять?
(im 22 and в похожей на вас ситуации)
Удачи
PS: Мне тоже показались интересными видеолекции. Вы можете загрузить их через торрент с
Вам следует ознакомиться с статьями Луиджи Ауриеммаса о Half-Life. Вы также найдете там декодер пакетов и несколько разобранных алгоритмов.
Возможно, будет трудно найти информацию о обратном инжиниринге Half-Life 2 из-за ее пригодности для мошенничества. Думаю, вам лучше всего подойдут такие форумы, как mpcforum .
Я предлагаю вам изучить Quake 1 -3 двигателя. Они доступны с исходным кодом. Протокол Half-Life может быть немного другим, но, скорее всего, достаточно близким.
Хотя детали могут отличаться, общая структура довольно старая. Вот краткий обзор:
В ранних играх с fps, таких как doom и Quake, позиция игрока обновлялась только после ответа сервера на вашу команду перемещения. То есть вы нажали кнопку перехода вперед, и клиент сообщил об этом серверу, сервер обновил вашу позицию в своей памяти, а затем ретранслировал новое игровое состояние вашему клиенту с вашей новой позицией. Это приводило к очень медленной игре: стрельба, даже передвижение в узких коридорах, была игрой с предсказанием отставания.
Новые игры позволяли клиенту самостоятельно управлять стрельбой и перемещением игрока. Хотя это привело к перемещению и запуску без задержек, оно открыло больше возможностей для мошенничества путем взлома клиентского кода. Теперь каждый игрок двигается и стреляет независимо на своем компьютере и сообщает серверу, что они сделали. Это выходит из строя только тогда, когда два игрока сталкиваются друг с другом или одновременно пытаются поймать силу.
Теперь у сервера есть этот поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и создать согласованную игру. их. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.
Это очень приблизительный обзор, но он должен дать вам общее представление.
Это выходит из строя только тогда, когда два игрока сталкиваются друг с другом или одновременно пытаются поймать мощность.Теперь у сервера есть поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и создать согласованную игру. их. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.
Это очень приблизительный обзор, но он должен дать вам общее представление.
Это выходит из строя только тогда, когда два игрока сталкиваются друг с другом или одновременно пытаются поймать мощность.Теперь у сервера есть поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и создать согласованную игру. их. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.
Это очень приблизительный обзор, но он должен дать вам общее представление.
Теперь сервер имеет этот поток состояний клиента, исходящий от каждого игрока, и должен синхронизировать их и сделать из них согласованную игру. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.
Это очень приблизительный обзор, но он должен дать вам общее представление.
Теперь у сервера есть этот поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и сделать из них согласованную игру. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.
Это очень приблизительный обзор, но он должен дать вам общее представление.
Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.Это очень приблизительный обзор, но он должен дать вам общее представление.
Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.Это очень приблизительный обзор, но он должен дать вам общее представление.