Recent Posts

Pages: [1] 2 3 ... 10
1
Привет, Alex98. Есть заголовок для С/С++, в котором почти нет комментариев и потому без примеров будет сложно разобраться. А примеры перенесены далеко не все. Даже наверное половины нет из 130. ::)
Каюсь, я было начал помогать с переносом примеров, а потом назрел тотальный пересмотр API и все наработки оказались по сути бесполезными. Разрабам не хватает поддержки извне.
На данный момент я разрабатываю конструктор игр на движке WS3D (использую чистый Си), Nikolas ваяет игру на С++. Так что могу сказать точно - оно работает.
2
Всем привет) Хочется узнать насчёт ветки на сях. Я так понял на них уже можно делать кое какие проекты. Если можно , то где можно достать эту ветку?
3
Проекты в разработке / Re: Sector 5
« Last post by Alec - WS3D Developer on February 18, 2018, 04:43:47 PM »
Меню нравится простотой. Хороший фон подобрал, в тему.
4
Проекты в разработке / Re: Sector 5
« Last post by Vuvk on February 18, 2018, 12:18:56 PM »

Quote
WS3D не умеет грузить звуковые файлы из архивов
Я, кстати, позднее хотел обратиться с данной проблемой, т.к. для моего конструктора это крайне необходимо.


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

5
Проекты в разработке / Re: Sector 5
« Last post by Nikolas - WS3D Developer on February 16, 2018, 08:24:33 PM »
Привет всем. Поведаю о том, что сделано в проекте. Сделано немного, времени мало.
Решил не углубляться в дальнейший сюжет. Остановимся пока на драконах ближе к финалу.

Тут такой казус вышел: драконы, оказывается, облегчили жизнь главному герою, хотя должно было быть наоборот. Провел мини-эксперимент. Сделал герою побольше здоровья, и дождавшись появления драконов, затихарился в углу, отстреливаясь только от самых ближних врагов. Дальние переключились на драконов.
Пока шла резня и стрельба, преспокойно дождался времени окончания миссии и "выиграл".  Так не пойдет.  Выход нашел такой: ограничил число появляющихся драконов и наделил их способностью останавливать время. Теперь придется их всех ликвидировать, иначе миссия не окончится. Такой вот карамболь.

Далее решил взяться за меню.  Основные контролы- кнопки. Решил сделать свои контролы, затягивающий процесс. В прошлый раз, когда задумал сделать игру, давно уже, эта затея вылилась в итоге в это  :D  Не напороться бы на те же грабли......

Тестовый экран меню прилагаю, может, будут замечания по оформлению....

На этом все, всем удачи.

PS. После того, как доделаю меню, наверное, займусь звуками. Дело в том, что WS3D не умеет грузить звуковые файлы из архивов. Нужно что-то придумать. Как вариант, можно попробовать либо прикрутить к звуковому движку работу с архивами, либо организовать загрузку в память и научить движок проигрывать прямо из области памяти. Посмотрим, что из этого выйдет.
6
Проекты в разработке / Re: Sector 5
« Last post by Alec - WS3D Developer on February 13, 2018, 05:53:38 PM »
Хм, впечатляет.  :)
7
Проекты в разработке / Re: Sector 5
« Last post by Nikolas - WS3D Developer on February 13, 2018, 05:37:03 PM »
Quote
Пора задуматься об ООП, которое является одним из преимуществ С++ над ФБ.
Это само собой. Иначе никак.
Каждый объект мира- отдельный класс. Например, вот мой класс дракона:

Code: [Select]
class Dragon
{
public:
    Dragon(wTexture* tex1,wTexture* tex2,wTexture* tex3,wTexture* tex4,wVector2i size0,wVector2f position0,wColor4s color0,wSound* lifeSound)
    {
        dSprite[0]=tex1;
        dSprite[1]=tex2;
        dSprite[2]=tex3;
        dSprite[3]=tex4;
        dLifeSound=lifeSound;
        position=position0;
        wColorFormat cFormat;
        UInt32 colorPitch;
        if(dSprite[0])
            wTextureGetInformation(dSprite[0],&dSize,&colorPitch,&cFormat);
        dScale.x=(Float32)size0.x/dSize.x;
        dScale.y=(Float32)size0.x/dSize.x;
        dColor=color0;
        dColor.alpha=150;
        lifeTime=(UInt32)wMathRandomRange(0,1000);
    }

    ~Dragon()
    {
        if(dLifeSound)
            wSoundStop(dLifeSound);
    }

    void moveTo()
    {
        position.x-=moveSpeed*sin(wMathDegToRad(angle));
        position.y-=moveSpeed*cos(wMathDegToRad(angle));
    }

    void setTargetAngle(wVector2f destPos)
    {
        Float32 tan;
        ///I четверть
        if((destPos.x>=position.x+dSize.x/2)&&(destPos.y<=position.y+dSize.y/2))
        {
           tan=((Float32)(destPos.x-position.x-dSize.x/2))/(Float32(-destPos.y+position.y+dSize.y/2));
           angle=-wMathRadToDeg(atan(tan));
        }
        ///II четверть
        if((destPos.x<=position.x+dSize.x/2)&&(destPos.y<=position.y+dSize.y/2))
        {
           tan=((Float32)(-destPos.x+position.x+dSize.x/2))/(Float32(-destPos.y+position.y+dSize.y/2));
           angle=wMathRadToDeg(atan(tan));
        }
        ///III четверть
        if((destPos.x<=position.x+dSize.x/2)&&(destPos.y>=position.y+dSize.y/2))
        {
            tan=((Float32)(-destPos.x+position.x+dSize.x/2))/(Float32(destPos.y-position.y-dSize.y/2));
            angle=180-wMathRadToDeg(atan(tan));
        }
        ///IV четверть
        if((destPos.x>=position.x+dSize.x/2)&&(destPos.y>=position.y+dSize.y/2))
        {
           tan=((Float32)(destPos.x-position.x-dSize.x/2))/(Float32(destPos.y-position.y-dSize.y/2));
           angle=180+wMathRadToDeg(atan(tan));
        }

        if((angle<=0)&&(angle>=-90))angle=360+angle;
    }

    void update()
    {
        lifeTime+=1;

        if(angle2>0)
            angle2-=1;
        else
            angle2+=1;

        if(!isAttackMode)
            targetTime+=1;

        if(lifeTime%20==0)
            index+=1;

        if(index>3)index=0;

        wVector2i tempPos;
        tempPos.x=wMathCeil(this->position.x);
        tempPos.y=wMathCeil(this->position.y);
        rotPoint.x=wMathCeil(position.x+dSize.x*dScale.x/2);
        rotPoint.y=wMathCeil(position.y+dSize.y*dScale.y/2);

         if(dSprite[index])
             wImageDrawAdvanced(dSprite[index],tempPos,rotPoint,angle+angle2,dScale,true,dColor);

         if(dLifeSound)
         {
             if((!wSoundIsPlaying(dLifeSound))&&(!wSoundIsStopped(dLifeSound)))
                wSoundPlay(dLifeSound,false);
         }
        wVector2i fromPos,toPos;
        swprintf(tmp,L"%s%d",L"H: ",(Int32)dHealth);
        wVector2u sText=wFontGetTextSize(wFontGetDefault(),tmp);
        fromPos.x=tempPos.x+5;
        fromPos.y=tempPos.y+5;
        toPos.x=fromPos.x+sText.x;
        toPos.y=fromPos.y+sText.y;
        wFontDraw(wFontGetDefault(),tmp,fromPos,toPos,wCOLOR4s_BLUE);

    }

    UInt32 index                =0;
    Float32 angle               =0;
    Float32 angle2              =0;
    wTexture* dSprite[4]        ={0};
    Float32 dHealth             =1000;
    Float32 moveSpeed           =0.2f;
    wVector2u dSize             =wVECTOR2u_ZERO;
    wVector2f dScale            =wVECTOR2f_ONE;
    wVector2f position          =wVECTOR2f_ZERO;
    wVector2i rotPoint          =wVECTOR2i_ZERO;
    UInt32 lifeTime             =0;
    Int32 reloadTime            =0;
    wColor4s dColor             =wCOLOR4s_WHITE;
    wSound* dLifeSound          =0;
    wchar_t tmp[256];

    Hero* target                =0;
    bool isAttackMode           =true;
    UInt32 targetTime             =0;
};

А вот процедура обновления всех драконов. Здесь вё, что они делают, за исключением взаимодействия с пулями (class Bullet), потому как этот момент описан в процедуре обновления пуль (здесь не привожу).
Code: [Select]
    void updateDragons()
    {
        ///Обновляем драконов
        UInt32 dCound=getDragonArraySize();
        if(dCound==0) return;

        for(Int32 i=0;i<dCound;++i)
        {
            Dragon* d=getDragon(i);
            d->update();

            if(d->dHealth<0)
                d->dHealth=0;

            ///Взаимодействие дракон-игроки
            for(Int32 i=0;i<getHeroesArraySize();++i)
            {
                Hero* h=getHero(i);
                if(isDHIntersect(d,h))
                {

                    //h->health=0;
                    if(h->isBot)
                    {
                        if(damageBot)
                            h->health=0;
                    }
                    else
                    {
                        if(damagePlayer)
                            h->health=0;
                    }

                    if(h->health==0)
                    {
                        if(h==d->target)
                        d->target=0;
                    }
                }
            }
            ///Если здоровье дракона <=300, включаем агрессивный режим
            if(d->dHealth>0&&d->dHealth<=300)
            {
                d->isAttackMode=true;
                d->moveSpeed=0.4f;
                if(d->lifeTime%20==0)
                    generateSmoke(d->position,false,wCOLOR4s_DARKORANGE);
            }
            wVector2f targetPos;
            ///В самом начале появления дракон просто летит перед собой
            if(d->lifeTime<600)
                d->moveTo();
            else
            {
                //Если включен режим нападения- ищет ближнего героя и нападает
                if(d->isAttackMode)
                {
                    Hero* h=getMinHero(d->position);
                    if(h)
                        d->setTargetAngle(h->position);
                    else
                        d->setTargetAngle(portalPosition);

                    d->moveTo();
                }
                //оборонительная позиция- нападаем только на тех, чья пуля попала в дракона
                else
                {
                    if(d->targetTime>1000)
                    {
                        if(d->target)
                        {
                            Hero* temp=d->target;
                            if(!temp->isBomber)
                                d->target=0;
                        }
                    }
                       if(d->target)
                    {
                        d->setTargetAngle(d->target->position);
                        d->moveTo();
                    }
                }
            }

              ///Умирание дракона
            if(d->dHealth==0)
            {
                deadDragonsCount+=1;
                if(dragonDeadSound)
                {
                    if(!wSoundIsPlaying(dragonDeadSound))
                        wSoundPlay(dragonDeadSound,false);
                }
                removeDragon(d);
                dCound=getDragonArraySize();
            }
        }
    }
8
Проекты в разработке / Re: Sector 5
« Last post by Alec - WS3D Developer on February 13, 2018, 04:57:29 PM »
Ну, уже просматривается геймплей.

Quote
Наступил критический момент. Код перевалил за  3000, особо ничего и не сделано, откуда столько?! Три дня занимался отловом багов. По мере усложнения взаимодействий между объектами мира появляются все новые проблемы. Будем решать...
Пора задуматься об ООП, которое является одним из преимуществ С++ над ФБ. (Хотя и в ФБ ООП в какой-то степени реализован).
9
Проекты в разработке / Re: Sector 5
« Last post by Nikolas - WS3D Developer on February 13, 2018, 01:12:09 PM »
Привет всем. Решил чуть освежить тему.
Наступил критический момент. Код перевалил за  3000, особо ничего и не сделано, откуда столько?! Три дня занимался отловом багов. По мере усложнения взаимодействий между объектами мира появляются все новые проблемы. Будем решать...

Я развиваю по мере возможностей линию появления новых персонажей из Портала.
Пока это будут Драконы. Злые и огнедышащие.  Они будут появляться не сразу, ближе к развязке.
Реализовал целых две линии поведения драконов:
1) Выжидательно-оборонительная. Первые секунд 15-20 дракон летит подальше от Портала в случайном направлении. Чтобы не создавать массовку в центре экрана, потому как число драконов будет увеличиваться по мере их отстрела. Если его не трогать, дракон мирно висит на месте и машет крылышками. В противном случае (пострелять по нему)  рептилия будет перемещаться в строну выстрела, возможно, изредка выпускать пламя. Если настигнет игрока/бота- мгновенная гибель.

2) Нападающая. Если здоровье дракона пошатнулось (менее 200 из 1000), он начинает методично истреблять всех, начиная с самых ближних к нему, в конце концов доберется и до героя.

Убить не просто: урон от обычной пули: -5,  т.е. нужно попасть 200 раз. Вместе с ботами не  долго, но нужно все время следить и за собой: патроны, аптечки, расположение гранатометчиков и расположение ботов относительно Портала. Суетно, по моему...
Из гранатомета урон: -100. Получается, десять раз хватит. Сложность в том,  чтобы набрать столько снарядов. У все новеньких ботов  снарядом не более 5, до момента гибели часть боезапаса они успевают истратить, иногда и весь....

Что еще новенького: по мелочи. Можно заметить "тающие" спрайты убитых  врагов с пробитой каской, драконы в критические моменты начинают безбожно дымить, боты без патроном бегают с ножом в руке, вверху экрана идет отсчет времени до конца миссии.

Демку пока выкладывать не буду, а то всем надоест раньше, чем наступит релиз  (если он наступит).
10
Проекты в разработке / Re: Sector 5
« Last post by Alec - WS3D Developer on February 08, 2018, 07:31:29 PM »
Quote
Добавить режим танкового сражения: мол, враг отчаялся овладеть Порталом силами пехоты и гранатометчиков, и подтянул один/или пару тяжелых танков или каких-нибудь самоходных установок.
Ну, если это не хардкор, то лучше обычно дать игроку надежду на спасение.  :) Так интереснее.
Quote
Может, я зря отвар из мухоморов принимал...
Так что наверное не зря.  :D
Pages: [1] 2 3 ... 10