Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 19:12

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Игра с фишками/карточками
СообщениеДобавлено: Пт май 11, 2018 16:09 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Идея практического теста для опробования Форта - игра с фишками или карточками. Это может быть и простой имитатор ходилки с кубиками, и простой wargame, и игра на уровне расстановки своих фишек на территории, выбивания оттуда чужих фишек и получения различных бонусов.

Что тут облегчает задачу:
1. Изображения в основном статические, нет ни сложной трехмерной, ни скоростной графики.
2. Нет realtime и сложного взаимодействия с мышью и клавиатурой.
3. Изображения могут быть достаточно условными (например, "вот этот красный квадратик пусть будет драконом с атакой 10 и жизнями 20").

Зачем тут Форт:
1. Интересно, насколько просто будет на Форте реализовывать особые правила, да и вообще автоматический отыгрыш правил.
2. Игровой процесс хорошо соответствует идее интерпретации некоторых команд, возможно, с параметрами.
3. В целом за счет описания дополнительных игровых механик на Форте и введении "слотов" для программируемых специальных действий можно будет попробовать отойти от разнообразных генераторов игровых программ.

Конечно, это все делается не для получения чего-то игрового для продажи через Steam :) Идея в том, что раз Форт хорош, то ведь на нем должно быть удобно решать практические задачи. А игра - это такое дело, которое не страшно и провалить, пусть даже и за неимением свободного времени. Правда, если уж даже простую игру не получается написать, то о чем мы, собственно?...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Пт май 11, 2018 20:14 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
наша местная легенда:
одиозная компания студентов, более известная, как " люди Х (икс)" в рамках квеста пятёрка на халяву без лаб" на форте писала преферанс....но из-ха сбоя винта всё было утеряно и восстановлено (с улучшениями в коде и движке) за двое бессонных суток, но увы без графики....

(злые товарищи пострадавших настояли на том, что квест не был выполнен в полной мере, и "люди Х" отделались только оценкой "хорошо" )


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Пт май 11, 2018 20:55 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Писал когда-то на Сях игру Талеи (Велеи) в консоли. Может, на форте попробовать?
Вот только как с АИ быть или как его там. Там правила у каждой стороны свои.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Пт май 11, 2018 21:18 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Может "память"? Не помню как точно называется, но смысл в том, что надо за меньшее количество ходов найти все совпадающие карточки.
А ещё мне нравится в Колибри floodit, но она не карточная и алгоритм чуть посложнее.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Пт май 11, 2018 22:33 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
_KROL писал(а):
Может "память"? Не помню как точно называется, но смысл в том, что надо за меньшее количество ходов найти все совпадающие карточки.
А ещё мне нравится в Колибри floodit, но она не карточная и алгоритм чуть посложнее.

Я уже начал делать "Память". Пока разбираюсь с прорисовкой.
Нашёл нормальную библиотеку "devel\~pi\lib\console.f".
Но я люблю, чтобы аттрибуты цвета были вместе, поэтому добавил у себя
Код:
: SetAttribue ( attr -> )
  N->Color SetBackground SetColor
;


Итог на сегодня (пишу на SP-FORTH):
Код:
\ 11.05.2018 _KROL (coding win-1251)
\ Игра "Память"
\ Copyright [C] 2018 _KROL krolmail@list.ru
\ todo: игровой процесс и управление

S" devel\~pi\lib\console.f" INCLUDED

HEX

\ Временно, для отладки
: ??? ( -- )
  DEPTH .SN KEY DROP
;

\ Цветовая гамма
07 CONSTANT COLOR:STD
1F CONSTANT COLOR:FLD
9F CONSTANT COLOR:SEL

\ Устанавливает соответствующие аттрибуты цвета консоли
: SetAttribue ( attr -> )
  N->Color SetBackground SetColor
;

\ "Текстуры" карт
CREATE cardTex
BL C, BL C,
BL C, BL C,
CHAR / C, CHAR \ C,
CHAR \ C, CHAR / C,
CHAR \ C, CHAR / C,
CHAR / C, CHAR \ C,
CHAR = C, CHAR = C,
CHAR = C, CHAR = C,
CHAR - C, CHAR - C,
CHAR - C, CHAR - C,
CHAR + C, CHAR + C,
CHAR + C, CHAR + C,
CHAR | C, CHAR | C,
CHAR | C, CHAR | C,
C9 C, BB C,
C8 C, BC C,
BC C, C8 C,
BB C, C9 C,
CHAR 4 C, BL C,
CHAR t C, CHAR H C,
CHAR ? C, CHAR ? C,
CHAR ? C, CHAR ? C,

\ Количество типов текстур (без нулевой пустой)
10 CONSTANT cardNum

\ Размер и само Поле
5 CONSTANT fieldSzX
4 CONSTANT fieldSzY
fieldSzX fieldSzY * CONSTANT fieldSz
CREATE Field fieldSz ALLOT
\ Текущие координаты
0 VALUE curX 0 VALUE curY

\ Возвращает адрес текстуры карты
: Card ( x y -- addr )
  fieldSzX * + Field +
;

\ Возвратится на позицию ниже поля
: ReturnXY ( -- )
  0 fieldSzY 4 * SetLocate
  COLOR:STD SetAttribue
;

\ Прорисовывает данную карту
: drawCard ( n sel -- )
  IF
    COLOR:SEL SetAttribue
  ELSE
    DUP 0=
    IF
      COLOR:STD SetAttribue
    ELSE
      COLOR:FLD SetAttribue
    THEN
  THEN
  GetX SWAP
  4 * cardTex +
  DUP C@ EMIT
  1+ DUP C@ EMIT
  SWAP GetY 1+ SetLocate
  1+ DUP C@ EMIT
  1+ C@ EMIT
;

\ Прорисовывает карты на поле
: drawCards ( -- )
  fieldSzY 0
  DO
    fieldSzX 0
    DO
      I J 2DUP
          4 * 1+ SWAP 4 * 1+ SWAP SetLocate
          2DUP Card C@
          ROT curY = SWAP curX = AND
          drawCard
    LOOP
    CR
  LOOP
  ReturnXY
;

\ Прорисовка "поля" без карт
: drawField ( -- )
  0 0 SetLocate
  COLOR:FLD SetAttribue
  fieldSzY 4 * 0
  DO
    fieldSzX 4 * 0
    DO
      [CHAR] * EMIT
    LOOP
    CR
  LOOP
  ReturnXY
;

\ Перепрорисовка всего
: reDraw ( -- )
  drawField
  drawCards
;

Console
S" Game 'Memory'" SetTitle
COLOR:STD SetAttribue Cls
Запустите "reDraw" чтобы увидеть результат.
P.s. Поправил свою алголо-дурь :)
+ Подправил, добавил комментарии для ясности.
Но почему-то он выводит несколько выделенных и неизвестно откуда взявшихся фишек 8)


Последний раз редактировалось _KROL Пт май 11, 2018 23:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Пт май 11, 2018 23:22 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Н, больше сегодня обновлять не буду :mrgreen:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Пт май 11, 2018 23:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
А как вообще планируется управлять этим?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 02:40 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Эх, я самое вкусное слопаю сам! :D
Вот вам memory.

Код:

50 CONSTANT X0
100 CONSTANT Y0
50 CONSTANT WIDTH
100 CONSTANT HEIGHT
20 CONSTANT SPACING

4 CONSTANT ROWS
5 CONSTANT COLUMNS

ROWS COLUMNS * CONSTANT CARDS

: PLACE->XY // PLACE# -- X, Y
  // 4 ðÿäà ïî 5 êàðò, èíäåêñ íà÷èíàåòñÿ ñ 0
  DUP ROWS MOD WIDTH SPACING + * X0 +
  OVER ROWS / HEIGHT SPACING + * Y0 +
;

: XY->PLACE // X, Y -- PLACE#
  Y0 - HEIGHT SPACING + / ROWS *
  SWAP X0 - WIDTH SPACING + /
  +
;

: CARDBOX // X, Y --
  2DUP WIDTH 0xFFFFFF HLINE
  2DUP HEIGHT + WIDTH 0xFFFFFF HLINE
  2DUP HEIGHT 0xFFFFFF VLINE
  SWAP WIDTH + SWAP HEIGHT 0xFFFFFF VLINE
;

0 VALUE ST
-1 VALUE CARD1
-1 VALUE CARD2

CREATE CARD[] CARDS CELLS ALLOT

VECT <FORWARD-REF>

: MOUSE-SECONDCARD
  MOUSE-X @ MOUSE-Y @ XY->PLACE DUP
  0 CARDS 1- WITHIN IF
    TO CARD2
    USE <FORWARD-REF> AS <MOUSE_LEFT>
    CARD[] CARD1 -TH @
    CARD[] CARD2 -TH @ = IF
      -1 CARD[] CARD1 -TH !
      -1 CARD[] CARD2 -TH !
    THEN
    2 TO ST
  ELSE
    DROP
  THEN
;

: MOUSE-FIRSTCARD
  MOUSE-X @ MOUSE-Y @ XY->PLACE DUP
  0 CARDS 1- WITHIN IF
    TO CARD1
    USE MOUSE-SECONDCARD TO <MOUSE_LEFT>
    1 TO ST
  ELSE
    DROP
  THEN
;

USE MOUSE-FIRSTCARD AS <FORWARD-REF>

: DRAWCARDS
  CLS
  CARDS 0 DO
    CARD[] I -TH @ -1 > IF
      I PLACE->XY CARDBOX
      I CARD1 = I CARD2 = OR IF
        I PLACE->XY
        HEIGHT 2 / + SWAP
        WIDTH 2 / + SWAP
        TEXTXY CARD[] I -TH @ .
      THEN
    THEN
  LOOP
 
  0
  CARDS 0 DO
    CARD[] I -TH @ -1 > IF 1 + THEN
  LOOP
  0 1 GOTOXY "Cards left: " PRINT DUP .
  0 = IF
    30 10 GOTOXY " You are win!" PRINT
  THEN
;

: GAME
  DRAWCARDS
  ST CASE
    0 OF USE MOUSE-FIRSTCARD AS <MOUSE_LEFT> BREAK
    1 OF BREAK
    2 20 <OF> 1 +TO ST BREAK
    21 OF
      -1 TO CARD1
      -1 TO CARD2
      0 TO ST
    BREAK
  ENDCASE
;

CREATE SAMPLE[]
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,

SAMPLE[] CARD[] CARDS CELLS CMOVE

50 TIMER_INTERVAL !
USE GAME AS <TIMER>


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 11:13 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Мы конечно "молодцы" (я, в частности)...
Не подскажешь, какие ты библиотеки используешь? У тебя наверное там всё настроено :(
Или это не SPF?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 14:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Разумеется, это не SPF :)

Собственно, пересмотрел еще раз код на предмет отличий и теперь можно попробовать описать пункты, из-за которых в кварке гораздо проще делать некоторые вещи.

1. HLINE VLINE. Это следствие прямого доступа к поверхности экрана в графике. Нет никакой консоли и никакого wm_paint (точнее, wm_paint уже реализован внутри). Рамку можно сделать, просто указав на стеке для каждой линии x, y, длина, цвет. В этом же разделе GOTOXY.
2. С мышью тоже совсем просто. <MOSE_LEFT> это вектор, вызываемый при нажатии левой кнопки мыши. При этом MOUSE-X и MOUSE-Y содержат координаты нажатия. Делать какой-то специальный цикл обработки сообщений не нужно - как и в случае с wm_paint все уже настроено в движке. Ведь практически каждая программа выводит что-то на экран и работает с мышью и клавиатурой?
3. USE MOUSE-FIRSTCARD AS <MOUSE_LEFT> - это просто синтаксические декорации. USE это ['], а AS это TO. Аналогично -TH, которое определено как CELLS + (но в ассемблере).
4. 50 TIMER_INTERVAL ! - интервал таймера в мс.
USE GAME AS <TIMER> - собственно запуск игры. Как таковое слово не запускается, просто настраивается вектор, вызываемый по таймеру (в процессе игры можно что-то набирать в консоли и запускать на исполнение).

Теперь мне действительно интересно посмотреть на аналогичный код для SPF. Без реализации цикла обработки сообщений тут не обойтись, если только не ограничиваться консолью, в которой придется игровое поле делать символами, и каждый раз его перерисовывать с уползанием предыдущего текста вверх. Куда как современно. Прямо реинкарнация Unity :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 14:56 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
Теперь мне действительно интересно посмотреть на аналогичный код для SPF. Без реализации цикла обработки сообщений тут не обойтись, если только не ограничиваться консолью, в которой придется игровое поле делать символами, и каждый раз его перерисовывать с уползанием предыдущего текста вверх. Куда как современно. Прямо реинкарнация Unity :)

Что за предрассудки :)
Были же раньше на местном форуме Game марафон тема и в частности там показано решение на базе библиотек от ~yz Игра крестики нолики
Да и без особенных обёрток работать с WinAPI напрямую не так уж сложно.

P.S. Да и другие проекты с задействованием графики на SPF4 и других Форт системах особых заморочек не вызывают, если не рассматривать вопрос кроссплатформенности.
Прямая работа с экраном, возможна, например в KolibriOS, а учитывая что эмулятор данной ОС появился и под Linux (не только под Win) то программирование приложений для неё достаточно тривиально. При этом готовое приложение можно запускать в рамках автономной Kолибри ОС. Выбор платформы для запуска приложения и каки образом никто же не уcтанавливает. ;)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 15:34 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
Да и без особенных обёрток работать с WinAPI напрямую не так уж сложно.

А почему одинаковые для каждого проекта действия с WinAPI надо обязательно в каждом проекте и повторять? Это ли не предрассудок? :)

KPG писал(а):
Прямая работа с экраном, возможна, например в KolibriOS, а учитывая что эмулятор данной ОС появился и под Linux (не только под Win) то программирование приложений для неё достаточно тривиально. При этом готовое приложение можно запускать в рамках автономной Kолибри ОС. Выбор платформы для запуска приложения и каки образом никто же не уcтанавливает.

Эээ... для работы с экраном надо ставить KolibriOS??? Она что, заведомо мощнее и функциональнее Windows/Linux? Я не вполне понимаю, зачем надо так старательно обходить напрашивающиеся решения, если они вдруг мнятся "нестандартными". Ну вот кварк использует для экрана вполне кроссплатформенную библиотеку OpenGL. В Kolibri это возможно? Замечу, что драйверы OpenGL для основных ОС пишутся производителями графических чипов, и обеспечить хотя бы сопоставимый с ними уровень довольно-таки сложно. Но самое главное - чего ради??? Чтобы оставаться на позиции "ANS - это стандарт, а SPF - стандарт де-факто"? Ну я не могу запретить возиться с полфабрикатами, и упираться в пародии, подобные упомянутым крестикам-ноликам. Делать ходы цифрами на клавиатуре - это просто ностальгия времен ДОС и отсутствия мышек как класса устройств. Еще бы в консоли ходы вводить словами Форта и получать ответные номера клеток. Результат говорит сам за себя - как говорится, упирайтесь дальше и продолжайте сидеть, ограниченные технологиями 20-летней давности.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 15:35 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Hishnik писал(а):
Без реализации цикла обработки сообщений тут не обойтись, если только не ограничиваться консолью, в которой придется игровое поле делать символами, и каждый раз его перерисовывать с уползанием предыдущего текста вверх

кстати нет 8)
в консоли винды можно рисовать.
Ограничения есть, но графики строятся запросто 8)
возни меньше, чем через mssage loop, хотя последнее не сложно реализуется так же.

пример для messageloop могу из форка привести.
source file: win.fts
\ 05.10.2013 m0leg
\
\


memory/ fld.fts
branch/ case.fts
stack/ add.fts
vocs/ dllvoc.fts
os/ callback.fts
os/ mtask.fts
os/ ansi-oem.fts
rel/ ws.fts

\ dll словари должны быть добавлены в контекст заранее
ALSO IMPORT USER32.DLL
ALSO IMPORT GDI32.DLL
ALSO IMPORT KERNEL32.DLL
ALSO FORTH DEFINITIONS

\ ловля ошибок, признаком которых является 0 на выходе функции
: n?WIN-ERR ( n --> n )
*IF ;THEN
GetLastError THROW
ERROR" Странная ошибка."
;


\ Создание структур
USER-CREATE wndclassex WndClasseX:: /size USER-ALLOT
USER-CREATE rect rect:: /size USER-ALLOT


USER-VALUE hwin \ Дескриптор главного окна

USER-VALUE phdc \ контекст окна в который осуществляется графический вывод


\ отобразить текст, заданный строкой asc # в позиции x y окна
: (type) ( asc # x y --> ) D>R OEM>ANSI SWAP DR> phdc TextOutA DROP ;

\ задать цвет текста и цвет фона
: !color ( color --> ) phdc SetTextColor DROP ;
: !bgr ( color --> ) phdc SetBkColor DROP ;
: !cf ( color fone -->) phdc TUCK SetBkColor DROP SetTextColor DROP ;

\ включение и выключение прозрачности текста
: !trasparent ( --> ) TRANSPARENT phdc SetBkMode DROP ;
: !opaque ( --> ) OPAQUE phdc SetBkMode DROP ;


\ получить информацию о состоянии курсора
: @CSRI ( --> flags hid x y ) 0 0 0 0 20 SP@ GetCursorInfo n?WIN-ERR DROP ;

\ определить состояние курсора: отображается\скрыт
: ?CSR ( --> flag ) @CSRI DROP NIP NIP NIP ;

\ получить координаты указателя мыши на экране (не в окне)
: @PPOS ( --> y x ) 0 0 SP@ GetCursorPos n?WIN-ERR DROP ;

\ скрыть и показать указатель мыши
: POFF ( --> ) ?CSR IF 0 ShowCursor DROP THEN ;
: PON ( --> ) ?CSR IFNOT 1 ShowCursor DROP THEN ;


\ стандартная (по умолчанию) обработка сообщения
: DefProc ( addr --> ) DUP >L lParam @ L@ wParam @ L@ message @ L> hwnd @ DefWindowProcA ;

\ Обработчик сообщений окна
\ нельзя внутри использовать hwin и phdc, если они USER переменные
\ здесь только фильтр для нужных сообщений, чтоб их не обрабатывал DefProc
CB: 'WINMES ( --> addr )
DUP message @
CASE wm:: mousemove OF POFF ENDOF \ обработку предполагаю делать в MAINLOOP
wm:: quit OF ENDOF \
wm:: close OF ENDOF \
wm:: keydown OF ENDOF \
wm:: ncmousemove OF PON ENDOF
DROP DefProc \ отдаем только, если сообщение не опознано
ENDCASE ;

\ попытка получения очередного сообщения без ожидания сообщения
\ flag сообщает о наличии сообщения в очереди
: NextMsg ( addr --> flag ) A>L 1 0 0 hwin AL> PeekMessageA ;

\ закрытие окна
: wclose ( addr --> )
phdc hwin ReleaseDC DROP \ Удаляем контекст окна для рисования (буфер)
hwin DestroyWindow DROP \ Уничтожение окна
;



CREATE "ch" CHAR" ¤ B, ;CREATE

VARIABLE color

0 VALUE dpt

\
: ~pointer ( addr --> )
!trasparent color @ !color
"ch" 1 ROT lParam @ DUP 16 RSHIFT SWAP 0xFFFF AND
(type) ;


: increment ( um u --> um u++ ) OVER INVERT OR 1 + AND ;

\ обработка событий (вне колбэка)
: Reflex ( addr --> )
DUP message @ ( addr --> )
CASE wm:: mousemove OF ~pointer ENDOF
wm:: keydown OF wParam @ "ch" B! ENDOF
wm:: lbuttondown OF 0x00808080 color @ increment color ! ENDOF
\ DROP TranslateMessage DROP
ENDCASE ;

\ проверка необходимости закрытия окна (тут только по ESC)
: ?esc ( addr --> flag )
DUP message @ wm:: keydown =
IF wParam @ vk:: escape = ;THEN
DROP FALSE ;

\ Кольцо для принятия сообщений от ОС
: MAINLOOP ( --> )
/MSG aFRAME >L \ место под хранение сообщения
BEGIN L@ NextMsg
IF L@ ?esc IF LDROP ;THEN \ необходимо ли выйти ?
L@ Reflex
L@ DispatchMessageA DROP
THEN
\ тут любые действия не синхронизированные с приходом сообщений
AGAIN ;

\ создание класса окна
: CreateClass ( ascZ addr --> cls ) >L
CS{ vredraw hredraw OR } WndClasseX:: L@ Style !
'WINMES WndClasseX:: L@ 'WndProc A!
0 GetModuleHandleA WndClasseX:: L@ hInstance !
32512 0 LoadIconA WndClasseX:: L@ hIcon !
32512 0 LoadCursorA WndClasseX:: L@ hCursor !
HBRUSH:: COLOR_MENUTEXT WndClasseX:: L@ hbrBackground !
WndClasseX:: L@ lpszClassName !
WndClasseX:: /size WndClasseX:: L@ cbSize !
L> RegisterClassExA n?WIN-ERR ;

\
: CreateWindow ( x y asc tid --> )
D>R D>L
0 \ дополнительные данные окна
R> \ дескриптор экземпляра приложения tid
0 \ дескриптор меню
0 \ дескриптор окна владельца (0 рабочий стол)
L> L> \ размеры окна
CW_USEDEFAULT \ вертикальная позиция окна
CW_USEDEFAULT \ горизонтальная позиция окна
WS{ BORDER } \ атрибуты окна
R@ \ имя заголовка окна
R> \ имя класса родителя окна
3 \ дополнительные атрибуты окна
CreateWindowExA n?WIN-ERR ;

\ Создание класса для окна
:> INITWIN ( x y asc # -> ) \ ширина и высота окна
OEM>ANSI DROP DUP wndclassex CreateClass DROP \ вместо DROP надо будет UnregisterClass в конце вызова

WndClasseX:: wndclassex hInstance @ CreateWindow TO hwin

hwin GetDC DUP TO phdc \ Создаем контекст окна для рисования (буфер)

sw: SHOW hwin ShowWindow DROP \ Показать окно на дисплее
hwin UpdateWindow n?WIN-ERR DROP \ Обновить окно
0 SetForegroundWindow DROP
MAINLOOP

;

ONLY DEFINITIONS
: zz
1200 800 s" первое" 4 INITWIN START DROP
\ 500 300 s" второе" 4 INITWIN START DROP
; zz
REPEAT


тут просто отрисовка символа ¤ в положении мышиного указателя.
По нажатии пкм цвет символа меняется.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 15:41 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
пример для messageloop могу из форка привести.

И что, в этот пример надо часто вводить существенные изменения? Такие, чтобы использование переменных в нужных местах не помогало. Раз нет, то предполагаю, что каждая программа, использующая окно, будет содержать такой код. И каждая программа, рисующая на экране, будет содержать обработчик wm_paint. А раз так, какие практические соображения не дают добавить такие вещи непосредственно в движок форт-системы и получать готовое окно с настроенными обработчиками и векторами в нужных местах? Вот эти все CreateWindowExA и Get/Translate/DispatchMessage были еще в книгах 90-х годов. В чем тут достижение?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Игра с фишками/карточками
СообщениеДобавлено: Сб май 12, 2018 15:47 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Hishnik писал(а):
И что, в этот пример надо часто вводить существенные изменения?

Нет, не часто, но есть тонкости.
Hishnik писал(а):
? Такие, чтобы использование переменных в нужных местах не помогало. Раз нет, то предполагаю, что каждая программа, использующая окно, будет содержать такой код.

неправильно построено утверждение. Бывает надо. Можно, конечно, везде поставить вектора, но не обязательно.
Думаю, что то, что утверждается выше было бы запросто реализовано мелкософтовцами, но, почему-то они сделали именно так 8)

Hishnik писал(а):
В чем тут достижение?

Не знаю, а нужно достижение?
Или научная новизна обязательна?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB