Спрайт не хочет сотрудничать - PullRequest
0 голосов
/ 22 мая 2018

Я делаю проект на C ++ SFML.Ниже вы можете увидеть небольшой фрагмент анимационного «движка» кода.Это моя проблема: в функции движения, в зависимости от того, какая клавиша нажата, переменная направления «dir» меняется.Затем в int main () функция aniamte_char принимает спрайт в качестве одного из своих параметров, в данном случае один элемент массива спрайтов "ch []", который имеет идентификатор "e.dir".Теперь, что происходит, это то, что «e.dir = 0» работает нормально, анимация воспроизводится нормально, но для «e.dir = 1,2,3,4» ничего не отображается.Я попытался возиться, чтобы решить эту проблему, но, похоже, ничего не работает, и я ничего не понимаю; / Если кто-то знает, почему это происходит, помогите.

int_main ()

#include <SFML/Graphics.hpp>
#include <iostream>
#include <conio.h>
#include <windows.h>

#include "InfiPower.h"

#define WIDTH 1200
#define HEIGHT 800
#define FRQ 10

using namespace std;
using namespace sf;

int main()
{
    RenderWindow win(VideoMode(WIDTH,HEIGHT),"takie cos lol");
    win.setFramerateLimit(60);

    InfiPower e(WIDTH/2-25,HEIGHT/2-25,true,0,0,-1);

    Texture bg_[1];
    bg_[0].loadFromFile("Textures/bg.png");

    Texture ch_[5];
    ch_[0].loadFromFile("Textures/char_idle.png");
    ch_[1].loadFromFile("Textures/char_right.png");
    ch_[2].loadFromFile("Textures/char_up.png");
    ch_[3].loadFromFile("Textures/char_left.png");
    ch_[4].loadFromFile("Textures/char_down.png");
    Sprite ch[5];
    ch[0].setTexture(ch_[0]);
    ch[1].setTexture(ch_[1]);
    ch[2].setTexture(ch_[2]);
    ch[3].setTexture(ch_[3]);
    ch[4].setTexture(ch_[4]);

    e.cur_bg=0;

    while(win.isOpen())
    {
        win.clear();

        e.movement(10,10000,WIDTH);
        e.set_background(win,bg_);
        cout<<e.dir<<endl;
        e.animate_char(win,ch[e.dir],100,FRQ);

        if(Keyboard::isKeyPressed(Keyboard::Escape))
        {
            exit(0);
        }

        win.display();
    }
}

фрагментмоя анимация "движок":

#include <SFML/Graphics.hpp>
#include <iostream>
#include <conio.h>
#include <windows.h>
#include "InfiPower.h"

using namespace std;
using namespace sf;

void InfiPower::animate_char(RenderWindow & win,Sprite & s,int cell_width,int caf)
{
    s.setPosition(c_xo,c_yo);
    s.setTextureRect(IntRect(state*cell_width,dir*cell_width,cell_width,cell_width));

    if(anim_c==caf)
    {
        state++;
        anim_c=0;
    }
    if(state>=4)
    {
        state=0;
    }

    win.draw(s);
    anim_c++;
}
void InfiPower::movement(int ms,int b,int w)
{
    if(Keyboard::isKeyPressed(Keyboard::D))
    {
        if(bg_x>=((b-w)*(-1)+ms))
        {
            in_motion=true;
            bg_x=bg_x-ms;
        }
        last_dir=1;
        dir=1;
    }
    else if(Keyboard::isKeyPressed(Keyboard::A))
    {
        if(bg_x+ms<=0)
        {
            in_motion=true;
            bg_x=bg_x+ms;
        }
        last_dir=3;
        dir=3;
    }
    else if(Keyboard::isKeyPressed(Keyboard::S))
    {
        if(if_4_dirs==true)
        {
            //if(bg_y-ms>=800)
            //{
                in_motion=true;
                bg_y-=ms;
            //}
            last_dir=4;
            dir=4;
        }
    }
    else if(Keyboard::isKeyPressed(Keyboard::W))
    {
        if(if_4_dirs==true)
        {
            //if(bg_y+ms<=0)
            //{
                in_motion=true;
                bg_y+=ms;
            //}
            last_dir=2;
            dir=2;
        }
    }
    else
    {
        in_motion=false;
        dir=0;
    }
}
void InfiPower::set_background(RenderWindow & win,Texture bg_[])
{
    Sprite bg;
    bg.setPosition(bg_x,bg_y);

    for(int i=0; i>=(-1); i++)
    {
        if(i==cur_bg)
        {
            bg.setTexture(bg_[i]);
            win.draw(bg);
            break;
        }
    }
}

1 Ответ

0 голосов
/ 22 мая 2018

Полагаю, эта строка устанавливает исходный прямоугольник координаты Y на следующую строку вниз.Для dir = 0 это верхняя строка, и она будет работать правильно:

s.setTextureRect(IntRect(state*cell_width,dir*cell_width,cell_width,cell_width));

Если есть одна строка, то она должна быть:

s.setTextureRect(IntRect(state*cell_width,0,cell_width,cell_width));

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

Меня беспокоит то, что вы делаете много «плохих» вещей, которые замедляют вас, пока вы не научитесь их исправлять.Например, for(int i=0; i>=(-1); i++) означает while(true) until integer overflow.То, что код «работает», не означает, что вы хотите сказать.Семантика имеет большое значение в программировании.

Как указано выше, вы должны научиться использовать отладчик и проходить по коду.Это очень фундаментальный навык.

Я бы посоветовал пройти урок по программированию, прочитать несколько книг, изучить чужой код и т. Д.используя коммерческий движок и узнав, как они это делают.Это подход TOP-DOWN и позволяет вам изучить более абстрактные концепции, прежде чем приступить к работе с низкоуровневыми вещами.Я рекомендую что-то вроде Unity.

...