Пятница, 19 Сентября 2025, 11:48

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

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


Сообщение отредактировал Alkosha - Среда, 25 Июня 2014, 22:57
AlkoshaДата: Четверг, 26 Июня 2014, 21:46 | Сообщение # 42 | Тема: Массив картинок 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Дата: Пятница, 27 Июня 2014, 15:54 | Сообщение # 43 | Тема: Массив картинок Builder Ц++
участник
Сейчас нет на сайте
Данке шон
AlkoshaДата: Воскресенье, 29 Июня 2014, 22:03 | Сообщение # 44 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Есть функция, в качестве аргумента которой передаётся указатель типа char* ("путь к файлу")
Но у меня в проге этот путь к файлу хранится в string'e. Как его преобразовать в нужный вид ?
AlkoshaДата: Воскресенье, 29 Июня 2014, 23:05 | Сообщение # 45 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Цитата
в качестве аргумента которой передаётся указатель типа char*
AlkoshaДата: Воскресенье, 29 Июня 2014, 23:28 | Сообщение # 46 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
хмм.... странный эррор.
Цитата
E:\TURBO\platform3\main.cpp|547|error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|


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


Сообщение отредактировал Alkosha - Воскресенье, 29 Июня 2014, 23:32
AlkoshaДата: Понедельник, 30 Июня 2014, 14:55 | Сообщение # 47 | Тема: Вопрос-Ответ (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Дата: Понедельник, 30 Июня 2014, 22:35 | Сообщение # 48 | Тема: Вопрос-Ответ (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Дата: Вторник, 01 Июля 2014, 22:08 | Сообщение # 49 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Изначально итерация индекса стрингов j происходила до вызова метода priemResursov(), но когда я j++ перенёс в этот самый priemResursov(), while перестал перескакивать.
Теперь картинки грузит как и положено... но, теперь застопорился на установке координат этих картинок. Как теперь из стрингов убрать запятые(либо иные разделительные знаки) и разделить на отдельные числа... похоже, плохая затея со стрингами. Нужно наверное посимвольно считывать, и тут же на ходу интерпретировать. Но пока не знаю как.


Сообщение отредактировал Alkosha - Вторник, 01 Июля 2014, 22:09
AlkoshaДата: Среда, 02 Июля 2014, 20:45 | Сообщение # 50 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Спасибо, сей подход прекрасно сработал.
AlkoshaДата: Суббота, 05 Июля 2014, 08:08 | Сообщение # 51 | Тема: Градиент
участник
Сейчас нет на сайте
Но тут же в теле цикла не происходит никакого изменения
_clr остаётся постоянным.
Код

color _clr = RGB(clr1.R+dr,clr1.G+dg,clr1.B+db)


Вот например сие даёт сплошной ярко-красный цвет.

Код

SDL_Color skyColorTop={255,100,100,255};
SDL_Color skyColorBottom={255,10,10,255};

int dr = skyColorBottom.r-skyColorTop.r;
int dg = skyColorBottom.g-skyColorTop.g;
int db = skyColorBottom.b-skyColorTop.b;
dr /= stepnum;
dg /= stepnum;
db /= stepnum;

for(int a=0;a<600;a+=1)
      {
       SDL_SetRenderDrawColor(renderer, skyColorBottom.r+dr,skyColorBottom.g+dg, skyColorBottom.b+db, 255);
       SDL_RenderDrawLine(renderer,0,a,800,a);
      }


Сообщение отредактировал Alkosha - Суббота, 05 Июля 2014, 08:09
AlkoshaДата: Воскресенье, 06 Июля 2014, 00:58 | Сообщение # 52 | Тема: Градиент
участник
Сейчас нет на сайте
Цитата
ну и конечно, если захочется линиями, то внутренний цикл убирай, ставь вместо него что-то типа line(i,0,i,height,clr_), если полоска градиента расположена в левом верхнем углу.


это и так понятно. Просто в Вашем первом варианте в теле цикла (не там где происходит попиксельное рисование линий), переменная остаётся без изменений.
Код
   for (int i=0; i<width;i++)    
            {    
                color _clr = RGB(clr1.R+dr,clr1.G+dg,clr1.B+db)    
                        
         /*
для наглядности закомментируем

          for (int j=0; j<height; j++)    
                {    
                    image.putpixel(i,j,_clr)    
                }    
        */
            }


А что касается Вашего последнего варианта, то даже не знаю, чё я делаю не так.
Градиента никакого.
Сплошной цвет получается
Структура SDL_Color'a - r,g,b,a

Код

SDL_Color skyColorTop={255,0,0,0};
SDL_Color skyColorBottom={0,0,255,255};

SDL_RenderSetScale(renderer,1,1);
SDL_SetRenderDrawBlendMode( renderer, SDL_BLENDMODE_BLEND);

float _dr;
float _db;
float _dg;
float __dr;
float __db;
float __dg;

    _dr = skyColorBottom.r-skyColorTop.r;
    _dg = skyColorBottom.g-skyColorTop.g;
    _db = skyColorBottom.b-skyColorTop.b;

     _dr /= 600;
     _dg /= 600;
     _db /= 600;

for(int a=0;a<600;a+=1)
       {
__dr += _dr;
__dg += _dg;
__db += _db;

SDL_SetRenderDrawColor(renderer, skyColorTop.r + (int)__dr, skyColorTop.g + (int)__dg, skyColorTop.b + (int)__db, 255);
SDL_RenderDrawLine(renderer,0,a,800,a);

       }
}


рисует сплошняком цветом skyColorTop (он же clr1). Как будто к нему прибавляются нули по rgb-каналам.

И даже если бы и прибавлялось что-то, ведь тут вполне возможно переполнение за значение 255 (допустим clr1.r=250, то в установке цвета к нему ещё бы прибавилось сего-нибудь (допустим единицу), то есть он бы резко спал в значение 0)


Сообщение отредактировал Alkosha - Воскресенье, 06 Июля 2014, 00:59
AlkoshaДата: Воскресенье, 06 Июля 2014, 15:54 | Сообщение # 53 | Тема: Градиент
участник
Сейчас нет на сайте
Даже когда создал структуру, результат всё тот же - сплошной цвет, который указан в skyColorTop (он же clr1 )
Код
    struct mycolor
{
     int r;
     int g;
     int b;
} ;
AlkoshaДата: Воскресенье, 06 Июля 2014, 16:31 | Сообщение # 54 | Тема: Градиент
участник
Сейчас нет на сайте
Код
     
struct mycolor
{
     int r;
     int g;
     int b;
} ;

public:
void sky()
{

mycolor skyColorTop={255,0,0};
mycolor skyColorBottom={0,0,255};

float _dr;
float _db;
float _dg;
float __dr;
float __db;
float __dg;

  _dr = skyColorBottom.r-skyColorTop.r;
  _dg = skyColorBottom.g-skyColorTop.g;
  _db = skyColorBottom.b-skyColorTop.b;

   _dr /= 600;
   _dg /= 600;
   _db /= 600;

for(int a=0;a<600;a+=1)
     {
__dr += _dr;
__dg += _dg;
__db += _db;

SDL_SetRenderDrawColor(renderer, skyColorTop.r +(int) __dr, skyColorTop.g +(int) __dg, skyColorTop.b +(int) __db, 255);
SDL_RenderDrawLine(renderer,0,a,800,a);

     }
}
AlkoshaДата: Воскресенье, 06 Июля 2014, 16:53 | Сообщение # 55 | Тема: Градиент
участник
Сейчас нет на сайте
Цитата wcpt ()
я написал, что проблемы, вероятно, из-за того, что у SDL_Color r g b a задаются как uint8, т.е. как беззнаковые числа. То есть,


В приведённом мною листинге уже нет SDL_Color .

Тут же своя структура с интами
Код
    struct mycolor   
{   
       int r;   
       int g;   
       int b;   
} ;


Добавлено (06.07.2014, 16:53)
---------------------------------------------
То есть тут -- int + int
Код
skyColorTop.r +(int) __dr


Сообщение отредактировал Alkosha - Воскресенье, 06 Июля 2014, 16:54
AlkoshaДата: Воскресенье, 06 Июля 2014, 17:24 | Сообщение # 56 | Тема: Градиент
участник
Сейчас нет на сайте
Даже если и так, я пробовал так же (Uint8) __dr , ещё когда skyColorTop был SDL_Color'ом. Тот же результат
AlkoshaДата: Воскресенье, 06 Июля 2014, 19:20 | Сообщение # 57 | Тема: Градиент
участник
Сейчас нет на сайте
Цитата wcpt ()
а потом результаты (которые, по идее, будут в пределах байта, почему я уже написал)


не важно, будет там инт или байт, так как там интенсивность возрастает от 0 до 255-ти, затем от 256 до 511-ти и так далее.
так же с минусовым знаком.

Я к тому, что
while(!0)
{
SDL_Color rgb;
rgb++;
render();
}

Будет постоянно мигать (постепенно возрастать яркость , затем резко гаснуть, и опять постепенно возрастать по яркости).
AlkoshaДата: Понедельник, 07 Июля 2014, 00:03 | Сообщение # 58 | Тема: Градиент
участник
Сейчас нет на сайте
странно... так работает. Но не вижу где разница с моим листингом (за исключением названий переменных)...
AlkoshaДата: Четверг, 10 Июля 2014, 13:06 | Сообщение # 59 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Так-с. Ресурсы и координаты удалось загрузить.
теперь карту коллизии бы туда же.
А то она до сих пор в исполняемой программе находится.
В следующем виде:
Код
static const int maplen = 20;
char *bitmap[maplen]=  
{  

//и тут фиксированное кол-во строк через запятую "....",

}


Когда построчно то же самое считываю из файла, всё ок.
Затем пытаюсь сконвертить в char* - происходит какая-то ерунда.
В консоли cout отображает всякие кракозябры, после чего выбивает из программы.

Код
void collis()
{
     int mapln=0;
     char *btmap[64];
         j+=1;
while(input[j]!="endcollis")
     {
     btmap[mapln]=(char*)input[j].c_str();
     mapln++;
     j++;
     cout<<mapln<<"  "<<btmap[mapln]<<endl;
     }
}

void deshifrator()
{
     for(int j=0;j<i;j++)
     {
         if(input[j]=="res")
         {
             priemResursov();
         }
           if(input[j]=="l1")
         {
             koordTilesL1();
         }
           if(input[j]=="l2")
         {
             koordTilesL2();
         }
            if(input[j]=="collis")
         {
             collis();
         }



Конкретно вот в этой штуке загвоздка.
Код
btmap[mapln]=(char*)input[j].c_str();

Добавлено (10.07.2014, 11:57)
---------------------------------------------
Содержимое считываемого файла

Добавлено (10.07.2014, 13:06)
---------------------------------------------
input[j] -- массив считанных строк.

AlkoshaДата: Пятница, 11 Июля 2014, 22:07 | Сообщение # 60 | Тема: Вопрос-Ответ (C++)
участник
Сейчас нет на сайте
Цитата OpenGOO ()
ведь функция вообще кроме вывода строк ничего не делает.


А должна.

Вывести строки я и так без проблем могу.

Ф-ция void collis() должна занести эти строки в char *btmap[64];

Короче, вот внутри программы сейчас такая штука.


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


Сообщение отредактировал Alkosha - Пятница, 11 Июля 2014, 22:08
Поиск:

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