RS Game Maker Community
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

 
Расширенный поиск
  Главная  Форум   Вики Блоги FAQ Игры Статьи Примеры Войти Регистрация  
Вики
Все желающие приглашаются редактировать вики. Можете писать о своих (или чужих) играх, размещать туториалы, постить статьи - главное навесить категорию.
Страниц: 1 2 3   Вниз
  Печать  
Оптимизация
0 Пользователей и 1 Гость смотрят эту тему.
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

09 Февраля 2011 в 23:36
Вопрос  таков: как оптимизировать кровь? Удаление по времени не предлагать.




 
andNsX
Ветеран форума
*****

Репутация: 111
Offline Offline

Награды:
Легенда сайта
Сообщений: 1 345

Ответ № 1 09 Февраля 2011 в 23:44
Сурфейсы. Поищи, на форуме тысячу раз обсуждали.
ZitRo
GML/C/C++/C#/html/js/php
Завсегдатай
****

Репутация: 95
Offline Offline

Сообщений: 623


Ответ № 2 09 Февраля 2011 в 23:45
1. Сурфейсы, да.
2. Тайлы - еще проще.
3. Объекты? Ну, сразу скажу, плохой выбор.
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 3 09 Февраля 2011 в 23:46
Сделано объектами.
Пытался тайлами. Ничего не вышло(

andNsX
Ветеран форума
*****

Репутация: 111
Offline Offline

Награды:
Легенда сайта
Сообщений: 1 345

Ответ № 4 09 Февраля 2011 в 23:49
1. Сурфейсы, да.
2. Тайлы - еще проще.
3. Объекты? Ну, сразу скажу, плохой выбор.
Тайлы это плохо. Каждый тайл это объект, только ест меньше памяти и меньше грузит процессор и видеокарту. Сурфейс же это одно изображение, которые изменяешь во время игры. Сурфейс не станет требовать больше памяти и сил от компьютера.
ZitRo
GML/C/C++/C#/html/js/php
Завсегдатай
****

Репутация: 95
Offline Offline

Сообщений: 623


Ответ № 5 09 Февраля 2011 в 23:52
Тайлы:
Создаешь бэкграунд bg_blood (с изображение крови, да)
Ну и создавай кровь:
tile_add(bg_blood,0,0,background_get_width(bg_blood),background_get_height(bg_blood),x,y,1000)
Тут вроде ничего сложного :)
чистишь кровь tile_layer_delete(1000).

UPD>
Сурфейс надо каждый шаг рисовать + память. Поверь мне, большая комната с сурфейсом крови - и ужрет всю память. Тайлы не перерисовываются шагами, и содержат в себе каплю памяти про координаты (и т.п.) и ссылку на изображение. Нарисованные раз, они не перерисуются, пока в них не поменять какую-то переменную.
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 6 09 Февраля 2011 в 23:59
Понимаешь ли, у каждого объекта крови свой угол поворота. Может как-нить так:

tile_add(background_create_from_screen(x,y,32,32,0,0),0,0,background_get_width(bg_blood),background_get_height(bg_blood),x,y,1000)

??

ZitRo
GML/C/C++/C#/html/js/php
Завсегдатай
****

Репутация: 95
Offline Offline

Сообщений: 623


Ответ № 7 10 Февраля 2011 в 00:04
Понимаешь ли, у каждого объекта крови свой угол поворота. Может как-нить так:
У... А про угол я и забыл. Каждый раз генить новое изображение для крови - глупо. Я просто сейчас как раз в гамаке с тайлами вожусь, вот на них и зациклился...
Тогда правда andNsX, тут без сурфейсов разве что объектами.
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 8 10 Февраля 2011 в 00:05
А можно про сурфейсы поподробнее?

ZitRo
GML/C/C++/C#/html/js/php
Завсегдатай
****

Репутация: 95
Offline Offline

Сообщений: 623


Ответ № 9 10 Февраля 2011 в 02:09
Создаем:
global.Surf=surface_create(room_width,room_height);
Рисуем (глубина объекта, в котором это действие, должна быть меньше чем у всех остальных)
draw_surface_part(global.Surf,view_xview,view_yview,view_wview,view_hview,view_xview,view_yview);
Добавляем кровь:
surface_set_target(global.Surf);
draw_sprite(bla-bla,x,y);
surface_reset_target();
Вроде бы все правильно, не проверял ;)
andNsX
Ветеран форума
*****

Репутация: 111
Offline Offline

Награды:
Легенда сайта
Сообщений: 1 345

Ответ № 10 10 Февраля 2011 в 02:19
Добавляем кровь:
surface_set_target(global.Surf);
draw_sprite(bla-bla,x,y);
surface_reset_target();
Вроде бы все правильно, не проверял ;)
Добавил бы, что не стоит делать это в DrawEvent. Черевато артефактами, странностями и вообще.
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 11 10 Февраля 2011 в 03:28
Спасибо большое за разъяснение. У самого получилось примерно то же самое. Но:
1). Спрайт крови не приобретает нужный угол - решено
2). Кровь не имеет альфа канала (накладывается квадратами)
Последнее редактирование: 10 Февраля 2011 в 04:04 от CJIADKUU 6Y6AJIEX

OPALsmoke
Новичок


Репутация: 3
Offline Offline

Сообщений: 20


Богема

Ответ № 12 10 Февраля 2011 в 14:55
В Crate
global.Surf = surface_create(room_width, room_height)
surface_set_target(global.Surf)
draw_clear_alpha(c_black,0)
surface_reset_target()
В момент ранения
surface_set_target(global.Surf)
draw_sprite_ext(Спрайт крови, 0, x, y, 1, 1, image_angle, image_blend, 1)
surface_reset_target()
В Draw
draw_surface_ext(global.Surf, 0, 0, 1, 1, 0, image_blend, 1)
:beer:
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 13 10 Февраля 2011 в 16:19
Спасибо большое конечно, но кровь всё равно накладывается "квадратами". ВСЁ ТО ЖЕ САМОЕ. Пояснение моей проблемы на картинке:


ZitRo
GML/C/C++/C#/html/js/php
Завсегдатай
****

Репутация: 95
Offline Offline

Сообщений: 623


Ответ № 14 10 Февраля 2011 в 20:13
Эх, я тоже с этой фигней не разобрался. Он альфой затирает все, что было нарисовано, да? На ГМ комьюннити много чего пишут на этот счет, но я так и не разобрался. Могу предложить все же сделать это тайлами, нарисовав просто разные вариации крови, или банально объектом, в creat'e которого будет написано как-то так:
if instance_count(obj_BLOOD)>100 {with obj_BLOOD {instance_destroy(); with other {exit}}} //удалит самую первую кровь, если их больше 100
P.S. Мне кажется, я написал какой-то бред.
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 15 10 Февраля 2011 в 20:19
Спасиба. Как бэ я немного по другому попробую сделать. Спрайты ведь меньше требуют памяти, чем объекты?

Tkachov
Завсегдатай
****

Репутация: 130
Offline Offline

Награды:
За перевод справки Game Maker 8Призер конкурса ''Маляр Ниндзя''
Сообщений: 665


Ответ № 16 10 Февраля 2011 в 20:23
Спасибо большое конечно, но кровь всё равно накладывается "квадратами". ВСЁ ТО ЖЕ САМОЕ. Пояснение моей проблемы на картинке:


Чо-то мне кажется, что надо режим смешивания (blend mode) bm_add врубить...
(я не помню уже в сурфейсах нифига, но у меня была рабочая кровь в игре, щас посмотрю)

[обязательно] blood_surf_drawer, Draw [depth=3]:
if(surface_exists(global.bloodsurf)=1){draw_surface(global.bloodsurf,0,0)}else{global.bloodsurf=surface_create(room_width,room_height)};

[обязательно] любой-объект, Событие-когда-должна-появиться-кровь:
cont.surfcnt+=1;//это необязательно, но я, когда эта переменная становится больше 700, очищаю весь сурфейс.
surface_set_target(global.bloodsurf);
draw_set_blend_mode(bm_add);
draw_sprite_ext(blood,random(sprite_get_number(blood)),x+random(5)-random(7),y+random(5)-random(7),1,1,random(360),c_white,1);
surface_reset_target();draw_set_blend_mode(bm_normal);

[желательно] cont, Alarm:
if(surfcnt>700)//это та самая очистка сурфейса
{
 surface_set_target(global.bloodsurf);
 draw_set_blend_mode(bm_normal);
 draw_clear_alpha(c_red,0);//чистим в красный полностью прозрачный цвет (т.е. в полностью прозрачный, неважно какого цвета)
 surface_reset_target();
 surfcnt=0;
}

Замечания:
1. Нужно завести переменную global.bloodsurf, и желательно при создании комнаты. В неё занести id созданного сурфейса, и создать следом за этим blood_surf_drawer - чтобы сразу приступил к рисованию.
Сделать это можно в cont.Create:
global.bloodsurf=surface_create(room_width,room_height);surfcnt=0;
instance_create(0,0,blood_surf_drawing);
2. blood - это спрайт крови.
3. "surfcnt=0" можно убрать, если не нужно очищать сурфейс.
Последнее редактирование: 10 Февраля 2011 в 20:35 от Tkachov
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 17 10 Февраля 2011 в 20:24
Пробовал режимы смешивания. ВСЕ, кроме bm_add. Щас попробую))


upd

не пашет...

Tkachov
Завсегдатай
****

Репутация: 130
Offline Offline

Награды:
За перевод справки Game Maker 8Призер конкурса ''Маляр Ниндзя''
Сообщений: 665


Ответ № 18 10 Февраля 2011 в 20:30
А я тебе весь код написал  :)
CJIADKUU 6Y6AJIEX
Активный участник
**

Репутация: 15
Offline Offline

Сообщений: 242


СОК

Ответ № 19 10 Февраля 2011 в 20:31
Сейчас...))) :)

Страниц: 1 2 3   Вверх
  Печать  
 
Перейти в:  

RSGMC (gmakers.ru) © 2007—2020
Счётчик–@Mail.ru