25.01.2014 / 12:56 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| DominaN, с чего бы это?
__________________
let live |
25.01.2014 / 13:03 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| aNNiMON, да вот хотя бы из-за разницы координат. На одном клиенте пакет с координатами дошел, а на другом - нет. Одно дело если это всякие пропсы или рагдолы, а другое - если целишься со снайперки в хэд, а попадаешь в стену метра за полтора от прицела. Все такие вещи должны считаться только сервером.
|
25.01.2014 / 13:08 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| DominaN, ты предлагаешь каждый раз ждать ответа от сервера с набором координат? Даже при среднем пинге играть уже станет невозможно, особенно если просчётов серверу приходится много делать.
__________________
let live |
25.01.2014 / 13:13 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| DominaN, вспомни Counter Strike. Там от клиента постоянно передаются только координаты и дополнительные параметры. Сервер в ответ отправляет те же самые координаты и параметры, только уже всех игроков. Если связь с сервером теряется (но не разорвана), то ты спокойно бегаешь по карте, а противники просто стоят. Если бы всё рассчитывал сервер, ты и пошевелиться бы не смог.
__________________
let live |
25.01.2014 / 13:24 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| aNNiMON, Но расчет физики все равно происходит на сервере, просто несколько в другом месте:
MOVETYPE_WALK. В обычном квейке вызывается прямо из основной функции SV_Physics, в QuakeWorld, Quake2, Half-Life вызывается из ответных пакетов клиента, содержащих информацию о перемещении игрока (т.н. usercmd_t), а в Quake3 даже есть возможно выбирать откуда вызывать физику игрока - из общего цикла или из функции приёма пакетов (квар g_synchronousClients 0\1). К слову сказать вызов физики игрока из функции приёма клиентских пакетов, кроме очевидных преимуществ (более высокая скорость реакции, более точная обработка физики) таит в себе и пару неприятностей. О первой из них знают все модемщики - чем реже приходят от них пакеты к серверу, тем реже вызывается физика игрока и никакой unlag и никакой предиктинг не в состоянии сгладить эффект от того преимущества, которое получают люди, играющие на более толстом канале. А вот вторая нехорошая проблема - то самое пресловутое застревание игрока в лифтах на подъеме\спуске, связанное с частичной рассинхронизацией движения лифта и игрока.
|
25.01.2014 / 14:38 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| DominaN (25.01.2014/12:53)aNNiMON, и все клиенты будут считать по-разному я тоже думал над этим. Думаю обеспечить одинаковую физику на разных устройствах можно максимум в пошаговых играх с простой физикой. |
25.01.2014 / 17:04 | |
UserSuperPupsik Пользователь Сейчас: Offline
Имя: UserSuperPupsik Регистрация: 27.09.2013
| Ребят, Всем Здравствуйте! Может кто-нибудь поделится готовым проектом. У меня простая проблема. Нужно создать Несколько классов MyCanvas1, MyCanvas1 ... MyCanvasN. Привязать к ним Listener кнопок, чтобы Нажал кнопку "1" включился Экран MyCanvas1 Нажал кнопку "2" включился Экран MyCanvas2 и т.д. И ещё! Можно ли в каждом классе сделать, чтобы при нажатии на кнопку "8" сработал метод repaint()? Может кто-нибудь поделится готовым проектом? Буду благодарен!!! Изменено UserSuperPupsik (25.01 / 17:05) (всего 1 раз) |
25.01.2014 / 17:20 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Для этого можно создать абстрактный класс, чтобы в каждый канвас не лепить этот код. То, что будет в коде абстрактного класса, то будет и во всех канвасах, наследуемых от него. public abstract class AbstractCanvas extends Canvas {
public void keyPressed(int key) {
if (key == KEY_NUM1) display.setCurrent(new MyCanvas1());
if (key == KEY_NUM2) display.setCurrent(new MyCanvas2());
//...
if (key == KEY_NUM9) display.setCurrent(new MyCanvas9());
if (key == KEY_NUM8) repaint();
}
}
// Теперь все классы надо наследовать не от Canvas, а от AbstractCanvas.
public class MyCanvas1 extends AbstractCanvas {
public void keyPressed(int key) {
// Если нужна какая-то дополнительная логика, то пишем:
super.keyPressed(key);
}
}
__________________
let live Изменено aNNiMON (25.01 / 17:29) (всего 1 раз) |
25.01.2014 / 17:27 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| aNNiMON, достаточно просто не переопределять keyPressed и он по умолчанию вызовется из суперкласса
|