Создание пули...
|
|
Abel399 | Дата: Суббота, 26 Мая 2012, 12:36 | Сообщение # 1 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Щас на gm делаю онлайн игру (так с друзьями поиграть). Проэкт не глобальный и не коммерческий . И вот я споткнулся, когда начал делать выстрелы... Идея в том, что клиент1 выстреливает при нажатии на лкм, создаётся пуля и пишется код: Code clearbuffer(); writebyte(shot) writeshort(bullet.x); writeshort(bullet.y); writeshort(dir); writeshort(bullet.image_angle); Сервер принимает байт и читает его: Code case shot: bullet.x=readshort() bullet.y=readshort() dir=readshort() bullet.image_angle=readshort() Сервер отправляет: Code clearbuffer(); writebyte(shot); writeshort(bullet.x); writeshort(bullet.y); writeshort(dir); writeshort(bullet.image_angle); sendmessage(clientsocket); Другие клиенты читают: Code case shot: bullet.x=readshort(); bullet.y=readshort(); dir=readshort(); bullet.image_angle=readshort(); bullet=instance_create(bullet.x, bullet.y, obj_bullet) {direction=dir; obj_bullet.image_angle=bullet.image_angle} Вот такой код пробовал я писать... Но как только я нажимал лкм, то клиент зависал и был полностью не управляем(выключался только через диспетчер задач). Вообщем пуля у меня в клиенте создаётся и летит, а как сделать чтобы её видели другие клиенты? Умные люди прошу вашей помощи Пожалуйста помогите. Заранее спасибо) P.S. Вот сама моя игра, чтобы было понятно как, там у меня дело обстоит -скачать P.S.S. Тот код я убрал т.к. он же не работает - зачем ему там быть)
Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Суббота, 26 Мая 2012, 12:48 |
|
| |
Saladin | Дата: Суббота, 26 Мая 2012, 14:12 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Если честно переменная shot слишком загадочная. В чем ее предназначение? Про имаж_англ, который по идее должен быть равен дирекшн тоже как то странно. Зачем тебе в пакете лишняя строка?
Теперь по последнему блоку кода: Ты сперва задаешь "какому то" обьекту пули координаты, хотя тот еще даже не создан, значит наверняка не тому что нужно. В последней строке дирекшн задается у обьекта, который принимает пакет а не у самой пули. Там же всем пулям задается один имаж_англ. А еще кэйз как я понял это номер пакета. Почему ты читаешь переменную кейз, которую не вытащил еще из пакета, и которая имеет дефолтное для обьекта значение (то что ты в криэйт написал при обьявлении переменной)?
У тебя только в приведенных блоках столько ошибок, что я не уверен, правильно ли работает все остальное. Садись переписывать заново конкретно этот момент. Когда получится просто добавишь в игру. Лично в таком грязном коде копошиться желания нет.
Анбаннэд. Хэлоу эгин =)
|
|
| |
Abel399 | Дата: Суббота, 26 Мая 2012, 14:50 | Сообщение # 3 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Раз так всё плохо, то помоги) Скажи как бы ты сделал "правильно"
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
Saladin | Дата: Суббота, 26 Мая 2012, 14:55 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Для начала исправь явные ошибки, я на них тебе уже указал. Дальше бери в руки справку по 39длл и читай внимательно. Там есть примеры. Потом попытайся сделать голый клиент-сервер на своем коде, который только отслеживает и передает остальным только одно действие. Когда оно все равно не заработает бери опять справку по 39длл и зубри еще. Тут же все и ежу понятно. Мне очень лень зубрить за тебя справку и искать за тебя решения. Вроде бы и так показал куда смотреть, этого мало что ли?
Анбаннэд. Хэлоу эгин =)
|
|
| |
Abel399 | Дата: Суббота, 26 Мая 2012, 15:38 | Сообщение # 5 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Ну вот подправил в коде: Клиент нажимает лкм и выполняются два скрипта: Code if canshoot { canshoot=false; alarm[1]=10; //время перезарядки mybullet = instance_create(x+0,y+0,obj_bullet); mybullet.speed = 10; mybullet.direction = dir; mybullet.myplayer = id; mybullet.image_angle = mybullet.direction; mybullet.command = command; } Code bullx=obj_bullet.x bully=obj_bullet.y bulldirection=mybullet.direction clearbuffer(); writebyte(12); writeshort(bullx); writeshort(bully); writeshort(bulldirection); sendmessage(global.clienttcp) Сервер принимает: Code mid=receivemessage(clientsocket); mid = readbyte(); switch mid { case 12: bullx=readshort(); bully=readshort(); bulldirection=readshort(); } break; Сервер отправляет: Code clearbuffer(); writebyte(12); writeshort(bullx); writeshort(bully); writeshort(bulldirection); sendmessage(clientsocket); Клиент принимает и выполняет: Code mid = receivemessage(global.clienttcp); mid = readbyte(); switch mid { case 12: bullx=readshort() bully=readshort() bulldirection=readshort() bull=instance_create(bullx, bully, obj_bull) } break; Но почему-то пуля все равно не отображается( Помочь можешь?
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
Saladin | Дата: Суббота, 26 Мая 2012, 15:53 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| Это бесполезно. Я не могу в каждом блоке кода исправлять ошибки. Quote if canshoot { canshoot=false; alarm[1]=10; //время перезарядки mybullet = instance_create(x+0,y+0,obj_bullet); mybullet.speed = 10; mybullet.direction = dir; mybullet.myplayer = id; mybullet.image_angle = mybullet.direction; mybullet.command = command; } Почему в mybullet записываем айди обьекта на не команду для сервера создать обьект? Как сервер узнает что все переменные в пакете ниже нужно присвоить пуле, которой нет?
Code bullx=obj_bullet.x bully=obj_bullet.y bulldirection=mybullet.direction clearbuffer(); writebyte(12); writeshort(bullx); writeshort(bully); writeshort(bulldirection); sendmessage(global.clienttcp) obj_bullet это указатель на тип обьекта пуля а не на конкретный экземпляр обьекта. Чьи координаты ты записал в переменную? Правильный ответ - первого экземпляра в комнате.
Code mid=receivemessage(clientsocket); mid = readbyte(); switch mid { case 12: bullx=readshort(); bully=readshort(); bulldirection=readshort(); } break; Почему ты перезаписываешь переменную в один и тот де момент несколько раз? Какой смысл в первой строчке? Зачем там присвоение если все равно ты в нее сразу пишешь первую строку пакета?
Все, надоело мне искать ошибки. Возьми готовый работающий пример и разберись как следует а не пытайся попасть пальцем в небо А я умываю руки, может тебе кто-то более терпеливый тебе согласится все разжевать. Из меня преподаватель никакой.
Анбаннэд. Хэлоу эгин =)
|
|
| |
Abel399 | Дата: Воскресенье, 27 Мая 2012, 06:50 | Сообщение # 7 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Спасибо огромное) Обожаю такую отличную критику Щас значит буду сам разжевывать свои ошибки... Спасибо, что показал их. Добавлено (27.05.2012, 06:50) --------------------------------------------- Ура получилось) Просто скрипты надо было вставлять не в obj_server, а в obj_client... Всё работает, правда одно но... Почему-то создаётся не 1 пуля, а три подряд(
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |