Вторник, 19 Ноября 2024, 19:46

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос - Ответ (Game Maker)
LunarPixelДата: Четверг, 03 Марта 2011, 08:27 | Сообщение # 1041
старожил
Сейчас нет на сайте
Вот тебе примерчик: ССЫЛКА
Не самый хороший вариант, просто первое что пришло в голову.
Для закрытия игры жми кнопку "Выход", если игра будет выключена другим способом, то при следующем запуске появится окно, которое спросит, хочешь ли ты восстановить игру, т.е. продолжить с того места на котором остановился.

P.S. Кубик движется только вправо, для теста.




Сообщение отредактировал LunarPixel - Четверг, 03 Марта 2011, 08:28
GameMixДата: Четверг, 03 Марта 2011, 11:12 | Сообщение # 1042
старожил
Сейчас нет на сайте
Здравствуйте. Помогите, пожалуйста, решить несколько вопросов:

1) Создал в игре пушку, которая вращается на 360o. Точка (x,y) спрайта пушки по центру. "lengthdir" немного усвоил, с одной пушкой по центру сделал. Пытался сделать такую же, но с двумя пушками и наткнулся на косяк: она стреляет то ровно, из дула, то где-то сбоку.

Примерный спрайт пушки:

Код создания пули около пушки:

Code
instance_create(x+lengthdir_x(30,image_angle+90)-10,y+lengthdir_y(30,image_angle+90),o_tur1_pulya); // выстрел из левого дула

Если пушка стреляет вверх, пули летят ровно из дула, если же поворачивается на угол 0o (направо) - косит. Пули создаются между двух стволов.

2) Выражение после проверки почему-то выполняется не полностью. Если игрок подходит близко к пушке, она вращается но не запускает Alarm0. Перепроверял, но так и не понял в чем проблема sad .
Скрипт объекта пушки:

step:

if instance_number(first_player) > 0
if point_distance(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2) < 350 and
!collision_line(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2,kirpich,1,1) and
!collision_line(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2,block,1,1)
{
image_angle=point_direction(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2)-90;
alarm[0] = 6;
}

Alarm0:

instance_create(x+lengthdir_x(30,image_angle+90)-10,y+lengthdir_y(30,image_angle+90),o_tur1_pulya);
alarm[0] = 6;


Steel Standoff - 2D аркада.
Мои статьи
LunarPixelДата: Четверг, 03 Марта 2011, 11:24 | Сообщение # 1043
старожил
Сейчас нет на сайте
По второму вопросу:

Дело в том, что пока у тебя выполняются все условия, alarm каждый шаг начинает отсчет с самого начала и не может досчитать до конца. Первое решение которое приходит в голову:

Создаешь переменную Peremen=0

if instance_number(first_player) > 0
if point_distance(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2) < 350 and
!collision_line(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2,kirpich,1,1) and
!collision_line(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2,block,1,1)
{
image_angle=point_direction(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2)-90;
if Peremen=0 {
alarm[0] = 6;
Peremen=1;}
}

Таким образом таймер будет срабатывать только один раз.
Если нужно чтобы действие повторялось, то в событие alarm0 допиши:
Peremen=0;

Должно сработать.




Сообщение отредактировал LunarPixel - Четверг, 03 Марта 2011, 11:25
RikettaДата: Четверг, 03 Марта 2011, 11:33 | Сообщение # 1044
Strategist
Сейчас нет на сайте
1. Скажу одно.... А случаем спрайт не в право должен быть повернут?

Fougerite - Rust Server OpenSource API
TerraDev - Terraria OpenSource Hack
LunarPixelДата: Четверг, 03 Марта 2011, 11:51 | Сообщение # 1045
старожил
Сейчас нет на сайте
По первому вопросу:

Можно попробовать сделать так, создать спрайт для пуль вот таким образом:


Если наложить этот спрайт на пушку, то пули окажутся прямо у концов стволов.

И просто поворачивать этот спрайт при выстреле на тот же угол на который повернута пушка.
Аналогично можно сделать пули по отдельности. Посто потребуется отдельный спрайт для каждой из двух пуль.
Тогда ничего высчитывать не нужно будет, пули должны появляться там где надо.

Добавлено (03.03.2011, 11:51)
---------------------------------------------
Riketta, спрайт может быть в любую сторону повернут... главное определить с какого угла начинать отсчет..
Как по мне, то вправо повернуть удобнее конечно...


NeZnayuДата: Четверг, 03 Марта 2011, 11:55 | Сообщение # 1046
__танцуй!__
Сейчас нет на сайте
LunarPixel, способ не очень, т.к. ГМу придется высчитывать маску столкновений для большого спрайта, который содержит всего два маленьких элемента.

Народ, учитесь пользоваться lengthdir_x(), lengthdir_y()


CombatForce - 2d TDS долгожданный релиз
Noobster - самый простой конструктор игр в мире
LaLaLaLAMA! - игра не про Ламу
LunarPixelДата: Четверг, 03 Марта 2011, 12:00 | Сообщение # 1047
старожил
Сейчас нет на сайте
NeZnayu, да, способ конечно не очень, но как вариант вполне может подойти...
Да и маску ведь можно (да и нужно) изменить... сделать чтобы она охватывала только эти два объекта, но безусловно способ не самый хороший...
Просто плюс в том, что задумываться над расчетами не придется.


GameMixДата: Четверг, 03 Марта 2011, 12:05 | Сообщение # 1048
старожил
Сейчас нет на сайте
Quote (LunarPixel)
вправо повернуть удобнее конечно...

Это я знаю. Не зря же в коде встречается "+90", "-90".

Quote (LunarPixel)
Можно попробовать сделать так, создать спрайт для пуль вот таким образом:

Можно, конечно, но это ограничит меня в добавлении, например, возможности получения визуальных повреждений пушкой (полуразрушенная пушка стреляет только из одного дула).

По поводу первого вопроса. Дело в том, что у меня получается так: если игрок подходит близко к пушке, она поворачивается в его сторону, но не стреляет. Однако, при отдалении от пушки более чем на 350 пикселей, она начинает стрелять как нужно (хотя не должна стрелять вообще), но уже не следит за игроком (не вращается. Так и задумано). Как тогда быть?

Добавлено (03.03.2011, 12:05)
---------------------------------------------

Quote (NeZnayu)
Народ, учитесь пользоваться lengthdir_x(), lengthdir_y()

Вот я, собственно, и учусь smile .


Steel Standoff - 2D аркада.
Мои статьи
LunarPixelДата: Четверг, 03 Марта 2011, 12:12 | Сообщение # 1049
старожил
Сейчас нет на сайте
step:

Code
if instance_number(first_player) > 0  
if point_distance(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2) < 350 and  
!collision_line(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2,kirpich,1,1) and  
!collision_line(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2,block,1,1)  
{  
image_angle=point_direction(x,y,first_player.x+first_player.sprite_width/2,first_player.y+first_player.sprite_height/2)-90;  
if Peremen=0 {  
alarm[0] = 6;  
Peremen=1;}  
}

Alarm0:

Code
instance_create(x+lengthdir_x(30,image_angle+90)-10,y+lengthdir_y(30,image_angle+90),o_tur1_pulya);   
Peremen=0;

Вроде ничего не напутал... smile

Добавлено (03.03.2011, 12:12)
---------------------------------------------
Ну и в create:

Code
Peremen=0


GameMixДата: Четверг, 03 Марта 2011, 12:18 | Сообщение # 1050
старожил
Сейчас нет на сайте
LunarPixel, сейчас проверю smile .

Добавлено (03.03.2011, 12:18)
---------------------------------------------
Проверил, все работает отлично! Просто хотел обойтись без переменных, через Alarm. Вижу без них не обойтись biggrin . Спасибо, +!


Steel Standoff - 2D аркада.
Мои статьи
NeZnayuДата: Четверг, 03 Марта 2011, 12:21 | Сообщение # 1051
__танцуй!__
Сейчас нет на сайте
Quote (аТнОтХоАн)
Дело в том, что у меня получается так: если игрок подходит близко к пушке, она поворачивается в его сторону, но не стреляет. Однако, при отдалении от пушки более чем на 350 пикселей, она начинает стрелять как нужно (хотя не должна стрелять вообще), но уже не следит за игроком (не вращается. Так и задумано). Как тогда быть?

if distance_to_object(PLAYER)<350
{image_angle=point_direction(x,y,PLAYER.x,PLAYER.y);}
if distance_to_object(PLAYER)<250
{//стреляем}

Чтобы пушка стреляла двумя пулями:

Нужно все-таки развернуть картинку спрайта направо (дабы не путаться)

Создание пули:
bullet1=instance_create(x+lengthdir_x(24,image_angle+15),y+lengthdir_y(24,image_angle+15),BULLET);
bullet2=instance_create(x+lengthdir_x(24,image_angle-15),y+lengthdir_y(24,image_angle-15),BULLET);

Красным цветом обозначен угол отклонения (в градусах), зеленым расстояние от центра до дула (в пикселях).
Цифры я взял из головы.


CombatForce - 2d TDS долгожданный релиз
Noobster - самый простой конструктор игр в мире
LaLaLaLAMA! - игра не про Ламу


Сообщение отредактировал NeZnayu - Четверг, 03 Марта 2011, 12:24
GameMixДата: Четверг, 03 Марта 2011, 12:31 | Сообщение # 1052
старожил
Сейчас нет на сайте
Quote (NeZnayu)
bullet1=instance_create(x+lengthdir_x(24,image_angle+15),y+lengthdir_y(24,image_angle+15),BULLET);
bullet2=instance_create(x+lengthdir_x(24,image_angle-15),y+lengthdir_y(24,image_angle-15),BULLET);

Сразу обнаружил ошибку. У вас получается, что две пули вылетают из одного, правого, дула.
Немного поменял: x-lengthdir_x(24,image_angle+15). Уже лучше, но проблема та же, что я описывал в этом вопросе - пули летят то из дула, то с центра точки между дулами.


Steel Standoff - 2D аркада.
Мои статьи


Сообщение отредактировал аТнОтХоАн - Четверг, 03 Марта 2011, 12:34
NeZnayuДата: Четверг, 03 Марта 2011, 12:36 | Сообщение # 1053
__танцуй!__
Сейчас нет на сайте
аТнОтХоАн, image_angle=direction ?

CombatForce - 2d TDS долгожданный релиз
Noobster - самый простой конструктор игр в мире
LaLaLaLAMA! - игра не про Ламу
NeZnayuДата: Четверг, 03 Марта 2011, 12:46 | Сообщение # 1054
__танцуй!__
Сейчас нет на сайте
Quote (аТнОтХоАн)
Сразу обнаружил ошибку. У вас получается, что две пули вылетают из одного, правого, дула.

Я не знаю почему у тебя они вылетают из одного дула, значит ты где-то накосячил.

Скачать пример


CombatForce - 2d TDS долгожданный релиз
Noobster - самый простой конструктор игр в мире
LaLaLaLAMA! - игра не про Ламу
GameMixДата: Четверг, 03 Марта 2011, 14:35 | Сообщение # 1055
старожил
Сейчас нет на сайте
Quote (NeZnayu)
Я не знаю почему у тебя они вылетают из одного дула, значит ты где-то накосячил.

Точно накосячил. Опять же из-за невнимательности не заметил, что созданная пуля равна переменной.
Спасибо за пример, буду разбираться в скрипте happy .


Steel Standoff - 2D аркада.
Мои статьи
LordZickДата: Четверг, 03 Марта 2011, 18:19 | Сообщение # 1056
участник
Сейчас нет на сайте
Опять я! Игрок подключается к серверу, появляется на сервере. Всё там работает, игрок ходит, чат пишет, но когда на сервер заходит другой игрок, его не показывает в первом, во втором, третем и т.д. клиентах. Тоесть игра оффлайн, хоть в чате пишет, что новый игрок подключился.
Я думаю что всё это из-за сервера, потому что он не отправляет "байт новый игрок".
В степе объекта сервер написано:
Code

  global.clienttcpsocket = tcpaccept(global.listeningsocket,true) //If someone tries to connect accept him
         if global.clienttcpsocket //If someone connected
{
   playerid = newplayerid(); //generate player id
   if(playerid < 0)exit;     //if too many players
   i = instance_create(0, 0, objPlayer);  //create object for player
   i.socketid = player;      //Set socket id for player to the socket that was just accepted
   i.playerid = playerid;
   players[playerid] = i;
   setnagle(player, false);  //turn off nagle algorithm for socket
    
   //Tell all players that i joined
   clearbuffer();
   writebyte(newplayer); //Write message id
   writebyte(playerid);  //Write the new players PlayerId
   writeshort(0);
   writeshort(0);
   writestring("", true);
   //Send to all other players
   with(objPlayer)
   {
     if(id != other.i)
     {
       sendmessage(socketid);
     }
   }
   //Tell me all the players that have already joined
   with(objPlayer)
   {
     if(id != other.i)
     {
       clearbuffer();
       writebyte(playerid);
       writebyte(newplayer);
       writeshort(x);
       writeshort(y);
       writestring(nick, true);
       sendmessage(other.player);    //send to me
     }
   }
}

В клиенте в objControl (степ) написано:
Code

while(1)                           //Start infinite loop  
{  
{  
instance_destroy();  
break;  
}  
mid = readbyte();     //read message id  

switch(mid)  
{  
case newplayer:  
pid = readbyte();       //read playerid  
player = instance_create(0, 0, objRemote); //create instance of objRemote (remote player)  
player.x = readshort();  
player.y = readshort();  
player.nick = readstring();  
players[pid] = player;  //Add instance to playerlist  
break;  

case playerlocation:  
player = players[readbyte()];   //get id of player from playerlist  
player.x = readshort();         //set x  
player.y = readshort();         //set y  
break;  

case exitgame:  
player = players[readbyte()];   //get id of player from playerlist  
with(player)instance_destroy(); //destroy  
break;  

case playernick:  
player = players[readbyte()];   //get id of player from playerlist  
player.nick = readstring();     //set nickname  
break;  
}  
}  

Если что, пример взял Massively Multiplayer Online Engine
Там не было объекта игрока. Я сам его сделал, смотря на другие примеры
Я ничего не понял, в чём проблема? Может это очень далеко от сервера и от objControl в клиенте?



BaHu3aTopДата: Суббота, 05 Марта 2011, 08:04 | Сообщение # 1057
постоянный участник
Сейчас нет на сайте
Как сделать чтобы ГГ стрелял в стену, а спрайт стены разрезался по полам где прошла пуля

VocalMixДата: Понедельник, 07 Марта 2011, 16:57 | Сообщение # 1058
постоянный участник
Сейчас нет на сайте
Добрый день.
Я совсем недавно начал работать с GML и вот, что получилось: wacko

Первое, что хочу спросить - в воздухе, персонаж способен атаковать чаще чем стоя на платформе. У меня получилось, вправо правильно, а влево не очень т.е. атака происходит, то налево, то направо. Почему? Подскажите пожалуйста!
Второе - можно этот код как-нибудь упростить т.е. иначе сформулировать в более удобную форму для записи, сохранив при этом, те же функции?
P. S. хотя этот код довольно прост для опытных пользователей, но я новичок, и поэтому возникают подобные вопросы :o)


Бложик: http://mus-vocalmix.blogspot.ru

Сообщение отредактировал VocalMix - Понедельник, 07 Марта 2011, 19:29
LordZickДата: Вторник, 08 Марта 2011, 13:50 | Сообщение # 1059
участник
Сейчас нет на сайте
Здрасте! Я не знаю как реализовать скелетную анимацию! Может кто-нибудь мне помочь в этом? Я в google, yandex и на rambler искал, но ничего не нашло, кроме флеш анимации!


Made_In_USSRДата: Вторник, 08 Марта 2011, 15:35 | Сообщение # 1060
заслуженный участник
Сейчас нет на сайте
Учимся пользоваться поиском!

Новичкам изучающим GML кликать сюда.
Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
Поиск:

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