雪碧不想合作
Sprite doesn't want to cooperate
我正在用 C++ SFML 制作一个项目。您可以在下面看到一小段动画 "engine" 代码。这是我的问题:在移动功能中,方向变量 "dir" 会根据按下的键而改变。然后,在 int main() 中,aniamte_char 函数将精灵作为其参数之一,在本例中,是 "ch[]" 精灵数组中具有 ID "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();
}
}
我的动画片断"engine":
#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;
}
}
}
我猜这行是将 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));
我想说点什么,我并不是要刻薄或无礼,但我认为你应该放慢速度,多学一点编码,然后再继续。对于当前的项目,您已经咬得太多了。 (基于这个问题和之前的问题)
我担心的是,您正在做很多 'bad' 事情,这些事情会减慢您的速度,直到您学会解决它们。例如。 for(int i=0; i>=(-1); i++)
表示 while(true) until integer overflow
。仅仅因为代码 "works" 并不意味着它就是您要说的。语义在编程中很重要。
如上所述,您应该学习如何使用调试器并单步执行代码。这是一项非常基础的技能。
我建议学习 class 编程,阅读一些书籍,研究其他人的代码等...
我还强烈建议通过使用商业引擎来学习游戏引擎编程,并了解他们是如何做到这一点的。这是一种自上而下的方法,可让您在处理低级问题之前学习更抽象的概念。我推荐像 Unity 这样的东西。
我正在用 C++ SFML 制作一个项目。您可以在下面看到一小段动画 "engine" 代码。这是我的问题:在移动功能中,方向变量 "dir" 会根据按下的键而改变。然后,在 int main() 中,aniamte_char 函数将精灵作为其参数之一,在本例中,是 "ch[]" 精灵数组中具有 ID "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();
}
}
我的动画片断"engine":
#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;
}
}
}
我猜这行是将 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));
我想说点什么,我并不是要刻薄或无礼,但我认为你应该放慢速度,多学一点编码,然后再继续。对于当前的项目,您已经咬得太多了。 (基于这个问题和之前的问题)
我担心的是,您正在做很多 'bad' 事情,这些事情会减慢您的速度,直到您学会解决它们。例如。 for(int i=0; i>=(-1); i++)
表示 while(true) until integer overflow
。仅仅因为代码 "works" 并不意味着它就是您要说的。语义在编程中很重要。
如上所述,您应该学习如何使用调试器并单步执行代码。这是一项非常基础的技能。
我建议学习 class 编程,阅读一些书籍,研究其他人的代码等...
我还强烈建议通过使用商业引擎来学习游戏引擎编程,并了解他们是如何做到这一点的。这是一种自上而下的方法,可让您在处理低级问题之前学习更抽象的概念。我推荐像 Unity 这样的东西。