Среда, 07 Декабря 2022, 08:48

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Создание пули... (Умные люди, прошу вашей помощи))
Создание пули...
Abel399Дата: Суббота, 26 Мая 2012, 12:36 | Сообщение # 1
Surpass your limits. Right now.
Сейчас нет на сайте
Щас на gm делаю онлайн игру (так с друзьями поиграть). Проэкт не глобальный и не коммерческий happy . И вот я споткнулся, когда начал делать выстрелы... Идея в том, что клиент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}

Вот такой код пробовал я писать... Но как только я нажимал лкм, то клиент зависал и был полностью не управляем(выключался только через диспетчер задач). Вообщем пуля у меня в клиенте создаётся и летит, а как сделать чтобы её видели другие клиенты? Умные люди прошу вашей помощи smile Пожалуйста помогите. rolleyes Заранее спасибо)
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.
Сейчас нет на сайте
Раз так всё плохо, то помоги) Скажи как бы ты сделал "правильно" biggrin

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;

Почему ты перезаписываешь переменную в один и тот де момент несколько раз? Какой смысл в первой строчке? Зачем там присвоение если все равно ты в нее сразу пишешь первую строку пакета?

Все, надоело мне искать ошибки. Возьми готовый работающий пример и разберись как следует а не пытайся попасть пальцем в небо smile
А я умываю руки, может тебе кто-то более терпеливый тебе согласится все разжевать. Из меня преподаватель никакой.


Анбаннэд. Хэлоу эгин =)
Abel399Дата: Воскресенье, 27 Мая 2012, 06:50 | Сообщение # 7
Surpass your limits. Right now.
Сейчас нет на сайте
Спасибо огромное) Обожаю такую отличную критику smile Щас значит буду сам разжевывать свои ошибки... Спасибо, что показал их. happy

Добавлено (27.05.2012, 06:50)
---------------------------------------------
Ура получилось) biggrin Просто скрипты надо было вставлять не в obj_server, а в obj_client... Всё работает, правда одно но... Почему-то создаётся не 1 пуля, а три подряд(


Ninja Slayer - 2D Physics Puzzle [cancelled]
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Создание пули... (Умные люди, прошу вашей помощи))
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг