(void Console :: execute ( const Strings str ) {
Array argv; String buf;
history -> insertNoRetain ( new String ( str ) );
curLine++; cursorPos = 0;
for ( int i = 0; i < str.getLength () ,- i++ ) {
char ch = str [i];
if ( СП == ' ' || СП == '\t' )
{
if ( buf.getLength () > 0 )
argv.insertNoRetain ( new String ( buf ) );
buf = "";
}
else
buf += ch;
}
if ( buf.getLength () > 0 )
argv.insertNoRetain ( new String ( buf ) );
if ( iexecuteHelp ( argv ) )
for ( Set : .- Iterator it = commands.getlterator (); !it.end (); ++it )
{
ConsoleCommand * com = (ConsoleCommand *) it.value ();
com -> execute ( argv, this );
}
}
Для передачи введенных символов контроллер будет просто передавать их консоли. Сама консоль решает, требует ли введенный символ обработки.
Для подключения консоли необходимо внести некоторые изменения в класс Controller, а именно добавить переменную console типа Console *, добавить создание и уничтожение консоли, а также передачу сообщений объекту консоли.
intController :: handleChar ( int ch )
{
console -> handleChar ( ch ) ; return controllerContinue;
}
intController :: handleKey ( int key, bool pressed ) {
if ( !pressed ) //we're interested only in presses
return controllerContinue;
if ( key == keyEsc I I key == keyFlO ) // check for quit command
Пишем портальный рендерер (часть 11)
return controllerQuit; console --> handleKey ( key, pressed ) ; return controllerContinue;
}
Также необходимо включить вызов console -> draw (view) для вывода консоли.
При создании контроллер автоматически создает консоль и добавляет объекты для поддержки ряда стандартных комнат, приводимых ниже.
setvidmode width height fullscreen [on I off] map map-file fov value
На рис. 8.1 приводится UML-диаграмма классов, используемых для работы консоли.
Обработка столкновений Еще одной возможностью, которую мы рассмотрим в этой главе, будет обработка столкновений игрока с гранями сцены.