池技术的简单应用 初次接触游戏优化(逻辑优化)技术

怪物链表的优化

怪物对象(int hp,int level)由怪物管理类(list<Monster*>Monsterlist,list<Monster*>Dead_Monsterlist,)调用怪物工厂类的创建方法创建,存放到怪物管理类中的怪物链表

Monsterlist(活动链表)中,调用怪物管理类中的自动掉血方法(AutoloseHP()),当血量为0时从活动链表中删除,并放入Dead_list中;给活动链表设置了怪物数量的最小(m_Min)

和最大值(m_Max),当活动链表的大小小于m_Min时随机从死亡链表中拿出(rand() % (m_Max - m_Min - 1) + m_Min - len)个怪物并重新赋值hp和level,存进Monsterlist中,并删

除死亡链表中的这些元素;在运行时会达到平衡,不会再调用新的内存,也不会因删除节点导致内存碎片的产生。

 

while (true)
    {
        manage->AddListsToMin();
        manage->Render();
        manage->AutoLoseHP();
        manage->DelMonster();
        cout << endl;
        manage->RenderDeadlist();
        Sleep(2000);
    }

 

 

 

第一次实现当中出现的问题:

1.原本Dead_list没有元素,那么如果随机产生的怪物数量大于Dead_list接收Monsterlist已死亡中的个数该怎么解决?

2.第一次运行时,每次重新生成的怪物都是原本的等级和血量,个数也和原始的Monsterlist一样,但经过检查发现,Deadlist中并没有元素

3.修改之后运行发现,死亡一个怪物,进行删除时出现异常

池技术的简单应用 初次接触游戏优化(逻辑优化)技术
 1 1 void MonsterManage::AutoLoseHP()
 2  2 {
 3  3     list<Monster*>::iterator it = m_MonstList.begin();
 4  4     while( it != m_MonstList.end())
 5  5     {
 6  6         (*it)->loseHp(10);
 7  7         if ((*it)->GetHp() == 0);
 8  8         {
 9  9             cout << "怪物已死亡" << endl;
10 10             m_MonstList.remove(*it);//出现异常
11 11             m_MonstList_Dead.push_back(*it);
12 12             
13 13         }
14 14         it++;
15 15         
16 16     }
17 17 } 
错误代码

第二次实现解决的问题:

1.通过随机产生的怪物数量大于Dead_List中的个数,则申请新的内存,创建新的怪物对象后插入Monsterlist中,这样还是可以达到理想的平衡状态

2.缺少循环条件,导致血量没有减少到0

3.使用remove方法时,已经将迭代器it指向的内容删除,t指向非法的内存,此时再存入Dead_list时就会报错;

解决方法:先将死亡的对象存入Dead_list,然后使用erase方法(erase删除传入的迭代器位置的元素,并返回下一个迭代器)代替remove删除对象,这样既可以避免存入死亡链表的是非法迭代器,也可以将迭代器自动偏移

池技术的简单应用 初次接触游戏优化(逻辑优化)技术
 1 void MonsterManage::DelMonster()
 2 {
 3     list<Monster*>::iterator it= m_MonstList.begin();
 4     for (; it != m_MonstList.end(); )
 5     {
 6         if ((*it)->GetHp() == 0)
 7         {
 8             /*cout << "怪物等级:" << (*it)->GetLV() << "血量:" << (*it)->GetHp() << endl;*/
 9             m_MonstList_Dead.push_back(*it);
10             it=m_MonstList.erase(it);
11         }
12     }
13 }
View Code

至此,怪物链表的池技术简单实现已经基本完成;实现的比较粗糙,现阶段没有应用价值,只是借此对池技术的原理有一个大致了解,希望有对此理解更深的大佬指导指导;

 

上一篇:javascript-如何对字母和特殊字符禁用粘贴选项,但对数字启用


下一篇:ubuntu 下dbus的环境搭建和使用