PMG

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

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




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2006 14:11 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
Ну и где в этой программе функция WinMain??? То, что вы показали это заголовочный файл .h (Header file) а к нему нужен еще и файл с кодом программы .cpp.

В проекте к 1 главе книги 3 файла D3Utility.h

#ifndef __d3dUtilityH__
#define __d3dUtilityH__

#include <d3dx9.h>
#include <string>

namespace d3d
{
bool InitD3D(
HINSTANCE hInstance, // [in] Application instance.
int width, int height, // [in] Backbuffer dimensions.
bool windowed, // [in] Windowed (true)or full screen (false).
D3DDEVTYPE deviceType, // [in] HAL or REF
IDirect3DDevice9** device);// [out]The created device.

int EnterMsgLoop(
bool (*ptr_display)(float timeDelta));

LRESULT CALLBACK WndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);

template<class T> void Release(T t)
{
if( t )
{
t->Release();
t = 0;
}
}

template<class T> void Delete(T t)
{
if( t )
{
delete t;
t = 0;
}
}
}

#endif // __d3dUtilityH__

=======================================
d3utility.cpp

#include "d3dUtility.h"

bool d3d::InitD3D(
HINSTANCE hInstance,
int width, int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device)
{
//
// Create the main application window.
//

WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = "Direct3D9App";

if( !RegisterClass(&wc) )
{
::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
return false;
}

HWND hwnd = 0;
hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",
WS_EX_TOPMOST,
0, 0, width, height,
0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/);

if( !hwnd )
{
::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
return false;
}

::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);

//
// Init D3D:
//

HRESULT hr = 0;

// Step 1: Create the IDirect3D9 object.

IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

if( !d3d9 )
{
::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
return false;
}

// Step 2: Check for hardware vp.

D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.

D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

// Step 4: Create the device.

hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device type
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
device); // return created device

if( FAILED(hr) )
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);

if( FAILED(hr) )
{
d3d9->Release(); // done with d3d9 object
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
}

d3d9->Release(); // done with d3d9 object

return true;
}

int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) )
{
MSG msg;
::ZeroMemory(&msg, sizeof(MSG));

static float lastTime = (float)timeGetTime();

while(msg.message != WM_QUIT)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
float currTime = (float)timeGetTime();
float timeDelta = (currTime - lastTime)*0.001f;

ptr_display(timeDelta);

lastTime = currTime;
}
}
return msg.wParam;
}

===========================================

D3DInit.cpp

#include "d3dUtility.h"

//
// Globals
//

IDirect3DDevice9* Device = 0;

//
// Framework Functions
//

bool Setup()
{
// Nothing to setup in this sample.

return true;
}

void Cleanup()
{
// Nothing to cleanup in this sample.
}

bool Display(float timeDelta)
{
if( Device ) // Only use Device methods if we have a valid device.
{
// Instruct the device to set each pixel on the back buffer black -
// D3DCLEAR_TARGET: 0x00000000 (black) - and to set each pixel on
// the depth buffer to a value of 1.0 - D3DCLEAR_ZBUFFER: 1.0f.
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);

// Swap the back and front buffers.
Device->Present(0, 0, 0, 0);
}
return true;
}

//
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_DESTROY:
::PostQuitMessage(0);
break;

case WM_KEYDOWN:
if( wParam == VK_ESCAPE )
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

//
// WinMain
//
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
if(!d3d::InitD3D(hinstance,
640, 480, true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(0, "InitD3D() - FAILED", 0, 0);
return 0;
}

if(!Setup())
{
::MessageBox(0, "Setup() - FAILED", 0, 0);
return 0;
}

d3d::EnterMsgLoop( Display );

Cleanup();

Device->Release();

return 0;
}

Если пытаться скомпилировать кусок программы, выдранный из ее середины, то ничего удивительного, если он компилироваться не будет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2006 17:40 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 29 апр 2006 21:28
Сообщения: 404
А ну вобщем нето компилил. :D

_________________
С уважением,Блинов Андрей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2006 18:30 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 29 апр 2006 21:28
Сообщения: 404
Короче я нехрена с этим ДХ неразберусь :evil: буду писать под ОГЛ.Заново под VC++ буду свой двиг переписывать.Одно утишает в этой книги полезная инфа о математике. :D

_________________
С уважением,Блинов Андрей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2006 18:41 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
Вы думаете что для OpenGL функция WinMain и цикл обработки сообщений необязательны???? :o


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 28 июн 2006 00:52 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 29 апр 2006 21:28
Сообщения: 404
Цитата:
Вы думаете что для OpenGL функция WinMain и цикл обработки сообщений необязательны????

Нет я решил остатся в превычной для себя среде(ОГЛ) ДХ для меня полный лес. :D

_________________
С уважением,Блинов Андрей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 июн 2006 20:21 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 29 апр 2006 21:28
Сообщения: 404
Visual C++ отказуется компилить этот участок кода
Код:
Gluint   texture[2];
AUX_RGBImageRec* text[2];
GLvoid IV_BMPLoad()
{
text[0] = auxDIBImageLoad("Data/box.bmp");
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, text[0]->sizeX, text[0]->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, text[0]->data);
}

Errors
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(8) : error C2146: syntax error : missing ';' before identifier 'texture'
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(8) : error C2501: 'Gluint' : missing storage-class or type specifiers
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(8) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

inno.exe - 3 error(s), 0 warning(s)
Памагите :|

_________________
С уважением,Блинов Андрей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 июн 2006 20:43 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
Сразу видна одна ошибка - надо писать GLuint. Обратите внимание на регистр символов (какие буквы строчные, а какие заглавные) и учтите, что С++ чувствителен к регистру.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 01 июл 2006 11:12 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 29 апр 2006 21:28
Сообщения: 404
Исправил и получил.
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(23) : error C2373: 'text' : redefinition; different type modifiers
c:\program files\microsoft visual studio\vc98\include\fstream.h(161) : see declaration of 'text'
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(26) : error C2109: subscript requires array or pointer type
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(26) : error C2440: '=' : cannot convert from 'struct _AUX_RGBImageRec *' to 'class ios &(__cdecl *)(class ios &)'
There is no context in which this conversion is possible
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2109: subscript requires array or pointer type
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2227: left of '->sizeX' must point to class/struct/union
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2109: subscript requires array or pointer type
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2227: left of '->sizeY' must point to class/struct/union
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(32) : error C2109: subscript requires array or pointer type
c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(32) : error C2227: left of '->data' must point to class/struct/union
c:\program files\microsoft visual studio\vc98\include\i3d\igl.h(19) : warning C4305: 'argument' : truncation from 'const double' to 'float'
Error executing cl.exe.

inno.exe - 9 error(s), 1 warning(s)

_________________
С уважением,Блинов Андрей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 01 июл 2006 22:10 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
У вас два раза определена глобальная переменная text. Проверьте код /(поиск по слову text)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 мар 2007 04:46 
Не в сети
Новичок

Зарегистрирован: 02 мар 2007 03:38
Сообщения: 6
Откуда: Лапландия
Всем Привет!!!
Assassin, скажите, чем вызван ваш переход с Dev на VC?
я недавно начал изучать С++ и хотелось бы узнать мнения об этих средах разработок, в чём их плюсы и минусы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 25 мар 2007 22:15 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 29 апр 2006 21:28
Сообщения: 404
Gremoh, Go to Тема Више! 8)

_________________
С уважением,Блинов Андрей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: инструкции
СообщениеДобавлено: 01 янв 2008 18:03 
Не в сети
Новичок

Зарегистрирован: 01 янв 2008 17:59
Сообщения: 2
Разговор ушел куда-то в сторону, но позвольте привести выдержки из моих инструкций.

Как создать новый проект под VC++, имея *.H, *.CPP, *.RC файлы
==============================================================

Обычно лучше создать новый проект, чем переделывать старый.
При описанной методике создастся один каталог (как в примерах
из SDK), в нем все файлы-исходники и служебные файлы MS VC.
Нам понадобятся файлы *.CPP, *.H (включая RESOURCE.H), *.RC
из нашего проекта.

1. New | Workspace. Задать каталог (E:\PROJECTS) без подкаталога-
имени проекта! Ввести workspace name. Сохранить все и выйти.

2. Оно создает каталог, он совпадает с именем workspace. Перенести
из него все файлы в нужный каталог (например, из E:\PROJECTS\BrickFire
в E:\PROJECTS\3BrickFire).

3. Открыть *.DSW, New | Project. Выбрать Win32 Application.
Ввести project name. Выбрать радиокнопку "Add to current workspace".
Далее обязательно выбрать "An empty project" (чтобы не завелось
лишних *.CPP). Сохранить и выйти.

4. Перенести *.DSP файл из создавшегося подкаталога с именем проекта
в корневой. Открыть *.DSW. Выбрать *.DSP из нового места.

5. Добавить файлы *.CPP, *.H, *.RC из каталога (обычно это все файлы,
других в списке нет): R-click на "Source files" в дереве - Add files
to folder.

6. Alt-F7, General | Microsoft Foundation Classes: Not Using MFC.
(на всякий случай).

7. Alt-F7, Link | Object/library modules: в конец добавить строку
winmm.lib ddraw.lib dsound.lib
(для мультимедиа-таймеров, функций DDraw и DSound).
Если нужно, добавить
dplayx.lib dinput.lib
(для DirectPlay и DirectInput).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 01 янв 2008 18:09 
Не в сети
Новичок

Зарегистрирован: 01 янв 2008 17:59
Сообщения: 2
А вот уже про DevCPP:
-------------------------------------------------------------------
*.GZ разархивируются gzip-ом (прилагается), а *.TAR - WINZip-ом.

Для компиляции DirectX проекта необходимо:

1. Установить DevCPP - файл devcpp-4.9.9.2_nomingw_setup.exe
Не надо создавать кэши и прочее ненужное. Перезагрузиться.
Убрать иконку DevCPP из меню быстрого запуска.

2. Инсталлировать mingw (MinGW-3.1.0-1.exe) в ТУ ЖЕ ДИРЕКТОРИЮ !
Т.е. указать тот же путь для установки, что и для DevCPP.
Например, E:\DEVCPP\

3. Прописать каталог BIN этой директории в PATH (например, E:\DEVCPP\BIN)

4. Перезагрузиться. Запустить DevCPP. Щелкнуть Yes (на вопрос о Make).

5. Установить пак API Win32 (w32api-3.2.tar.gz). Но лучше взять архив
rar3: w32api-3.2.rar . Для этого просто разархивировать его, файлы из
каталогов INCLUDE и LIB просто скопировать поверх имеющихся
в соответствующих каталогах (например, E:\DEVCPP\include\ и
E:\DEVCPP\lib\).

6. Установить пак DirectX9. Для этого запустить IDE (DevCPP), меню
Tools ("Сервис") | Package Manager, кнопка Install.
Выбрать файл DirectX9[1].DevPak . Перезагрузиться.

7. Исправить некорректную библиотеку libdsound.a
Проще всего взять ее из данного дистрибутива из архива libdsound.rar
Или можно поступить так:
отредактировать dsound.def из каталога E:\DEVCPP\lib\Definitions
(убрать вручную символы подчеркивания из начала строк), запустить:

dlltool --input-def dsound.def --kill-at --output-lib libdsound.a

(утилита dlltool находится в каталоге \BIN, который мы прописали
в PATH), при этом в текущем каталоге должны находиться файлы
dsound.def и libdsound.a, в него же будет помещена исправленная
версия файла libdsound.a . Ее надо переместить в каталог \lib

8. Для создания проекта рекомендуется создать поддиректорию внутри
главного каталога, например, E:\DEVCPP\PROJECT . Поместить в нее
файл проекта *.DEV (если есть), файлы для создания ресурсов, если
нужно (*.BMP, *.WAV и прочие), файлы *.RC, *.C (*.CPP), *.H (*.HPP)

Если есть корректный проект (*.DEV), то открыть его и компилировать.

Есть возможность импортировать проект из проекта MS VC++. Для этого
выбрать "File | Import | Import MS Visual C++ project"
("Файл | Импорт | Импорт проекта MS Visual C++"),
выбрать конфигурацию (обычно это Release) и имя сохраняемого
проекта DevCpp.

9. Если проект собирается "с нуля", следует создать проект. Запустив
DevCPP, выбрать File | New | Project... (Файл | Создать | Проект...)
Выбрать Windows application. Войти в созданную директорию (\PROJECT)
и ввести имя файла проекта. Щелкнуть слева в дереве на имени проекта
правой кнопкой, выбрать "Add to Project" ("Добавить к проекту"), войти
в директорию \PROJECT, выбрать все файлы. Нажать кнопку "Сохранить все"
(две дискеты слева вверху).

Убрать файл main.cpp (оставшийся после создания) из проекта (правой
кнопкой на нем - "Remove File" / "Удалить файл"). Удалить его с диска.

Войти в
Project | Project Options , закладка "General"
(Проект | Параметры проекта , закладка "Общие")
и ввести имя проекта.

Затем надо войти в
Project | Project Options , закладка "Parameters"
(Проект | Параметры проекта , закладка "Параме...")
и выставить нужные библиотеки (правый список, "Linker") ("Компоновщик")
Можно редактировать строки руками, а можно нажать кнопку под ними
и выбрать из диалога. Потребуются следующие библиотеки:

- libwinmm.a (для функций мультимедиа-таймера, например, timeGetTime)
- libddraw.a (для DirectDraw)
- libole32.a (для CoInitialize и CoUninitialize)
- libdsound.a (для DirectSound)

Если исходники и проект лежат в поддиректории главной директории,
например, E:\DEVCPP\PROJECT, строки будут иметь вид:
../lib/libwinmm.a
../lib/libddraw.a
../lib/libdsound.a
../lib/libole32.a

Откомпилировать проект и запустить.

Воронов Олег Владимирович, 25.03.2005 г.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2

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


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

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


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

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