Создание игры "Уголки"

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics Создание игры "Уголки"

В этой теме 49 ответов, 3 участника, последнее обновление Павел Букреев Павел Букреев 8 года/лет, 5 мес. назад.

Просмотр 15 сообщений - с 31 по 45 (из 50 всего)
  • Автор
    Сообщения
  • #2199
    Heisenberg
    Heisenberg
    Участник
    Сообщений:320

    Зарегистрирован:
    01.04.2015

    Репутация:146

    std::list<T>, std::vector<T>…

    #2200
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:582

    Зарегистрирован:
    04.01.2015

    Репутация:106

    использовать цикл for i=0, … , 12
    где element[i].sprite.setPosition(x,y); // как то так

    #2216

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    если у меня белые это объект w класса Player, а черные объект b класса Player, то тогда для расстановки, element[i].w.sprite.setposition(x,y)?

     

    #2217

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    почему спрайт не перемещается, ведь когда я его пробовал перемещать как в 17 уроке все работало, а как по 18 не перемещается, а просто выводит “приехали”

     

    #include <SFML/Graphics.hpp>
    #include “map.h”
    #include <iostream>

    using namespace sf;

    class Player { // класс Игрока
    public:
    float dx,dy,x, y, w, h, d,speed; //координаты игрока х и у, высота ширина
    int dir;
    bool isMove, isSelect;//добавили переменные состояния движения и выбора объекта
    String File; //файл с расширением
    Image image;//сфмл изображение
    Texture texture;//сфмл текстура
    Sprite sprite;//сфмл спрайт

    Player(String F, float X, float Y, float W, float H) { //Конструктор с параметрами(формальными) для класса Player. При создании объекта класса мы будем задавать имя файла, координату Х и У, ширину и высоту
    isMove = false; isSelect = false;
    dir = 0, speed = 0,dx=0,dy=0;
    File = F;//имя файла+расширение
    w = W; h = H;//высота и ширина
    image.loadFromFile(“images/” + File);//запихиваем в image наше изображение вместо File мы передадим то, что пропишем при создании объекта. В нашем случае “hero.png” и получится запись идентичная image.loadFromFile(“images/hero/png”);
    image.createMaskFromColor(Color(136, 102, 64));
    texture.loadFromImage(image);//закидываем наше изображение в текстуру
    sprite.setTexture(texture);//заливаем спрайт текстурой
    x = X; y = Y;//координата появления спрайта
    sprite.setTextureRect(IntRect(0, 0, w, h)); //Задаем спрайту один прямоугольник для вывода одного льва, а не кучи львов сразу. IntRect – приведение типов

    }

    void update(float time)
    {
    switch (dir)
    {
    case 0: dx = speed; dy = 0; break;
    case 1: dx = -speed; dy = 0; break;
    case 2: dx = 0; dy = speed; break;
    case 3: dx = 0; dy = -speed; break;
    }

    x += dx*time;
    y += dy*time;
    if (!isMove) speed = 0;
    sprite.setPosition(x, y);
    }
    };

    int main()
    {
    RenderWindow window(VideoMode(600, 600), “Game Corner”);

    Image map_image;//объект изображения для карты
    map_image.loadFromFile(“Images/chess.jpg”);//загружаем файл для карты
    Texture map;//текстура карты
    map.loadFromImage(map_image);//заряжаем текстуру картинкой
    Sprite s_map;//создаём спрайт для карты
    s_map.setTexture(map);//заливаем текстуру спрайтом

    Player p(“white_checker.png”, 0, 0, 39.0, 39.0);//создаем объект p класса player,задаем “hero.png” как имя файла+расширение, далее координата Х,У, ширина, высота.

    Player b(“black_checker.png”, 0, 0, 39.0, 39.0);//создаем объект p класса player,задаем “hero.png” как имя файла+расширение, далее координата Х,У, ширина, высота.

    b.sprite.setPosition(57, 79);
    p.sprite.setPosition(4, 6);

    float CurrentFrame = 0;//хранит текущий кадр
    Clock clock;

    float dX = 0;//корректировка нажатия по х
    float dY = 0;//по у
    int tempX = 0;//временная коорд Х.Снимаем ее после нажатия прав клав мыши
    int tempY = 0;//коорд Y
    float distance = 0;//это расстояние от объекта до тыка курсора

    while (window.isOpen())
    {
    float time = clock.getElapsedTime().asMicroseconds();

    clock.restart();
    time = time / 800;

    Vector2i pixelPos = Mouse::getPosition(window);//забираем коорд курсора
    Event event;
    while (window.pollEvent(event))
    {
    if (event.type == Event::Closed)
    window.close();

    if (event.type == Event::MouseButtonPressed)//если нажата клавиша мыши
    if (event.key.code == Mouse::Left) {//а именно левая
    if (p.sprite.getGlobalBounds().contains(pixelPos.x, pixelPos.y))//и при этом координата курсора попадает в спрайт
    {
    p.sprite.setColor(Color::Green);//красим спрайт в зеленый,тем самым говоря игроку,что он выбрал персонажа и может сделать ход
    p.isSelect = true;
    }
    }
    if (p.isSelect)//если выбрали объект
    if (event.type == Event::MouseButtonPressed)//если нажата клавиша мыши
    if (event.key.code == Mouse::Right) {//а именно правая
    p.isMove = true;//то начинаем движение
    p.isSelect = false;//объект уже не выбран
    p.sprite.setColor(Color::White);//возвращаем обычный цвет спрайту
    tempX = pixelPos.x;//забираем координату нажатия курсора Х
    tempY = pixelPos.y;//и Y

    }
    }
    if (p.isMove) {
    distance = sqrt((tempX – p.x)*(tempX – p.x) + (tempY – p.y)*(tempY – p.y));//считаем дистанцию (расстояние от точки А до точки Б). используя формулу длины вектора

    if (distance > 2) {//этим условием убираем дергание во время конечной позиции спрайта

    p.x += 0.1*time*(tempX – p.x) / distance;//идем по иксу с помощью вектора нормали
    p.y += 0.1*time*(tempY – p.y) / distance;//идем по игреку так же
    }
    else { p.isMove = false; std::cout << “priehali\n”; }//говорим что уже никуда не идем и выводим веселое сообщение в консоль
    }

    p.update(time);
    window.clear();

    /////////////////////////////Рисуем карту/////////////////////
    for (int i = 0; i < HEIGHT_MAP; i++)
    for (int j = 0; j < WIDTH_MAP; j++)
    {
    if (TileMap[i][j] ==’F’) s_map.setTextureRect(IntRect(458, 159, 60, 60));

    if (TileMap[i][j] == ‘1’) s_map.setTextureRect(IntRect(458, 159, 60, 60)); //если встретили символ пробел, то рисуем 1й квадратик
    if (TileMap[i][j] == ‘0’) s_map.setTextureRect(IntRect(347, 159, 60, 60));//если встретили символ s, то рисуем 2й квадратик

    if (i == 2 & j == 6) p.sprite.setPosition(310, 70);

    s_map.setPosition(j * 60, i * 60);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадрат

    window.draw(s_map);//рисуем квадратики на экран

    }
    window.draw(p.sprite);
    window.draw(b.sprite);
    window.display();
    }

    return 0;
    }

    #2249

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    так где может быть ошибка, а?

    #2250
    +1
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:582

    Зарегистрирован:
    04.01.2015

    Репутация:106

    фиг знает, код не подсвечивается, не видно что к чему))

    #2251

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    он перетаскивает только в том случае, если я не указываю начальные координаты в int main и ее координаты получаются (0,0), но если мне стоит изменить их в int main,он показывается что ее координаты (0,0) , но на самом деле шашка стоит  (120,60) и все она не двигается после этого, где надо правильно указывать координаты шашек, чтоб они еще и двигались?

    #2252

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    кстати  если убрать void update(float time), то передвижения тоже нет!

    #2253
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:582

    Зарегистрирован:
    04.01.2015

    Репутация:106

     

    #2254

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    забей, это я убрал. я понял что указание позиции он там рисует(я оставил <span class=”crayon-v”>p</span><span class=”crayon-sy”>.</span><span class=”crayon-v”>sprite</span><span class=”crayon-sy”>.</span><span class=”crayon-e”>setPosition</span><span class=”crayon-sy”>(</span><span class=”crayon-cn”>310</span><span class=”crayon-sy”>,</span> <span class=”crayon-cn”>70</span><span class=”crayon-sy”>)</span><span class=”crayon-sy”>;)</span>, но почему-то я все равно он не перерисовывается на новом месте(расчеты идут и есть координаты новой позиции, но стоит)

    #2255
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:582

    Зарегистрирован:
    04.01.2015

    Репутация:106

    ох, что то с подсветкой кода. как ты вставлял код?

    то что никуда не едет надо смотреть в сторону движения x+=, y+=

    #2287

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    вот весь проект, вот именно что они меняют, а шашка не двигается

    #2288

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    здесь находятся  картинки и сам код программы

    Вложения:
    You must be logged in to view attached files.
    #2290
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:582

    Зарегистрирован:
    04.01.2015

    Репутация:106

    вечером гляну

    #2291

    CapitanRex19
    Участник
    Сообщений:28

    Зарегистрирован:
    08.11.2015

    Репутация:0

    https://yadi.sk/d/l9_yQIZ5kbXTy здесь полная сборка программы

Просмотр 15 сообщений - с 31 по 45 (из 50 всего)

Для ответа в этой теме необходимо авторизоваться.