问题描述
我目前在一个学校项目中,我没有任何想法去做我真正想做的事情,因为我是一个初学者。首先,我使用的是 SFML 2.5,这就是问题所在。
问题。
我必须创建一个里面有鱼的水族馆。我遵循了网上的教程,最终创建了一个水族馆,其中有一个实体正在移动和检测碰撞,这要归功于 TileMap。问题是我必须在玩家每次点击时创建一个实体。我使用工厂和抽象实体来创建和绘制实体
我在互联网上看到,我们可以创建一个具有创建和销毁管理功能的实体池。我试过这样做,但结果不在这里。有人能帮我吗。不要犹豫,让我分享代码或信息。
我的鱼实体
class Fish : public Character
{
public:
Fish();
~Fish();
Fish* getNext() const { return state_.next; }
void setNext(Fish* next) { state_.next = next; }
void move();
bool inUse() const { return framesLeft_ > 0; }
private:
int framesLeft_;
union
{
// State when it's in use.
struct
{
double x,y;
double xVel,yVel;
} live;
// State when it's available.
Fish* next;
} state_;
};
我的池实体
class FishPool
{
public:
explicit FishPool(void) :
m_entities(new Fish[POOL_SIZE])
m_firstAvailable(nullptr) {
// Assign first available entity.
m_firstAvailable = m_entities[0];
// Assign each entity's next pointer.
for (int i = 0; i < POOL_SIZE - 1; ++i) {
m_entities[i].setNext(&m_entities[i + 1]);
}
// Terminate end of array.
m_entities[POOL_SIZE - 1].setNext(nullptr);
}
~FishPool(void) {
delete[] m_entities;
}
Fish* create(void) {
// Check if pool is full.
//assert(m_firstAvailable != nullptr);
// Pull out the next available entity.
Fish* e = m_firstAvailable;
m_firstAvailable = e->getNext();
// Init entity if needed...
// ...
return e;
}
void destroy(Fish* e) {
// Reset entity data...
// ...
e->setNext(m_firstAvailable);
m_firstAvailable = e;
}
private:
static const int POOL_SIZE = 100;
Fish m_entities[POOL_SIZE];
Fish m_firstAvailable;
};
我的循环游戏
// Boucle de jeu
while (window.isopen()) {
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
/*switch (event.type) {
case sf::Event::MouseButtonpressed:
// Ajout d'un point fish
scores.AddPoint(1);
// Ajout d'un point algues
scores.AddPointAlg(1);
// La creation de poisson
if (!tileFish.move("images/fish.png",sf::Vector2u(32,32),fish.GetX(),fish.GetY()))
return -1;
break;
case sf::Event::MouseButtonReleased:
//
break;
}*/
}
sf::Time delta_time = sf::milliseconds(100);
instance.Update();
elapsed_time += r.restart();
// Update/Refresh frequency
float f = fps.getFps(instance);
if (sf::Mouse::isButtonpressed(sf::Mouse::Left))
{
factory.Create("fish");
}
else {
// We have enough time to spawn a sprite. ( may be for several ? )
while (elapsed_time >= delta_time) {
// Spawn your sprite
// ...
/*if (sf::Mouse::isButtonpressed(sf::Mouse::Left))
{
if (!tileFish.create("images/fish.png",fish.GetY()))
return -1;
}*/
if (!tileFish.move(imageFish,fish.GetY()))
return -1;
fish.move();
//dory.move();
// Substract the time consumed
elapsed_time -= delta_time;
}
}
window.clear();
window.draw(tileMap);
window.draw(tileFish);
map.drawText(window,scores.Getscores(),scores.GetscoresAlg(),instance.GetStartedTime(),f);
window.display();
}
return -1;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)