Понедельник, 06 Мая 2024, 03:43

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Записи участника » Alkosha [230]
Результаты поиска
AlkoshaДата: Среда, 02 Июля 2014, 20:45 | Сообщение # 181 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Спасибо, сей подход прекрасно сработал.
AlkoshaДата: Вторник, 01 Июля 2014, 22:08 | Сообщение # 182 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Изначально итерация индекса стрингов j происходила до вызова метода priemResursov(), но когда я j++ перенёс в этот самый priemResursov(), while перестал перескакивать.
Теперь картинки грузит как и положено... но, теперь застопорился на установке координат этих картинок. Как теперь из стрингов убрать запятые(либо иные разделительные знаки) и разделить на отдельные числа... похоже, плохая затея со стрингами. Нужно наверное посимвольно считывать, и тут же на ходу интерпретировать. Но пока не знаю как.


Сообщение отредактировал Alkosha - Вторник, 01 Июля 2014, 22:09
AlkoshaДата: Понедельник, 30 Июня 2014, 22:35 | Сообщение # 183 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
глобальное объявление j тоже не помогло.

Добавлено (30.06.2014, 22:27)
---------------------------------------------
Решил глянуть, что же всё-таки пихается в priemResursov()

Код
void priemResursov()
{
while(input[j]!="endres")
{
  //tileTex[atoi(input[j+1].c_str())].load((char*)input[j+2].c_str());
  j+=2;
  cout<<atoi(input[j+1].c_str())<<" : "<<(char*)input[j+2].c_str()<<"\n";
}
}


Результат:

Добавлено (30.06.2014, 22:31)
---------------------------------------------

Цитата goldsphere ()
первое что бросается в глаза, ты не предпринимаешь никаких действий, если файла такого нету, т.е считать ты его не смог, а что-то делать с пустой информацией пытаешься.

это второстепенное. Ибо до перехода в функцию deshifrator() все считанные строки отображаются в консоли.

Добавлено (30.06.2014, 22:35)
---------------------------------------------
ага.... только щас дошло по скриншотам.
Что в этом цикле он шпарит дальше, чем я расчитывал.

Код
for( j=0;j<i;j++)
{
if(input[j]=="res")
{
priemResursov();
}
}


то есть поначалу он всё как и положено делает, затем не выходит из тела while(input[j]!="endres") продолжает шпарить до какого-то неведомого предела.
AlkoshaДата: Понедельник, 30 Июня 2014, 14:55 | Сообщение # 184 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Компилит нормально. Но во время выполнения программы крашит.

Код
class myLoadStageFromFile
{
private:
ifstream file;

string input[256];
int i=0;

public:
void open()
{
file.open("maps//level1.lvl", ios::in);
          if (file)
          {
              while (!file.eof())
              {
                  file>>input[i];
                  i++;
              }
              file.close();

              for(int j=0;j<i;j++)
              {
                  cout<<input[j]<<"\n";
              }

          deshifrator();
          }
}

private:
int j=0;
void priemResursov()
{
while(input[j]!="endres")
          {
              tileTex[atoi(input[j].c_str())].load((char*)input[j+1].c_str());
              j+=2;
          }
}
void deshifrator()
{
          for(int j=0;j<i;j++)
          {
              if(input[j]=="res")
              {
                  j++;
                  priemResursov();
              }
          }
}
};


Причём этот участок выполняется
Код
while (!file.eof())
              {
                  file>>input[i];
                  i++;
              }
              file.close();

              for(int j=0;j<i;j++)
              {
                  cout<<input[j]<<"\n";
              }


А вот структура файла *.lvl
Цитата
res
0 img//home2.png
1 img//ground1.png
2 img//zabor1.png
3 img//home1.png
4 img//bus.png
5 img//platform1.png
6 img//tree.png
7 img//gorka.png
8 img//ground2.png
9 img//truba.png
10 img//junk.png
endres


Если функцию tileTex[int].load(char*) напрямую выполнить (безо всяких считываний из файла), то всё ок.

Добавлено (30.06.2014, 13:43)
---------------------------------------------
Кстати, а в каждом элементе string-массива может ли быть символ конца строки в этом случае (\n)?
Если да, то как его избежать. Ведь заношу инфу в стринги таким образом.
file>>input[i];

Добавлено (30.06.2014, 14:55)
---------------------------------------------
а не, всё-таки энд-лайна нет в стрингах.
input[i].length() показывает в консольке ровно то же кол-во символов, сколько и видно их в той же самой консольке невооружённым глазом.


Сообщение отредактировал Alkosha - Понедельник, 30 Июня 2014, 22:19
AlkoshaДата: Воскресенье, 29 Июня 2014, 23:28 | Сообщение # 185 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
хмм.... странный эррор.
Цитата
E:\TURBO\platform3\main.cpp|547|error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|


но мой стринг не как константа объявлен


Сообщение отредактировал Alkosha - Воскресенье, 29 Июня 2014, 23:32
AlkoshaДата: Воскресенье, 29 Июня 2014, 23:05 | Сообщение # 186 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Цитата
в качестве аргумента которой передаётся указатель типа char*
AlkoshaДата: Воскресенье, 29 Июня 2014, 22:03 | Сообщение # 187 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Есть функция, в качестве аргумента которой передаётся указатель типа char* ("путь к файлу")
Но у меня в проге этот путь к файлу хранится в string'e. Как его преобразовать в нужный вид ?
AlkoshaДата: Пятница, 27 Июня 2014, 15:54 | Сообщение # 188 | Тема: Массив картинок Builder Ц++
участник
Сейчас нет на сайте
Данке шон
AlkoshaДата: Четверг, 26 Июня 2014, 21:46 | Сообщение # 189 | Тема: Массив картинок Builder Ц++
участник
Сейчас нет на сайте
Вот думаю каким образом их рисовать.
На форме нужно создать область, где эти самые картинки будут видны (чтоб не мазались по всей форме).

Цитата goldsphere ()
. Скорей всего при размещении картинки на экране надо записывать в массив текстовую или числовую информацию о типе объекта и его координаты.


Такое уже сделано. Но внутри самой исполнительной программы, а не в файле.
Над чтением с файла только начал шаманить.

Добавлено (26.06.2014, 21:46)
---------------------------------------------
Кстать... а как создать имэйдж happy ?

Объявляю массив так.
TImage *pngI[256] ;

затем по открытию файла
pngI[0]= new TImage();
pngI[0]->LoadFromFile(filename);

выбивает эррор

Цитата
[BCC32 Error] Unit1.cpp(59): E2285 Could not find a match for 'TImage::TImage()'
AlkoshaДата: Среда, 25 Июня 2014, 22:53 | Сообщение # 190 | Тема: Массив картинок Builder Ц++
участник
Сейчас нет на сайте
Пытаюсь сделать редактор уровней, выбрал ГУЙ Builder'a XE (так как в оном, в отличии от борландовского, есть поддержка png-имэйджей)
Сделал листбокс, в который добавляются файлы картинок через диалог открытия файлов.
Теперь бы эти картинки разместить в виде массива на виртуальном игровом поле.
И вот теперь не знаю как лучше.
Мне кажется для каждой размещённой картинки создавать TImage достаточно ресурсоёмко.
Каким образом оптимальнее всего разместить картинки на поле ?


Сообщение отредактировал Alkosha - Среда, 25 Июня 2014, 22:57
AlkoshaДата: Понедельник, 23 Июня 2014, 14:58 | Сообщение # 191 | Тема: Физика 2д платформера.
участник
Сейчас нет на сайте
Цитата Saitei ()
тык <- там есть ответ


Ну дык, если ячейки как в Марио раскидать, то у меня всё в порядке.

В первой части марио броуз (клон которого рассматривается в варианте по SFML) не было наклонных поверхностей, а у меня как раз запара именно с наклонными поверхностями. Я имею ввиду нет интерполяции перехода от ячейки к ячейке, когда поднимается вверх, и когда спускается, больше планирует за счёт свободного падения (как это визуально выглядит, можно глянуть в том примере, который я скинул)

Добавлено (23.06.2014, 14:58)
---------------------------------------------
Вот в диззи фантастик эдвэнче тоже по двумерному массиву определялась коллизия, и там тоже заметно эти ячейки, тем не менее, там он гораздо плавнее двигался по склонам.

Сообщение отредактировал Alkosha - Понедельник, 23 Июня 2014, 14:56
AlkoshaДата: Понедельник, 23 Июня 2014, 13:59 | Сообщение # 192 | Тема: Физика 2д платформера.
участник
Сейчас нет на сайте
Цитата RomanNVKZ ()
Кстати, на чем пишешь?


Очевидо, что на Бейсике. sad
AlkoshaДата: Суббота, 21 Июня 2014, 20:00 | Сообщение # 193 | Тема: Градиент
участник
Сейчас нет на сайте
Допустим, на вход функции поступают параметры для цветовых переходов от одного цвета до другого.

Вот к примеру color1={r1,g1,b1}; color2={r2,g2,b2}
тут цикл for=0 to len // где len - ширина градиента.
затем линиями line(x1,y1,x2,y2) с цветовыми переходами от color1 до color2.
Как определить для каждого шага в цикле цвет перехода?


Сообщение отредактировал Alkosha - Суббота, 21 Июня 2014, 20:01
AlkoshaДата: Пятница, 20 Июня 2014, 22:07 | Сообщение # 194 | Тема: Физика 2д платформера.
участник
Сейчас нет на сайте
Сейчас он немного отличается от того, что было в первом посте.
И класс физики тож чуток изменился, вроде.

Код
class Physix
{
public:

void wallcollis()
{
         int centery=pers.y/32;
int centerx=pers.x/32;
// стена слева
      if(collisMap.bitmap[centery][centerx-1]=='B'&&collisMap.bitmap[centery-1][centerx-1]=='B')
                     {
                     if (pers.dx<0)
                         {

                         pers.dx=0;

                         }
                     }

// стена справа
      if(collisMap.bitmap[centery][centerx+1]=='B'&&collisMap.bitmap[centery-1][centerx+1]=='B')
                     {
                     if (pers.dx>0)
                         {

                         pers.dx=0;

                         }
                     }
                     if(pers.onGround)pers.x+=pers.dx;

//сверху
  if(collisMap.bitmap[centery-1][centerx]=='B')
                     {
                     if (pers.dy<0)
                         {

                         pers.dy=0;

                         }
                     }

}

void gravitation()
{
     int centery=pers.y/32;
int centerx=pers.x/32;
     if (!pers.onGround)
         {
             pers.dy=pers.dy+1;
         pers.x+=pers.dx;
         }
         pers.y+=pers.dy;
         pers.onGround=false;
                 if(collisMap.bitmap[centery+1][centerx]=='B')
                     {pers.onGround=true;
                     if (pers.dy>=0)
                         {pers.y=centery*32;
                         pers.dy=0;

                         }
                     }
         if(collisMap.bitmap[centery][centerx]=='B')
                     {pers.onGround=true;
                      pers.y=centery*32-1;
                     if (pers.dy>0)
                         {
                         pers.dy=0;

                         }
                     }

}

};
Physix phys;


Нынешнее состояние моего горе-платформера.
Сдёрни

Добавлено (20.06.2014, 22:07)
---------------------------------------------
Всё равно по наклонным поверхностям он рахитно передвигается.

AlkoshaДата: Пятница, 20 Июня 2014, 13:50 | Сообщение # 195 | Тема: Система частиц. Помогите исправить...Пожалуйста
участник
Сейчас нет на сайте
Пока хочу реализовать для начала эффект дождя.

Сперва инициализирую
начальное направление частиц, а так же спрайт (в дальнейшем ещё добавлю переменные для размеров эмиттера и плотности испускания частиц)
rain.init("img//kaplya.png",-3,3,3,30);


Затем в цикле обновление координат вызываю функцию rain.update()

Мною задумывалось так, если флаг rain.enable= труЪ, то эмиттер испускает частицы.
else эмиттер прекращает испускать частицы, но если хотя бы одна частица "жива" то апдейтить её координаты.
Но тут короче криво условие сделано.
Та и вообще в целом весь подход мне кажется не совсем корректным, точнее совсем не корректным.

Код
class myParticles
{
public:
bool enable=false;

struct partic
{
int starty, startx ;

float x;
float y;
float dx,dy;
int timeToDie;
};

private:
static const int maxnum=200;
SDL_Rect rect;
partic partics[maxnum];
float maxSpeedy, minSpeedy, minSpeedx, maxSpeedx;

public:
SDL_Texture * particTex;

void init(char* tex,float minx, float maxx, float miny,float maxy)
{
         maxSpeedy=maxy;
         minSpeedy=miny;
         minSpeedx=minx;
         maxSpeedx=maxx;
         loadTex(tex);
        for(int i=0;i<maxnum;i++)
         {
             partics[i].startx=rand()%800;
             partics[i].starty=-10;
             partics[i].x= partics[i].startx;
             partics[i].y=partics[i].starty;
             partics[i].dx=rand()%(int)(maxSpeedx-minSpeedx)+minSpeedx;
             partics[i].dy=rand()%(int)(maxSpeedy-minSpeedy)+minSpeedy;
             partics[i].timeToDie=rand()%20+20;
         }
}

         void loadTex( char* filename )
         {
         particTex = IMG_LoadTexture(renderer, filename);
         SDL_QueryTexture(particTex, NULL, NULL, &rect.w, &rect.h);
         }

         void update()
         {

             for(int i=0;i<maxnum;i++)
                 {
                  if(enable)partics[i].timeToDie--;
                     if(partics[i].timeToDie<=0&&!enable)partics[i]={0};

                         if(partics[i].timeToDie<=0&&enable) {
                         partics[i].startx=rand()%800;
                         partics[i].starty=-10;
                         partics[i].x=partics[i].startx;
                         partics[i].y=partics[i].starty;
                         partics[i].dx=rand()%(int)(maxSpeedx-minSpeedx)+minSpeedx;
                         partics[i].dy=rand()%(int)(maxSpeedy-minSpeedy)+minSpeedy;
                          partics[i].timeToDie=rand()%20+20;
                         }
                      if(partics[i].timeToDie>0||enable){
                     partics[i].y+=partics[i].dy;
                     partics[i].x+=partics[i].dx;
                      }

           }
         }

         void display()
         {
             SDL_RenderSetScale(renderer,1,1);
             SDL_SetTextureBlendMode(particTex, SDL_BLENDMODE_ADD);
               for(int i=0;i<maxnum;i++)
                 {

                     SDL_Rect DestRs;
                     DestRs.x=partics[i].x;
                     DestRs.y=partics[i].y;
                     DestRs.w=rect.w;
                     DestRs.h=rect.h;
                     SDL_RenderCopy(renderer, particTex ,  &rect, &DestRs);

                 }

         }
};
myParticles rain;


Добавлено (20.06.2014, 13:09)
---------------------------------------------
Искал в гугле чё-нить по частицам, так там такие программиздские ухищрения. Есть даже примеры и на шейдерах и на распараллеливании.

Мне бы чё-нить попроще. Типа того г*вн*-кода, написанного мною.

Добавлено (20.06.2014, 13:50)
---------------------------------------------
Изначально у меня вообще была проверка "умершей"частицы не по "timeToDie!!!!" а по границам, за которые попапдает частица.
Но тогда вообще было так, если !enable, то "дождь" резко исчезал.
Я вот уже подумываю, что надо было так и оставить и при !enable попросту альфа-канал всех частиц разом постепенно уменьшать от 255-ти до 0-ля.


Сообщение отредактировал Alkosha - Пятница, 20 Июня 2014, 13:52
AlkoshaДата: Среда, 11 Июня 2014, 14:45 | Сообщение # 196 | Тема: Физика 2д платформера.
участник
Сейчас нет на сайте
Платформер у меня обрабатывается по битмапе, в смысле столкновения персонажа с граундом.

Вот пока как-то кривовато это дело происходит, а именно выталкивание персонажа из под "земли".

То после прыжка с высокой платформы он на половину застряёт в ячейках, и вдоль них может ходить и так же можно продолжать прыгать на том же уровне, то как раз впритык ячейке состыковка... ай, короче. Кажись я непонятно пояснил.
Рабочая программа прилагается, дабы глянуть поведение персонажа (управление ADW)


Вот класс физики.
Собственно запара в функции gravitation().

Код
class Physix
{
public:

void wallcollis()
{
            int centery=pers.y/32;
int centerx=pers.x/32;
// стена слева
         if(collisMap.bitmap[centery][centerx-1]=='B'&&collisMap.bitmap[centery-1][centerx-1]=='B')
                        {
                        if (pers.dx<0)
                            {

                            pers.dx=0;

                            }
                        }
// стена справа
         if(collisMap.bitmap[centery][centerx+1]=='B'&&collisMap.bitmap[centery-1][centerx+1]=='B')
                        {
                        if (pers.dx>0)
                            {

                            pers.dx=0;

                            }
                        }
                        if(pers.onGround)pers.x+=pers.dx;
}

void gravitation()
{
        int centery=pers.y/32;
int centerx=pers.x/32;
        if (!pers.onGround)
            {
            pers.dy=pers.dy+0.9;
            pers.x+=pers.dx;
            }
            pers.y+=pers.dy;
                pers.onGround=false;

                    if(collisMap.bitmap[centery+1][centerx]=='B')
                        {pers.onGround=true;

                        if (pers.dy>0)
                            {
                            pers.dy=0;

                            }
                        }

            if(collisMap.bitmap[centery][centerx]=='B')
                        {pers.onGround=true;
                         pers.y-=8;
                        if (pers.dy>0)
                            {
                            pers.dy=0;
                            }
                        }

}

};
Physix phys;


Добавлено (11.06.2014, 14:44)
---------------------------------------------
Где dx dy - ускорения по соответствущим осям.
onGround - флаг нахождения на земле.
bitmap[][] - двумерный массив char'ов , где символ "B" обозначает земную твердь.
ну в общем и всё.

Добавлено (11.06.2014, 14:45)
---------------------------------------------
Подозрение на погрешности при переводе float'a в int


Сообщение отредактировал Alkosha - Среда, 11 Июня 2014, 14:54
AlkoshaДата: Воскресенье, 08 Июня 2014, 12:53 | Сообщение # 197 | Тема: Ошибка в компоновщика C::B
участник
Сейчас нет на сайте
Не, ну это конкретная шляпенция.
Удалял антивирусник. Пробовал без него - тоже нет доступа к собираемому файлу.
Более того, теперь и на с++ builder такой же бадыль.

Хотя где-то пол-года назад ничего такого не было ни в c::b , ни в билдере , ни в dev-CPP.

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


Сообщение отредактировал Alkosha - Воскресенье, 08 Июня 2014, 13:10
AlkoshaДата: Воскресенье, 25 Мая 2014, 10:40 | Сообщение # 198 | Тема: Ошибка в компоновщика C::B
участник
Сейчас нет на сайте
Цитата froex ()
Открой диспетчер задач и найди там свой процесс.


Цитата Alkosha ()
Та и в процессах программа не сидит.

Добавлено (25.05.2014, 10:40)
---------------------------------------------
Вот тут чуваки тоже столкнулись с подобной шляпенцией.
cannot open output file, permission denied

Но там они вроде как до антивиря др.Вэба докопались.
У меня eset smart security 4. Я его на момент компиляции и запуска программы пробовал отключить, всё равно через раз нет доступа к собираемому *.exe
Причем тоже как и у тех челов, через некоторое время можно снова компилировать проект не выходя из кодблокса.

Какая-то служба винды наверное лочит.

AlkoshaДата: Воскресенье, 18 Мая 2014, 10:12 | Сообщение # 199 | Тема: Ошибка в компоновщика C::B
участник
Сейчас нет на сайте
Цитата
Ты закрываешь программу перед тем, как перекомпилировать?


Ессно. Причём как и по закрытию на виндоузный крестик в углу, так и по "press any key". Та и в процессах программа не сидит.
AlkoshaДата: Суббота, 17 Мая 2014, 17:29 | Сообщение # 200 | Тема: Ошибка в компоновщика C::B
участник
Сейчас нет на сайте
Скачал SDL 2.3 для mingw.
Установил кодблокс 13.12 с mingw в комплекте.
В билд-опшонс -> компилер указал путь к инклудам (D:\engines\SDL2-devel-2.0.3-mingw\SDL2-2.0.3\i686-w64-mingw32\include) и во вкладке линкер путь к либам (D:\engines\SDL2-devel-2.0.3-mingw\SDL2-2.0.3\i686-w64-mingw32\lib)

В линкер-сеттингс поле озэр линкер опшонс : -lmingw32 -lSDL2main -lSDL2

Иногда компилируется и стартует программа, даже спрайтики удалось вывести.
А иногда происходит ошибка в ld.exe (компоновщик):

Код
||=== Build: Debug in Platform20 (compiler: GNU GCC Compiler) ===|
ld.exe||cannot open output file Platform20.exe Permission denied|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|


Приходится по нескольку раз перезапускать кодблокс.
Чтение-запись на диск разрешены, орудую под правами администратора.
Другие проекты компилируются и стартуют как и положено.
А с этим SDL2 какая-то аномалия.

Добавлено (17.05.2014, 17:29)
---------------------------------------------
Ах да. ОС - Windows 7 x86

Сообщение отредактировал Alkosha - Суббота, 17 Мая 2014, 17:27
Форум игроделов » Записи участника » Alkosha [230]
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг