уроки sfml ,вопросы по урокам

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics уроки sfml ,вопросы по урокам

В этой теме 9 ответов, 2 участника, последнее обновление Alex Alex 8 года/лет, 2 мес. назад.

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)
  • Автор
    Сообщения
  • #2787
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

    вопрос следующий: при добавлении функции void interactionWithMap(),после компиляции появляется один белый экран, и windows аварийно завершает программу,в чем может быть проблема?(урок 11)

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

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

    Репутация:106

    если закомментируешь эту строку то всё норм?

    может у тебя персонаж появляется в месте, где не должен и застревает благодаря этой ф-ции?

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

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

    Репутация:106

    скидывай на будущее весь код, может рисование не так проходит в конечном счёте. и проект тоже кидай.

    #2794
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

    сейчас ситуация немного другая, я поменял местами, в функции , как было в уроке (<span class=”crayon-v”>TileMap</span><span class=”crayon-sy”>[</span><span class=”crayon-v”>i</span><span class=”crayon-sy”>]</span><span class=”crayon-sy”>[</span><span class=”crayon-v”>j</span><span class=”crayon-sy”>]</span> <span class=”crayon-o”>==</span> <span class=”crayon-s”>’0′)     на     (<span class=”crayon-v”>TileMap</span><span class=”crayon-sy”>[j</span><span class=”crayon-sy”>]</span><span class=”crayon-sy”>[</span><span class=”crayon-v”>i</span><span class=”crayon-sy”>]</span> <span class=”crayon-o”>==</span> <span class=”crayon-s”>’0′)?то есть x с y местами поменял, после этого почему то заработало, но не все, </span></span>

    <span class=”crayon-s”><span class=”crayon-s”>что получилось,влево персонаж останавливается как надо, вправо останавливается заранее почти на пол карты</span></span>

    #2795
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

    сейчас ситуация немного другая, я поменял местами, в функции , как было в уроке (TileMap[i][j] == ‘0’) на (TileMap[j][i] == ‘0’)то есть x с y местами поменял, после этого почему то заработало, но не все,
    что получилось,влево персонаж останавливается как надо, вправо останавливается заранее почти на пол карты

    #2796
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

    код немного изменил под тип “марио” и добавил возвращение анимации при остановке персонажа

    #2797
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

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

    using namespace sf;//включаем пространство имен sf, чтобы постоянно не писать sf::

    class Player//class igroka
    {

    private:float x, y;

    public:

    float w,h, dx,dy,speed;
    int dir =0;
    String File;
    Image image;
    Texture texture;
    Sprite sprite;

    Player(String F,float X,float Y,float W,float H)//конструктор
    {
    dx = 0;dy = 0;speed = 0;dir = 0;
    File = F;
    w=W,h=H;
    image.loadFromFile(“imaj/” + File);
    image.createMaskFromColor(Color(255,255,255));
    image.createMaskFromColor(Color(41,33,59));
    texture.loadFromImage(image);
    sprite.setTexture(texture);
    x=X,y=Y;

    sprite.setTextureRect(IntRect(0, 0, w, h));
    }

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

    }
    x += dx*time;
    y+= dy*time;

    speed =0;

    sprite.setPosition(x,y);
    interactionWithMap();

    }

    void interactionWithMap()//ф-ция взаимодействия с картой
    {

    for (int j = x / 32; j<(x + w) / 32; j++)
    for (int i = y / 32; i < (y + h) / 32; i++)
    {
    if (TileMap[j][i] == ‘0’)//если наш квадратик соответствует символу 0 (стена), то проверяем “направление скорости” персонажа:
    {

    if (dx>0)
    {
    x = j * 32 ;break;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа
    }
    if (dx < 0)
    {
    x = j * 32 + 32;break;//аналогично идем влево
    }
    }

    if (TileMap[j][i] == ‘s’) { //если символ равен ‘s’ (камень)

    TileMap[j][i] = ‘ ‘;//убираем камень, типа взяли бонус. можем и не убирать, кстати.
    }
    }
    }

    float getplayercoordinateX(){ //этим методом будем забирать координату Х
    return x;
    }

    float getplayercoordinateY(){ //этим методом будем забирать координату Y
    return y;
    }

    };

    int main()
    {
    RenderWindow window(sf::VideoMode(640, 480), “Marin”); //увеличили для удобства размер окна
    view.reset(sf::FloatRect(0,0, 640, 480));//размер “вида” камеры при создании объекта вида камеры. (потом можем менять как хотим) Что то типа инициализации.

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

    Player p(“martin.png”,100,390,120,125);//ввод в коструктор

    p.sprite.setTextureRect(IntRect(0,200, 120, 125));//начальное расположение спрайта

    p.sprite.setScale(0.5, 0.5);//размер персонажа

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

    Clock clock;//переменная времени

    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::Right)){
    p.dir = 0; p.speed = 0.3;
    CurrentFrame += 0.008*time;//скорость анимации
    if(CurrentFrame >6)CurrentFrame -= 6;
    p.sprite.setTextureRect(IntRect(150 * int(CurrentFrame),0, 120,125));
    getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY());
    }
    else
    p.sprite.setTextureRect(IntRect(0,200, 120, 125));//начальное расположение спрайта

    if (Keyboard::isKeyPressed(Keyboard::Left)){
    p.dir = 1; p.speed = 0.3;
    CurrentFrame += 0.008*time;
    if(CurrentFrame >6)CurrentFrame -= 6;
    p.sprite.setTextureRect(IntRect(150* int(CurrentFrame)+150,0, -130, 125));
    getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY());
    }
    else if (p.dir ==1){
    p.sprite.setTextureRect(IntRect(120,200, -120, 125));//начальное расположение спрайта
    }

    if (Keyboard::isKeyPressed(Keyboard::Up)){
    p.dir = 3; p.speed = 0.3;

    p.sprite.setTextureRect(IntRect(450,0, 120,125));

    }

    // //////////////////////////////////////////////////

    p.ogivlenie(time);//оживление ввод времени

    window.clear(Color(246,236,211));

    // ///////////карта(печатаем карту по квадратику)////////////////////// //
    for (int i = 0; i < visota; i++)
    for (int j = 0; j < shirina; j++)
    {
    if (TileMap[i][j] == ‘ ‘) s_map.setTextureRect(IntRect(283,157, 32, 32)); //если встретили символ пробел, то рисуем 1й квадратик
    if (TileMap[i][j] == ‘s’) s_map.setTextureRect(IntRect(32, 329, 32, 32));//если встретили символ s, то рисуем 2й квадратик
    if ((TileMap[i][j] == ‘0’)) s_map.setTextureRect(IntRect(0, 409, 32, 32));//если встретили символ 0, то рисуем 3й квадратик

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

    window.draw(s_map);//выводим карту

    }

    window.setView(view);
    window.draw(p.sprite);//выводим спрайт на экран
    window.display();
    }

    return 0;
    }

    #2798
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

    строка “x = j * 32 ;break;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа” – это уже я сам эксперементировал что бы изменить ситуацию

    #2799
    +1
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

    все разобрался в чем причина, проблема была из за функции p.sprite.setScale(1, 1); она уменьшала картинку, но не сам спрайт поэтому, поэтому персонаж останавливался раньше нужного, так же закрывалось окно из за того что спрайт был распложен там где не должен был быть, так как он был больше самой картинки я этого не мог видеть

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

    добавил один таил для положения персонажа в положении покоя и когда он подходит к препятствию

    #2800
    +1
    Alex
    Alex
    Участник
    Сообщений:41

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

    Репутация:22

    код который получился :

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)

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