Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Проекты на MidletPascal

Ответ
 
Опции темы
Старый 20.02.2011, 03:24   #1
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
cInput, система для ввода текста в режиме Canvas

Это простая система позволяет реализовывать поля ввода текста во время графического режима. То есть вам не понадобится использовать не-очень-игровую стандартную форму ввода, или мучатся над ограничением набора вводимых символов.
В примере система работает аналогично стандартному вводу на телефонах Nokia, c единственной разницей в использовании * для стирания текста.

Кроме непосредственного ввода с выбором нужной буквы в зависимости от клавиши, поддерживается смена языков (как и редактирование набора букв для языка), и есть определенная оптимизация (включая определение надобности перерисовки экрана).

Система + пример реализации:
Скриншот:

Код (тег OFFTOP потому что spoilerа не вижу :\):
program cInput;
// Код системы
var // переменные системы:
    
en: array[0..11of string// англ. расскладка
    
enx: array[0..11of string// англ. расскладка (заглавные)
    
ru: array[0..11of string// русс. расскладка
    
rux: array[0..11of string// русс. расскладка (заглавные)
    
lanname: array[0..3of string;
    
laninteger// текущий язык
    
lancinteger// количество языков
    
ke_inputstring// текущий ввод
    
ke_currentinteger// текущая кнопка
    
ke_selectinteger// буква под цифрой
    
ke_timeinteger// время ввода
    
ke_timexinteger// макс. время ввода
// Функции системы:
iostart() - инициализация переменных системы
    Эту функцию нужно запустить до первого использования
    большинства других функций системы
иначе может
    произойти что
-то ужасное.
procedure iostartbegin
    lanc 
:= 0;
    
// Английский
    
en[0] := ' 0'enx[0] := en[0];
    
en[1] := '.,?!' chr(39) + '"1'enx[1] := en[1];
    
en[2] := 'abc2'enx[2] := 'ABC2';
    
en[3] := 'def3'enx[3] := 'DEF3';
    
en[4] := 'ghi4'enx[4] := 'GHI4';
    
en[5] := 'jkl5'enx[5] := 'JKL5';
    
en[6] := 'mno6'enx[6] := 'MNO6';
    
en[7] := 'pqrs7'enx[7] := 'PQRS7';
    
en[8] := 'tuv8'enx[8] := 'TUV8';
    
en[9] := 'wxyz9'enx[9] := 'WXYZ9';
    
lanname[0] := 'en'lanname[1] := 'EN'lanc := lanc 2;
    {
// Русский. Может не работать, поэтому закоментирован.
    
ru[0] := en[0]; rux[0] := ru[0];
    
ru[1] := en[1]; rux[1] := ru[1];
    
ru[2] := 'абвг2'rux[2] := 'АБВГ2';
    
ru[3] := 'дежз3'rux[3] := 'ДЕЖЗ3';
    
ru[4] := 'ийкл4'rux[4] := 'ИЙКЛ4';
    
ru[5] := 'мноп5'rux[5] := 'МНОП5';
    
ru[6] := 'РСТУ6'rux[6] := 'РСТУ6';
    
ru[7] := 'фхцч7'rux[7] := 'ФХЦЧ7';
    
ru[8] := 'шщъы8'rux[8] := 'ШЩЪЫ8';
    
ru[9] := 'ьэюя9'rux[9] := 'ЬЭЮЯ9';
    
lanname[2] := 'ru'lanname[3] := 'RU'lanc := lanc 2;}
    
// Инициализация переменных:
    
lan := 0;
    
ke_timex := 10;
    
ke_input := '';
    
ke_current := -1;
    
ke_time := 0;
end;
keytoint(кнопка):индекс преобразование индекса кнопки в число
    Преобразовует код кнопки 
(константув легко отличаемое число
    Возращает 0..9 для цифр
10 для *, 11 для #, -1 для прочего
}function keytoint(keyinteger):integerbegin
    
if (key >= ke_key0) and (key <= ke_key9then keytoint := key ke_key0
    
else if (key ke_starthen keytoint := 10;
    else if (
key ke_poundthen keytoint := 11;
    else 
keytoint := -1;
end;
lanstr(индекс) - возращает строку для кнопки из текущего языка (lan)
    
индекс индекс кнопки (полученный из keytoint)
}function 
lanstr(key:integer):stringbegin
    
if key >= 0 then begin
        
if lan 0 then lanstr := en[key]
        else if 
lan 1 then lanstr := enx[key]
        else 
lanstr := '';
    
end else lanstr := '';
end;
lanlen(индекс) - возращает длину строки кнопки из текущего языка
    индекс 
индекс кнопки (полученный из keytoint)
}function 
lanlen(key:integer):integerbegin
    lanlen 
:= length(lanstr(key))
end;
lanchr(индекс,номер) - возращает символ из строки кнопки ...
    
индекс индекс кнопки (полученный из keytoint)
    
номер номер символа в строке кнопкижелательно меньше ее длины.
}function 
lanchr(key:integer;ind:integer):charbegin
    lanchr 
:= getchar(lanstr(key),ind)
end;
iohandle основная функция системы
    возращает
надобность repaintа (boolean)
}function 
iohandle:boolean; var key:integerbegin
    key 
:= keytoint(getkeyclicked); // получаем последнюю клацнутую кнопку...
    
iohandle := false// возращенное по умолчанию значение
    
if key >= 0 then begin // если что-то нажато
        
ke_time := 0// сброс времени ввода
        
iohandle := true// перерисовуем.
        
if key 10 then begin // если нажата цифра
            
if key ke_current then begin // выбор буквы\символа
                
ke_select := ke_select 1;
                if 
ke_select >= lanlen(ke_currentthen ke_select := 0;
            
end else begin // нажата другая кнопка
                
if ke_current >= 0 then
                    ke_input 
:= ke_input lanchr(ke_current,ke_select);
                
ke_current := key;
                
ke_select := 0;
            
end;
        
end else if key 10 then begin // звездочка (backspace)
            
            
if(ke_current >= 10)or(ke_current 0)then
                
if length(ke_input) > 0 then
                    ke_input 
:= copy(ke_input0length(ke_input)-1);
            
ke_current := -1;
            
ke_select := 0;
        
end else if key 11 then begin // решетка (смена языка)
            
if ke_current >= 0 then // если начат ввод, ввести в строку
                
ke_input := ke_input lanchr(ke_current,ke_select);
            
lan := lan 1;
            if 
lan >= lanc then lan := 0;
            
ke_current := -1;
            
ke_select := 0;
        
end// тут дописывать else if'ы для прочих кнопок
        // (после того как допишите их в keytoint)
    
end else begin
        
if ke_current >= 0 then begin
            ke_time 
:= ke_time 1;
            if 
ke_time >= ke_timex then begin
                ke_time 
:= 0;
                
ke_input := ke_input lanchr(ke_current,ke_select);
                
ke_current := -1;
                
ke_select := 0;
                
iohandle := true;
            
end;
        
end;
    
end;
end;
// Ниже идет демка
var    // переменные для демонстрации
    
szstring// строки для вывода, проверки
    
xinteger// x-координата
    
yinteger// y-координата
    
ccommand// кнопка выхода
// Основная процедура прорисовки (для теста)
procedure maindrawbegin
    setcolor
(239235231);
    
fillrect(00getwidthgetheight);
    
setcolor(000);
    
:= 4;
    
:= 4;
    
:= 'Input: ' ke_input;
    
drawtext(s,x,y); := getstringheight(s);
    
:= lanstr(ke_current);
    if 
<> '' then begin
        s 
:= '[' copy(z0ke_select);
        
drawtext(s,x,y); := getstringwidth(s);
        
setcolor(25500);
        
:= getchar(zke_select);
        
drawtext(s,x,y); := getstringwidth(s);
        
setcolor(000);
        
:= copy(zke_select+1length(z)) + ']';
        
drawtext(s,x,y); := 4:= getstringheight(s);
    
end else begin
        s 
:= '[ ]'// 
        
drawtext(s,x,y); := getstringheight(s);
    
end;
    
:= 'Language: ' integertostring(lan) + ' ' lanname[lan];
    
drawtext(s,x,y); := getstringheight(s);
    
:= '* to erase, # to switch language';
    
drawtext(s,x,y); := getstringheight(s);
    
repaint;
end;
// Основная программа
begin
    iostart
;
    
ke_input := '?';
    
// добавляем кнопку выхода:
    
:= createcommand('Exit'cm_exit1);
    
addcommand(c);
    
// основной цикл:
    
maindraw;
    
repeat
        
if iohandle then maindraw;
        
delay(100);
    
until getclickedcommand c;
    
removecommand(c);
end
Удачи в использовании сего в вашних проэктах.
Увидеть текстовую благодарность в мою сторону в About'е вашей программы\игры, использующей сию систему, было бы тоже очень мило.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
DIMMON4IK (20.02.2011), m.ksy (21.02.2011), nokia_c3 (20.02.2011), odd (22.02.2011), Pyth_ON (20.07.2011)
Старый 20.02.2011, 14:27   #2
nokia_c3
AnyKey`щик
 
Регистрация: 19.02.2011
Сообщений: 9
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: cInput, система для ввода текста в режиме Canvas

Прекрасно!
Почему не дали ссылку в моём треде?
Мне правда инпуты не нужны, только само декодирование.
(Offline)
 
Ответить с цитированием
Старый 20.02.2011, 23:50   #3
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
Ответ: cInput, система для ввода текста в режиме Canvas

Сообщение от nokia_c3 Посмотреть сообщение
Прекрасно!
Почему не дали ссылку в моём треде?
Мне правда инпуты не нужны, только само декодирование.
Мысль написать такую систему пришла ко мне когда в вашей теме было только два или три сообщения. Потом, к моменту окончания написания программы, я обновил страницу, и понял что это не совсем то что нужно, и вам оно врядли будет настолько полезным. Поэтому выложил в отдельную тему. Поскольку под-форум не очень активный, заметить новую тему не сложно, и сообщение на указатель в ее сторону тратить не нужно
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LTS (23.02.2011)
Старый 01.03.2011, 20:40   #4
scorey
Оператор ЭВМ
 
Аватар для scorey
 
Регистрация: 07.02.2009
Адрес: Чебоксары
Сообщений: 28
Написано одно полезное сообщение
Ответ: cInput, система для ввода текста в режиме Canvas

А как - же кверти? у меня нокия c3, там кверти, и было - бы лучше создать мидлет, в котором можно было бы вручную понажымать все кнопки и мидлет запомнил бы код кнопок, потом в меню каждую кнопку сопоставить с буквой и усё)).
(Offline)
 
Ответить с цитированием
Старый 01.03.2011, 23:03   #5
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: cInput, система для ввода текста в режиме Canvas

В идеале было бы 3 варината:
обычный, кверти и сенсор.
(Offline)
 
Ответить с цитированием
Старый 18.07.2011, 14:25   #6
rus21d
AnyKey`щик
 
Регистрация: 20.06.2011
Сообщений: 8
Написано одно полезное сообщение
Ответ: cInput, система для ввода текста в режиме Canvas

нужно добавить сюда символ перевода на новую строку и сам перевод сделать будет не плохо
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com