Четверг, 25 Апреля 2024, 12:25

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
PAMCECДата: Понедельник, 24 Февраля 2014, 21:41 | Сообщение # 1201
был не раз
Сейчас нет на сайте
Подскажите пожалуйста почему у меня эта
программа не компилиркутся? Где я ошибся?
___________________________________________________________________________
Эмм.. Все ошибки глупые я их уже сам исправил. простите. wacko


PAMCEC II

Сообщение отредактировал PAMCEC - Понедельник, 24 Февраля 2014, 21:54
REaveRДата: Вторник, 25 Февраля 2014, 16:45 | Сообщение # 1202
уже был
Сейчас нет на сайте
_getch();

Всё стало серым...
GameMixДата: Четверг, 06 Марта 2014, 07:13 | Сообщение # 1203
старожил
Сейчас нет на сайте
Привет всем. Пара вопросов по векторам:
1) Как правильно записать сортировку вектора? sort(vec.begin(), vec.end()) - выкидывает 42 ошибки при компиляции.
2) Возможно ли изменить один элемент в векторе, не перезаписывая весь вектор с измененным нужным элементом?


Steel Standoff - 2D аркада.
Мои статьи
-l33t-h4xx-Дата: Четверг, 06 Марта 2014, 07:51 | Сообщение # 1204
участник
Сейчас нет на сайте
Цитата GameMix ()
выкидывает 42 ошибки при компиляции.

Какие?
Цитата GameMix ()
2) Возможно ли изменить один элемент в векторе, не перезаписывая весь вектор с измененным нужным элементом?

Какая-то перезапись происхиодит только при удалении элемента из середины вектора, или когда у него заканчивается память, и нужно выделять новую. А то, что ты хочешь сделать, происходит само по себе, когда ты пишешь что-то вроде vec[i] = value. Если нужно изменить вектор, переданный в функцию, используй передачу по ссылке.


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Четверг, 06 Марта 2014, 07:54
GameMixДата: Четверг, 06 Марта 2014, 10:10 | Сообщение # 1205
старожил
Сейчас нет на сайте
Цитата -l33t-h4xx- ()
то, что ты хочешь сделать, происходит само по себе, когда ты пишешь что-то вроде vec[i] = value.

-l33t-h4xx-, это то, что мне нужно. Спасибо! Теперь можно не маяться с std::sort(), а использовать простую сортировку a[i] = a[i+1] smile


Steel Standoff - 2D аркада.
Мои статьи
dembel52Дата: Пятница, 07 Марта 2014, 17:37 | Сообщение # 1206
был не раз
Сейчас нет на сайте
Помогите пожалуйста!
Начал изучать графическую библиотеку SFML по видео уроку,но у меня неправильно отресовывается массив.
В чем может быть ошибка?
Вот код:
Код

#include <SFML/Graphics.hpp>//подключаем модуль graphics       

using namespace sf;
int ground=500;
const int H=12;
const int W=40;

String TileMap[H]=       
{
     "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
     "BOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOB",
     "B         O                    B",
     "B         O                    B",
     "B         O                    B",
     "B         O                    B",
     "B         O                    B",
     "B                    B",
     "B                    B",
     "B      BB            BBBBBB                    B",
     "B      BB            BBBBBB                    B",
     "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
             
};

class PLAYER{

public:
       float dx,dy;
       FloatRect rect;
       bool onGround;
       Sprite sprite;
       float currentFrame;

       PLAYER(Texture &image)
       {
        sprite.setTexture(image);
        rect=FloatRect(32,32,40,50);

        dx=dy=0;
        currentFrame=0;
       }

       void update(float time)
       {
        rect.left+=dx*time;
        Collision(0);
        if(!onGround) dy=dy+0.0005*time;
        rect.top+=dy*time;
        onGround=false;
        Collision(1);
              

        currentFrame+=0.0005*time;
         if(currentFrame>6) currentFrame-=6;
         if(dx>0) sprite.setTextureRect(IntRect(40*int(currentFrame),244,40,50));
         if(dx<0) sprite.setTextureRect(IntRect(40*int(currentFrame)+40,244,-40,50));

        sprite.setPosition(rect.left,rect.top);

        dx=0;
       }
       void Collision(int dir)
       {
       for(int i=rect.top/16;i<(rect.top+rect.height)/16;i++)
         for(int j=rect.left/16;j<(rect.left+rect.width)/16;j++)
         {
          if(TileMap[i][j] =='B')
          {
           if((dx>0) && (dir==0))rect.left=j*16-rect.width;
           if((dx<0) && (dir==0))rect.left=j*16+16;
           if((dy>0) && (dir==1)) {rect.top=i*16-rect.height;dy=0;onGround=true;}
           if((dy<0) && (dir==1)) {rect.top=i*16+16;dy=0;}
          }
          if(TileMap[i][j]=='O')
          {
           TileMap[i][j]=' ';
          }

         }
       }
             

};

int main()       
{       
       RenderWindow window(sf::VideoMode(600,400), "Tect");//Создаем окно размером 200х200 с заголовком "Тест"       
             
       Texture t;//создаем техстуру
       t.loadFromFile("fff.png");//загружаем картинку

       float currentFrame=0;

       PLAYER p(t);
       Clock clock;       

       RectangleShape rectangle(Vector2f(16.0,16.0));

       while (window.isOpen())//главный цикл программы, работает, пока окно открыто       
       {       
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
        time=time/800;
        sf::Event event;//создаем очередь событий       
        while (window.pollEvent(event))//цикл работает, пока очередь событий не пуста       
        {       
         if (event.type == sf::Event::Closed)//если жмем крестик       
         window.close();//то окно закрывается       
        }       
        if(Keyboard::isKeyPressed(Keyboard::Left))
        {
         p.dx=-0.1;
        }
        if(Keyboard::isKeyPressed(Keyboard::Right))
        {
         p.dx=0.1;
        }
        if(Keyboard::isKeyPressed(Keyboard::Up))
        {
         if(p.onGround) {p.dy=-0.4; p.onGround=false;}
        }       
        p.update(time);

        window.clear();//очистка экрана       
        for(int i=0;i<H;i++)
         for(int j=0;j<W;j++)
         {
          if(TileMap[i][j] =='B') rectangle.setFillColor(Color::Blue);
          if(TileMap[i][j] =='O') rectangle.setFillColor(Color::Red);
          if(TileMap[i][j] ==' ') continue;
          rectangle.setPosition(i*16,j*16);
          rectangle.setSize(Vector2f(16.0,16.0));
          window.draw(rectangle);//отрисовка квадрата
         }
        window.draw(p.sprite);//отрисовка спрайта       
        window.display();//отрисовка окна       
       }       
       return 0;       
}       

Вот что получается:
ссылка
Пишу в VC 2010C++ Express
Хотя спрайт взаимодействует с картой правильно


Сообщение отредактировал dembel52 - Пятница, 07 Марта 2014, 17:49
goldsphereДата: Пятница, 07 Марта 2014, 18:14 | Сообщение # 1207
заслуженный участник
Сейчас нет на сайте
У тебя массив содержит строки разной длинны. А через циклы ты их прогоняешь, как буд-то они все длинны j. Так что, попробуй выровнять строки в масиве

FinderX - Android Аркада

Сообщение отредактировал goldsphere - Пятница, 07 Марта 2014, 18:14
dembel52Дата: Пятница, 07 Марта 2014, 18:43 | Сообщение # 1208
был не раз
Сейчас нет на сайте
Строки одинаковые,почему то здесь оони так отабражаются,пробовал редактировать все равно так(.
-l33t-h4xx-Дата: Суббота, 08 Марта 2014, 12:43 | Сообщение # 1209
участник
Сейчас нет на сайте
Поменяй индексы в теле цикла местами. У тебя адресация вида [y][x], а не [x][y].

Как правильно задавать вопросы
dembel52Дата: Суббота, 08 Марта 2014, 13:49 | Сообщение # 1210
был не раз
Сейчас нет на сайте
Все заработало спасибо!
goldsphereДата: Суббота, 15 Марта 2014, 06:17 | Сообщение # 1211
заслуженный участник
Сейчас нет на сайте
Продолжаю доставать всех с lua))) На сей момент, мне необходимо зарегистрировать функцию, но не простою, а метод класса
int Actor::addeffect(lua_Sate*)
{
..
return 0;
}
но как я уже понял, нельзя так её зарегистрировать

lua_pushcfunction(L, addeffect);
lua_setglobal(L, "addeffect");

аргумент типа int(Actor::*)(lua_State*) несовместим с параметром lua_CFunction

Если делать функцию как друга, то придётся принимать ещё 1 параметр, что тоже lua не позволит. Можно ли как-то обойти это?


FinderX - Android Аркада
LabirintikДата: Суббота, 15 Марта 2014, 07:53 | Сообщение # 1212
постоянный участник
Сейчас нет на сайте
Цитата goldsphere ()
int Actor::addeffect(lua_Sate*)
{
..
return 0;
}


если это функция не что не возвращает что мешает делать её void ?
-l33t-h4xx-Дата: Суббота, 15 Марта 2014, 09:25 | Сообщение # 1213
участник
Сейчас нет на сайте
goldsphere, почему бы не сделать отдельную функцию-обёртку, которая вызывала бы внутри себя метод класса?
Код
int lua_addeffect(lua_State *L)
{
  // Код, в котором со стека снимаются аргументы
  obj.addeffect(/* ... */);
  return 0;
}



Как правильно задавать вопросы
LabirintikДата: Суббота, 15 Марта 2014, 09:36 | Сообщение # 1214
постоянный участник
Сейчас нет на сайте
Цитата -l33t-h4xx- ()

Несовместимость типов тогда будет, умник.

сори, я добавление lua в C++ не изучал, я предположил что может сделать её void
vasua99Дата: Суббота, 15 Марта 2014, 19:50 | Сообщение # 1215
GNU follower
Сейчас нет на сайте
Вопрос. почему не работает такой код?

Код

template <typename T>
auto f(T x) -> decltype(x)
{
  T x2 = 2 * x;
  return x2 + (x * x + 1) / x2;
}

template int f(int );


И, такой кстати тоже:

Код

template <typename T>
auto f(T x) -> decltype(x)
{
  T x2 = 2 * x;
  return x2 + (x * x + 1) / x2;
}

template auto f(int x) -> decltype(x);


Ошибка: не удается сопоставить создание экземпляра с шаблоном(дословно). Или ни как так не получится(имею ввиду с возвращаемым типом определяемым с помощью decltype)?


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
SnuuxДата: Суббота, 15 Марта 2014, 20:30 | Сообщение # 1216
постоянный участник
Сейчас нет на сайте
vasua99, ideone.com нормально запускает первый вариант: http://ideone.com/ytgdhi
PoliusДата: Суббота, 15 Марта 2014, 20:59 | Сообщение # 1217
был не раз
Сейчас нет на сайте
vasua99, Snuux, Различные компиляторы по разному поддерживают стандарт.
LabirintikДата: Суббота, 15 Марта 2014, 21:00 | Сообщение # 1218
постоянный участник
Сейчас нет на сайте
Как загрузить текстовой файл(fstream) из папки с проектом (извините за нубство)
vasua99Дата: Суббота, 15 Марта 2014, 21:19 | Сообщение # 1219
GNU follower
Сейчас нет на сайте
Цитата Labirintik ()
Как загрузить текстовой файл(fstream) из папки с проектом (извините за нубство)


Код

#include <fstream>

int main()
{
     std::ifstream input("input.txt");
     std::ofstream output("output.txt");
     ... дальше работаешь как с обычными потоками ввода-вывода(cout, cin)

     input.close();
     output.close();
     ...
}

Добавлено (15.03.2014, 21:19)
---------------------------------------------

Цитата Polius ()
vasua99, Snuux, Различные компиляторы по разному поддерживают стандарт.

Ну а по стандарту что сказано в данном случае?(C++11)


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
LabirintikДата: Суббота, 15 Марта 2014, 21:21 | Сообщение # 1220
постоянный участник
Сейчас нет на сайте
Цитата vasua99 ()
#include <fstream>

int main()
{
std::ifstream input("input.txt");
std::ofstream output("output.txt");
... дальше работаешь как с обычными потоками ввода-вывода(cout, cin)

input.close();
output.close();
...
}

это я знаю, ну у меня они не с папки запуска проекта читаются

Добавлено (15.03.2014, 21:21)
---------------------------------------------
А всё работает, видимо надо запускать с папки проекта, а не через VS

Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Поиск:

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