|
FAQ Туториалы и часто задаваемые вопросы |
18.03.2013, 21:36
|
#1
|
AnyKey`щик
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений (для 7 пользователей)
|
ввод текста в ксорсе
Привет всем
Есть вопрос:в обычном блице есть функция для ввода текста 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
Последний раз редактировалось ProGamer, 18.03.2013 в 22:43.
|
(Offline)
|
|
18.03.2013, 22:57
|
#2
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: ввод текста в ксорсе
Сообщение от ProGamer
Второй:Нужно написать ещё одну программу,которая будет написана без подключения ксорса,и которая будет записывать введённый текст в файл (нужно скомпилировать её в ехе'шник):
и вызывать её каждый раз,когда потребуется ввести текст,а затем считывать содержимое файла в ксорсовской программе:
|
Скажи мне, как, КААК тебе в голову могла прийти такая идея!? Живо писать собственный инпут через графические команды!
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
|
|
18.03.2013, 23:48
|
#3
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: ввод текста в ксорсе
Давайте ему просто объясним.
Смотри, тебе надо сделать класс (тип?) в блице. например, TextBox.
Вот его метод Update:
Проверяешь, наведен ли курсор на прямоугольник (а он ведь имеет прямоугольную форму? ) Если наведен и при этом щелкнули ЛКМ, то делаем его активным.
Если активен, то считываешь символы с клавы (GetChar или как то так)
C= GetChar()
if(c <> 0) text = text + C
вот и все. Можно еще отлавливать нажатие на Enter, к примеру, и на него как то реагировать (например, брать введенный текст и совать его куда-либо)
Ну это так, каркас.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.03.2013, 19:36
|
#4
|
AnyKey`щик
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений (для 7 пользователей)
|
Ответ: ввод текста в ксорсе
Если активен, то считываешь символы с клавы (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 переводит код в текстовое значение
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ProGamer за это полезное сообщение:
|
|
19.03.2013, 19:38
|
#5
|
AnyKey`щик
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений (для 7 пользователей)
|
Ответ: ввод текста в ксорсе
но и GetKey почему-то не работает (у меня она возвращает неправильный код),поэтому использовал KeyDown
|
(Offline)
|
|
19.03.2013, 20:20
|
#6
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
Ответ: ввод текста в ксорсе
хм! а вы "x" не забыли подставить к Getkey?
у меня в проектах работает
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.03.2013, 20:42
|
#7
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: ввод текста в ксорсе
Сообщение от ProGamer
Функции 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 переводит код в текстовое значение
|
Йобть!
k%=0
Repeat
k%=GetKey()
If k<>0 Then Print Chr(k)
Until KeyHit(1)
End
Раз программируешь недавно то пара советов:
1) Такое количество if'ов может вызвать инфаркт. Если будут похожие конструкции - юзай select/case. Разница в том, что ифы будут проверяться дальше, даже когда соответствующее значение найдено.
2) Значение после вызова функции keyhit() лучше хранить в переменной. Если бы keyhit производила бы вычисления то вместе с твоей конструкцией из if даже тетрис бы умер.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Gector за это полезное сообщение:
|
|
19.03.2013, 20:57
|
#8
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: ввод текста в ксорсе
Дружок, иди лучше в дизайнеры. А вот это на досуге почитай...
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)
{
// произвести ещё одну бессмысленную операцию
}
В то время как суть индусского метода заключается в как можно более полном затуманивании предназначения программного продукта, китайский код зачастую поражает и даже отупляет простотой и брутальной прямолинейностью подхода, что характерно для китайской инженерии в целом. С другой стороны, нельзя не отметить, что подобные технологии позволяют максимальным образом трудоустроить население и приводят к сокрушительным победам в социалистических соревнованиях по количеству написанных строчек.
Если программист в китайском стиле напишет процедуру, то вероятность того, что результат её деятельности будет совершенно бесполезным, стремится к единице.
Очень часто китайский код пишут тупые студенты, которые пришли учиться по неясным причинам. Потом такой код приходится долго вкуривать. Выражение «ебу и патчу» произошло благодаря как раз таким случаям.
|
(Offline)
|
|
19.03.2013, 21:00
|
#9
|
AnyKey`щик
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений (для 7 пользователей)
|
Ответ: ввод текста в ксорсе
хм! а вы "x" не забыли подставить к Getkey?
у меня в проектах работает
|
действительно работает
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ProGamer за это полезное сообщение:
|
|
19.03.2013, 21:04
|
#10
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: ввод текста в ксорсе
Сообщение от ProGamer
действительно работает
|
Мне кажется код надо расширить для ввода БОЛЬШИХ букв
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.03.2013, 21:11
|
#11
|
AnyKey`щик
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений (для 7 пользователей)
|
Ответ: ввод текста в ксорсе
Мне кажется код надо расширить для ввода БОЛЬШИХ букв
|
да,ещё неплохо было-бы сделать возможность стирания
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ProGamer за это полезное сообщение:
|
|
19.03.2013, 22:12
|
#12
|
AnyKey`щик
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений (для 7 пользователей)
|
Ответ: ввод текста в ксорсе
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 переход на новую строку
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.03.2013, 22:34
|
#13
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: ввод текста в ксорсе
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 100 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.
|
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Nex за это полезное сообщение:
|
|
19.03.2013, 22:39
|
#14
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: ввод текста в ксорсе
Сообщение от ProGamer
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) Зачем массив?
|
(Offline)
|
|
19.03.2013, 23:00
|
#15
|
AnyKey`щик
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений (для 7 пользователей)
|
Ответ: ввод текста в ксорсе
Мне интересно две вещи:
1) Где в играх применяется ввод с переходом на другую строку?
2) Зачем массив?
|
это для консоли игры,а насчёт массива,не знаю как сделать проще
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:17.
|