ria pc game
fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Dragonella игра версия 17.09.2020 браузерная /скачиваемая
Многоликий: dress - hordes win/linux/android/html5 игра браузерная /скачиваемая
Вакансии
Игродельня
Сегодня
19 марта 2024 11:30
Вход Регистрация Забыли пароль ?

megainformatic - Приобрести эмулятор игры Электроника ИМ-04 Веселый Повар версия от 3.07.2019
7.07.2019 эмулятор игры Электроника ИМ-04 Веселый Повар версия от 7.07.2019 обновление. Внесены небольшие исправления связанные с поведением игры после загрузки ранее сохраненной игры. При загрузке сохраненной игры может появляться несколько падающих единиц еды в одном потоке, что сильно усложняет игру. Теперь это исправлено. 4.07.2019 эмулятор игры Электроника ИМ-04 Веселы
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic cms express files

megainformatic - Уроки Photoshop - Чудеса

megainformatic cms express files - Развертывание сайта на Вашем хостинге

megainformatic - Настольная игра "Веселый Буквоежка"

megainformatic - Уроки delphi directx 8.1

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения.

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения. Страница 2

megainformatic - Урок 2 Создаем и обрабатываем команды меню.

megainformatic - Урок 2 Создаем и обрабатываем команды меню. Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 3

megainformatic - Урок 4 Построение класса приложения

megainformatic - Урок 4 Построение класса приложения - Страница 2

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов - Страница 2

megainformatic - Урок 6 Игровая логика

megainformatic - Заметки по joomla - JFolder::create: Path not in open_basedir paths. Что это?

megainformatic cms express files - Добавление статей на сайт под управлением megainfromatic cms express files

megainformatic - Урок 7 2D-анимация

megainformatic - Урок 8 Загрузка/Сохранение текущей игры, режим паузы, режимы часов/будильника, запуск браузера Internet Explorer для показа сайта разработчика и других интернет-ресурсов

megainformatic - Урок 9 Тестирование и отладка приложения

megainformatic - Мои Музыкальные Миры

megainformatic - уроки Photoshop free

megainformatic cms express

megainformatic cms express

megainformatic cms express

megainformatic cms express files

megainformatic - Методы создания растровых изображений в Adobe Photoshop

megainformatic - Создание фотореалистичной текстуры травы

megainformatic - Рабочее пространство Adobe Photoshop

megainformatic - Бесшовные (тайловые) текстуры

megainformatic - Создание изображений огня, воды, неба

megainformatic - Создание текстур горных пород и суши (урок 5)

megainformatic - Рисование персонажей (урок 6)

megainformatic - Рисование фона (урок 6 часть 2)

megainformatic - Рельефные изображения

Добавление статей на сайт под управлением megainformatic cms express

megainformatic - Воспроизведение файлов в форматах it, xm, s3m, mod

megainformatic - Воспроизведение файлов в форматах it, xm, s3m, mod - страница 2

megainformatic - Воспроизведение в игре музыки в формате XM

megainformatic - Воспроизведение файлов в формате OGG Vorbis

megainformatic - игра "Веселый Буквоежка" - инструменты разработки

megainformatic - Игра "Веселый Буквоежка" - история создания проекта

megainformatic - Как анимировать паука ?

megainformatic - Уроки Photoshop

megainformatic - Купить Уроки Photoshop - Чудеса

megainformatic - Купить Уроки Photoshop - Рисуем и Анимируем

megainformatic - Приобрести эмулятор игры Электроника ИМ-04 Веселый Повар версия от 3.07.2019

сайт megainformatic - Говорящий Комикс Веселый Буквоежка

megainformatic - Что нужно для создания собственного сайта ?

megainformatic - Моделируем девушку в 3d используя 3ds max

megainformatic - Уроки Fruity Loops Studio - пишем свою музыку

megainformatic - Уроки Fruity Loops Studio - пишем свою музыку - урок 1 - Быстрый старт

megainformatic - Сброник статей по дизайну и компьютерной графике. Обзор.

megainformatic - Уроки 3d на delphi directx - Вывод Заставки

 

Программирование игр на С++ для платформы DirectX 9c

 
     
  Написание приложения DirectX9c + MFC в среде MSVS 2005  
     
 

Данный урок является введением в программирование на C++ в MSVS 2008

Вам нужно иметь установленную среду Microsoft Visual Studio 2005 или 2008 (можно триал),

и DirectX SDK 9 версии, или лучше самой последней - DirectX SDK August 2008.

 
     
  [назад] [далее] [к содержанию]  
     
 

Причины побудившие меня к написанию данной серии статей достаточно просты - поделиться своим опытом в области создания игр на VC++ в среде MSVS 2005 для DirectX 9c

В данном уроке я попытаюсь рассказать о том, как подойти к созданию приложения сочетающего использование интерфейсов DirectX 9c и классов из библиотеки MFC

 
     
 

Начнём с того, что в DirectX SDK August 2008 не представлен ни один из примеров приложения, рассчитанного на совместное использование DirectX и классов MFC.

По видимому предполагается, что тема достаточно тривиальна для тех, кто работает с DirectX

Однако мне это представляется не совсем так.

Зачем Вам в приложении DirectX могут понадобится классы MFC?

Во-первых, MFC содержит целый ряд просто необходимых классов, а значит и решения тех стандартных задач, которые трудно решить на голом WinAPI.

В частности если Ваше приложение DirectX подразумевает работу в стандартном окне и является какой-либо утилитой используемой в разработке Вашей игры (например редактор карт), то без использования MFC Вам просто не обойтись.

Во-вторых, даже если Ваша игра будет большую часть времени работать в полноэкранном режиме, классы MFC Вам всё равно понадобятся для решение многих типовых задач.

Именно базируясь на этих двух причинах следует рассмотреть как подойти к совместному использованию DirectX и MFC в своём приложении.

 
     
 

Для простоты мы разберем некий базис - шаблон приложения, рассчитанного на DirectX9c + MFC

Последовательность создания приложения D3D9 (DirectX 9c) + MFC
в MSVS 2005

File > New > Project > MFC > MFC Application

опции
Dialog based
язык - Английский (США) - потом поменяем на русский (при создании диалогов и изменении
их свойств)
MFC standard
Use MFC in a static library
Use Unicode libraries
остальные опции на своё усмотрение или по-умолчанию

После генерации приложения нужно настроить проект для использования заголовочных
файлов и библиотек DirectX 9c как это показано в уроке Первый старт

Добавить исходный код из DXUT - это набор вспомогательного кода, который Вы найдете внутри [DirectXSDK]\Samples\C++\DXUT\

Код данной папки ориентирован на использование в WinAPI-приложении без использования MFC

Для использования в MFC-проекте код потребует небольших модификаций во всех файлах *.cpp из папок Core и Optional нужно добавить строку #include "stdafx.h" перед строкой #include "DXUT.h" в самом начале каждого файла. Для простоты создайте копию содержимого папки DXUT, назвав например DXUT_mfc и смело вносите эти изменения. После этих изменений в качестве заголовочного файла управляющего прекомпилированными модулями будет задан stdafx.h что и имеет место в созданном Вами MFC-приложении, в противном случае Вы получите ошибки во время компиляции.

Код папки DXUT_mfc нужно добавить к коду проекта - в окне Solution Explorer щелкните правой кнопкой по названию проекта, выберите Add > New Filter, который назовите DXUT_mfc.

 
     
   
     
 

и добавьте все файлы из папки DXUT_mfc кроме DXUTguiIME.* и ImeUi.*

Данные файлы относятся к использованию национальных языков и Вам пока не потребуются.

 
     
 

Добавить шаблонный код для начальной инициализации типового D3D9 - приложения

Рассмотрим что нужно добавить на примере проекта D3DAppTemplate

В модуле D3DAppTemplate.h нужно внести следующие изменения и дополнения -

#include <d3d9.h>
#include <d3dx9.h>

#include "D3DAppTemplateDlg.h"

внутри описания класса class CD3DAppTemplateApp

~CD3DAppTemplateApp();

в конце описания класса

public:
CD3DAppTemplateDlg* pMainWindow;

В модуле D3DAppTemplate.cpp

#include "DXUT.h"
#include "DXUTcamera.h"
#include "DXUTsettingsdlg.h"
#include "SDKmisc.h"
#include "SDKsound.h"

 

 

//--------------------------------------------------------------------------------------
// Global variables
//--------------------------------------------------------------------------------------

ID3DXFont* g_pFont = NULL; // Font for drawing text
ID3DXSprite* g_pTextSprite = NULL; // Sprite for batching draw text calls
CFirstPersonCamera g_Camera; // A model viewing camera
CSoundManager g_DSound; // DirectSound class

bool g_bShowHelp = true; // If true, it renders the UI control text
bool g_bPlaySounds = true; // whether to play sounds
double g_fLastAnimTime = 0.0; // Time for the animations


//--------------------------------------------------------------------------------------
// Forward declarations
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed,
void* pUserContext );
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext );
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext );
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext );
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext );
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
void* pUserContext );
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext );
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
void CALLBACK OnLostDevice( void* pUserContext );
void CALLBACK OnDestroyDevice( void* pUserContext );
void RenderText();

void InitApp();

void InitialD3DAppSettings();

 

CD3DAppTemplateApp::CD3DAppTemplateApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
pMainWindow = NULL;
}

 

 

BOOL CD3DAppTemplateApp::InitInstance()
{
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();

// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization
SetRegistryKey(_T("Local AppWizard-Generated Applications"));

 

pMainWindow = new CD3DAppTemplateDlg();
pMainWindow->Create(CD3DAppTemplateDlg::IDD);
pMainWindow->ShowWindow(SW_SHOW);
pMainWindow->ShowWindow(SW_HIDE);

m_pMainWnd = pMainWindow;

InitialD3DAppSettings();

//g_d3dApp.Cleanup3DEnvironment();

delete pMainWindow;

pMainWindow = NULL;

// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}

 

void InitialD3DAppSettings()
{
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

// Set the callback functions. These functions allow DXUT to notify
// the application about device changes, user input, and windows messages. The
// callbacks are optional so you need only set callbacks for events you're interested
// in. However, if you don't handle the device reset/lost callbacks then the sample
// framework won't be able to reset your device since the application must first
// release all device resources before resetting. Likewise, if you don't handle the
// device created/destroyed callbacks then DXUT won't be able to
// recreate your device resources.
DXUTSetCallbackD3D9DeviceAcceptable( IsDeviceAcceptable );
DXUTSetCallbackD3D9DeviceCreated( OnCreateDevice );
DXUTSetCallbackD3D9DeviceReset( OnResetDevice );
DXUTSetCallbackD3D9FrameRender( OnFrameRender );
DXUTSetCallbackD3D9DeviceLost( OnLostDevice );
DXUTSetCallbackD3D9DeviceDestroyed( OnDestroyDevice );

DXUTSetCallbackMsgProc( MsgProc );

DXUTSetCallbackKeyboard( KeyboardProc );
DXUTSetCallbackFrameMove( OnFrameMove );
DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );

// Show the cursor and clip it when in full screen
DXUTSetCursorSettings( true, true );

InitApp();

// Initialize DXUT and create the desired Win32 window and Direct3D
// device for the application. Calling each of these functions is optional, but they
// allow you to set several options which control the behavior of the framework.
DXUTInit( true, true ); // Parse the command line and show msgboxes
DXUTSetHotkeyHandling( true, true, true ); // handle the defaul hotkeys

/*DXUTCreateWindow( L"D3D9 App Template", 0, 0, LoadMenu(0,
MAKEINTRESOURCE(IDR_MAINMENU)) );*/
DXUTCreateWindow( L"D3D9 App Template", 0, 0, 0);

SetWindowLong( DXUTGetHWND(), GWL_STYLE,
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX);

// We need to set up DirectSound after we have a window.
g_DSound.Initialize( DXUTGetHWND(), DSSCL_PRIORITY );


DXUTCreateDevice( true, 631, 380 );

//InitD3DApp();

// Pass control to DXUT for handling the message pump and
// dispatching render calls. DXUT will call your FrameMove
// and FrameRender callback when there is idle time between handling window messages.
DXUTMainLoop();

// Perform any application-level cleanup here. Direct3D device resources are released within the
// appropriate callback functions and therefore don't require any cleanup code here.

//return DXUTGetExitCode();
}

//--------------------------------------------------------------------------------------
// Initialize the app
//--------------------------------------------------------------------------------------
void InitApp()
{
// Add mixed vp to the available vp choices in device settings dialog.
DXUTGetD3D9Enumeration()->SetPossibleVertexProcessingList( true, false, false, true );

// Setup the camera with view matrix
D3DXVECTOR3 vEye( .5f, .55f, -.2f );
D3DXVECTOR3 vAt( .5f, .125f, .5f );
g_Camera.SetViewParams( &vEye, &vAt );
g_Camera.SetScalers( 0.01f, 1.0f ); // Camera movement parameters

}


//--------------------------------------------------------------------------------------
// Called during device initialization, this code checks the device for some
// minimum set of capabilities, and rejects those that don't pass by returning false.
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )
{
// Skip backbuffer formats that don't support alpha blending
IDirect3D9* pD3D = DXUTGetD3D9Object();
if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
return false;

// Need to support ps 2.0
if( pCaps->PixelShaderVersion < D3DPS_VERSION( 2, 0 ) )
return false;

// Need to support A8R8G8B8 textures
if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
AdapterFormat, 0,
D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8 ) ) )
return false;

return true;
}

//--------------------------------------------------------------------------------------
// This callback function is called immediately before a device is created to allow the
// application to modify the device settings. The supplied pDeviceSettings parameter
// contains the settings that the framework has selected for the new device, and the
// application can make any desired changes directly to this structure. Note however that
// DXUT will not correct invalid device settings so care must be taken
// to return valid device settings, otherwise IDirect3D9::CreateDevice() will fail.
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext )
{
assert( DXUT_D3D9_DEVICE == pDeviceSettings->ver );

HRESULT hr;
IDirect3D9* pD3D = DXUTGetD3D9Object();
D3DCAPS9 caps;

V( pD3D->GetDeviceCaps( pDeviceSettings->d3d9.AdapterOrdinal,
pDeviceSettings->d3d9.DeviceType,
&caps ) );

// If device doesn't support HW T&L or doesn't support 1.1 vertex shaders in HW
// then switch to SWVP.
if( ( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) == 0 ||
caps.VertexShaderVersion < D3DVS_VERSION( 1, 1 ) )
{
pDeviceSettings->d3d9.BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}

// If the hardware cannot do vertex blending, use software vertex processing.
if( caps.MaxVertexBlendMatrices < 2 )
pDeviceSettings->d3d9.BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

// If using hardware vertex processing, change to mixed vertex processing
// so there is a fallback.
if( pDeviceSettings->d3d9.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING )
pDeviceSettings->d3d9.BehaviorFlags = D3DCREATE_MIXED_VERTEXPROCESSING;

// Debugging vertex shaders requires either REF or software vertex processing
// and debugging pixel shaders requires REF.
#ifdef DEBUG_VS
if( pDeviceSettings->d3d9.DeviceType != D3DDEVTYPE_REF )
{
pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_PUREDEVICE;
pDeviceSettings->d3d9.BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
#endif
#ifdef DEBUG_PS
pDeviceSettings->d3d9.DeviceType = D3DDEVTYPE_REF;
#endif
// For the first device created if its a REF device, optionally display a warning dialog box
static bool s_bFirstTime = true;
if( s_bFirstTime )
{
s_bFirstTime = false;
if( pDeviceSettings->d3d9.DeviceType == D3DDEVTYPE_REF )
DXUTDisplaySwitchingToREFWarning( pDeviceSettings->ver );
}

return true;
}


//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has been
// created, which will happen during application initialization and windowed/full screen
// toggles. This is the best location to create D3DPOOL_MANAGED resources since these
// resources need to be reloaded whenever the device is destroyed. Resources created
// here should be released in the OnDestroyDevice callback.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext )
{
HRESULT hr;



// Initialize the font

V_RETURN( D3DXCreateFont( pd3dDevice, 10, 0, 0, 1, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
L"MS Sans Serif ", &g_pFont ) );



// Define DEBUG_VS and/or DEBUG_PS to debug vertex and/or pixel shaders with the
// shader debugger. Debugging vertex shaders requires either REF or software vertex
// processing, and debugging pixel shaders requires REF. The
// D3DXSHADER_FORCE_*_SOFTWARE_NOOPT flag improves the debug experience in the
// shader debugger. It enables source level debugging, prevents instruction
// reordering, prevents dead code elimination, and forces the compiler to compile
// against the next higher available software target, which ensures that the
// unoptimized shaders do not exceed the shader model limitations. Setting these
// flags will cause slower rendering since the shaders will be unoptimized and
// forced into software. See the DirectX documentation for more information about
// using the shader debugger.
DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE;

#if defined( DEBUG ) || defined( _DEBUG )
// Set the D3DXSHADER_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3DXSHADER_DEBUG;
#endif

#ifdef DEBUG_VS
dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT;
#endif
#ifdef DEBUG_PS
dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT;
#endif

return S_OK;
}


//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has been
// reset, which will happen after a lost device scenario. This is the best location to
// create D3DPOOL_DEFAULT resources since these resources need to be reloaded whenever
// the device is lost. Resources created here should be released in the OnLostDevice
// callback.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice,
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
HRESULT hr;


// get device caps
D3DCAPS9 caps;
pd3dDevice->GetDeviceCaps( &caps );


if( g_pFont )
V_RETURN( g_pFont->OnResetDevice() );


// Create a sprite to help batch calls when drawing many lines of text
V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );

// Setup the camera's projection parameters
float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height;
g_Camera.SetProjParams( D3DX_PI / 3, fAspectRatio, 0.001f, 100.0f );

// set lighting
pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
pd3dDevice->SetRenderState( D3DRS_AMBIENT, D3DCOLOR_ARGB( 255, 255, 255, 255 ) );
pd3dDevice->LightEnable( 0, TRUE );
pd3dDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );


// reset the timer
g_fLastAnimTime = DXUTGetGlobalTimer()->GetTime();

return S_OK;
}

//--------------------------------------------------------------------------------------
// This callback function will be called once at the beginning of every frame. This is the
// best location for your application to handle updates to the scene, but is not
// intended to contain actual rendering calls, which should instead be placed in the
// OnFrameRender callback.
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{

g_fLastAnimTime = fTime;

// Update the camera's position based on user input
g_Camera.FrameMove( fElapsedTime );


}


//--------------------------------------------------------------------------------------
// This callback function will be called at the end of every frame to perform all the
// rendering calls for the scene, and it will also be called if the window needs to be
// repainted. After this function has returned, DXUT will call
// IDirect3DDevice9::Present to display the contents of the next buffer in the swap chain
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{

pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
0xFFA1E1FF, 1.0f, 0L );

if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{

//
// Output text information
//
RenderText();

pd3dDevice->EndScene();
}
}


//--------------------------------------------------------------------------------------
// Render the help and statistics text. This function uses the ID3DXFont interface for
// efficient text rendering.
//--------------------------------------------------------------------------------------
void RenderText()
{
// The helper object simply helps keep track of text position, and color
// and then it calls pFont->DrawText( m_pSprite, strMsg, -1, &rc, DT_NOCLIP, m_clr );
// If NULL is passed in as the sprite object, then it will work however the
// pFont->DrawText() will not be batched together. Batching calls will improves performance.
CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 10 );
const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetD3D9BackBufferSurfaceDesc();

// Output statistics
txtHelper.Begin();
txtHelper.SetInsertionPos( 5, 5 );
txtHelper.SetForegroundColor( 0xFF0000FF );


txtHelper.DrawTextLine( DXUTGetFrameStats( true ) );

txtHelper.End();
}


//--------------------------------------------------------------------------------------
// As a convenience, DXUT inspects the incoming windows messages for
// keystroke messages and decodes the message parameters to pass relevant keyboard
// messages to the application. The framework does not remove the underlying keystroke
// messages, which are still passed to the application's MsgProc callback.
//--------------------------------------------------------------------------------------
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
{
if( bKeyDown )
{
switch( nChar )
{
case VK_F1:
g_bShowHelp = !g_bShowHelp; break;
}
}
}


//--------------------------------------------------------------------------------------
// Before handling window messages, DXUT passes incoming windows
// messages to the application through this callback function. If the application sets
// *pbNoFurtherProcessing to TRUE, then DXUT will not process this message.
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
void* pUserContext )
{


g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );

return 0;
}


//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has
// been destroyed, which generally happens as a result of application termination or
// windowed/full screen toggles. Resources created in the OnCreateDevice callback
// should be released here, which generally includes all D3DPOOL_MANAGED resources.
//--------------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{

SAFE_RELEASE( g_pFont );

//g_d3dApp.Cleanup3DEnvironment(); //методы освобождения ресурсов нужно вызывать именно

//здесь. В данном примере g_d3dApp - объект игрового приложения не используется, поэтому он здесь закомментирован. В приложении с игрой освобождение ресурсов происходит именно так.
}

//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has
// entered a lost state and before IDirect3DDevice9::Reset is called. Resources created
// in the OnResetDevice callback should be released here, which generally includes all
// D3DPOOL_DEFAULT resources. See the "Lost Devices" section of the documentation for
// information about lost devices.
//--------------------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{

if( g_pFont )
g_pFont->OnLostDevice();

SAFE_RELEASE( g_pTextSprite );




}

 
     
  Этот же код вы найдете внутри модулей D3DAppTemplate.h и D3DAppTemplate.cpp в проекте D3DAppTemplate -  
     
  Исходный код приложения D3DAppTemplate - 269 Кб, архив WinRaR 3.3 - Исходный код приложения D3DAppTemplate - 270 Кб, архив WinRaR 3.3  
     
  Особенностью работы данного приложения является то, что в качестве первоначального (главного) окна используется стандартное окно диалога. Это окно создается как немодальное (modeless), затем оно отображается и тут же скрывается, уступая очередь созданному окну DirectX-приложения  
     
  Схема функционирования выглядит следующим образом -  
     
   
     
 

В начале создается объект класса CD3DAppTemplateApp путём вызова его конструктора

CD3DAppTemplateApз();

Затем вызывается метод InitInstance() внутри которого и осуществляется вся ицициализация, касающаяся mfc и directx.

Вместо созданного модального диалога, содержащего кнопки OK и Cancel создается немодальное окно, которое отображается и тут же скрывается, а далее вызывается функция InitialD3DAppSettings() которая отвечает за всё дальнейшее связанное с directx.

Для настройки directx вызывается функция InitialD3DAppSettings(); Внутри неё происходит настройка directx, создание окна directx-приложения и запуск цикла очереди сообщений вызовом функции DXUTMainLoop(); Как это реализовано в деталях - смотри выше или в исходном коде проекта D3DAppTemplate

Далее все необходимые сообщения системы можно обрабатывать внутри функции MsgProc, а собственно игровую логику и отрисовку игровой сцены производить внутри функций OnFrameMove и OnFrameRender

При выходе из приложения вызовом exit() или PostQuitMessage DXUTMainLoop завершается, управление возвращается внутрь метода InitInstance, метод возвращает FALSE, что свидетельстует о ненужности запуска цикла очереди сообщений и приложение закрывается. При уничтожении вызывается метод деструктора ~CD3DAppTemplateApp() внутри которого удаляется созданный объект немодального главного окна приложения.

 
     
 

Особенность данного решения поставленной задачи: mfc + directx9c в простоте реализации.

Недостаток состоит в том, что требуется использование вспомогательного окна, которое в целом никак не используется - лишь отображается, а затем скрывается. Но использование его требуется по той причине, что класс CWinApp в своём свойстве m_pMainWnd обязательно требует окна производного от CWnd, каковым окно приложения, создаваемое для directx-приложения средствами WinAPI не является.

Можно конечно предложить более сложный способ - использовать главное окно для целей directx, однако это значительно усложнит задачу, потребуя сильных изменений в реализации функции InitialD3DAppSettings() главным образом для использования готового окна, а не его создания, переделки DXUTMainLoop для работы исходя из очереди сообщений прокачиваемых через методы CWinApp и некоторые другие.

 
     
 

Моей целью было предложить Вам достаточно простой способ совместного использования directx9c и mfc и я считаю, что таковой и предложил Вам. По мере накопления Вами опыта в программирования на directx + mfc Вы, возможно, найдете для себя более оптимальные решения, еще более подходящие для Ваших нужд.

Так что желаю Вам всяческих успехов на этом поприще.

Сам же я, являясь по-сути Delphi DirectX - программистом вот уже начиная с далекого 2002 года, могу сказать, что использование для этих целей VC++ не намного сложнее, а в чём-то даже проще. Но то, что Вы выберете для использования с DirectX - C++ или Delphi будет всецело зависеть от Ваших возможностей в настоящем времени, главным образом касающихся наличия у Вас под рукой той или иной среды программирования BDS (Borland Developer Studio) или MSVS (Microsoft Visual Studio) и опыта в работе с ними.

При желании Вам всегда можно будет перейти с C++ на Delphi и наоборот, как это имело место в моём случае.

 
     
 

Так что же лучше Delphi или C++ ???

- Решать Вам!

 
     
     
     
     
     
     
  [назад] [далее] [к содержанию]  
оцените статью:
0
Понравилось!
0
Не понравилось!


     
  видео-рассказ, уроки godot
#442 незнакомка / stranger girl - видео-рассказ
играть
Осваиваем движок godot 3.4
читать
   
   
     
     
  игры Многоликий: dress - hordes эпизоды с 1 по 4
Многоликий: dress - hordes эпизод 1 - win/linux/android/html5 скачать free версию, купить полную версию, играть в браузере
играть
Многоликий: dress - hordes эпизод 2 - win/linux/android/html5 скачать free версию, купить полную версию, играть в браузере
скачать
Многоликий: dress - hordes эпизод 3 - win/linux/android/html5 скачать free версию, купить полную версию, играть в браузере
купить
Многоликий: dress - hordes эпизод 4 - win/linux/android/html5 скачать free версию, купить полную версию, играть в браузере
купить
   
     
  игры, музыкальные клипы
enterra игра на java libgdx - скачать
скачать
enterra 3d игра на godot 3.5.1 - скачать
скачать
Музыкальная новогодняя ночь 2023
смотреть
Многоликий: dress - hordes win/linux/android/html5 version - скачать или играть в браузере
скачать/играть
   
     
     
     
     
  музыкальный клип, игры
Kate Ryan - Ella Elle L'a клип смотреть
смотреть
sexonix играть в браузере
играть
Многоликий: dress - hordes pc игра free версия - скачать
скачать
Многоликий: dress - приключения начинаются - parallel reality - скачать - версия для Win, Linux, браузерная и android
скачать
   
     
     
     
  разработка игр, анимационный фильм, новогодняя дискотека 2020 - песни на итальянском, игра про лифт
разработка игры gdess 2 видео-дневники разработки
смотреть
Игра Дарвина смотреть
смотреть
ciao 2020 - чао 2020 - новогодняя дискотека в итальянском стиле от Ивана Урганта и компании
смотреть
One Way The Elevator проходим игру вместе с Dr. Perec !!!
смотреть
   
     
     
  игры, инструменты разработки, анимационный фильм, фильм.
БОЛЬШАЯ ИГРА или СЕКРЕТЫ УСПЕХА которых вы можете достичь сами - уникальный набор инструментов, игровых движков (на delphi, c++, html5), проектов, обучающих уроков и материалов, исходных кодов реальных игр и многое другое - все создано 1 человеком - представлен накопленный за 14 лет опыт
купить
Астра затерянная в космосе смотреть
смотреть
Костя Ника Время Лета 2006 фильм смотреть онлайн
смотреть
Временной поток - игра в жанре визуальной новеллы - скачать
скачать
   
     
     
  игры
Witches Trainer 1.6 and Innocent Witches 0.1 - Школа ведьм и Невинные ведьмы - игра скачать
скачать
Futa in the Police Academy - игра скачать
скачать
gdess cкачать игру про Нику и Костю
скачать
gdess2 приобрести игру про Нику и Костю
купить
   
     
  игры в браузере
Prince of Persia аркада, фихтование, экшн, adventure в браузере
играть
Dreams Reality Мечты и Реальность играть в браузере
играть
Little Office Trouble Небольшая Офисная Оказия играть в браузере
играть
Tetris в браузере
играть
   
     
     
  игры в браузере
Neon Battle Tank 2 аркада в браузере
играть
Robocop аркада в браузере
играть
Robocop (Ocean версия) аркада в браузере
играть
Karateka аркада, драки в браузере
играть
   
     
     
  игры в браузере
Prehistorik 2 - аркада в браузере
играть
Игры с конкурса Код 15 - посмотреть стримы The Dreik, megainformatic, Котострим, скачать игры
играть
Большая игра Mega game играть в браузере
играть
Black planet Черная планета - играть в браузере, почитать о её разработке
играть
   
     
     
  игры в браузере
Teenage Mutant Ninja Turtles II аркада в браузере
играть
2 nights играть в браузере
играть
Wolfenstein 3D - экшн в браузере
играть
Golden Axe - экшн в браузере
играть
   
     
     
  игры в браузере (3), создание музыки в браузере (1)
Aladdin аркада в браузере
играть
Surprise! Adlib Tracker 2 (sadt 2) в браузере
играть
Lamborghini аркада, гонки в браузере
играть
Risky Woods аркада в браузере
играть
   
     
     
  игры в браузере
Black Box horror играть в браузере
играть
Любовные булавки logic играть в браузере
играть
Fire power игра про танки в браузере
играть
Red Ball Forever аркада играть в браузере
играть
   
     
     
  игры в браузере
Teresa - dos эро квест в браузере
играть
Shadow Knights аркада про ниндзя в браузере
играть
БК-0010.01 эмулятор теперь браузере
бк 0010.01 - играть!
The Cycles - International Grand Prix Racing играть в браузере
играть
   
     
     
  игры в браузере
Fantastic Dizzy adventure игра в браузере
играть
Ugh! аркадная игра в браузере
играть
Budokan: The Martial Spirit - fighting играть в браузере
играть
Vida - ретро эротический квест в браузере
играть
   
     
     
  игры в браузере (3), скачиваемые (1)
Легендарный Starcraft теперь в вашем браузере
играть
Inspace космический скролл шутер игра в браузере
играть
Key shield аркадная игра в браузере
играть
Team Ninja Unkende 4 - Ninja Gaiden 4 фанатский проект pc игра скачать
скачать
   
     
     
  игры в браузере
Laser Adventures - fast hardcore shooter играть в браузере
играть
Петька и Чапай спасают галактику продолжение !!! играть в браузере
играть
Ninjuzi - прыгучий neo shooter игра в браузере
играть
Plants vs Zombies 3 tower defence игра в браузере
играть
   
     
  игры в браузере, скачиваемые игры
Shmupnage - cosmos shooter играть в браузере
играть
Undercat pc игра скачать
скачать
Cold station - shooter, survival играть в браузере
играть
Cut the rope - аркада, логика играть в браузере
играть
   
     
     
  игры в браузере
Crown Dungeon 2 играть в браузере
играть
dragonella играть в браузере
играть
crush shooter играть в браузере
играть
grievous medical shooter играть в браузере
играть
   
     
     
  игры в браузере
Foxyland 2 играть в браузере
Foxyland 2
quidget 2 играть в браузере
quidget 2
эмулятор игры Ну, Погоди !
играть
Pigglet игра русская версия, english версия играть в браузере
играть
   
     
  полезный софт, игры в браузере
Google Media Grabber - Простая и компактная программа для скачивания картинок из гугл
скачать
Anova играть в браузере
anova игра
A Knots Story играть в браузере
A Knots Story
Sabotage играть в браузере
sabotage
   
     
  сервисы, игры
Онлайн Сервис для приема фото в печать с предварительной обработкой
24500 руб.
satellite / спутник - визуальная новелла полная версия
скачать
ria pc game robocop
игра
star inheritance звездное наследие игра zx spectrum
играть
   
     
  игры, программы
ria pc game - pink dreams come true - розовые мечты сбываются
купить / скачать
эмулятор игры Электроника ИМ Автослалом версия 24.09.2019
купить
Онлайн чат для вашего сайта - megainformatic live chat
5500 руб.
Game Builder - Строитель Игр
скачать
   
     
  поздравления, уроки рисования, уроки создания сайтов
НОВОГОДНЕЕ ОБРАЩЕНИЕ СОЗДАТЕЛЯ Мега Информатик К ЖИТЕЛЯМ ПЛАНЕТЫ интернет
читать
Рисуем красивую девушку всего за 6 шагов
читать
Что нужно знать для создания сайта ?
читать
Нэн - интерактивный комикс
150 руб.
   
     
  комиксы, музыка, рассказы
Приключения Кости Коробкина - С новым годом - интерактивный комикс (kk hny) - онлайн комикс
читать
Костя Коробкин - СЕКРЕТНЫЙ ПРОЕКТ - интерактивный комикс (kk scp) - онлайн комикс
читать
Новогодняя дискотека 2013 на megainformatic точка ru
слушать
Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА
читать
   
     
  игра для разработки, калькулятор услуг, cms, комикс
комплект freeware игра Шарики на лифте / Balls on lif + Как создать игру / How make a game
250 руб.
Калькулятор рассчёта стоимости услуг зубопротезирования для стоматологической клиники
разработка на заказ
Система управления сайтом megainformatic cms admin files без mysql только на файлах
1250 руб.
Приключения Кости Коробкина - Как я провел лето - интерактивный комикс (akk hiss)
350 руб.
   
     
  игры для разработки, комиксы
dream world - пример 2d игры созданной на fle game engine - c++ и directx 9
скачать
Костя Коробкин - Компания Зергов (kk kz) - онлайн комикс
читать
Веселый Буквоежка - онлайн комикс
читать
Создание игры на fle game engine - Simple game
скачать
   
     
  игры шарики и ямки, комиксы про Костю Коробкина, ria xxl игра, fly snow 3d генератор эффектов снега, частиц и др. -
игра Шарики и Ямки - Каникулы Зеленого Шарика PC / Balls and Holes - Green Ball Holidays PC game
скачать
Костя Коробкин Комикс читать онлайн
читать
ria xxl - версия 4.09.2019 купить
150 руб.
fle game generator - fle генератор игр - fly snow 3d падающий снег версия 1.0.3.1 от 13.12.2016 - расширяемый генератор визуальных образов и игр
350 руб.
 
     
  Создай свою игру на fle game engine -
fle game engine новый современный движок для создания игр на платформе Windows Directx 9c - которая поддерживается большинством ПК
800 руб.
Риа PC игра / Ria PC game
240 руб./скачать
игра Шарики на лифте Серия 1 Разгони Лифт / Balls on Lift Level 1 Run The Lift версия 0.9.2 05.10.2016 / version 0.9.2 05.10.2016
скачать
скачать
 
     
  Для создания сайта - модуль отзывов/комментариев для вашего сайта в составе megainformatic cms express files -
Модуль отзывов/комментариев для вашего сайта
700 руб.
Модуль коротких ссылок
1250 руб.
larry xxl фан проект купить версия 4.09.2019
150 руб.
эмулятор игры Электроника ИМ-04 Веселый Повар версия от 7.07.2019
500 руб.
 
     
  Уроки Flash, бесплатные Flash - игры.
Уроки Flash
бесплатно
бесплатные flash игры
бесплатно
Модуль галерей для любой cms
2500 руб.
megainformatic cms rs
14000 руб.
 
     
  Поддержка сайтом нескольких языков (multi lang), создание собственной системы личных кабинетов, соц. сети или фриланс - биржи (megainformatic cms social), создание сервиса коллективных покупок на базе megainformatic cms groupon, онлайн сервис подсчёта статистики ключевых слов в статьях вашего сайта keywords gen + описание кода данного сервиса, с возможностью бесплатно реализовать его аналог на своём собственном сайте.
Поддержка сайтом нескольких языков
500 руб.
megainformatic cms social
12000 руб.
megainformatic cms groupon
14000 руб.
Онлайн - сервис подсчёта статистики ключевых слов
бесплатно

megainformatic.ru/webjob/ - сервис для фриланс проектов - место встречи заказчиков и исполнителей

 
 

Социальная сеть megainformatic.ru/webjob/

megainformatic.ru/webjob/
webjob
веселая математика
бесплатно
template selector
350 руб.
megainformatic cms express files + модуль slider
300 руб.

megainformatic.ru/webjob/ - сервис для фриланс проектов - место встречи заказчиков и исполнителей

 
     
 

Системы управления сайтом, уроки

megainformatic cms admin
1250 руб.
уроки delphi direct x 3d
бесплатно
megainformatic cms seo
550 руб.
megainformatic cms stat kit
500 руб.

megainformatic cms admin - простая и компактная система для работы и управления сайтом

 
     
 
megainformatic cms express
350 руб.
megainformatic cms e-mailer
5800 руб.
megainformatic cms e-shop
3000 руб.
megainformatic cms e-pro
500 руб.
 
 
 
 
     
     
 

megainformatic cms free и серия продуктов - Уроки Photoshop

megainformatic cms free
бесплатно
уроки photoshop
650 руб.
уроки photoshop - чудеса !
700 руб.
уроки photoshop -  рисуем и анимируем
750 руб.

Данная серия посвящена описанию приемов и методов создания изображений, с помощью инструментария программы Adobe Photoshop. Кроме того, многие описанные средства могут вам помочь при освоении и многих других программ для работы с растровой графикой - GIMP, Corel Photo Paint и других.

 

 
 
     
 

бесплатные игры 2d и 3d, а также эмулятор Ну, Погоди!

эмулятор игры Ну, Погоди !
300 руб.
Дорога в Город
бесплатно
Donuts 3D
бесплатно
Нечто: Необъяснимое
бесплатно

Это серия распространяемых бесплатно игр. Вы не только можете поиграть, но и скачать исходники, получив тем самым возможность внести изменения в игру или создать новую !!! (эмулятор Ну, Погоди! распространяется платно).

 
     
 
 
 
     
 

серия игр про Веселого Буквоежку, и бесплатно распространяемая игра Нечто: Необъяснимое - в плену желаний

Говорящий комикс - Веселый Буквоежка
350 руб.
Настольная игра - Веселый Буквоежка
510 руб.
Как создать игру ? Программируем сами
fle game engine
Нечто: Необъяснимое - в плену желаний
бесплатно

Здесь представлены новинки жанра - Говорящий Комикс, Настольная игра, А также продукт, который позволит Вам научиться создавать игры самостоятельно. Ну и конечно изюминка в своём роде - бесплатная игра - Нечто: Необъяснимое - в плену желаний

 
     
 
 
 
     
 

Серия бесплатных онлайн уроков, посвященных 3ds max, photoshop, c++, directx, delphi и php.

Уроки 3ds max
бесплатно
Уроки c++ и directx
бесплатно
Уроки трекерской музыки
бесплатно
Рисуем волка
бесплатно
Уроки php и создания сайтов
бесплатно
Пример 3d игры на delphi directx с исходниками
бесплатно
Набор разработчика игр
500 руб.
Ваше Визуальное шоу
300 руб.

Описаны практические примеры решения различных задач, возникающих при создании игр и сайтов.

Продукты Набор разработчика и Ваше Визуальное Шоу распространяются платно.

 
     
 
 
 
     
     
 

уроки и продукты различной тематики

Как создать игру Ну, Погоди! на delphi directx
бесплатно
Музыкальные миры CJ andy - моя авторская музыка mp3
бесплатно
Уроки Photoshop free (Свободно распространяемые)
бесплатно
megainformatic cms express - Ваш Персональный Сайт на php + my sql
400 руб.

Бесплатные Уроки Photoshop free, Бесплатные Уроки по программированию на delphi directx - Как создать игру Ну, Погоди!, Бесплатная Авторская музыка в формате mp3 - Музыкальные Миры, Платно распространяемый продукт megainformatic cms express - система для быстрого создания Вашего сайта на php + my sql.

 
     
 
 
 
     
 

Проекты игр, уроки

Игра Веселый Буквоежка
450 руб.
Уроки Delphi Directx 8.1
бесплатно
Моделируем девушку в 3d studio max
бесплатно
Уроки музыки в FL Studio
бесплатно

Игра Веселый Буквоежка, уроки delphi directx 8.1 для начинающих (описываются основы 3d игр), моделируем девушку в 3d studio max, уроки музыки - пишем музыку в Fruity Loops Studio

 
     
 
 
 
     
     
     
 
megainformatic cms express files

Быстрая и Компактная Система Управления Вашим Сайтом - megainformatic cms express files

megainformatic cms express files - это простое, быстрое и очень компактное решение для создания первого вашего сайта. НЕ ИСПОЛЬЗУЕТ базы данных mysql. Вместо этого используются файловые базы данных. Поэтому Вы можете использовать систему даже на хостинге с поддержкой php, но без поддержки баз данных my sql.

Очень проста в установке - достаточно вам скопировать все файлы на ваш хостинг и сайт готов к работе !!!

В комплект входят 3 готовых шаблона, модули поиска и карты сайта, а также статьи по основам создания сайта.

Подробнее...

 
 

Оставленные комментарии


fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
Quidget 2 игра в браузере - русская версия, english версия
megainformatic Размещение баннерной рекламы у нас
megainformatic live chat
Начать беседу
X
Время загрузки: 0,0909