Просмотр полной версии : Скроллинг пространства в многопользовательской реалтайм игре
Astraport
08.01.2012, 01:25
Без скроллинга все отлично работает. Но когда в игре 4 юзера начинается толкучка. Поэтому увеличил мир в 3 раза по ширине и в 3 раза по высоте. Юзер теперь может передвигаться в пределах видимой части, а дальше, когда подошел к границе, скроллится мир.
Но т.к. игра многопользовательская, то на сервер отправляются и транслируются только команды изменения клавиш. Получается хаос. Если транслировать координаты каждого юзера на каждый фрейм, то вырастает нагрузка на сервер и все получается дерганным.
Может есть у кого опыт в правильной организации подобного проекта?
Может быть ссылочку? :)
Заодно и поиграем :)
Astraport
08.01.2012, 15:35
Не хочется выкладывать недоделку, но если это поможет решить проблемы...
http://avatargame.cloudno.de/
Пока не сделал скроллинг играть ещё можно было. Теперь ерунда происходит. Можно проверить открыв игру в разных вкладках браузера. Ещё теряется фокус у персонажа - нужно что-то написать в чате, тогда фокус опять появляется.
Перемещение клавиатурными стрелками, стрелять - мышкой. Собирать монетки - на них потом можно будет купить броню, скорость и т. п. Ещё бонусы появляются.
Zebestov
08.01.2012, 15:48
У тебя скроллом заведует сервер? Это же просто отображение модели мира, модель не меняется оттого, что я смотрю то в одну, то в другую ее часть.
Astraport
08.01.2012, 16:09
У тебя скроллом заведует сервер?
Нет клиент, конечно. Если сервер, то это же у всех клиентов будет одинаково скроллится.
Добавлено через 44 минуты
Я двигаю героя (hiroes[player]) и мир (bg) так:
protected function everyFrame(event:Event):void
{
for(var player:String in hiroes){
if (currId!=null){
if (hiroes[player].rightArrow ) {
if (hiroes[player].x < (this.width/2 - hiroes[player].width/2 + 300)){
hiroes[player].x += speed;
} else {
if (bg.x > -1600){
bg.x -= speed;
}
}
}
if (hiroes[player].leftArrow ) {
if (hiroes[player].x > (this.width/2 - hiroes[player].width/2 - 300)){
hiroes[player].x -= speed;
} else {
if (bg.x < 0){
bg.x += speed;
}
}
}
if (hiroes[player].upArrow ) {
if (hiroes[player].y > (this.height/2 - hiroes[player].height/2 - 270)){
hiroes[player].y -= speed;
} else {
if (bg.y < 0){
bg.y += speed;
}
}
}
if (hiroes[player].downArrow) {
if (hiroes[player].y < (this.height/2 - hiroes[player].height/2 + 270)){
hiroes[player].y += speed;
} else {
if (bg.y > -1600){
bg.y -= speed;
}
}
}
for (var i:int = 0; i < wallArray.length; i++){
if(hiroes[player].hitTestObject(wallArray[i] as Wall))
{
if (hiroes[player].rightArrow){
hiroes[player].x = hiroes[player].oldHeroX;
bg.x = olgBgX;
}
if (hiroes[player].leftArrow){
hiroes[player].x = hiroes[player].oldHeroX;
bg.x = olgBgX;
}
if (hiroes[player].upArrow){
hiroes[player].y = hiroes[player].oldHeroY;
bg.y = olgBgY;
}
if (hiroes[player].downArrow){
hiroes[player].y = hiroes[player].oldHeroY;
bg.y = olgBgY;
}
}
}
hiroes[player].oldHeroX = hiroes[player].x;
hiroes[player].oldHeroY = hiroes[player].y;
olgBgX = bg.x;
olgBgY = bg.y;
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.