[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Рисование (game maker)
Рисование
АДМИНДата: Среда, 2012/Авг/15, 13:42 | Сообщение # 1
Группа: Администрация
Сообщений: 62
Награды: 6
Репутация: 9
Статус: Offline


2.3.1. Как отобразить объект для конкретного игрока, в случае, если у меня включено два вида?






 


Ответ: Используйте переменную view_current. Пример:


Код:






 


if view_current = 0


{


   draw_text(view_xview[view_current], view_yview[view_current], 'Игрок 1');


}


 


if view_current = 1


{


   draw_text(view_xview[view_current], view_yview[view_current], 'Игрок 2');


}


 




 


 




2.3.2. Я отрисовываю на экране, к примеру, текст, но когда я двигаюсь - он улетает за границы экрана. Как сделать так, чтобы текст оставался в исходной позиции?






 


Ответ: На самом деле, позиция текста не меняется, однако координаты вида, напротив, изменяются. Вид - область, которую нужно отрисовать на экране. Чтобы отрисовать что-либо на виде - к координатам x и у нужно прибавлять view_xview и view_yview соответственно. Например:


Код:






 


draw_text(view_xview + 16, view_yview + 32, "Text");


Чтобы отрисовывать текст, например, над главным героем - можно написать так:


Код:


draw_text(o_player.x + 16, o_player.y - 32, "Text");


 




 


 




2.3.3.Я пишу в событие draw event в объекте игрока отображение жизней (например). Но в игре спрайт игрока не отображается. В чём причина?






 


Ответ: Если событие draw event пусто - GM автоматически отрисовывает спрайт объекта, в случае, если он находится в пределах вида. Если же вы задали в этом событии какие-то действия - GM не может знать, находится ли ваша графика в пределах вида, или вне его. Потому, эти действия выполняются в любом случае, а спрайт объекта не отображается. Чтобы нарисовать спрайт вручную - нужно дописать такой код в начало события draw event:


Код:






 


draw_sprite_ext(sprite_index, image_index, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);


 




 


Эта функция использует встроенные переменные для изменения масштаба, прозрачности, поворота и тд. спрайта, но если вы не используете эти функции - вы можете писать просто


Код:






 


draw_sprite(sprite_index, image_index, x, y);


 




 


 




2.3.4. Как изменить глубину объекта в draw event?






 


Ответ: Глубину объекта прямо в событии draw изменить нельзя. Можно использовать несколько объектов с разной глубиной или просто переставить действия в событии рисования (если вы используете 3D - почитайте про d3d_set_depth(depth)).


 


 




2.3.5: Вопрос 1: Как сделать, чтобы когда герой был ниже дерева - он был над ним, а когда выше - за ним? Вопрос 2: Какую нужно использовать формулу, чтобы вычислить глубину объекта в изометрии или в играх с видом как в классических jrpg?






 


Ответ: Для игр с видом как в классических jrpg обычно используется формула depth=-y при условии, что центр спрайта находится в точке столкновения объекта с землёй, а не в (0,0). Эту код нужно поставить в create event статических объектов, и step event динамических. Чем ниже объект, тем меньше его глубина, тем выше он рисуется.


Для изометрии можно использовать формулу depth = -(y - sprite_yoffset + (sprite_height + H) / 2), где H - высота объекта над уровнем земли. Если у одного и того же спрайта высота точек спрайта над уровнем земли разная - нужно использовать буфер глубины, то есть - 3D технологии.


 


 




2.3.6. Как сделать ссылку / Текст, при клике на который выполнялось бы определённое действие?






 


Ответ: Можно использовать следующий скрипт:


Код:






 


/***************************************************


 Скрипт рисует ссылку.


 argument0 - х;


 argument1 - y;


 argument2 - текст;


 Возвращает 1, если игрок кликнул на текст, иначе - 0.


***************************************************/


var xx, yy, str, width, height; // Задаём временные переменные


xx = argument0;


yy = argument1;


str = argument2;


width = string_width(str);


height = string_height(str);


 


if mouse_x > xx and mouse_y > yy and mouse_x < xx + width and mouse_y < yy + height // Если пользователь навёл на мышку, то...


{


   draw_set_color(c_red); // Устанавливаем цвет, с которым рисуется выделенная ссылка


   draw_text(xx, yy, str); // Рисуем текст


   draw_line(xx, yy + height, xx + width, yy + height); // Рисуем подчёркивание


 


   if mouse_check_button_released(mb_left) // Если пользователь кликнул на ссылку, то...


   {


       return 1; // Возвращаем 1, и завершаем работу скрипта


   }


}


else


{


   draw_set_color(c_blue); // Рисуем ссылку обычным цветом


   draw_text(xx, yy, str);


}


 


return 0; // Возвращаем 0 - пользователь не кликал на ссылку


 




 


Пример использования, [draw event]:


Код:






 


if draw_text_button(0, 0, 'button')


{


   execute_shell("http://google.com/", 0);


}


 




 


Для открытия web страницы в игровом окне можно использовать функцию splash_show_web.


 


 




2.3.7. Можно ли для хелсбара использовать спрайт, а не цвет?






 


Ответ: Конечно!


Код:






 


draw_sprite(s_healthbar, 0, view_xview + 8, view_yview + 8)  //Рисуем фон


draw_sprite_part(s_healthbar, 1, 0, 0, sprite_get_width(s_healthbar) * (Health / Health_max),


sprite_get_height(s_healthbar), view_xview + 8, view_yview + 8) //Рисуем жизни на фоне


 




 


s_healthbar - спрайт хелсбара, первый кадр должен быть фоном хелсбара, а второй кадр - картинка полностью заполненного жизнями хелбара.


Health - текущее кол-во жизней, Health_max - максимальное кол-во жизней.


view_xview + 8, view_yview + 8 - позиция хелсбара


 


 




2.3.8. Как сделать, чтобы при наведении на объект высвечивалась информация о нём?






 


Ответ: В draw event объекта, при наведении на который должна высвечиваться информация следует добавить такой код:


Код:






 


if position_meeting(mouse_x, mouse_y, id) // Если в позиции мышки находится данный экземпляр объекта, то...


{


   // Рисуем нужную информацию.


}


 




 


Так же не стоит забывать, что если добавить какой-то код в событие draw - GM перестанет автоматически рисовать спрайт объекта, так что его отрисовку нужно добавить вручную (с помощью функции draw_sprite, к примеру).


 


 




2.3.9. Как повернуть сурфейс относительно его центра?






 


Ответ: Нужно использовать 3D-преобразования, которые отлично работают и в 2D. Пример:


Код:






 


d3d_transform_add_translation(-surface_get_width(surface)/2, -surface_get_height(surface)/2, 0); // Устанавливаем сурфейс в центр


d3d_transform_add_rotation_z(image_angle); // Поворачиваем его на величину image_angle


d3d_transform_add_translation(x, y, 0); // Сдвигаем в нужную позицию, там, где будет рисоваться сурфейс


draw_surface(surface, 0, 0); // Рисуем сурфейс


d3d_transform_set_identity(); // Отключаем все преобразования, установленные пользователем


 




 


 




2.3.10. Как полностью перекрасить спрайт в другой цвет?






 


Ответ: Для того, чтобы перекрасить спрайт в чёрный цвет - можете использовать image_blend, тот же параметр color в функциях для отображения спрайтов. Кстати, это довольно полезная функция, к примеру - с её помощью можно легко создать тень, пример:


Код:






 


draw_sprite_ext(sprite_index, 0, x + 2, y + 2, 1, 1, 0, c_black, 0.3); // Рисуем тень с непрозрачностью 0.3


draw_sprite(sprite_index, 0, x, y); // Рисуем сам спрайт


 




 


Чтобы полность перекрасить спрайт в цвет, отличный от чёрного - используйте функцию для создания тумана в 3D играх. Пример:


Код:






 


d3d_set_fog(true, c_white, 0, 0);


draw_sprite(sprite_index, 0, x, y);


d3d_set_fog(false, c_white, 0, 0);


 




 


Ну, а если вы хотите создать полноценный эффект "Fade" - используйте dll для работы с пиксельными шейдерами в GM, где это реализуется очень легко: http://gmc.yoyogames.com/index.php?showtopic=492876


 


 





Создатель сайта!!!!
 
Форум » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Рисование (game maker)
Страница 1 из 11
Поиск: