FreeBasic
Главная
Вход
Регистрация
Суббота, 27.04.2024, 01:54Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Freebasic » Вопросы по языку FreeBasic » Проблема с текстовым вводом в графическом окне
Проблема с текстовым вводом в графическом окне
haavДата: Четверг, 30.05.2013, 08:39 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Сообщения в данной теме перенесены отсюда

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
vicmadДата: Четверг, 30.05.2013, 08:39 | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Уважаемый haav, не могли-бы помочь с примером реализации текстового ввода в графическом окне для моей игры. Я пытаюсь сделать меню ввода количества игроков и их имен. 
У меня есть числовой счетчик количества игроков, тип игроков со строковой переменной "имя". Вообщем мне просто нужен пример как в окне с разрешением 800х600, вывести например по центру фразу "введите количество игроков" и присвоить переменной "счетчик" значение, после чего вывести "введите имя" и начать вводить текстовые имена с присвоением их переменной "имя".
Команда input мне вроде не подходит так как мне надо чтоб ввод происходил в основном цикле с выводом графики. Полагаю что както надо задействовать GetKey но пока не могу понять как.

Если Вас не затруднит, буду очень благодарен.

 
haavДата: Четверг, 30.05.2013, 08:39 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Вроде начало получаться реализовывать что хотел.
Завел две строковые переменные "name" и "char",  а в основном цикле поставил:
char=inkey$
name=name+char
осталось добавить команды по удалению и игнорированию ненужных клавиш))
 
haavДата: Четверг, 30.05.2013, 08:40 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (vicmad)
Вроде начало получаться реализовывать что хотел.Завел две строковые переменные "name" и "char", а в основном цикле поставил:
char=inkey$
name=name+char
осталось добавить команды по удалению и игнорированию ненужных клавиш))

Я рад, значит код не нужен, сам до всего дойдешь?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
vicmadДата: Четверг, 30.05.2013, 08:40 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: 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
Репутация: 49
Статус: 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)
Прикрепления: 1509002.bmp (85.8 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Четверг, 30.05.2013, 13:38 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Че-то я ступил shy

Только сейчас дошло. Русские буквы при вводе можно легко выводить в графическое окно при наличии шрифта с кириллицей. Есть же доступ к событиям процедуры окна при помощи Screenevent. Там ловятся нажатия клавиш и есть доступ к сканкодам. И не надо ничего придумывать biggrin


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
vicmadДата: Четверг, 30.05.2013, 20:25 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Звучит круто smile , правда я половину не совсем понял. Вообщем пытаюсь разобраться с примером, но у меня почемуто видно только тот текст который я ввожу, а остальные надписи почемуто не видно.

Я упростил свой код, можно как-то также просто удалять буквы?

Код
#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
Репутация: 49
Статус: Offline
Цитата
Вообщем пытаюсь разобраться с примером, но у меня почемуто видно только тот текст который я ввожу, а остальные надписи почемуто не видно.


Быть не может. Файлик bmp в приклеплении скачивал? Сохранял его в том же каталоге , что и сама программа с именем 1.bmp?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
vicmadДата: Четверг, 30.05.2013, 21:25 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Да скачивал, сохранил, даже переименовал чтоб загружался, в коде было загрузить "1.bmp" а он был с именем 150...
 
haavДата: Четверг, 30.05.2013, 21:34 | Сообщение # 12
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Попробуй скачать, распаковать и запустить из папки.
Прикрепления: temp.zip (4.1 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
vicmadДата: Четверг, 30.05.2013, 21:45 | Сообщение # 13
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
все отлично работает  smile
 
haavДата: Четверг, 30.05.2013, 22:10 | Сообщение # 14
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (vicmad)
все отлично работает smile


Ну и хорошо, с этим разобрались. Если будут вопросы по коду не стесняйся.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ПавелДата: Четверг, 30.05.2013, 22:36 | Сообщение # 15
Сержант
Группа: Пользователи
Сообщений: 21
Репутация: 0
Статус: Offline
а в чем был создан шрифт с кирилицей?
 
Форум » Freebasic » Вопросы по языку FreeBasic » Проблема с текстовым вводом в графическом окне
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: