АДМИН | Дата: Среда, 2012/Авг/15, 13:42 | Сообщение # 1 |
Группа: Администрация
Сообщений: 62
Статус: 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 |
Создатель сайта!!!!
|
|
|
|
|