| Вопросы товарища Likantrop'а |
|
Likantrop
| Дата: Вторник, 04.08.2009, 16:58 | Сообщение # 1 |
Хрен заткнешь
Группа: Проверенные
Сообщений: 260
Статус: Offline
|
Итак, два вопроса. Один простой, другой не знаю, наверно тоже 1) Есть прямая некой длины. Есть координаты начала и конца. Вопрос. Как найти координаты середины? Вроде бы легкая вещь, но посидел, с ленгтдирами поколдовал, вышло только частной решение проблемы(при определенных углах). 2)Есть объект шара, есть объект платформы. Как сделать так, чтобы платформа возвращала либо угол в 90, либо 270 в зависимости от нахождения шара? Посмотрите картинку. Стрелочками показано направление, которое должна возвращать платформа. Примечание: платформа может быть под любым углом. если что, кидайте ЛС мне. Хвост. Пофиксил название темы. Хвост
|
| |
| | |
|
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
|
вот.
|
| |
| | |
|
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, брр... Я скоро совсем умным стану, вот узнал, что такое списки, ща узнаю, что такое нормаль 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; Все отлично, но при активном мотании вида туда-сюда(что, собственно, в игре будет) появляются глюки, между блоками местами нет расстояния вообще, местами оно становится больше чем нужно... Пока вижу лишь такое решение - сделать вид, что так и надо, "а это у нас стиль такой  "
|
| |
| | |
|
Mikozoid
| Дата: Четверг, 06.08.2009, 10:48 | Сообщение # 16 |
Молчун
Группа: Проверенные
Сообщений: 25
Статус: Offline
|
|
| |
| | |
|
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
|
Немного смущают...Хотя ща посидел, подумал, вроде бы почти все понятно.. Разве что местами код можно упростить(у меня вид один будет использоваться наверно...) И еще вот не понял, зачем там в степе дирекшен проверять больше или меньше 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 не работает. Выходит, ориентация относится только к собственному движению частицы, но не вынужденному(под влиянием аттрактора)?
|
| |
| |
|
|