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

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

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 18.03.2013, 21:36   #1
ProGamer
AnyKey`щик
 
Аватар для ProGamer
 
Регистрация: 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
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: ввод текста в ксорсе

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


(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
Colossus (22.03.2013), Gector (18.03.2013), Nex (19.03.2013), Reizel (18.03.2013)
Старый 18.03.2013, 23:48   #3
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: ввод текста в ксорсе

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

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

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

Ну это так, каркас.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Arles (20.03.2013)
Старый 19.03.2013, 19:36   #4
ProGamer
AnyKey`щик
 
Аватар для ProGamer
 
Регистрация: 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 за это полезное сообщение:
Arles (20.03.2013), Gector (19.03.2013)
Старый 19.03.2013, 19:38   #5
ProGamer
AnyKey`щик
 
Аватар для ProGamer
 
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений
(для 7 пользователей)
Ответ: ввод текста в ксорсе

но и GetKey почему-то не работает (у меня она возвращает неправильный код),поэтому использовал KeyDown
(Offline)
 
Ответить с цитированием
Старый 19.03.2013, 20:20   #6
Spy4433
ПроЭктировщик
 
Аватар для Spy4433
 
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений
(для 63 пользователей)
Ответ: ввод текста в ксорсе

хм! а вы "x" не забыли подставить к Getkey?
у меня в проектах работает
__________________
форум эт вещь... и почему я раньше им не пользовался?

AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Кирпи4 (19.03.2013)
Старый 19.03.2013, 20:42   #7
Gector
Легенда
 
Аватар для Gector
 
Регистрация: 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 за это полезное сообщение:
Кирпи4 (19.03.2013), Nex (19.03.2013), ProGamer (19.03.2013), Reizel (19.03.2013), St_AnGer (19.03.2013)
Старый 19.03.2013, 20:57   #8
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 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
ProGamer
AnyKey`щик
 
Аватар для ProGamer
 
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений
(для 7 пользователей)
Ответ: ввод текста в ксорсе

хм! а вы "x" не забыли подставить к Getkey?
у меня в проектах работает
действительно работает
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ProGamer за это полезное сообщение:
Кирпи4 (19.03.2013), Gector (19.03.2013)
Старый 19.03.2013, 21:04   #10
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: ввод текста в ксорсе

Сообщение от ProGamer Посмотреть сообщение
действительно работает
Мне кажется код надо расширить для ввода БОЛЬШИХ букв
__________________


(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Gector (19.03.2013)
Старый 19.03.2013, 21:11   #11
ProGamer
AnyKey`щик
 
Аватар для ProGamer
 
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений
(для 7 пользователей)
Ответ: ввод текста в ксорсе

Мне кажется код надо расширить для ввода БОЛЬШИХ букв
да,ещё неплохо было-бы сделать возможность стирания
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ProGamer за это полезное сообщение:
Кирпи4 (19.03.2013), Gector (19.03.2013)
Старый 19.03.2013, 22:12   #12
ProGamer
AnyKey`щик
 
Аватар для ProGamer
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Кирпи4 (19.03.2013)
Старый 19.03.2013, 22:34   #13
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: ввод текста в ксорсе

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 100 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо Nex за это полезное сообщение:
Кирпи4 (20.03.2013), Gector (19.03.2013), Nikich (20.03.2013), Reizel (19.03.2013), St_AnGer (19.03.2013)
Старый 19.03.2013, 22:39   #14
Gector
Легенда
 
Аватар для Gector
 
Регистрация: 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
ProGamer
AnyKey`щик
 
Аватар для ProGamer
 
Регистрация: 16.03.2013
Сообщений: 7
Написано 4 полезных сообщений
(для 7 пользователей)
Ответ: ввод текста в ксорсе

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


Опции темы

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

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


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


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