forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   Atlantis Engine (http://forum.boolean.name/showthread.php?t=7721)

FDsagizi 04.03.2009 07:45

Ответ: Atlantis Engine
 
NitE Быть не идеотом - этого мало!

Lost 05.03.2009 01:27

Ответ: Atlantis Engine
 
Скромное обновление:
* Создание текстур
* Рендеринг в текстуру (будет доделано завтра)
* Добавлен класс для рендеринга aRenderTexture (тонюсенькая обвертка сюрфейса в дх, тем не менее создает впечатление целостности сего процесса:) )

З.Ы. Пофиксены мелкие баги и ошибки.

-Алеллуйа-
А теперь настало время для 2х мини демок

1. Стресс тест
Нету множества оптимизаций но тем не менее очень интересно сколько выжмет фпс и запуститься ли вообще:rolleyes: . В сцене 4096 кубов + текстура 515х512х24 с сжатием ДХТ1.

http://lostgamestudio.ucoz.ru/load/0-0-0-9-20

1. Небольшой тест гуя и физикса
Сцена - статический физ обьект, лампочки - джоинты, кубики - боксы, меню - панельки и кнопочки. Аналогично первому ждем замечаний окромя камеры с ней много проблем...ее вращает по ролл оси постоянно, пока не могу починить никак...уж извините.

http://lostgamestudio.ucoz.ru/load/0-0-0-10-20

Управление:
Mouse Right + move mouse - вращать камеру (она будет так некрасиво кренится =()
W S - двигать перса - инвалида
Mouse Left - пуляет ящичек

HolyDel 05.03.2009 01:48

Ответ: Atlantis Engine
 
1. стресс-тест
когда пусто - 320-327 фпс
когда примерно половина - 80 фпс
когда все - 27-28 фпс
когда выходишь - выдает ошибку
вот логи:
Цитата:

'Atlantis Engine' build 1154, Mar 5 2009

* Инициализация...

[ INFO 00:46:44 ]: * Инициализация рендера
[ INFO 00:46:44 ]: Инициализация Direct3D
[ INFO 00:46:44 ]: Создание окна
[ INFO 00:46:44 ]: NVIDIA GeForce 9600M GS nvd3dum.dll 7. 15. 11. 7948
[ INFO 00:46:45 ]: Direct3D успешно инициализирован
[ INFO 00:46:46 ]: * Инициализация менеджера физики
[ INFO 00:46:46 ]: * Инициализация менеджера файлов
[ INFO 00:46:46 ]: * Инициализация менеджера ресурсов
[ INFO 00:46:46 ]: * Инициализация менеджера интерфейса
[ INFO 00:46:46 ]: * Инициализация менеджера сцены
[ INFO 00:46:46 ]: * Инициализация менеджера рендеринга
[ INFO 00:46:46 ]: * Инициализация таймера
[ INFO 00:47:28 ]: * Деинициализация менеджера рендеринга
2. Небольшой тест гуя и физикса
1. Впринципе не особо заметно, но на курсоре чучуть кривовато натянута текстура (сверху показана часть низа). юзай ClampToEdge в настройках фильтра.
2. кнопки работают отлично!
3. фпс окола 1200, но картинка кажется почему то дерганой (физика обновляется не каждый кадр?)
4. такая-же ошибка при выходе.

Lost 05.03.2009 11:38

Ответ: Atlantis Engine
 
Большое спасибо за тест! С обновлением физики нужно немного поиграться, очень странно откуда взялась ошибка, у меня все ровно, приду домой - буду искать причину.

FDsagizi 05.03.2009 12:39

Ответ: Atlantis Engine
 
Смотрел второй тест

вобщем.

Вруструм режит кубики жестко, бывает что видно как они исчезают.
Лампы есть, но должны ли они испускать свет- хм, не испускают =)
так же падает при выходе. Интересно, по чему не юзать (exit(1) ? )

Lost 05.03.2009 12:54

Ответ: Atlantis Engine
 
Фрустум самый нбычный, лампочка светит только 1 и то плохо видно из-за высокого амбиента, с вылетом разберусь дома, у меня всегда норм работало, вчера поздно было, торопился, может чего забыл.

-=Jack=- 05.03.2009 17:23

Ответ: Atlantis Engine
 
НИОДНА из дэмок не запускается. Не первая не эти 2.

Lost 05.03.2009 18:36

Ответ: Atlantis Engine
 
Цитата:

Сообщение от -=Jack=- (Сообщение 99621)
НИОДНА из дэмок не запускается. Не первая не эти 2.

А лог нельзя? Предполагаю,что проблема в том, что вы не установили драйвера на физикс (не ниже версии 2.8.1.).

Lost 05.03.2009 19:02

Ответ: Atlantis Engine
 
Патчик для второй демки (где лампочки)
По идее должны быть исправлены баги с дерганьем физики (но возможны и другие баги), а вот вылет уже попробуйте..должно все работать....у меня и без патча не вылетало а коректно завершалась программа

http://slil.ru/27025249

-=Jack=- 06.03.2009 14:07

Ответ: Atlantis Engine
 
Цитата:

Сообщение от Lost (Сообщение 99636)
А лог нельзя? Предполагаю,что проблема в том, что вы не установили драйвера на физикс (не ниже версии 2.8.1.).

'Atlantis Engine' build 2215, Jan 28 2009

* Initializing Engine...

[ INFO 12:06:23 ]: * Timer is successfull initialized
[ INFO 12:06:23 ]: Сreate window...OK
[ INFO 12:06:23 ]: Initialize Direct3D...OK
[ INFO 12:06:23 ]: * Render Manager is successfull initialized
[ INFO 12:06:23 ]: * File Manager is successfull initialized
[ INFO 12:06:23 ]: * Resource Manager is successfull initialized
[ INFO 12:06:24 ]: * Physics is successfull initialized
[ INFO 12:06:24 ]: * Scene Manager is successfull initialized
[ INFO 12:06:24 ]: Create font "Arial" "arial"
[ INFO 12:06:24 ]: Create camera "default"
[ INFO 12:06:24 ]: Load texture "media/tiles_bump.jpg" "tiles_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/act_lenin_bump.jpg" "act_lenin_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/crete_beton_3_bump.jpg" "crete_beton_3_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/grnd_shlak_02_bump.jpg" "grnd_shlak_02_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/mtl_colored_alum_bump.jpg" "mtl_colored_alum_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/priboi_crap_greydust_bump.jpg" "priboi_crap_greydust_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/ston_beton_ch_09_bump.jpg" "ston_beton_ch_09_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/ston_bordur_bump.jpg" "ston_bordur_bump"
[ INFO 12:06:24 ]: Load texture "media/lenin/ston_oblicovka_gr05_bump.jpg" "ston_oblicovka_gr05_bump"
[ INFO 12:06:24 ]: Load texture "media/ae_256x256.jpg" "ae_256x256"
[ INFO 12:06:24 ]: Load effect "media/shadowmapping.fx" "shadowmapping"
[ INFO 12:06:24 ]: Create texture "shadow_tex"
[ INFO 12:06:24 ]: Create render texture "shadow_rt"
[ INFO 12:06:24 ]: Create depth stencil texture "shadow_rt"
[ INFO 12:06:25 ]: Load mesh "media/lenin/lenin.x"
[ INFO 12:06:25 ]: Create material "grnd_shlak_02"
[ INFO 12:06:26 ]: Load texture "media\lenin\grnd_shlak_02.jpg" "grnd_shlak_02"
[ INFO 12:06:26 ]: Create material "crete_beton_3"
[ INFO 12:06:26 ]: Load texture "media\lenin\crete_beton_3.jpg" "crete_beton_3"
[ INFO 12:06:26 ]: Create material "ston_beton_ch_09"
[ INFO 12:06:26 ]: Load texture "media\lenin\ston_beton_ch_09.jpg" "ston_beton_ch_09"
[ INFO 12:06:26 ]: Create material "ston_oblicovka_gr05"
[ INFO 12:06:26 ]: Load texture "media\lenin\ston_oblicovka_gr05.jpg" "ston_oblicovka_gr05"
[ INFO 12:06:26 ]: Create material "mtl_colored_alum"
[ INFO 12:06:26 ]: Load texture "media\lenin\mtl_colored_alum.jpg" "mtl_colored_alum"
[ INFO 12:06:26 ]: Create material "act_lenin"
[ INFO 12:06:26 ]: Load texture "media\lenin\act_lenin.jpg" "act_lenin"
[ INFO 12:06:26 ]: Create material "priboi_crap_greydust"
[ INFO 12:06:26 ]: Load texture "media\lenin\priboi_crap_greydust.jpg" "priboi_crap_greydust"
[ INFO 12:06:26 ]: Create material "priboi_crap_greydust"
[ INFO 12:06:26 ]: Create material "ston_bordur"
[ INFO 12:06:26 ]: Load texture "media\lenin\ston_bordur.jpg" "ston_bordur"
[ INFO 12:06:26 ]: Create entity "media/lenin/lenin.x" "lenin"
[ INFO 12:06:27 ]: Create light "light1"
[ INFO 12:06:27 ]: Load mesh "media/sphere.x"
[ INFO 12:06:27 ]: Create material "ae_256x256"
[ INFO 12:06:27 ]: Load texture "media\ae_256x256.jpg" "ae_256x256"
[ INFO 12:06:27 ]: Create entity "media/sphere.x" "sphere"



Физикс стоит. Кстать, последние 2 демки заработали :)

Lost 06.03.2009 15:05

Ответ: Atlantis Engine
 
-=Jack=-
Поставь патч должно помочь, ссылка на второй странице

-=Jack=- 06.03.2009 16:34

Ответ: Atlantis Engine
 
Да всё норм :)
Выглядит отлично = )
Но нашел пару глюков:
1. Глюки с феструмом (когда объект не виден пропалают тени, а иногда даже объект пропадает, когда он виден о_О)
2. http://i007.radikal.ru/0903/39/8c87f9f71ae1.jpg

Кстать, не мог бы показать исходник(самого примера)? Хотелось бы увидеть код и оценить его удобство понятность ;)

Lost 06.03.2009 17:04

Ответ: Atlantis Engine
 
Сейчас движок переработал с нуля, но вот сорец с второй демки (с лампочками)

Код:

//=========================================================================
// Atlantis Engine
// All Rights Reserved 2008
//
//
// Email: [email protected]
// ICQ: 284-298-113
//=========================================================================
#include<windowsx.h>
#include"resource.h"
#include"Atlantis.h"
 
// Обьекты
aFont* fontTahoma;
aFont* fontFPS;
// Уровень 1
aEntity* entLevel01;
aTexture2D* texLevel01_lm;
NxActor* actLevel01;
aEntity* entLight;
aLight* light;
aEntity* entLamp1;
aEntity* entLamp2;
// Игрок
aCamera* camPlayer;
aEntity* entPlayer;
NxActor* actPlayer;
float fPlayerMoveSpeed = 4.0f;// 1 - default
bool isMouseRight = false;
aEntity* entWeapon_vintorez;
// Интерфейс
aPanel* panCursor;
aPanel* panBackground;
aButton* butStart;
aButton* butExit;
 
 
// Устанавливает параметры джоинта
void setJointParameters(NxJointDesc &desc, NxActor* _pActor1, NxActor* _pActor2, aVector3 _vecPos)
{
desc.setToDefault();
desc.actor[0] = _pActor1;
desc.actor[1] = _pActor2;
desc.setGlobalAnchor(Vec3ToNxVec3(_vecPos));
}
// Создает подвесную лампочку и возвращает указатель на енити лампы
aEntity* createJointLamp(aString _strModel, aVector3 _vecPosJoint, aVector3 _vecPosActor)
{
aEntity* entity = SceneManager.createEntity(_strModel);
NxActor* actor = PhysicManager.createActor(PHYSIC_CONVEX, entity);
actor->wakeUp(true);
actor->setGlobalPosition(Vec3ToNxVec3(_vecPosActor));
actor->setLinearDamping(0.3f);
actor->setAngularDamping(0.3f);
 
NxSphericalJointDesc desc;
desc.setToDefault();
desc.actor[0] = actor;
desc.actor[1] = NULL;
NxJoint* joint = PhysicManager.createJoint(desc);
joint->setGlobalAnchor(Vec3ToNxVec3(_vecPosJoint));
return entity;
}
// Рендерит линии джоинтов
void renderJointLines()
{
Render.renderLine(aVector3(-4.5f, 3.1f, 0), entLamp1->getPos(), aColor(0, 0, 255));
Render.renderLine(aVector3(-3.5f, 3.1f, 0), entLamp2->getPos(), aColor(0, 0, 255));
Render.renderLine(aVector3(-2.5f, 3.1f, 0), entLight->getPos(), aColor(0, 0, 255));
}
// Создает сцену
void createScene()
{
// заргужаем 1й уровень
entLevel01 = SceneManager.createEntity("media/meshes/l01_test.x");
entLevel01->setScale(aVector3(0.05f, 0.05f, 0.05f));
actLevel01 = PhysicManager.createActor(PHYSIC_STATIC, entLevel01);
// заргужаем и назначаем ему лайтмапу
texLevel01_lm = ResourceManager.loadTexture("media/textures/l01_test_lm.tga");
entLevel01->setTexture(TEXTURE_LIGHTMAP, 0, texLevel01_lm);
 
// подвесим пару лампочек на джоинтах
entLamp1 = createJointLamp("media/meshes/lamp.x", aVector3(-4.5f, 3.1f, 0), aVector3(-4.5f, 2.3f, 0));
entLamp2 = createJointLamp("media/meshes/lamp.x", aVector3(-3.5f, 3.1f, 0), aVector3(-3.5f, 2.3f, 0));
// реальный источник освещения :)
entLight = createJointLamp("media/meshes/lamp.x", aVector3(-2.5f, 3.1f, 0), aVector3(-2.5f, 2.3f, 0));
light = SceneManager.createLight(LIGHT_POINT);
light->setColor(aColor(255, 255, 255));
light->setRange(15.0f);
// создаем камеру
camPlayer = SceneManager.createCamera();
camPlayer->setFOV(0.80f);
camPlayer->setNearPlane(0.1f);
SceneManager.setCamera(camPlayer);
// создаем игрока
entPlayer = SceneManager.createEntity("media/meshes/box.x");
entPlayer->setScale(aVector3(0.1f, 0.1f, 0.1f));
entPlayer->resetFlag(ENTITY_VISIBLE);
actPlayer = PhysicManager.createActor(PHYSIC_BOX, entPlayer);
actPlayer->setGlobalPosition(NxVec3(10, 1, 0));
// разрешаем поворачивать меш только по оси X и Y
// чтобы не переворачивался
actPlayer->raiseBodyFlag(NX_BF_FROZEN_ROT_X);
actPlayer->raiseBodyFlag(NX_BF_FROZEN_ROT_Y);
actPlayer->raiseBodyFlag(NX_BF_FROZEN_ROT_Z);
// прикрепляем оружие к игроку
//entWeapon_vintorez = SceneManager.createEntity("media/meshes/wpn_vss.x");
//entWeapon_vintorez->setScale(aVector3(0.1f, 0.1f, 0.1f));
//entWeapon_vintorez->setPos(aVector3(10, 1, 0));
/*
aEntity* boxes[1024];
int j = 0;
for (int i = 0; i < 32; i++)
{
for (j = 0; j < 32; j++)
{
boxes[i] = SceneManager.createEntity("media/meshes/box.x");
boxes[i]->setScale(aVector3(0.3f, 0.3f, 0.3f));
boxes[i]->setPos(aVector3(2.0f * i, 0.0f, 2.0f * j));
}
}
*/
}
// Обновляет игрока
void updatePlayer()
{
aVector2 force = DX9Render.getMouseForce();
if (DX9Render.mouseLeft())
{
camPlayer->rotateYaw(force.x / 5);
camPlayer->rotatePitch(force.y / 5);
}
// двигаем игрока за камерой
aVector3 vecCamPos = NxVec3ToVec3(actPlayer->getGlobalPosition());
vecCamPos.y += 0.5f;
camPlayer->setPos(vecCamPos);
// направление камеры
aVector3 vecMove = camPlayer->getDir();
// двигает игрока вперед
if (DX9Render.keyDown(KEY_W))
{
actPlayer->setLinearVelocity(NxVec3(vecMove.x * fPlayerMoveSpeed, vecMove.y, vecMove.z * fPlayerMoveSpeed));
}
// назад
if (DX9Render.keyDown(KEY_S))
{
actPlayer->setLinearVelocity(NxVec3(-vecMove.x * fPlayerMoveSpeed, vecMove.y, -vecMove.z * fPlayerMoveSpeed));
}
// на правую кнопку мыши бросаем кубик
if (DX9Render.mouseRight() == true && isMouseRight == false)
{
aEntity* ent = SceneManager.createEntity("media/meshes/box.x");
ent->setScale(aVector3(0.3f, 0.3f, 0.3f));
//ent->setFlag(ENTITY_TRANSLUCENT);// use alpha channel
aVector3 dir = camPlayer->getDir();
aVector3 force = dir * 1500;
NxActor* act = PhysicManager.createActor(PHYSIC_CONVEX, ent);
act->setGlobalPosition(Vec3ToNxVec3(camPlayer->getPos()));
act->addForce(Vec3ToNxVec3(force), NX_FORCE, false);
isMouseRight = true;
}
if (!DX9Render.mouseRight() && isMouseRight)
{
isMouseRight = false;
}
//entWeapon_vintorez->setPos(camPlayer->getPos());
//entWeapon_vintorez->setDir(camPlayer->getDir());
}
// Показывает меню
void showMenu()
{
panBackground->setFlag(GUI_VISIBLE);
butStart->setFlag(GUI_VISIBLE);
butExit->setFlag(GUI_VISIBLE);
}
// Прячет меню
void hideMenu()
{
panBackground->resetFlag(GUI_VISIBLE);
butStart->resetFlag(GUI_VISIBLE);
butExit->resetFlag(GUI_VISIBLE);
}
// Закрывает игру
void exitGame()
{
exit(0);
}
// Вызывается при наведении на кнопочку
void onTouch_start() {butStart->setFlag(GUI_COLORED);}
void onTouch_exit() {butExit->setFlag(GUI_COLORED);}
// Вызывается при снятии курсора с кнопки
void onLeave_start() {butStart->resetFlag(GUI_COLORED);}
void onLeave_exit() {butExit->resetFlag(GUI_COLORED);}
 
// Создает интерфейс
void createInterface()
{
// информация
fontTahoma = GUIManager.createFont("Tahoma", 14);
fontTahoma->setText("Everybody lies... (c) House MD");
// курсор
panCursor = GUIManager.createPanel("media/ui/cursor.dds");
panCursor->setFlag(GUI_TRANSLUCENT);
panCursor->setLayer(999);
// фон меню
panBackground = GUIManager.createPanel("media/ui/lost_bg.jpg");
panBackground->setLayer(1);
panBackground->setWidth(1024);
panBackground->setHeight(768);
// кнопка "Enter The Island"
butStart = GUIManager.createButton("media/ui/button_01.bmp");
butStart->setLayer(2);
butStart->setWidth(128);
butStart->setHeight(32);
butStart->setPos(aVector2((DX9Render.getWidth() - butStart->getWidth()) / 2, (DX9Render.getHeight() - butStart->getHeight()) / 2));
butStart->setOnEvent(GUI_EVENT_CLICK_LEFT, hideMenu);
butStart->setOnEvent(GUI_EVENT_TOUCH, onTouch_start);
butStart->setOnEvent(GUI_EVENT_LEAVE, onLeave_start);
butStart->addDigit(12, 8, fontTahoma, aColor(255, 255, 255), "Enter The Island");
butStart->setColor(aColor(255, 128, 128));
// кнопка "Exit"
butExit = GUIManager.createButton("media/ui/button_01.bmp");
butExit->setLayer(2);
butExit->setWidth(128);
butExit->setHeight(32);
butExit->setPos(aVector2(butStart->getPos().x, butStart->getPos().y + 64));
butExit->setOnEvent(GUI_EVENT_CLICK_LEFT, exitGame);
butExit->setOnEvent(GUI_EVENT_TOUCH, onTouch_exit);
butExit->setOnEvent(GUI_EVENT_LEAVE, onLeave_exit);
butExit->addDigit(52, 8, fontTahoma, aColor(255, 255, 255), "Exit");
butExit->setColor(aColor(128, 128, 255));
// TEST0: создание текстуры
//aTexture2D* texCreated = ResourceManager.createTexture(256, 256, D3DFMT_A8B8G8R8);
//butExit->setOnEventTexture(GUI_EVENT_LEAVE, texCreated);
}
// Обновляет интерфейс
void updateInterface()
{
panCursor->setPos(DX9Render.getMousePos());
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// инициализация
Render.init(1024, 768, 32, false, false);
DX9Render.setTitle("Everybody lies... (c) House MD");
ShowCursor(false);
// выключаем дебаг режим
Log.setEnableDebug(false);
// параметры рендера
Render.setTextureFiltering(TEXTURE_FILTERING_LINEAR);
Render.setLightingEnable(true);
Render.setAmbientLight(aColor(200, 190, 170));
Render.setClearColor(aColor(200, 190, 170));
 
// сцена
SceneManager.setDebugMode(false);
// шрифт выводящий значение FPS
fontFPS = GUIManager.createFont("Tahoma", 18);
fontFPS->setLayer(2);
fontFPS->setPos(aVector2(0.0f, 30.0f));
// создаем интерфейс
createInterface();
// создаем сцену
createScene();
// for 4096 boxes test
/*
camPlayer = SceneManager.createCamera();
camPlayer->setFOV(0.80f);
camPlayer->setNearPlane(0.1f);
SceneManager.setCamera(camPlayer);
 
aEntity* boxes[4096];
int j = 0;
for (int i = 0; i < 64; i++)
{
for (j = 0; j < 64; j++)
{
boxes[i] = SceneManager.createEntity("media/meshes/box.x");
boxes[i]->setScale(aVector3(0.3f, 0.3f, 0.3f));
boxes[i]->setPos(aVector3(2.0f * i, 0.0f, 2.0f * j));
}
}
*/
// главный цикл
while (DX9Render.getWindowActive())
{
/*
// если нажали кнопку выход
if (DX9Render.keyDown(KEY_ESCAPE)) {break;}
 
// управление камерой
if (DX9Render.keyDown(KEY_W)) {camPlayer->moveX( 0.12f);}
if (DX9Render.keyDown(KEY_S)) {camPlayer->moveX(-0.12f);}
if (DX9Render.keyDown(KEY_A)) {camPlayer->moveZ(-0.12f);}
if (DX9Render.keyDown(KEY_D)) {camPlayer->moveZ( 0.12f);}
if (DX9Render.keyDown(KEY_Z)) {camPlayer->moveY( 0.12f);}
if (DX9Render.keyDown(KEY_X)) {camPlayer->moveY(-0.12f);}
aVector2 force = DX9Render.getMouseForce();
if (DX9Render.mouseLeft())
{
camPlayer->rotateYaw(force.x / 5);
camPlayer->rotatePitch(force.y / 5);
}
*/
 
// UPDATE LIGHT ENTITY
light->setPos(entLight->getPos());
// выводим фпс
fontFPS->setText(aMakeString("FPS: %.f", Timer.getFPS()));
// обновляем интерфейс
updateInterface();
// обновляем игрока
updatePlayer();
// ! update scene !
PhysicManager.updateScene();
SceneManager.updateScene();
// ! rendering here !
Render.clearScreen();
Render.beginRender();
// ! rendering scene !
RenderManager.renderScene();
// ! user rendering !
renderJointLines();
// ! flip backbuffer !
Render.flip();
}
exit(0);
return0;
}


-=Jack=- 06.03.2009 17:39

Ответ: Atlantis Engine
 
Прикольно :) Вроде удобный синтаксис :)
А давно движок делаешь? сам? Какие возможности есть, кроме показанных в демках?

Lost 06.03.2009 17:54

Ответ: Atlantis Engine
 
Движок делаю с августа месяца, уже 3й раз переписываю, первый ну там все понятно, проба пера), второй раз - зашел в архитектурный тупик...опыта не особо много в проектировании...ну вот 3й раз стараюсь уже избегать подобных ошибок, пишу где-то месяц

Из возможностей - почитай на 2й странице, если есть еще вопросы - задавай, отвечу =)


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot