Форум: "Игры";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизА не устраивать ли нам небольшие конкурсы по кодингу? Найти похожие ветки
← →
NailMan © (2004-07-20 15:23) [600]КиТаЯц ©
Да хоть так, только движение по инерции и правильная математика столкновений типа Сфера-Сфера не такие уж простые как кажутся в условия этой самой инерции.
К тому же если я и возьмусь за такой конкурсный проект, то делать буду только в half-3D(как у WildTangent-овской вариации) и под современное железо(поинтспрайты и т.д.) так что дохлые тачки судей как-то не катят.
---
WBR, NailMan aka 2:5020/3337.13
← →
ПсихЪ_задумчивый (2004-07-20 15:52) [601]
> NailMan © (20.07.04 15:23) [600]
Да ладно, простейшая реализация инерционного движения занимает 2-3 строчки, а столкновение сфера-сфера упирается в нахождение расстояния между центрами. Быструю функцию нахождения этого расстояния предложил Андре Ламонт. Как для 2D, так и 3D реализации. Погрешность 3,5%, но скорость не впример высокая. Исключительно смещение битов, и никакх тебе корней.
Так что в таком задании можно будет сосредоточится исключительно на красивостях, что ни есть гуд.
← →
NailMan © (2004-07-20 17:47) [602]ПсихЪ_задумчивый
Простейшая инерция для играбельности не катит(я сейчас как раз занимаюсь правильной инерцией для своего UT).
Про столкновения - важно не отловить факт столкновения, а реакция на него, то есть опредилить вектор отражения, а это задача не такая уж простая(мне не так давно кинули примеры по вариантам с NeHe) в реализации. Сразу скажу я в процессе бития лбом о стену - учет инерции(оперирую угловыми скоростями) при столкновении с несколькими сферами(боунд-сфера только для уменьшения расчетов) - это тебе не хухры мухры.
Само собой просчет в конкурсной программке нужно только для одно сферы, но учет нормальной инерции даст свои коррективы на сложность(а втом и соль конкурсной программы).
Что же касается определения факта столкновения сфера-сфера(3D), то:
Function CheckCollisionSphereToSphere(V1:td3dvector;r1:single;V2:td3dvector;r2:single):boolean;
var sQ:Single;
begin
sQ:=Sqr(v2.x-v1.x) + Sqr(v2.y-v1.y) + Sqr(v2.z-v1.z);
If sq<=((r1+r2)*(r1+r2)) then result:=true else result:=false;
end;
V,r - Координаты центра и радиус соответсвенно.
Словами переводя формулу - если квадрат расстояния между точками в пространстве меньше либо равно квадрату суммы радиусов двух сфер, то типа столкнулись! Точность 100% с 50% вероятностью(true/false)... :-))
Формула кажется Пифагора...
ЗЫ: Сорри за оффтопиковый код...по идее это секреты ;-))
---
WBR, NailMan aka 2:5020/3337.13
← →
NailMan © (2004-07-20 17:51) [603]Красивости само собой - без этого никуда, только вот думаю 2Д реализация будет менее привлекательна в силу ограничения по размер итогового дистрибутива(анимация взрывов будет затруднительна).
Но это это добавит интригу - 2Д против half-3D(не путать с 2D-over-3D).
---
WBR, NailMan aka 2:5020/3337.13
← →
ПсихЪ_задумчивый (2004-07-20 18:04) [604]
> NailMan © (20.07.04 17:51) [603]
В конкурсах нет ограничений на раелизацию. За 3D плюсов не поставят. А приведённая тобой функция тормозная, как старая черепаха. Двемерная реализация этой функции есть у меня в исходники для второго конкурса.
← →
NailMan © (2004-07-20 18:12) [605]ПсихЪ_задумчивый
Чем тормозная? Ни одного корня, умножения и сложения/вычитания, двумерная реализация еще проще, откинув Z и вместо Single юзать Integer. Вообще получится быстрее поноса(понос на заметку быстрее мысли, а мысль мгновенна) :-))
> За 3D плюсов не поставят
Даже и не надеюсь - просто мне так проще.
---
WBR, NailMan aka 2:5020/3337.13
← →
Zer0 © (2004-07-20 18:19) [606]ГыГыГы
в моей деме одновременно отбражались и сталкивались со с всеми физическими законами 120 обьектов в реальном времени. 30 фпс на p2-300.
← →
Zer0 © (2004-07-20 18:28) [607]p.s. никаких оптимизаций, кроме прямого использования fpu =)
← →
RagE © (2004-07-20 19:01) [608]даешь конкурс :). а то сяду старые делать :)
← →
ПсихЪ_задумчивый (2004-07-21 09:23) [609]
> sQ:=Sqr(v2.x-v1.x) + Sqr(v2.y-v1.y) + Sqr(v2.z-v1.z);
Тут по твоему нет корней?
← →
RagE © (2004-07-21 10:21) [610]ПсихЪ_задумчивый (21.07.04 09:23) [609]
Как бы ты не отказывался верить а нет :). корень sqrt а sqr это x*x.
← →
NailMan © (2004-07-21 10:55) [611]ПсихЪ_задумчивый
> > sQ:=Sqr(v2.x-v1.x) + Sqr(v2.y-v1.y) + Sqr(v2.z-v1.z);
>
> Тут по твоему нет корней?
Как и сказал RagE - нету тут корней, хорошло могу написать так:
sQ:=(v2.x-v1.x)*(v2.x-v1.x) + (v2.y-v1.y)*(v2.y-v1.y) + (v2.z-v1.z)*(v2.z-v1.z);
те же яйца только в профиль...так даже быстрей получится - нет лишних вызовов функции
← →
ПсихЪ_задумчивый (2004-07-21 11:24) [612]Э... ГЫ! Туплю, в общем... (:
Но всё равно вот это:
function Fast_Distance_2D( x : int; y : int ) : int;
var
mn : int;
begin
x := abs( x );
y := abs( y );
if x < y then
mn := x
else
mn := y;
Result := ( x+y-( mn shr 1 )-( mn shr 2 )+( mn shr 4 ) );
end;
быстре будет. Вызывается как:
Fast_Distance_2D( x1-x2, y1-y2 );
← →
wiz (at work) (2004-07-21 13:29) [613]2 ПсихЪ_задумчивый:
если мы "чиста канкретна" бьёмся за скорость :), тогда это
---cut---
x := abs( x );
y := abs( y );
---cut---
надо заменить на:
---cut---
if x<0 then x:=-x;
if y<0 then y:=-y;
---cut---
так мы избавились от двух вызовов функции abs
:)))
← →
cyborg © (2004-07-21 13:41) [614]
> [613] wiz (at work) (21.07.04 13:29)
Ещё быстрее будет:
X:=X and 7FFFFFFF;
Y:=Y and 7FFFFFFF;
← →
NailMan © (2004-07-21 14:52) [615]cyborg ©
При условии что это Integer...
---
WBR, NailMan aka 2:5020/3337.13
← →
cyborg © (2004-07-21 15:04) [616]
> [615] NailMan © (21.07.04 14:52)
оно там интегер ;)
← →
NailMan © (2004-07-21 15:46) [617]cyborg ©
А ну да. Ступил.
Все таки интересен вариант с Single. Буду наверно прав если юзать вместо Single - Extended - это все таки родной для FPU формат числа, а не Single -> меньше конвертаций Single->Extended->Single
---
WBR, NailMan aka 2:5020/3337.13
← →
cyborg © (2004-07-21 15:51) [618]
> [617] NailMan © (21.07.04 15:46)
А я думал, что сингл сопроцессор тоже жуёт, как процессор жуёт байты и слова, разве не так? Не знал.
← →
RagE © (2004-07-21 16:08) [619]Вот чувствую опять настанут выходные прийду на рабочее место а конкурс уже идет вовсю, вместо того чтобы в свободное время занятся разработкой :) Выберем задание конкурса таки или нет?
← →
Darthman © (2004-07-21 16:13) [620]Давайте решать, в самом деле :D
Последнее слово беру за собой, как устроитель ;) но темы от вас оч. хочу услышать самые желаемые. Пусть каждый напишет по 2-3 темы, которые бы он стал делать, которые кажутся интересными точнее. Вот.
← →
cyborg © (2004-07-21 16:23) [621]Интересно было бы сделать диалог из РПГшных игр, то-сё, туда-сюда, дай то, дай сё. Можно только в консоли делать, никто не останется в обиде ;). Только срока на такой конкурс нужно минимум месяц давать.
← →
NailMan © (2004-07-21 16:55) [622]cyborg ©
> А я думал, что сингл сопроцессор тоже жуёт, как процессор
> жуёт байты и слова, разве не так? Не знал.
Сингл это упрощенный формат. Сопроцессор имеет внутренний формат числа Extended, и когда дельфи сует ему сингл, то автоматом оно конвертится в extended и при выходе наоборот. При этом теряется точность(к вопросу о сравнениях чисел с плавающей точкой). так чта...
Другой вопрос что в API(D3D,OGL) юзают сингл как основной формат - для экономии места и из-за того что Single весит 32бит, что для сопроцессора ЦПУ и сопроцессора видеоадаптера более удобно чем Extended(кажется 80бит весом).
Darthman ©
Могу лишь голосовать за Asteroids. И то под сомнением мое участие - работы у меня сейчас много.
---
WBR, NailMan aka 2:5020/3337.13
← →
ПсихЪ_задумчивый (2004-07-21 17:25) [623]
> Darthman © (21.07.04 16:13) [620]
Я уже писал, то, что по моему сможет адекватно соответствовать самой идее конкурсов. А посему подписываюсь ещё и к предложению cyborg"а. Имя под этим в виду, что гораздо продуктивней будет заданием конкурса считать реализацию какой-то одной части игры (меню, диалоги, консоль и т.д.).
← →
Darthman © (2004-07-21 18:55) [624]Итак... я долго размышлял, но тут неожиданно для себя открыл очень любопытную задачку (несложную на взгляд, но имеющую уйму косяков при реализации). Описание чуть позже.
← →
DeadMeat © (2004-07-21 19:05) [625]А мне ещё Earth Scorch нравится... У меня 3D вариант есть, правда вот найти не могу... Там всё также играется как и в 2D, только добавилось дополнительное управление по сторонам горизонта... Целится также как и раньше, но сначала непривычно, а потом в самый раз...
Я за Earth Scorch... А так, можно ещё о чем-нибудь подумать на досуге...
---
...Death Is Only The Begining...
← →
Darthman © (2004-07-21 19:15) [626]Надеюсь вы не обидитесь, что это не Scorched Earth =) Идея имхо интересная. Спасибо тому, кто подсказал.
Условия:
http://code.rpro.ru/_xonix.html
← →
DeadMeat © (2004-07-21 19:36) [627]Ну чтож... Будем делать Xonix... Сразу говорю, можете меня заранее оштрафовать по размеру... Если опять таки успею вовремя. Хотя в этот раз расчитываю успеть.
← →
OSokin (2004-07-21 20:47) [628]OK. Сделаем. У меня есть типа такой, но без исходников. Буду делать по ее образу и подобию, но упрощенно.
← →
Zak3D[@Tm] © (2004-07-21 22:28) [629]: ) А я посмотрю как вы отризание делать будете ( Моя тема как раз о нём :)))))
← →
Darthman © (2004-07-22 00:47) [630]А это как раз самое интересное ;)
← →
ПсихЪ_задумчивый (2004-07-22 10:12) [631]
> Zak3D[@Tm] © (21.07.04 22:28) [629]
> Darthman © (22.07.04 00:47) [630]
Это я уже описывал в "заковской" теме...
Да, если не заморачиваться со всякими там дазигнами, то действительно интересно будет реализовывать сею игру. ТОлько вот у меня комп почти здох, поэтому буду делать на рабочем компе после работы. Я участвую точно!!!
← →
Darthman © (2004-07-22 10:24) [632]Я, почти 100% тоже в этот раз приму участие.
← →
MegaVolt (2004-07-22 10:45) [633]Вот образец вдобавок не просто с шариками а с наворотами http://webfile.ru/32423
← →
ПсихЪ_задумчивый (2004-07-22 11:25) [634]
> MegaVolt (22.07.04 10:45) [633]
Дома у меня Хonix3D стоит. Правда очень древняя не крятнутая шаровара. Графика убогая, доступен толь Лёгкий режим игры, но наворотов там полно. Бонусы всякие, когда вражий шар врезается в твою линию, то от места удара начиает расползаться волна и пока она не достигла тебя ты ещё можешь завершить отрезание... Ну и прочие радости.
← →
RagE © (2004-07-22 12:57) [635]Мне задание нравится, я с вами
← →
Darthman © (2004-07-22 14:05) [636]Ну вообщем-то оно не тривиальное, тут задачки и косяки будут.
← →
Darthman © (2004-07-23 10:27) [637]up
← →
wiz © (2004-07-23 17:53) [638]немного не в тему, но...
выдалась на работе свободная минутка, решил попробовать сравнить недавно обсуждавшиеся тут алгоритмы поиска расстояния... в целом написал прогу делающую один миллион вычислений расстояния (на входе - случайные числа) и вычисляющую время выполнения (через QueryPerformanceCounter)... получил на работе следующие результаты (пишу на память - ногами не бить):
ПсихЪ ver - 586 нс/выч
wiz ver - 546 нс/выч
cyborg ver - 526 нс/выч
nailman non-sqrt ver - 415 нс/выч
nailman sqrt ver - 802 нс/выч
машина - Intel Pentium-4 2.2Ghz / ram512Mb
(причём P4-Mobile если я правильно понимаю, т.к. ноутбук)
хотел послать результаты с работы, но все уже уходили, так что послал exe"шник домой и сделал то же самое дома:
ПсихЪ ver - 464 нс/выч
wiz ver - 487 нс/выч
cyborg ver - 434 нс/выч
nailman non-sqrt ver - 312 нс/выч
nailman sqrt ver - 1075 нс/выч
машина - P3-1200 / ram256Mb
сравнивая результаты... ВОПРОС!!!!!! почему P4 почти везде пасётся? почему нет ожидаемого улучшения на P3 (ПсихЪ->wiz->cyborg)? кто-нибудь занимался подобными вещами???
PS: если кому интересно - могу завтренько с утреца выложить бинарники/исходники
← →
wiz © (2004-07-23 17:55) [639]PPS: кстати, и там и там win2k-sp4 (если вдруг возникла мысль, что ОС может влиять на результат)
← →
wiz © (2004-07-23 18:12) [640]PPPS: для тех кто не хочет ждать до завтра пример:
//ПсихЪ code
function Fast_Distance_2D( x : integer; y : integer ) : integer;
var
mn : integer;
begin
x := abs( x );
y := abs( y );
if x < y then
mn := x
else
mn := y;
Result := ( x+y-( mn shr 1 )-( mn shr 2 )+( mn shr 4 ) );
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
x,y,len:integer;
worktime,dummy:double;
begin
dummy:=0;
TimerInit;
for i:=1 to max_iter do
begin
x:=random(10000)-5000;
y:=random(10000)-5000;
len:=Fast_Distance_2D(x,y);
dummy:=dummy+len;
end;
TimerTick;
edit1.text:=floattostr(dummy);
worktime:=timer_counter/max_iter * 10E9;
edit1.text:=format("%4.4f нс/выч",[worktime]);
end;
TimerInit, TimerTick - вызовы QueryPerformanceCounter;
dummy - чтобы компилер не "забил" на len;
edit1.text:=floattostr(dummy); - чтобы компилер не "забил" на dummy;
max_iter - очевидно количество итерации (1 000 000)
Страницы: 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27
вся ветка
Форум: "Игры";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 1.6 MB
Время: 0.505 c