Проблема с текстовым вводом в графическом окне
|
|
haav | Дата: Четверг, 30.05.2013, 08:39 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Сообщения в данной теме перенесены отсюда
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vicmad | Дата: Четверг, 30.05.2013, 08:39 | Сообщение # 2 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Уважаемый haav, не могли-бы помочь с примером реализации текстового ввода в графическом окне для моей игры. Я пытаюсь сделать меню ввода количества игроков и их имен. У меня есть числовой счетчик количества игроков, тип игроков со строковой переменной "имя". Вообщем мне просто нужен пример как в окне с разрешением 800х600, вывести например по центру фразу "введите количество игроков" и присвоить переменной "счетчик" значение, после чего вывести "введите имя" и начать вводить текстовые имена с присвоением их переменной "имя". Команда input мне вроде не подходит так как мне надо чтоб ввод происходил в основном цикле с выводом графики. Полагаю что както надо задействовать GetKey но пока не могу понять как.
Если Вас не затруднит, буду очень благодарен.
|
|
| |
haav | Дата: Четверг, 30.05.2013, 08:39 | Сообщение # 3 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Привет vicmad!
Цитата Полагаю что както надо задействовать GetKey но пока не могу понять как.
Функция GetKey в графическом режиме работает только с английской раскладкой. То есть может возвращать значения от 0 до 127. При вводе русских букв , а это символы 2 половины таблицы ASCII, всегда будет возвращать код 63.
Отсюда для ввода русских символов надо писать костыль. Под windows я представляю как это сделать:
Сразу скажу что функцию GetKey можно исключить и ловить клавиши с помощью Multikey.
Создать что-то типа таблички-массива (с кодами и буквами). Например multikey вернуло &h16 , напечать в русской раскладке "г", в английской "u" Узнавать текущую раскладку можно с помощью winapi GetKeyboardLayoutName
Под Linux только одна загвоздка: надо искать свои возможности определять раскладку.
Если для ввода не нужно русских букв, то можно обойтись getkey. Если вариант без русских букв тебя устроит, пиши. Попробую написать примерный код сегодня или завтра.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vicmad | Дата: Четверг, 30.05.2013, 08:40 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Вроде начало получаться реализовывать что хотел. Завел две строковые переменные "name" и "char", а в основном цикле поставил: char=inkey$ name=name+char осталось добавить команды по удалению и игнорированию ненужных клавиш))
|
|
| |
haav | Дата: Четверг, 30.05.2013, 08:40 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Цитата (vicmad) Вроде начало получаться реализовывать что хотел.Завел две строковые переменные "name" и "char", а в основном цикле поставил: char=inkey$ name=name+char осталось добавить команды по удалению и игнорированию ненужных клавиш)) Я рад, значит код не нужен, сам до всего дойдешь?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vicmad | Дата: Четверг, 30.05.2013, 08:40 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Снова вошел в тупик, можно помощь с удалением букв? Чето немогу понять как сделать так чтоб при нажатии кнопки Backspace удалялась последняя буква переменной name. Можете подсказать какие функции и в каком порядке использовать? Ниже мой кодик, в нем много ненужного поэтому основные моменты выделил
Код 'Тест преигрового цикла: создание игроков (количества, имена)
[b]#include "fbgfx.bi" Using FB ScreenRes 800,600,16,2,0' установка режима экрана Setmouse 0,0,0 ' прячем курсор[/b]
Dim Shared As Byte pl_counter, pl_numer, faza [b]Dim Shared As String*25 char, new_char[/b] Dim Shared As Integer ikey
pl_counter=0 pl_numer=0 faza=0
[b]Do ' ГЛАВНЫЙ ЦИКЛ[/b] [b]ScreenLock Cls[/b] Draw String (350,80),"PRE GAME TEST" Draw String (50,480),"players: " & pl_counter Draw String (50,520),"pre game faza: " & faza Select Case faza Case 0 [b]new_char=InKey$ char=char+new_char[/b] Draw String (350,180),"Input players number(1 to 5):" Draw String (250,200),"TEST TEXT: "+ char + new_char End Select ScreenUnLock Sleep 60, 1 Loop Until Multikey(SC_Q) Or Multikey(SC_ESCAPE)
Сообщение отредактировал vicmad - Среда, 29.05.2013, 22:25 |
|
| |
haav | Дата: Четверг, 30.05.2013, 08:40 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Я написал небольшой код, думаю это то, что тебе нужно хотя бы для начала , не забудь фото со шрифтом скинуть в папку с прогой:
Код Screen 19,32,2 ScreenSet 1
' Если раскладка русская, ставим английскую ' Работает только на винде #ifdef __FB_WIN32__ #Include "windows.bi" Dim As ZString*10 szKL GetKeyboardLayoutName(@szKL) If szKL = "00000419" Then ActivateKeyboardLayout(Cast(HKL,HKL_NEXT) ,KLF_SETFORPROCESS) EndIf #EndIf
Type TPlayers szName As ZString*64 iNumber As Integer End Type
Dim Shared As ZString*20 szInfo = "Введите имя игрока", szName ' буфер ввода для имени Dim Shared As TPlayers players(1 To 100) ' массив пользователей Dim Shared As UByte bFlag ' флаг нажатия F1 Dim Shared As Integer iCountUsers, iCaret ' кол-во юзеров,место каретки Dim Shared As Any Ptr font ' хендл шрифта
' Главная комната Sub drawRoom() Line (20,20)-(780,580),&hABCD,BF End Sub
' Окно с вводом пользователей Sub drawGuiInputName() Line (300,250)-(500,350),&hf0f0f0,BF Line (330,300)-(470,320),&hfff0,BF Draw String (400-(Len(szInfo)\2)*7, 265),szInfo,,font Draw String (50,50),"Сделайте запись и нажмите ENTER",,font End Sub
Sub InputName()
szName = "" iCaret=0 Do
Var iKey = GetKey() Select Case iKey Case 13 ' ENTER bFlag = 0 iCountUsers+=1 players(iCountUsers).szName = szName players(iCountUsers).iNumber = iCountUsers Exit Do Case 8 ' DELETE If Len(szName)>1 Then If iCaret = Len(szName) Then szName = Mid(szName,1,Len(szName)-1) iCaret-=1 ElseIf iCaret = 0 Then szName = Mid(szName,2,Len(szName)) iCaret = 0 Else szName = Mid(szName,1,iCaret-1) & Mid(szName,iCaret+1,Len(szName)) iCaret-=1 EndIf Else szName = "" iCaret=0 EndIf Case 48 To 57,65 To 90,97 To 122 ' Только английские буквы (при желании можно добавить пробел, подчеркивание и пр.) iCaret+=1 szName &= Chr(iKey) Case 19455 'стрелка влево iCaret-=1 Case 19967 'стрелка вправо iCaret+=1 End Select drawRoom() drawGuiInputName Draw String (333,303),szName Line(333+iCaret*8,303)-(334+iCaret*8,315),&hff0000,BF Sleep(1) PCopy
Loop
End Sub
'Загружаем шрифт font = IMageCreate(1568,14) BLoad "1.bmp",font
Do Cls drawRoom() Draw String (50,50),"Нажмите клавишу F1 для записи",,font Draw String (50,70),"Игроков " & iCountUsers ,,font For i As Integer = 1 To iCountUsers Draw String (50,70+20*i),"Player " & _ players(i).iNumber & ": " & players(i).szName ,,font Next If MultiKey(&h3B) Then bFlag = 1 ' клавиша F1 для окна ввода имени
If bFlag = 1 Then InputName() EndIf
PCopy Sleep(1)
Loop Until MultiKey(1) ' ESC
ImageDestroy(font)
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Четверг, 30.05.2013, 13:38 | Сообщение # 8 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Че-то я ступил
Только сейчас дошло. Русские буквы при вводе можно легко выводить в графическое окно при наличии шрифта с кириллицей. Есть же доступ к событиям процедуры окна при помощи Screenevent. Там ловятся нажатия клавиш и есть доступ к сканкодам. И не надо ничего придумывать
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vicmad | Дата: Четверг, 30.05.2013, 20:25 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Звучит круто , правда я половину не совсем понял. Вообщем пытаюсь разобраться с примером, но у меня почемуто видно только тот текст который я ввожу, а остальные надписи почемуто не видно.
Я упростил свой код, можно как-то также просто удалять буквы?
Код #include "fbgfx.bi" Using FB ScreenRes 800,600,16,2,0' установка режима экрана Setmouse 0,0,0 ' прячем курсор
Dim Shared As String pl_name,new_char
Do ' ГЛАВНЫЙ ЦИКЛ ScreenLock Cls new_char=InKey$ Select Case new_char Case "A" To "Z", "a" To "z" pl_name=pl_name+new_char End Select Draw String (250,200),"TEST TEXT: "+ pl_name ScreenUnLock Sleep 60, 1 Loop Until Multikey(SC_Q) Or Multikey(SC_ESCAPE)
Сообщение отредактировал vicmad - Четверг, 30.05.2013, 20:32 |
|
| |
haav | Дата: Четверг, 30.05.2013, 20:48 | Сообщение # 10 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Цитата Вообщем пытаюсь разобраться с примером, но у меня почемуто видно только тот текст который я ввожу, а остальные надписи почемуто не видно.
Быть не может. Файлик bmp в приклеплении скачивал? Сохранял его в том же каталоге , что и сама программа с именем 1.bmp?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vicmad | Дата: Четверг, 30.05.2013, 21:25 | Сообщение # 11 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Да скачивал, сохранил, даже переименовал чтоб загружался, в коде было загрузить "1.bmp" а он был с именем 150...
|
|
| |
haav | Дата: Четверг, 30.05.2013, 21:34 | Сообщение # 12 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Попробуй скачать, распаковать и запустить из папки.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vicmad | Дата: Четверг, 30.05.2013, 21:45 | Сообщение # 13 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| все отлично работает
|
|
| |
haav | Дата: Четверг, 30.05.2013, 22:10 | Сообщение # 14 |
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Статус: Offline
| Цитата (vicmad) все отлично работает smile
Ну и хорошо, с этим разобрались. Если будут вопросы по коду не стесняйся.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Павел | Дата: Четверг, 30.05.2013, 22:36 | Сообщение # 15 |
Сержант
Группа: Пользователи
Сообщений: 21
Статус: Offline
| а в чем был создан шрифт с кирилицей?
|
|
| |
|