forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   очень маленькие хинты (http://forum.boolean.name/showthread.php?t=3670)

Taugeshtu 17.06.2007 22:52

очень маленькие хинты
 
Предлагаю в этой теме выкладывать то, что под определение функции не попадает ввиду своих малых размеров, но тем не менее способно принести ощутимую пользу.
С вашего позволения, я начну.

ФПС - это очень больной вопрос, и не секрет, что многие ищут способы его увеличения. предлагаю вашему вниманию следующий ФПС-бустер:
вертикальная синхронизация - это эффект, позволяющий добиться совпадения обсчёта сцены и обновления экрана. если она выключена, могут наблюдаться некоторые артефакты. А могут и не наблюдаться. Если же она включена, то заветный ФПС не поднимется выше частоты обновления экрана, которая обычно составляет 60-70Гц.
Вся радость жизни в том, что по умолчанию она в блитце включена, а вот как ее выключить знают не все. Меж тем делается это просто - надо вместо:
Flip
писать:
Flip false
или
Flip (0)

вот и всё - наслаждайтесь приростом фпс!

был бы крайне признателен, если бы кто-нибудь написал про рендер твининг.

SBJoker 17.06.2007 23:31

Re: очень маленькие хинты
 
Рендер твининг, это технология позволяющая стабилизировать скорость анимации моделей.
Для этого нужно юзать необязательный параметр твин, а сам параметр этот это число float являющееся отношением текущей скорости к необходимой, другими словами текущий_фпс/требуемый_фпс.

Например мы хотим чтоб анимация щла на скорости 75 фпс, а у нас сейчас видяха выдаёт тока 30, то твин коэффициент равен 30/75 = ~0.5 вот и всё...

Этот коэфицент передавать в функции UpdateWorld и RenderWorld

Однако RenderWorld часто начинает глючить почём зря с твинингом в частности мерцают объекты с альфа-каналом.

HolyDel 18.06.2007 01:17

Re: очень маленькие хинты
 
параметр UpdateWorld - ето множитель скорости моделей, например updateworld 2 - вся анимация будет играться в два раза быстрее.
тогда (теоретически, сам не проверял) для стабилизации скорости анимации проигрывания моделей можно сделать так:
updateworld требуемый_фпс/текущий_фпс.

mod 1 - вернет дробную часть числа (спасибо Impersonalis-у)

a=b=4 - присваивает переменной a 1-цу, если b равен 4 и 0 если неравен (многие ето знают но немногие пользуются).

еще пример, ето можно использовать и в математических выражениях, например
for i=1 to 100
if a(i)=5 then b(i)=0 else b(i)=10
next
можно заменит на:
for i=1 to 100
b(i)=(a(i)=5)*10
next

tormoz 10.01.2008 02:52

Ответ: очень маленькие хинты
 
Код:

entity=EntityCollided(hero,enemy_type) Or EntityCollided(hero,bild_type) Or PickEntity(hero,10)
Очень удобные конструкции облегчающие жизнь

alcoSHoLiK 10.01.2008 03:14

Ответ: очень маленькие хинты
 
Циклический счетчик. Переменная a будет изменяться в пределах от 0 до RANGE - 1.
Код:

a% = 0
;...
a = (a + 1) mod RANGE

Если у RANGE в двоичном представлении n младших разрядов равны единице без пропусков, можно сделать так:
Код:

const RANGE% = 31    ; 00011111b
a% = 0
;...
a = (a + 1) and RANGE


dimond 12.01.2008 02:59

Ответ: очень маленькие хинты
 
меняет цвет при условии
Код:

Color (health<25)*255,(health>=25)*255,0:text 0,0,health
у меня идея, упрощение кода донельзя
если я изобрел велосипед, скажите.

impersonalis 12.01.2008 03:09

Ответ: очень маленькие хинты
 
+ http://forum.boolean.name/showthread.php?t=275

-=SCiP=- 14.01.2008 01:22

Re: очень маленькие хинты
 
Незнаю такое кто мож уже знает. Но всеже выкладываю.

a=5
b=5
Условие ИЛИ
;If (a Or b)=5 Then ;ИЛИ
Условие И
If (a And b)=5 Then ;И
Print "Yes"
Else
Print "no"
EndIf
WaitKey

moka 21.01.2008 19:22

Ответ: очень маленькие хинты
 
Ещё и так можно:

;If a=5 Or b=10 Then ;ИЛИ
Условие И
If a=5 And b=10 Then ;И
Print "Yes"
Else
Print "no"
EndIf
WaitKey

alcoSHoLiK 21.01.2008 21:43

Ответ: Re: очень маленькие хинты
 
Цитата:

Сообщение от -=SCiP=- (Сообщение 74240)
Условие ИЛИ
;If (a Or b)=5 Then ;ИЛИ
Условие И
If (a And b)=5 Then ;И

Это побитовое ИЛИ и И. Если a = 1, b = 4, первое выражение будет истинно. Если a = 5, b, например, равно 255, второе условие также будет истинно.

dimond 10.02.2008 02:11

Ответ: очень маленькие хинты
 
Код:

Global Click%
Function MouseClick(n%)
        If MouseDown(n) Then
                Click=True
        EndIf
        If Click=True Then
                If Not MouseDown(n) Then
                        If Not MouseHit(n) Then
                                Click=False
                                Return True
                        EndIf
                EndIf
        Else
                Return False
        EndIf
End Function

Функция срабатывает от отпускания мыши, как в windows-кнопках.
Очень удобно, если MouseHit() не всегда срабатывает, а применение MouseDown() неприменимо.

moka 10.02.2008 07:54

Ответ: очень маленькие хинты
 
Функция такого рода называется MouseRelease, т.к. обработка инпута происходит отдельным потоком, то употребление функций получения инпута, за один так главного цикла - не наилучший способ получения данных о нажатиях, т.к. хоть и мала вероятность отпустить мышь между двумя связанными MouseDown, но она есть, и ловил я её не раз. По этому очень рекомендую привязывать к Глобальным переменным, в Начале цикла Весь инпут (мышь, клаву, кнопки, координаты, и скорости, всех видов инпута, которые обрабатываются паралельным потоком).

dimond 11.02.2008 02:12

Ответ: очень маленькие хинты
 
Думаю, что проверка на MouseHit() будет лишней. я ее вписал на всякий случай, но походу работает и без нее.

Alex_Noc 22.06.2008 00:23

Ответ: очень маленькие хинты
 
Вот такая конструкция вернет значение после отрицания :
num#=-2.3
if keyhit (but) then num#=(not num#)*-2.3
значение модет быть любым абсалютно.

ffinder 08.07.2008 15:09

Ответ: очень маленькие хинты
 
1. EntityCollided и другие функции коллизий в Блице не будут работать без UpdateWorld в главном цикле. Справка не врет.
2. справка по функции Blitz3D DocsEntityBox(ent, x,y,z, w,h,d) ничего не говорит о координатах x,y,z - а это на самом деле не центр, а крайний угол параллелепипеда... Иногда справка не врет, а не говорит всю правду;-)

moka 08.07.2008 16:14

Ответ: очень маленькие хинты
 
Цитата:

1. EntityCollided и другие функции коллизий в Блице не будут работать без UpdateWorld в главном цикле. Справка не врет.
Анимация тоже не будет работать без обновления.

Harter 27.12.2008 15:23

Ответ: очень маленькие хинты
 
Цитата:

Сообщение от dimond (Сообщение 73962)
меняет цвет при условии
Код:

Color (health<25)*255,(health>=25)*255,0:text 0,0,health
у меня идея, упрощение кода донельзя
если я изобрел велосипед, скажите.

Есть вешь получше(т.к. только что изобрел - без упрощения кода, но думаю оптимизировать не составит труда):

Код:

greenn=(510-life*5)/2
redd=(510-greenn)/2
Color greenn, redd, 0


Shirase 31.12.2008 07:37

Ответ: очень маленькие хинты
 
Ну наверно все это знают:
Cвич булевой переменной:
flag=flag xor 3
или
flag=1-flag

Функция сложения по модулю 2 (xor)
Почему xor называется "сложение по модулю 2"? Потому что так оно и есть: в двоичной системе 0+0=0, 0+1=1+0=1, 1+1=10, а по модулю 2 (остаток от деления на 2) последняя сумма как раз и даёт 0.
Во-первых, при инвертировании одного из аргументов эта функция также инвертируется. Во-вторых, эта функция показывает, когда аргументы не равны (а при инвертировании одного из аргументов - когда равны). В-третьих, она позволяет проводить управляемое инвертирование: при нулевом аргументе другой аргумент не меняется, при единичном же значении второй аргумент инвертируется. Наконец, эта функция инволютивна (её повторное применение возвращает к исходному аргументу): если (x3=x1 xor x2), то (x3 xor x1=x2) и (x3 xor x2=x1).
Почему Xor нет в BlitzMAX???:''((

jimon 31.12.2008 14:57

Ответ: очень маленькие хинты
 
Shirase
пиши flag = not flag и будет тебе счастье

SBJoker 31.12.2008 15:03

Ответ: очень маленькие хинты
 
Цитата:

Сообщение от Shirase (Сообщение 93268)
Почему Xor нет в BlitzMAX???:''((

наверно потому что там его заменяет оператор ~

dimanche13 31.12.2008 15:03

Ответ: очень маленькие хинты
 
Bitwise exclusive or Expression ~ Expression

Arton 21.07.2009 18:35

Ответ: очень маленькие хинты
 
Поставил в своём коде Flip (0), до этого fps был ~72 хотя комп неслабый, после fps подскочил аш до ~2000, впрочем у меня все равно только плоскость и один кубик рендерился) но всё равно я таких цифр еще не видел o_O

NitE 21.07.2009 18:37

Ответ: очень маленькие хинты
 
некрофилическая фантастика !

ABTOMAT 21.07.2009 19:53

Ответ: очень маленькие хинты
 
Arton, аргумент flip ответственен за вертикальную синхронизацию (= ограничение ФПС до "родного" для монитора уровня), поэтому, если с flip(0) (синхра отключена) может быть какой угодно FPS, то с flip(1) (включена) может быть либо равным частоте развёртки экрана (Правый клик на раб. столе -> свойства -> параметры -> дополнительно -> монитор -> частота обновления экрана) либо меньше.
http://ru.wikipedia.org/wiki/Вертикальная_синхронизация
В блице по умолчанию включена, чтобы не было лишних вопросов (типа у меня 100 ФПС а у друга 500 ФПС и у него всё быстрее движется и когда мы в мою игру по сетке играем, он меня обгоняет :-D), т.к. на ненастроенных мониторах обычно 60 Гц, и ламота жалуется, что ЭЛТ-мониторы им глаза портят.

Arton 03.08.2009 18:29

Ответ: очень маленькие хинты
 
Спасибо за разъяснение, ABTOMAT, а про вертикальную синхронизацию я так знаю, просто я думал что "Flip – меняет местами передний и задний буфер" как написано было в одном учебники =)

ABTOMAT 03.08.2009 18:55

Ответ: очень маленькие хинты
 
Цитата:

"Flip – меняет местами передний и задний буфер"
И это тоже

Chrono Syndrome 12.08.2009 14:43

Ответ: очень маленькие хинты
 
Одна из наиболее оптимизированных (по меркам Blitz3D) реализаций алгоритма преобразования целоисчисленного представления ранее записанного выровненным (символами нуля) текстом десятичного числа к исходному виду:

Код:

Function Val4(DWord%) ; Для четырехзначных чисел (ReadInt).
DWord = DWord - $30303030
Return (((DWord And $FF)*10+DWord Shl 16 Shr 24)*10+DWord Shl 8 Shr 24)*10+DWord Shr 24
End Function

Function Val2(Word%) ; Для двузначных чисел (ReadShort).
Return (Word And $FF - $30) * 10 + (Word - $3000) Shr 8
End Function

Обратите внимание: из соображений производительности в представленных функциях опущены какие-либо проверки корректности передаваемых данных.

Alex_Noc 09.12.2010 23:06

Ответ: очень маленькие хинты
 
Вот такая конструкция вернет после "Not" не "0", а ваши числа:
Num=32 ;начальное значение переменной
if keyhit (but) then Num=Num-16*(Num=32)+16*(Num=16) ; переключает с 16 на 32 и обратно
значения могут быть любыми.

Это Тадеус подсказал за что ему огромное спасибо!!!

ABTOMAT 09.12.2010 23:38

Ответ: очень маленькие хинты
 
Посоны, вы чего? Можно же намного изящней!
Код:

var = 16
var = ((Int(Not(var Shr 4-1))+1)Shl 4)
Print var

Ньюфаги не могут битовый сдвиг, лол :-D.

Harter 14.05.2011 18:21

Ответ: очень маленькие хинты
 
Вложений: 1
Цитата:

Сообщение от Harter (Сообщение 92967)
Есть вешь получше(т.к. только что изобрел - без упрощения кода, но думаю оптимизировать не составит труда):

Код:

greenn=(510-life*5)/2
redd=(510-greenn)/2
Color greenn, redd, 0


100500лицоладоней

Представляю вам первый алгоритм из серии "не думай @ ищи".

уголок дорога как сделать круто бесплатно без регистрации 2D 3D ну клеточки чтоб работало
Блочная графика #1

moka 14.05.2011 18:59

Ответ: очень маленькие хинты
 
Всегда подобное использовал для тайлов..
Только разница в том, что я подумал а не искал, тем самым извлёк знания и опыт.

LLI.T.A.L.K.E.R. 14.05.2011 23:03

Ответ: очень маленькие хинты
 
Цитата:

Сообщение от Harter
Представляю вам первый алгоритм из серии "не думай @ ищи".

уголок дорога как сделать круто бесплатно без регистрации 2D 3D ну клеточки чтоб работало
Блочная графика #1

Что там значат 8 и 4?
Написали от балды, чтобы запутать?

И что за 1+2=3
Нельзя тупо ввести 3 и всё..

Глупых вопросов больше не напишу..
Не понял я левую картинку.
:dontknow:

moka 14.05.2011 23:37

Ответ: очень маленькие хинты
 
Цитата:

Сообщение от LLI.T.A.L.K.E.R. (Сообщение 188492)
Что там значат 8 и 4?
Написали от балды, чтобы запутать?

И что за 1+2=3
Нельзя тупо ввести 3 и всё..

Глупых вопросов больше не напишу..
Не понял я левую картинку.
:dontknow:

Омг, если для тебя это не понятно, то это не значит что написали от балды.


Есть тайл, и четыре к нему прилегающих, тебе нужно высчитать какую картинку вставлять.
Можешь сделать тупо кучей If'ов (16*4), и будет у тебя гипер говнокод, на строк 70. А можно тупо сделать по умному немного приложив логику.
Разжую.
Исходя из картинки сверху, поле является таким:
Код:

0 1 0 0
0 1 0 0
0 1 1 1
0 0 0 0

Нужно правильно подобрать тайлы, чтобы они исходя из поля, заполнили дорогу.
Смотрим на тайл в первой картинке по координате 2,3. Относительно ему есть тайл сверху и справа.
Если за условность взять нумерацию как показано на первой картинке:
вверх - 1; вправо - 2; вниз - 4; влево 8. Числа кратные двум, и их можно плюсовать как угодно. В одно число можно запаковать все четыре, или любую другую комбинацию. Например 4+2+1 = 7, при этом иначе ты 7 не разберёшь, как только на 4, 2 и 1. (кратные двум). Если рассмотреть в бинарном коде, то тут всё просто:
Код:

1: 0001
2: 0010
4: 0100
8: 1000

Получается 7 будет: 0111.
Такой подход используют много где, в тех же флагах в виде параметров для функций. Но длина ограничена естественно, 16 чисел - это будет 16 бит. Если брать уже 32 числа, то это будет весьма длинное число: 2^32-1 = 4,294,967,295. Столько флагов обычно не используют.
Вернёмся назад. Значит у нас есть 4 числа, и нужно получить флаг. Предположим мы разбираем центральную ячейку и поле такое:
Код:

0 0 0
0 1 0
0 0 0

Сверху 0, справа 0, снизу 0, слева 0. Получается при сумме 0. Смотрим на вторую картинку - по индексу будет 0.
Далее рассмотрим такой сценарий:
Код:

0 1 0
0 1 0
0 1 0

Сверху 1, значит +1. Снизу тоже 1, значит +4. В результате 5. Идём снова в картинку с тайлами: Вертикальная дорога.
Смотрим если все вместе (1+2+4+8 = 15), это будет последняя перекрёсток.
Если справа пусто, а везде в других есть, то будет 1+4+8 = 13, и по картинке с тайлами сходится.

Это весьма хорошая смекалка, и если кто-то додумался до подобного сам, то ему огромный зачёт (себя хвалю :-D).

LLI.T.A.L.K.E.R., если ты не понял сам, то не гони, а лучше скажи что не понимаешь, тебе объяснят, если сам не способен.

impersonalis 15.05.2011 01:20

Ответ: очень маленькие хинты
 
Напечатано в журнале «The American Scientist», 46, №3 (1958):
Цитата:

Но наибольший успех достигается с помощью такого приема: из готовой рукописи вы вырываете две страницы выкладок, а вместо них вставляете слово «следовательно» и двоеточие. Гарантирую, что читатель добрых два дня будет гадать, откуда взялось это «следствие». Еще лучше написать «очевидно» вместо «следовательно», поскольку не существует читателя, который отважился бы спросить у кого-нибудь объяснение очевидной вещи. Этим вы не только сбиваете читателя с толку, но и прививаете ему комплекс неполноценности, а это одна из главных целей.
http://n-t.ru/ri/fz/fz208.htm
Придумать шифрующий алгоритм проще, чем его взломать. Додуматься до приведённого выше алгоритма кодирования - просто, расшифровать картинку без пояснений? ололо - тему в раздел "загадки" (ну или разрешите наконец писать HEX-ом).


Часовой пояс GMT +4, время: 13:51.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot