PMG

Форумы по созданию игр
Текущее время: 28 мар 2024 21:48

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: подключение консоли к проекту
СообщениеДобавлено: 14 авг 2014 11:31 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 03 июл 2014 07:49
Сообщения: 19
Откуда: Омск
Здравствуйте,
задался вопросом, как можно добавить консоль в проект,
что бы можно было прописывать команды, а программа их выполняла.
(например: вводишь"load model 1 ", программа показывала модель)
но возникла сложность как именно подключить консоль
или если без нее как захватывать напечатанный текст при исполнении самой программы.
(например: нажав на кнопку "Q" программа начинает записывать в переменную текст который печатает пользователь,
потом проверяет и выполняет заданную команду)
если знаете напишите пожалуйста


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: подключение консоли к проекту
СообщениеДобавлено: 15 авг 2014 09:27 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Бывает по принципу командной строки, бывает на основе языка программирования, например, Lua.
Есть исходники Doom или Quake в сети в них есть командная строка. Можно посмотреть в книге Микроарт, Хонич, Как самому создать трехмерную игру, 1996.
Смысл прост. Вводиться команда, она интерпретируется отдельной функцией, где каждой команде прописан свой код или своя функция, затем она вызывается с параметрами и вуаля.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: подключение консоли к проекту
СообщениеДобавлено: 15 авг 2014 13:15 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 03 июл 2014 07:49
Сообщения: 19
Откуда: Омск
большое спасибо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: подключение консоли к проекту
СообщениеДобавлено: 18 авг 2014 17:08 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 03 июл 2014 07:49
Сообщения: 19
Откуда: Омск
у меня получилось подключить консоль и через нее посылать команды в программу.
но через консоль неудобно хочу попробовать через саму программу,
т.е. при выполнении самой программы(без консоли) можно было задавать ей команды
(Например: нажав на определенную кнопку программа переключается на захват печатающего текста,
пользователь пишет команду, программа выполняет)
но вот как реализовать захват печатающегося текста в переменную не знаю
(единственное что нашел, что можно как-то через keyhandler )
если знаете напишите пожалуйста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: подключение консоли к проекту
СообщениеДобавлено: 19 авг 2014 10:12 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Да, вроде не тяжело. Можно через стандартный Windows диалог:
Код:
#include <windows.h>
#include <windowsx.h>
#include "resource.h"

BOOL   InitD3DRM(HWND hWnd, int full_win, int wid, int hei, int bit, int yes_hw);
void   ActivateD3DRM(WPARAM wParam);
void   RenderD3DRM();
void   SizeD3DRM(WPARAM wParam,LPARAM lParam);
void   PaintD3DRM();
void   DestroyD3DRM();

int st_full=1, st_win=0, st_next=0, wid=1024, hei=768, bit=32, st_hw=1, st_hel=0;

BOOL keys[256];      // Массив для процедуры обработки клавиатуры

BOOL mou_rbut;
BOOL mou_lbut;
int mou_y;
int mou_x;

LRESULT CALLBACK WndProc(
            HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam)
{
   switch (message)   // Тип сообщения
   {
      case WM_CREATE:
      {
         if ( InitD3DRM(hWnd,st_full,wid,hei,bit, st_hw)==0 )
         {
            MessageBox(0,"Ошибка инициализации D3DRM.","Ошибка",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
         }
         break;
      }

      case WM_DESTROY:
      case WM_CLOSE:
      {
         DestroyD3DRM();
         PostQuitMessage(0);
         break;
      }

      case WM_KEYDOWN:
      {
         if ( wParam==VK_ESCAPE )
         {
            DestroyD3DRM();
            PostQuitMessage(0);
            break;
         }
         keys[wParam] = TRUE;
         break;
      }

      case WM_KEYUP:
      {
         keys[wParam] = FALSE;
         break;
      }

        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
        case WM_RBUTTONDOWN:
        case WM_RBUTTONUP:
        case WM_MOUSEMOVE:
        {
            mou_lbut = (wParam&MK_LBUTTON?TRUE:FALSE);
            mou_rbut = (wParam&MK_RBUTTON?TRUE:FALSE);
            mou_x = LOWORD(lParam);
            mou_y = HIWORD(lParam);
            break;
        }

      case WM_SIZE:
      {
         SizeD3DRM(wParam,lParam);
         break;
      }

      case WM_ACTIVATE:
      {
         ActivateD3DRM(wParam);
         break;
      }

      case WM_PAINT:
      {
         PaintD3DRM();
         break;
      }

      default:
         return (DefWindowProc(hWnd, message, wParam, lParam));
   }
   return (0);
}


void start_win ( HINSTANCE hinstExe )
{
   MSG      msg;   // Структура сообщения Windows
   WNDCLASS   wc; // Структура класса Windows для установки типа окна
   HWND      hWnd;// Сохранение дискриптора окна
   DWORD      dwStyle;

   wc.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
   wc.lpfnWndProc      = (WNDPROC) WndProc;
   wc.cbClsExtra      = 0;
   wc.cbWndExtra      = 0;
   wc.hInstance      = hinstExe;
   wc.hIcon         = NULL;
   wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);
   wc.lpszMenuName      = NULL;
   wc.lpszClassName   = "D3DRM WinClass";

   if(!RegisterClass(&wc))
   {
      MessageBox(0,"Ошибка регистрации класса окна.","Ошибка",MB_OK|MB_ICONERROR);
      return;
   }

   if ( st_full==1 )
      dwStyle=WS_POPUP;
   else
      dwStyle=WS_OVERLAPPEDWINDOW;

   hWnd = CreateWindow(
      "D3DRM WinClass",
      "Пример D3DRM",   // Заголовок вверху окна
      dwStyle | WS_CLIPCHILDREN |   WS_CLIPSIBLINGS,
      0, 0,         // Позиция окна на экране
      wid, hei,      // Ширина и высота окна
      NULL, NULL, hinstExe, NULL);

   if(!hWnd)
   {
      MessageBox(0,"Ошибка создания окна.","Ошибка",MB_OK|MB_ICONERROR);
      return;
   }

   ShowWindow(hWnd, SW_SHOW);
   UpdateWindow(hWnd);
   SetFocus(hWnd);

   while (1)
   {
      if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
      {
         if ( GetMessage(&msg, NULL, 0, 0) )
         {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
         }
         else return;
      }
      RenderD3DRM();
   }

}



BOOL DlgInit
   ( HWND hwnd, HWND hwndFocus, LPARAM lParam )
{
   SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_SETCHECK, st_full, 0);
   SendDlgItemMessage(hwnd, IDC_RADIO_WIN , BM_SETCHECK, st_win , 0);
   SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_SETCHECK, st_hw, 0);
   SendDlgItemMessage(hwnd, IDC_RADIO_HEL , BM_SETCHECK, st_hel, 0);

//   SendDlgItemMessage(hwnd, IDC_COMBO1 , CB_ADDSTRING, 0, (LPARAM)"1");

   return TRUE;
}

void   DlgCommand
   ( HWND hwnd, int id, HWND hwndCtl, UINT codeNotify )
{
   switch ( id )
   {
   case IDC_NEXT :
   {
      st_full=SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_GETCHECK, 0, 0);
      st_win =SendDlgItemMessage(hwnd, IDC_RADIO_WIN , BM_GETCHECK, 0, 0);
      st_hw=SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_GETCHECK, 0, 0);
      st_hel =SendDlgItemMessage(hwnd, IDC_RADIO_HEL , BM_GETCHECK, 0, 0);
      st_next=1;
      EndDialog(hwnd,id);
      break;
   }
   case IDC_QUIT :
   {
      st_next=0;
      EndDialog(hwnd,id);
      break;
   }
   case IDC_RADIO_FULL:
   {
      st_full=SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_GETCHECK, 0, 0);
      st_win=0;
      break;
   }
   case IDC_RADIO_WIN:
   {
      st_win=SendDlgItemMessage(hwnd, IDC_RADIO_WIN, BM_GETCHECK, 0, 0);
      st_full=0;
      break;
   }
   case IDC_RADIO_HW:
   {
      st_hw=SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_GETCHECK, 0, 0);
      st_hel=0;
      break;
   }
   case IDC_RADIO_HEL:
   {
      st_hel=SendDlgItemMessage(hwnd, IDC_RADIO_HEL, BM_GETCHECK, 0, 0);
      st_hw=0;
      break;
   }
   }
   SendDlgItemMessage(hwnd, IDC_RADIO_FULL, BM_SETCHECK, st_full, 0);
   SendDlgItemMessage(hwnd, IDC_RADIO_WIN , BM_SETCHECK, st_win , 0);
   SendDlgItemMessage(hwnd, IDC_RADIO_HW, BM_SETCHECK, st_hw, 0);
   SendDlgItemMessage(hwnd, IDC_RADIO_HEL , BM_SETCHECK, st_hel, 0);
}

BOOL   CALLBACK   Dlg_Proc
   ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
   BOOL rc=TRUE;

   switch ( uMsg )
   {
      HANDLE_MSG ( hDlg, WM_INITDIALOG, DlgInit );
      HANDLE_MSG ( hDlg, WM_COMMAND, DlgCommand );
   default:
      rc=FALSE;
      break;
   }
   return rc;
}

   // Головная процедура определяющая диалог

int   WINAPI WinMain
   ( HINSTANCE hinstExe, HINSTANCE hinstPrev,
   LPSTR lpszCmdLine, int nCmdShow )
{
   DialogBox ( hinstExe, MAKEINTRESOURCE(IDD_SCREEN), NULL, Dlg_Proc);
   if ( st_next==1 ) start_win(hinstExe);
   return 0;
}


А в OGL можно через сообщения case WM_KEYDOWN и WM_KEYUP.
https://www.opengl.org/discussion_board ... for-OpenGL

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: подключение консоли к проекту
СообщениеДобавлено: 22 авг 2014 09:31 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 03 июл 2014 07:49
Сообщения: 19
Откуда: Омск
огромное спасибо :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB