RFO BASIC  28.12.2016 / 22:14 |  |  lion1971    Пользователь  
   Сейчас: Offline 
 Имя: Lion1971 Регистрация: 12.12.2016
   | в data положить папку hanoy с рисунками
  
 Прикрепленные файлы:   data.zip (52.81 кб.) Скачано 71 раз    source.zip (0.89 кб.) Скачано 64 раза   |  
   29.12.2016 / 03:07 |  |  b0ing    Пользователь  
   Сейчас: Offline 
 Имя: Макс Регистрация: 24.08.2016
   | Вопрос алгоритма преследования был реализован мной почти два года назад в игрушке под названием четыре шара в версии 2. Отмечу что это была заря изучения RFO. Поэтому код в игре п...ц, но в ней есть тот самый алгоритм. В первой версии использовал направления под углом  в 45 и 90 градусов - наипростейший с применением условий. А вот во второй суть сводится к вычислению длины диагонали между двумя точками и вычисления угла относительно друг друга,движение точки это как бы увеличивающийся радиус круга, сам круг и радиус естественно не видно, а вот точка радиуса-окружности показана. Вообщем кому надо.
  
 Прикрепленные файлы:   FourBall_v2.bas   (10.44 кб.) Скачано 1008 раз   |  
   29.12.2016 / 03:13 |  |  b0ing    Пользователь  
   Сейчас: Offline 
 Имя: Макс Регистрация: 24.08.2016
   | Видел тут вопрос по кнопкам. Решил помочь. Накатал демку по работе с функцией click(). Коментарии в листинге. Открыть спойлер Закрыть спойлер ! Демонстрация работы функции click()  
! Значения возвращаемые функцией открывают  
! богатые возможности для регистрации   
! событий и  анимации кнопок.  
! В целях демонстрации тут реализована простенькая  
! анимация на события.  
! Для того, чтобы поймать момент самого клика  
! в программе ипользована пауза, чтобы получить   
! максимальное быстродействие, читаем листинг  
! и выключаем  блок программы с паузой, который  
! ловит клик и тормозит процесс, чтобы мы смогли его  
! увидеть.  
   
   
gr.open 255,100,100,100,0,1  
gr.screen sw,sh  
gosub gr_functions  
   
! Задаем координаты четырех областей касаний,  
! а также - цветных прямоугольников (кнопок)  
! lt - left, tp - top, rt - right, bt - bottom  
array.load lt[],        0,  sw/2,  sw/2,         0  
array.load tp[],       0,         0,   sh/2,   sh/2  
array.load rt[], sw/2,     sw,       sw,  sw/2  
array.load bt[], sh/2,  sh/2,        sh,       sh  
   
!Задаем цвета прямоугольникам (кнопкам)  
array.load r[],  255, 100, 255, 100  
array.load g[], 100, 255, 255, 100  
array.load b[], 100, 100, 100, 255  
   
! И отрисовываем  
dim rct[4]  
for i=1 to 4  
   gr.color 150, r[i], g[i], b[i],1  
   gr.rect rct[i], lt[i], tp[i], rt[i], bt[i]  
next  
   
! Границы кнопок обозначим линиями.  
gr.color 255,0,0,0,0  
gr.set.stroke 3  
gr.line ln,sw/2,0,sw/2,sh  
gr.line ln,0,sh/2,sw,sh/2  
   
! Создаем лейблы с информацией о статусе  кнопок.  
! Четыре кнопки - четыре лейбла.  
dim tx[8]  
gr.color 255,255,255,255,1  
tx[1]=tx(sw/4,sh/4,"")  
tx[2]=tx(sw/4*3,sh/4,"")  
tx[3]=tx(sw/4*3,sh/4*3,"")  
tx[4]=tx(sw/4,sh/4*3,"")  
   
! Под лейблами со статусом, покажем информацию о  
! том, находится ли программа на паузе.  
! Создаем еще четыре лейбла под статусными.  
! И сразу делаем их невидимыми, чтобы показывать  
! в нужный момент.  
ps$="Включена пауза"  
gr.color 0  
tx[5]=txp(sw/4,sh/4+sh/30,ps$)  
tx[6]=txp(sw/4*3,sh/4+sh/30,ps$)  
tx[7]=txp(sw/4*3,sh/4*3+sh/30,ps$)  
tx[8]=txp(sw/4,sh/4*3+sh/30,ps$)  
   
gr.render  
   
! Массиву cl[] - будет возвращаться  
!  значение функции click(),  
! а массиву s$[] - будем задавать значение статусных лейблов, для удобочитаемости листинга, хотя  
! он (массив) и не нужен.  
dim cl[4], s$[4]  
   
! Переменная fltch - ключ управления опросом кнопок  
! Прослушивание кнопок начинается в момент   
! касания экрана.  
! Состояние fltch=1, при загрузке программы,   
! установлено для  определения статуса кнопок и вывода на экран их значений.  
fltch=1  
   
DO  
  ! Можно было обойтись и без  gr.touch  
  ! команда нужна для более стабильной работы, чтобы  
  ! нажатие на кнопку не происходило в середине цикла  
  ! опроса кнопок, это приводило бы к тому, что более   
  ! старшая кнопка в цикле не понимала когда нажали   
  ! не на нее  
  ! Если мы не хотим регистрировать стабильное  
  ! состояние 10 функции click(), мы можем смело  
  ! стереть  ( if !fltch then gr.touch fltch, xtch, ytch),  
  ! удалить переменную fltch, и оставить в цикле DO  
  ! только слушатель gosub Listener  
   
  ! fltch обнуляется в подпрогр. stand_by  
   
  if !fltch then gr.touch fltch, xtch, ytch  
  if fltch then gosub Listener  
UNTIL 0  
   
   
! Ну понеслась  
Listener:  
  for i=1 to 4  
    ! Массив cl[]  нужен не только  
    ! для  возвращения   
    ! значений функции click(),  он нужен еще и  
    ! для передачи в нее, ее же состояния,  
    ! поэтому он присутствует одним из  
    ! аргументов функции, по сути, являясь ее  
    ! входящими данными.  
    ! Так же функция принимает координаты  
    ! нажатий на экран lt,tp,rt,bt, указанные в начале  
    ! программы  
   
    cl[i]=click(lt[i],tp[i],rt[i],bt[i],cl[i])  
   
    ! click() -  возвращает значения событий кнопок.  
    ! 0 - режим ожидания (прослушивание).  
    ! 1 - нажатие и удержание кнопки (кнопка вниз).  
    ! 2 - нажатие-отпускание кнопки (клик).  
    ! И 10 - это тот момент, когда что-то нажато, но  
    ! не сама кнопка.  
    ! Также click() понимает, когда на кнопку надавили   
    ! и съехали с нее не отрываясь от экрана,  
    ! это прекращает регистрацию клика  
   
    !Событие "Клик" происходит одномоментно без   
    !всяких   
    !повторений, поэтому далее используем паузу для   
    !регистрации этого события.  
   
    ! Чтобы не нагромождать код, уводим события в  
    !  отдельные процедуры  
    if cl[i]=1 then   gosub Down  
    if cl[i]=2 then   gosub Clicked  
    if cl[i]=10 then gosub No_down  
   
  next   
   
      ! Узнаем все ли кнопки перешли в режим ожидания  
      ! Если все, то stand_by  
      if !cl[1] & !cl[2] & !cl[3] & !cl[4] then gosub Stand_by  
   
  gr.render  
   
Return  
   
   
! При желании можно расписать процедуры для   
!  каждой кнопки типа Вutton1_Down, Button1_Click  
! Button2_noFocus и так далее...   
! Понимающие программисты поймут ;)  
   
Stand_by:  
   ! Перевод всех значений в стартовое состояние  
   for i=1 to 4  
     ! Цвет кнопки  
     gr.modify rct[i],"alpha",150  
   
     ! Скрываем инфо о паузе  
     gr.modify tx[i+4],"alpha",0  
   
     !  Выводим статус  
     s$[i]="Ожидание"  
     gr.modify tx[i],"text",s$[i]   
   
     ! Указываем, что опрос кнопок надо остановить  
      fltch=0  
   next  
Return  
   
   
Down:  
   !  Цвет нажатой кнопки чуть ярче остальных  
   !  Стандартное значение 150  
   gr.modify rct[i],"alpha",210  
   
   ! Выводим статус нажатой кнопки  
   s$[i]="Кнопка вниз"  
   gr.modify tx[i],"text",s$[i]   
Return  
   
   
No_down:  
   !  Кнопка узнает, что нажали не на нее  
   ! и становится чуть темнее  
   gr.modify rct[i],"alpha",70  
   
   ! Выводим статус ненажатой кнопки  
   s$[i]="Нажали не меня :("  
   gr.modify tx[i],"text",s$[i]   
   
   ! Скрываем инфо о паузе на всякий случай :)  
     gr.modify tx[i+4],"alpha",0  
Return  
   
   
   
Clicked:  
   ! Момент отпускания  
   
   ! Выводим статус  
   s$[i]="Был клик"  
   gr.modify tx[i],"text",s$[i]  
   
   ! Обесцвечиваем кнопку,  
   ! Становится виден серый фон.  
   gr.modify rct[i],"alpha",0  
   
   ! Включаем паузу и  сообщение о ней  
   ! Чтобы увидеть реальную скорость клика -  
   ! Закоментируйте этот блок ⤵  
   
   gr.modify tx[i+4],"alpha",255  
   gr.render  
   pause 2000  
   
   !                                                            ⤴  
   
Return  
   
   
   
   
   
   
Gr_functions:  
   
! Это текстовые функции  
! Совсем другая история  
fn.def txp(x,y,s$)  
  gr.screen w,h  
  gr.text.align 2  
  s=h/50 : gr.text.size s  
  v=-(s*(0.29/2))+s/2  
  gr.text.draw t,x,y+v,s$  
  fn.rtn t  
fn.end  
   
fn.def tx(x,y,s$)  
  gr.screen w,h  
  gr.text.align 2  
  s=h/40 : gr.text.size s  
  v=-(s*(0.29/2))+s/2  
  gr.text.draw t,x,y+v,s$  
  fn.rtn t  
fn.end  
   
! Вот она - гордость разработчика :)  
! Функция, которая возвращает,  
! практически, все необходимые события стандартной  
! кнопки. (на самом деле есть еще круче, но  
!  эта более простая в освоении   :-)  
fn.def click(lt,tp,rt,bt,f)  
  gr.bounded.touch btc,lt,tp,rt,bt  
  gr.touch tc,x,y  
  if f=1 then c=1  
  if f=2 then c=0  
  if f=10 then c=10  
  if tc=1 & btc=0 & f=0 then c=10  
  if btc=1 & f<10 then c=1  
  if btc=0 & tc=0 & f=10 then c=0  
  if f=1 & btc=0 & tc=0 then c=2  
  if f=1 & btc=0 & tc=1 then c=0  
  fn.rtn c  
fn.end  
   
Return  
   
   
   
!  Функция click(), при закрытии программы,  
!  изредка вызывает жалобы на  синтаксис, похоже   
! на баг РФО  
!  Это решается здесь ↴  
   
onerror:  
end ""  
  Изменено b0ing (29.12 / 03:13) (всего 1 раз)
 Прикрепленные файлы:   Demo_Fn_Click.bas   (9.64 кб.) Скачано 926 раз   |  
   29.12.2016 / 09:37 |  |  1961uvg    Пользователь  
   Сейчас: Offline 
 Имя: Victor Откуда: Минск Регистрация: 28.07.2015
   | bOing СПАСИБО !   Игрушка и Demo классно сделаны! Demo почти как статья получилась от такого количества коментариев.  А в игрушке я не понял как играть? Это типа выбираешь цвет и ждешь кто победит? Едят желтый, а что фиолетовый делает?
   |  
   29.12.2016 / 17:44 |  |  b0ing    Пользователь  
   Сейчас: Offline 
 Имя: Макс Регистрация: 24.08.2016
   | Пояснение к игре - 4 шара.Открыть спойлер Закрыть спойлер В игрушке изначально присутствуют четыре шара зеленый, белый, синий и оранжевый. Да, суть их сводится к выживанию. Когда появляется горох (желтый шарик), они все чешут к нему и какой быстрей его слопает тот становится на единицу больше, скорость его тоже становится на единицу больше, то есть у него появляется преимущество перед другими, чтобы съесть другой горох. При столкновении друг с другом их раскидывает по случайным координатам экрана, а так же у них на единицу убавляется здоровье и скорость, то есть в этот момент, преимущество получают шары которые не дерутся. Когда появляется красный горох  (вероятность его появления регулируется), то при столкновении у шаров списывается по 10 хп, и съевший этот горох шар тоже получает 10 единиц, интересный момент получается когда столкнувшийся шар съедает красный горох, в итоге как бы забирает у противника 10 очков. Если единицы здоровья становятся отрицательной величиной, шар как бы умирает, превращаясь в духа, при этом его начальная скорость равна примерно 40 единицам, последующими столкновениями уменьшаясь, и примерно когда скорость духа достигает -100 единиц он постепенно останавливается а затем покидает поле. Интересно получается когда большой шар остальных превращает в духов,а они в свою очередь могут здорово поубавить ему здоровье часто даже переламывая победу в другую сторону. Появление гороха тоже рэндомно и жизнь у него тоже разная, он может раньше исчезнуть чем до него кто-нибудь доберется. Побеждает оставшийся на экране шар. Эту игрушку смело можно назвать симулятором выживания. Иногда когда болеешь за какой-нибудь шар ему почему-то начинает везти больше остальных. Не знаю с чем это связано, но тендеция такая. Посути вся игра построена на случайных генераторах, может ли мозг как-то влиять на результаты? Первые разы думал все кажется, но количество результатов говорит об обратном. Эта область еще не изучена (наверное). Отпишитесь о своих наблюдениях.
  Отвечаю на вопрос.  Да, и влиять на результаты в игре нельзя. Выбираем шар и ждем.
   Изменено b0ing (29.12 / 17:52) (всего 2 раза) |  
   29.12.2016 / 19:23 |  |  lion1971    Пользователь  
   Сейчас: Offline 
 Имя: Lion1971 Регистрация: 12.12.2016
   |  Изменено lion1971 (29.12 / 19:24) (всего 1 раз) |  
   29.12.2016 / 19:27 |  |  1961uvg    Пользователь  
   Сейчас: Offline 
 Имя: Victor Откуда: Минск Регистрация: 28.07.2015
   | Очень прикольно! Я и сам уже почти понял суть! И действительно если сильно болеть за  выбранный шар , он побеждает?   Короче альтернатива игры Конвея "Жизнь" или "Life".    Мне очень понравилось - уже пару часов  гоняю и почти все понял без описания.   Но описание поставило все на свои места.     Буду дальше играть - хотя играть это условно,  наверно лучше - считать , что болеть за выбранный шар!
   Изменено 1961uvg (29.12 / 19:29) (всего 1 раз) |  
   29.12.2016 / 19:46 |  |  1961uvg    Пользователь  
   Сейчас: Offline 
 Имя: Victor Откуда: Минск Регистрация: 28.07.2015
   | Lion1971 Интересные сайты, хотя первый больше для Web дизайнеров!   Они англоязычные, но google chrome помогает понять!
   Изменено 1961uvg (29.12 / 19:46) (всего 1 раз) |  
   30.12.2016 / 03:20 |  |  levapbar    Пользователь  
   Сейчас: Offline 
 Имя: Павел Регистрация: 04.09.2016
   | b0ing По поводу влияния мозга на генератор случайных чисел. Набери в google "генератор случайных событий". Не чисел, а событий. Интересно почитать.
   |  
   30.12.2016 / 08:51 |  |  1961uvg    Пользователь  
   Сейчас: Offline 
 Имя: Victor Откуда: Минск Регистрация: 28.07.2015
   | На официальном форуме нашел первую демонстрационную программу виртуальной реальности, т.е. динамическое стерео ( 3D ).      Для просмотра нужны очки виртуальной реальности для смартфона, их можно сделать из картона ( можно найти в интернете )  или купить, есть подороже - из пластмассы.  http://info.vrstorecardboard.ru/     Как один и самый бюджетный вариант это использовать лист бумаги ( картон ), установить на экран смартфона по середине между двух изображений и смотреть каждое изображение своим глазом.    В программе есть три режима: 1 - полупрозрачные квадраты; 2 - цветные точки ( звезды ) и 3 - буквы.  Выбираем и смотрим как это летит на Вас.     Ну очень эффектно смотрится !!!  Изменено 1961uvg (30.12 / 09:01) (всего 2 раза)
 Прикрепленные файлы:   Burst%20VR.bas   (4.55 кб.) Скачано 897 раз   |  
    Всего сообщений: 2716  Фильтровать сообщения
  Поиск по теме
  Файлы топика (511) 
                 |