Вопросы товарища Likantrop'а - Проблема - решение. GML и прочее. - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 10123910»
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Вопросы товарища Likantrop'а (Вопросы серьезные,... дважды! xD)
Вопросы товарища Likantrop'а
Likantrop Дата: Вторник, 04.08.2009, 16:58 | Сообщение # 1
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
Итак, два вопроса. Один простой, другой не знаю, наверно тоже smile
1) Есть прямая некой длины. Есть координаты начала и конца. Вопрос. Как найти координаты середины? Вроде бы легкая вещь, но посидел, с ленгтдирами поколдовал, вышло только частной решение проблемы(при определенных углах).
2)Есть объект шара, есть объект платформы. Как сделать так, чтобы платформа возвращала либо угол в 90, либо 270 в зависимости от нахождения шара? Посмотрите картинку. Стрелочками показано направление, которое должна возвращать платформа.
Примечание: платформа может быть под любым углом.

если что, кидайте ЛС мне. Хвост.
Пофиксил название темы. Хвост
Прикрепления: 3878327.jpg(7Kb)
 
Druce Дата: Вторник, 04.08.2009, 17:03 | Сообщение # 2
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
Likantrop, 1 - xcenter=(x1+x2)/2 ycenter=(y1+y2)/2 - просто среднее арифметическое.
2 - ну по крайней мере можно if y>hero.y dir=270 else dir=90. Только что ты имел в виду "под любым углом"?


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
Likantrop Дата: Вторник, 04.08.2009, 17:12 | Сообщение # 3
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
Quote (Druce)
1 - xcenter=(x1+x2)/2 ycenter=(y1+y2)/2 - просто среднее арифметическое.

стыдно мне :[ спасибо)
2 - нет, не прокатит к сожалению... как бы объяснить...ща нарисую, пять секунд...
 
Likantrop Дата: Вторник, 04.08.2009, 17:15 | Сообщение # 4
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
вот.
Прикрепления: 7027565.jpg(5Kb)
 
Sander Дата: Вторник, 04.08.2009, 17:19 | Сообщение # 5
Сказал что-то
Группа: Проверенные
Сообщений: 60
Статус: Offline
если корректно понял, то код для платформы:

var angle;
angle=point_direction(x,y,ball.x,ball.y)-image_angle;
while(angle<0) angle+=360
while(angle>360) angle-=360
if(angle<180) dir=90 else dir=270

вроде как-то так, могу ошибаться

 
Ninja Дата: Вторник, 04.08.2009, 17:25 | Сообщение # 6
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
Quote (Likantrop)
платформа может быть под любым углом

а этот угол известен?


Oh, my God! You kill Kenny! You bastard!
 
WertyXBOCT Дата: Вторник, 04.08.2009, 17:44 | Сообщение # 7
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Это нормаль называется. Думаю это тебе поможет:
Quote
Относительное положение точки и прямой линии

Одна из важнейших операций заключается в определении положения точки относительно направленного отрезка прямой линии. Результат выполнения операции показывает, лежит ли точка слева или справа от направленного отрезка прямой линии или, если она совпадает с прямой линией, располагается она после конца направленного отрезка этой прямой линии, до начала, а если ни то, ни другое, то не совпадает ли она с началом или с концом или лежит между ними. Направленный отрезок прямой линии четко разделяет плоскость на семь непересекающихся областей и эта операция сообщает, какой из этих областей принадлежит точка (рис. 1).

Для определения положения текущей точки относительно отрезка прямой линии p0p1, направленного от точки р0 к точке p1, используется компонентная функция classify. Возвращается значение типа перечисления, указывающее на положение текущей точки:

Рис. 1: Разделение плоскости на семь областей направленным отрезком прямой линии

enum {LEFT, RIGHT, BEYOND, BEHIND, BETWEEN, ORIGIN, DESTINATION};
// СЛЕВА, СПРАВА, ВПЕРЕДИ, ПОЗАДИ, МЕЖДУ, НАЧАЛО, КОНЕЦ

int Point::classify(Point &p0, Point &pl)
{
Point p2 = *this;
Point a = p1 - pO;
Point b = p2 - pO;
double sa = a. x * b.y - b.x * a.y;
if (sa > 0.0)
return LEFT;
if (sa < 0.0)
return RIGHT;
if ((a.x * b.x < 0.0) || (a.y * b.y < 0.0))
return BEHIND;
if (a.length() < b.length())
return BEYOND;
if (pO == p2)
return ORIGIN;
if (p1 == p2)
return DESTINATION;
return BETWEEN;
}

Вначале проверяется ориентация точек p0, p1 и р2, чтобы определить, располагается ли точка р2 слева или справа, или она коллинеарна с отрезком p0p1. В последнем случае необходимы дополнительные вычисления, ели векторы a=pl-pO и b=р2-p0 имеют противоположное направление, то точка р2 лежит позади направленного отрезка p0p1 если вектор а короче вектора b, то точка р2 расположена после отрезка p0p1. В противном случае точка р2 сравнивается с точками p0 и р1 для определения, совпадает ли с одной из этих концевых точек или лежит между ними.

Для удобства предусмотрена несколько иная версия компонентной функции classify, которой в качестве аргумента передается ребро вместо пары точек.
int Point::classify(Edge &e)
{
return classify(e.org, e.dest);
}

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

Взято с http://algolist.manual.ru/maths/geom/datastruct.php



Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Likantrop Дата: Вторник, 04.08.2009, 18:48 | Сообщение # 8
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
WertyXBOCT, брр... Я скоро совсем умным стану, вот узнал, что такое списки, ща узнаю, что такое нормаль smile
Sander, попробую...
Ninja, не известен, но легко вычислить, если надо....

хмм, хотя щас еще серьезно задумался, надо оно мне или нет...)
хотя для общего развития сделаю, мож потом выкину)

 
CH@$ER Дата: Вторник, 04.08.2009, 19:47 | Сообщение # 9
Всех уже задолбал
Группа: Высший Советник
Сообщений: 1088
Статус: Offline
Чтобы определить, с какой стороны от линии (А, Б) находится точка (В), нужно посчитать векторное произведение (синус угла между векторами) векторов АБ и АВ. Если оно меньше нуля, то точка слева (или ниже линии, зависит от расположения точек А и Б) иначе справа (сверху).
Векторное произведение векторов (x1, y1) и (x2, y2): x1 * y2 + x2 * y1

Тоже самое написал WertyXBOCT, только более продвинутый вариант.

Точка А в данном случае - координаты платформы (x, y), а точка Б расчитывается так:
x2 = x + lengthdir_x(direction, size);
y2 = y + lengthdir_y(direction, size);

Где direction - направление платформы, а size - её длина.



Создание 3D FPS · Онлайновые таблицы рекордов · Многое другое!
 
Likantrop Дата: Среда, 05.08.2009, 12:17 | Сообщение # 10
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
CH@$ER, спасибо

еще вопрос, пишу сюда, дабы не плодить:
Есть у меня объект чекпоинта. Он представляет собой следующее: прямоугольники длиной 25 пикселей движутся вниз, доходят до границы комнаты и появляются снова сверху. У спрайта прямоугольника выравнивание не по центру(а по верхнему краю). Так, в чем проблема. Комнаты бывают разной высоты. Написал цикл для вычисления нужного количества прямоугольников и вычисления y для каждого...Но что бы я не делал, у меня между прямоугольниками в одном месте либо лишнее пустое место. Думал-думал, ничего не придумал. Впишешь в пустое место - прилипают два друг к другу...
Посмотрите пример, может чего подскажите. Ща вот в голову пришло сделать определенное кол-во прямоугольников, делить на их количество размер комнаты и тыды и тыпы.

Вот ссылка на пример:http://ffs.pp.ru/load/1-1-0-29



Сообщение отредактировал Likantrop - Среда, 05.08.2009, 12:21
 
Ninja Дата: Среда, 05.08.2009, 16:30 | Сообщение # 11
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
в создании obj_ctrl дописать
Code
global.cc:=ceil(room_height/50)*50;

в степе у obj_razmetk написать
Code
if y>=global.cc then y:=0;
if y<0 then y:=global.cc;

и убрать событие intersect boundary


Oh, my God! You kill Kenny! You bastard!
 
Likantrop Дата: Среда, 05.08.2009, 21:45 | Сообщение # 12
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
Ninja, хм, похоже на выход)
я кстати думаю насчет того, что объектов слишком много создается...попробую с видом поработать...

добавлено: ох жесть...при высоте комнаты в 8000 фпс падает до 10 о_О
да, без вида тут не обойтись...



Сообщение отредактировал Likantrop - Среда, 05.08.2009, 21:50
 
Ang3L Дата: Среда, 05.08.2009, 23:11 | Сообщение # 13
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote (Likantrop)
прямоугольники длиной 25 пикселей движутся вниз

Это room_height div размер_квадрата + 1 (т.е. если высота комнаты 625 и размер квадрата 25, то кубиков 26. Если кубики идут вниз, то лишний перескакивает вверх и всё встык. Перемещение: если "y" кубика больше "room_height", то "y = -размер_кубика;"). Лишний перескакивает вперёд, таким образом, получается бесконечный цикл.

Добавлено (05.08.2009, 23:11)
---------------------------------------------
Ну переделай под вид.



Blogpost
 
Ninja Дата: Четверг, 06.08.2009, 00:03 | Сообщение # 14
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
Quote (Ang3L)
Это room_height div размер_квадрата + 1 (т.е. если высота комнаты 625 и размер квадрата 25, то кубиков 26. Если кубики идут вниз, то лишний перескакивает вверх и всё встык. Перемещение: если "y" кубика больше "room_height", то "y = -размер_кубика;").

вроде не прокатит, там ведь смещение может быть.
улучшеный вариант первого моего решения
в создании
Code
aa=room_height/50+1;
global.cc:=ceil(room_height/50)*50;

в степе
Code
if y>=global.cc then y:=-2*sprite_height;
if y<-2*sprite_height then y:=global.cc;


Oh, my God! You kill Kenny! You bastard!

Сообщение отредактировал Ninja - Четверг, 06.08.2009, 00:22
 
Likantrop Дата: Четверг, 06.08.2009, 09:01 | Сообщение # 15
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
Хмм, сделал под вид(у меня 800 на 600):
в create:
Code

for (i=0; i<13; i+=1)  
{ii=instance_create(x, i*50,obj_razmetk); ii.direction=270; ii.speed=1.4;
iii=instance_create(x+25, i*50,obj_razmetk);iii.direction=90; iii.speed=1.4;}

step:

Code
if (y>=view_yview[0]+600) then y=view_yview[0]-50;  
if (y<view_yview[0]-50) then y=view_yview[0]+600;

Все отлично, но при активном мотании вида туда-сюда(что, собственно, в игре будет) появляются глюки, между блоками местами нет расстояния вообще, местами оно становится больше чем нужно...
Пока вижу лишь такое решение - сделать вид, что так и надо, "а это у нас стиль такой cool "
 
Mikozoid Дата: Четверг, 06.08.2009, 10:48 | Сообщение # 16
Молчун
Группа: Проверенные
Сообщений: 25
Статус: Offline
Вот. Надеюсь, замутные листы тебя не смущают
http://dump.ru/file/3179614
 
Ninja Дата: Четверг, 06.08.2009, 11:59 | Сообщение # 17
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
Quote (Likantrop)
Все отлично, но при активном мотании вида туда-сюда(что, собственно, в игре будет) появляются глюки, между блоками местами нет расстояния вообще, местами оно становится больше чем нужно...

можно так исправить:
в создании контроллера
Code
aa=view_hview[0]/50+1;
global.cc:=ceil(view_hview/50)*50;

в степе оставить то же, что и было, т.е.
Code
if y>=global.cc then y:=-2*sprite_height;  
if y<-2*sprite_height then y:=global.cc;

и добавить в draw
Code
draw_sprite_ext(sprite_index,-1,x,view_yview+y,1,1,0,c_white,image_alpha);


Oh, my God! You kill Kenny! You bastard!
 
Likantrop Дата: Четверг, 06.08.2009, 12:13 | Сообщение # 18
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
Quote (Mikozoid)
Вот. Надеюсь, замутные листы тебя не смущают http://dump.ru/file/3179614

Немного смущают...Хотя ща посидел, подумал, вроде бы почти все понятно..
Разве что местами код можно упростить(у меня вид один будет использоваться наверно...)
И еще вот не понял, зачем там в степе дирекшен проверять больше или меньше 180? У меня же четко 90 и 270...

Добавлено (06.08.2009, 12:13)
---------------------------------------------

Quote (Ninja)
и добавить в draw Codedraw_sprite_ext(sprite_index,-1,x,view_yview+y,1,1,0,c_white,image_alpha);

ну вроде бы все логично, должно работать, но на деле вообще фигня какая-то получается...прямоугольники при передвижении вообще куда-то пропадают плюс опять же расстояния неравные

 
Ninja Дата: Четверг, 06.08.2009, 12:27 | Сообщение # 19
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
Quote (Likantrop)
но на деле вообще фигня какая-то получается...прямоугольники при передвижении вообще куда-то пропадают плюс опять же расстояния неравные

странно, у меня все нормально. http://webfile.ru/3822154


Oh, my God! You kill Kenny! You bastard!
 
Likantrop Дата: Суббота, 08.08.2009, 16:07 | Сообщение # 20
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
Ninja, спасибо, действительно работает! Правда, смотрится странновато...)
Эхх, лучше бы конечно код Мизокозоида, но он грузить будет сильней цп, каждый шаг столько вычислений...

Добавлено (08.08.2009, 16:07)
---------------------------------------------
Вопрос по частицам, а точнее по аттракторам.

Quote
part_type_orientation(ind,ang_min,ang_max,ang_incr,ang_wiggle,ang_relative) Устанавливает свойства угла ориентации для типа частицы. Вы определяете минимальный угол, максимальный угол, увеличение в каждом шаге и количестве подвижности в угле. (По умолчанию 0.) Вы можете также указать, должен ли данный угол быть относительным (1) к текущему направлению движения или абсолютным (0). Например, установив все значения на 0, но ang_relative установили на 1, то ориентация частицы будет точно следовать за путём частицы.

У меня есть частицы. Есть аттрактор, который их притягивает. Частицы должны лететь под нужным углом к аттрактору(то есть, их угол должен быть равен направлению движения). Однако они летят неправильно. part_type_orientation не работает. Выходит, ориентация относится только к собственному движению частицы, но не вынужденному(под влиянием аттрактора)?
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Вопросы товарища Likantrop'а (Вопросы серьезные,... дважды! xD)
Страница 1 из 10123910»
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход