forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   ввод текста в ксорсе (http://forum.boolean.name/showthread.php?t=18003)

ProGamer 18.03.2013 21:36

ввод текста в ксорсе
 
Привет всем
Есть вопрос:в обычном блице есть функция для ввода текста Input.В ксорсе нет эквивалента этой функции (xInput),а после включения графического режима командой xGraphics3D команда Input не срабатывает(программа вообще зависает).Так как же вводить текст в ксорсе ???
Первый способ:Можно использовать команду Input до xGraphics3D,и каждый раз,когда потребуется ввести новый текст перезагружать программу
Второй:Нужно написать ещё одну программу,которая будет написана без подключения ксорса,и которая будет записывать введённый текст в файл (нужно скомпилировать её в ехе'шник):
Код:

tekst$=Input$("Enter text: ")
fil=WriteFile("text.txt")
WriteLine(fil,tekst$)
CloseFile(fil)
End

и вызывать её каждый раз,когда потребуется ввести текст,а затем считывать содержимое файла в ксорсовской программе:
Код:

Include "xors3d.bb"
xGraphics3D 800,600,16
ExecFile("enterer.exe")
.bgn
        If FileType("text.txt")=1;проверяем наличие файла
        fil=ReadFile("text.txt")
        tekst$=ReadLine(fil)
                If tekst$="ololo";любое условие
                ;любое действие
                EndIf
        Closefile(fil)
        DeleteFile("text.txt")
        Else
        Goto bgn;если файла нет,проверяем ещё раз
        EndIf


Кирпи4 18.03.2013 22:57

Ответ: ввод текста в ксорсе
 
Цитата:

Сообщение от ProGamer (Сообщение 255172)
Второй:Нужно написать ещё одну программу,которая будет написана без подключения ксорса,и которая будет записывать введённый текст в файл (нужно скомпилировать её в ехе'шник):
и вызывать её каждый раз,когда потребуется ввести текст,а затем считывать содержимое файла в ксорсовской программе:

Скажи мне, как, КААК тебе в голову могла прийти такая идея!? Живо писать собственный инпут через графические команды!

Reizel 18.03.2013 23:48

Ответ: ввод текста в ксорсе
 
Давайте ему просто объясним.
Смотри, тебе надо сделать класс (тип?) в блице. например, TextBox.

Вот его метод Update:
Проверяешь, наведен ли курсор на прямоугольник (а он ведь имеет прямоугольную форму? ;) ) Если наведен и при этом щелкнули ЛКМ, то делаем его активным.
Если активен, то считываешь символы с клавы (GetChar или как то так)
C= GetChar()
if(c <> 0) text = text + C

вот и все. Можно еще отлавливать нажатие на Enter, к примеру, и на него как то реагировать (например, брать введенный текст и совать его куда-либо)

Ну это так, каркас.

ProGamer 19.03.2013 19:36

Ответ: ввод текста в ксорсе
 
Цитата:

Если активен, то считываешь символы с клавы (GetChar или как то так)
C= GetChar()
if(c <> 0) text = text + C
Функции GetChar нет.Есть GetKey,которая возвращает код нажатой клавиши,а поэтому надо код надо перевести в букву или цифру.
Код:

Global txt$
While Not KeyDown(1)
SelectKey()
prnt$=prnt$+txt$
Text 0,0,prnt$
txt$=""
Delay 100
Flip
Cls
Wend
End
Function SelectKey()
If KeyDown(2)
txt$="1"
EndIf
If KeyDown(3)
txt$="2"
EndIf
If KeyDown(4)
txt$="3"
EndIf
If KeyDown(5)
txt$="4"
EndIf
If KeyDown(6)
txt$="5"
EndIf
If KeyDown(7)
txt$="6"
EndIf
If KeyDown(8)
txt$="7"
EndIf
If KeyDown(9)
txt$="8"
EndIf
If KeyDown(10)
txt$="9"
EndIf
If KeyDown(11)
txt$="0"
EndIf
If KeyDown(12)
txt$="-"
EndIf
If KeyDown(13)
txt$="="
EndIf
If KeyDown(16)
txt$="q"
EndIf
If KeyDown(17)
txt$="w"
EndIf
If KeyDown(18)
txt$="e"
EndIf
If KeyDown(19)
txt$="r"
EndIf
If KeyDown(20)
txt$="t"
EndIf
If KeyDown(21)
txt$="y"
EndIf
If KeyDown(22)
txt$="u"
EndIf
If KeyDown(23)
txt$="i"
EndIf
If KeyDown(24)
txt$="o"
EndIf
If KeyDown(25)
txt$="p"
EndIf
If KeyDown(26)
txt$="["
EndIf
If KeyDown(27)
txt$="]"
EndIf
If KeyDown(30)
txt$="a"
EndIf
If KeyDown(31)
txt$="s"
EndIf
If KeyDown(32)
txt$="d"
EndIf
If KeyDown(33)
txt$="f"
EndIf
If KeyDown(34)
txt$="g"
EndIf
If KeyDown(35)
txt$="h"
EndIf
If KeyDown(36)
txt$="j"
EndIf
If KeyDown(37)
txt$="k"
EndIf
If KeyDown(38)
txt$="l"
EndIf
If KeyDown(39)
txt$=";"
EndIf
If KeyDown(40)
txt$="'"
EndIf
If KeyDown(44)
txt$="z"
EndIf
If KeyDown(45)
txt$="x"
EndIf
If KeyDown(46)
txt$="c"
EndIf
If KeyDown(47)
txt$="v"
EndIf
If KeyDown(48)
txt$="b"
EndIf
If KeyDown(49)
txt$="n"
EndIf
If KeyDown(50)
txt$="m"
EndIf
If KeyDown(51)
txt$=","
EndIf
If KeyDown(52)
txt$="."
EndIf
If KeyDown(53)
txt$="/"
EndIf
If KeyDown(57)
txt$=" "
EndIf
End Function

функция SelectKey переводит код в текстовое значение

ProGamer 19.03.2013 19:38

Ответ: ввод текста в ксорсе
 
но и GetKey почему-то не работает (у меня она возвращает неправильный код),поэтому использовал KeyDown

Spy4433 19.03.2013 20:20

Ответ: ввод текста в ксорсе
 
хм! а вы "x" не забыли подставить к Getkey?
у меня в проектах работает :)

Gector 19.03.2013 20:42

Ответ: ввод текста в ксорсе
 
Цитата:

Сообщение от ProGamer (Сообщение 255259)
Функции GetChar нет.Есть GetKey,которая возвращает код нажатой клавиши,а поэтому надо код надо перевести в букву или цифру.
Код:

Global txt$
While Not KeyDown(1)
SelectKey()
prnt$=prnt$+txt$
Text 0,0,prnt$
txt$=""
Delay 100
Flip
Cls
Wend
End
Function SelectKey()
If KeyDown(2)
txt$="1"
EndIf
If KeyDown(3)
txt$="2"
EndIf
If KeyDown(4)
txt$="3"
EndIf
If KeyDown(5)
txt$="4"
EndIf
If KeyDown(6)
txt$="5"
EndIf
If KeyDown(7)
txt$="6"
EndIf
If KeyDown(8)
txt$="7"
EndIf
If KeyDown(9)
txt$="8"
EndIf
If KeyDown(10)
txt$="9"
EndIf
If KeyDown(11)
txt$="0"
EndIf
If KeyDown(12)
txt$="-"
EndIf
If KeyDown(13)
txt$="="
EndIf
If KeyDown(16)
txt$="q"
EndIf
If KeyDown(17)
txt$="w"
EndIf
If KeyDown(18)
txt$="e"
EndIf
If KeyDown(19)
txt$="r"
EndIf
If KeyDown(20)
txt$="t"
EndIf
If KeyDown(21)
txt$="y"
EndIf
If KeyDown(22)
txt$="u"
EndIf
If KeyDown(23)
txt$="i"
EndIf
If KeyDown(24)
txt$="o"
EndIf
If KeyDown(25)
txt$="p"
EndIf
If KeyDown(26)
txt$="["
EndIf
If KeyDown(27)
txt$="]"
EndIf
If KeyDown(30)
txt$="a"
EndIf
If KeyDown(31)
txt$="s"
EndIf
If KeyDown(32)
txt$="d"
EndIf
If KeyDown(33)
txt$="f"
EndIf
If KeyDown(34)
txt$="g"
EndIf
If KeyDown(35)
txt$="h"
EndIf
If KeyDown(36)
txt$="j"
EndIf
If KeyDown(37)
txt$="k"
EndIf
If KeyDown(38)
txt$="l"
EndIf
If KeyDown(39)
txt$=";"
EndIf
If KeyDown(40)
txt$="'"
EndIf
If KeyDown(44)
txt$="z"
EndIf
If KeyDown(45)
txt$="x"
EndIf
If KeyDown(46)
txt$="c"
EndIf
If KeyDown(47)
txt$="v"
EndIf
If KeyDown(48)
txt$="b"
EndIf
If KeyDown(49)
txt$="n"
EndIf
If KeyDown(50)
txt$="m"
EndIf
If KeyDown(51)
txt$=","
EndIf
If KeyDown(52)
txt$="."
EndIf
If KeyDown(53)
txt$="/"
EndIf
If KeyDown(57)
txt$=" "
EndIf
End Function

функция SelectKey переводит код в текстовое значение

Йобть! :4to:

Код:

k%=0
Repeat
        k%=GetKey()
        If k<>0 Then Print Chr(k)
Until KeyHit(1)
End

Раз программируешь недавно то пара советов:
1) Такое количество if'ов может вызвать инфаркт. Если будут похожие конструкции - юзай select/case. Разница в том, что ифы будут проверяться дальше, даже когда соответствующее значение найдено.
2) Значение после вызова функции keyhit() лучше хранить в переменной. Если бы keyhit производила бы вычисления то вместе с твоей конструкцией из if даже тетрис бы умер.

Кирпи4 19.03.2013 20:57

Ответ: ввод текста в ксорсе
 
Дружок, иди лучше в дизайнеры. А вот это на досуге почитай...

Kитайский код — стиль написания программ, нарушающий принцип НПС («Не повторяй себя»). Китайский подход к программированию требует эксплицитного отказа от циклов, локальных переменных, любых процедур и условных выражений, а также использования технологии copy-and-paste чуть менее, чем везде. Такой подход точно увеличивает объём исходников и может увеличить производительность (ведь пропускаются такты на джамповые команды).
Возьмём, к примеру, такой кусочек программы на C: [скрыть]
int arr[10];
int i;
for (i = 0; i < 10; i++)
{
arr[i] = 0;
}
Который, кстати, вполне мог бы выглядеть и так:
int arr[10] = {0};
Типичный программист в китайском стиле напишет это так:
int a0 = 0;
int a1 = 0;
int a2 = 0;
int a3 = 0;
int a4 = 0;
int a5 = 0;
int a6 = 0;
int a7 = 0;
int a8 = 0;
int a9 = 0;
и в дальнейшем будет использовать a0, a1, a2, a3, a4 и т.д. Например, вместо прекрасного:
if (x < 10) arr[x] = x;
будет:
if (x == 0)
{
a0 = x;
}
else if (x == 1)
{
a1 = x;
}
else if (x == 2)
{
...
}
Пример № 1, приведённый выше:
uint i;
...
if (i.ToString().Length == 1)
{
...
}
приверженец китайской методы перепишет так:
if (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9)
{
// произвести ещё одну бессмысленную операцию
}

В то время как суть индусского метода заключается в как можно более полном затуманивании предназначения программного продукта, китайский код зачастую поражает и даже отупляет простотой и брутальной прямолинейностью подхода, что характерно для китайской инженерии в целом. С другой стороны, нельзя не отметить, что подобные технологии позволяют максимальным образом трудоустроить население и приводят к сокрушительным победам в социалистических соревнованиях по количеству написанных строчек.
Если программист в китайском стиле напишет процедуру, то вероятность того, что результат её деятельности будет совершенно бесполезным, стремится к единице.
Очень часто китайский код пишут тупые студенты, которые пришли учиться по неясным причинам. Потом такой код приходится долго вкуривать. Выражение «ебу и патчу» произошло благодаря как раз таким случаям.

ProGamer 19.03.2013 21:00

Ответ: ввод текста в ксорсе
 
Цитата:

хм! а вы "x" не забыли подставить к Getkey?
у меня в проектах работает
действительно работает

Кирпи4 19.03.2013 21:04

Ответ: ввод текста в ксорсе
 
Цитата:

Сообщение от ProGamer (Сообщение 255273)
действительно работает

Мне кажется код надо расширить для ввода БОЛЬШИХ букв

ProGamer 19.03.2013 21:11

Ответ: ввод текста в ксорсе
 
Цитата:

Мне кажется код надо расширить для ввода БОЛЬШИХ букв
да,ещё неплохо было-бы сделать возможность стирания

ProGamer 19.03.2013 22:12

Ответ: ввод текста в ксорсе
 
Код:

y=0
num=1
Dim old$(10000)
Repeat
k%=GetKey()
If k<>0
t$=Chr$(k)
t2$=t2$+t$
EndIf         
If KeyHit(28)
num=num+1
old$(num)=t2$
t2$=""
y=y+12
EndIf
For i=1 To num
Text 0,y-(12*(i-2)),old$(i)
Next
Text 0,0,t2$
Flip
Cls
Until KeyHit(1)
End

код стал короче,регистр меняется при удерживании shift,при нажатии enter переход на новую строку

Nex 19.03.2013 22:34

Ответ: ввод текста в ксорсе
 
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 100 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

Gector 19.03.2013 22:39

Ответ: ввод текста в ксорсе
 
Цитата:

Сообщение от ProGamer (Сообщение 255287)
Код:

y=0
num=1
Dim old$(10000)
Repeat
k%=GetKey()
If k<>0
t$=Chr$(k)
t2$=t2$+t$
EndIf         
If KeyHit(28)
num=num+1
old$(num)=t2$
t2$=""
y=y+12
EndIf
For i=1 To num
Text 0,y-(12*(i-2)),old$(i)
Next
Text 0,0,t2$
Flip
Cls
Until KeyHit(1)
End

код стал короче,регистр меняется при удерживании shift,при нажатии enter переход на новую строку

Мне интересно две вещи:
1) Где в играх применяется ввод с переходом на другую строку?
2) Зачем массив?

ProGamer 19.03.2013 23:00

Ответ: ввод текста в ксорсе
 
Цитата:

Мне интересно две вещи:
1) Где в играх применяется ввод с переходом на другую строку?
2) Зачем массив?
это для консоли игры,а насчёт массива,не знаю как сделать проще


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot