Ogre之简易地模拟人物退格血条

写在前面:

首先,在制作该人物血条前,我需要声明以下几点:

1.人物的血条属于简易制作的退格方式,不是连续的进度条类型。

2.该血条制作纯属快速开发完成,没有达到精细的程度,高手可以绕道。

以以上两点为前提,我粗略的讲述一下我在OGRE中用CEGUI制作血条的过程。

首先,人物头像用了一张我很喜欢的全职猎人中奇伢的图片:

紧接着,为了配合紫色色调,我我选取了一种紫色的血条单元:

有了血条单元(这里我称之为紫星),之后,用图片制作工具拼接制作了11张图片,

从0星紫星一直到10星紫星,取名为purple_x.jpg(x为紫星数量),为了便于理解,这里附

一张九星紫星的图片:

到此为止,素材准备好了,便开始在OGRE中完成我的程序部分了,

以下是我完成图片,文字,及窗口绘制部分的代码,我将其封装在一个函数中:

(CEGUI为0.8.3版本)

//----------------------------------【CreateSrcBloodShowWindow()函数】----------------------------------
// Desc:创建主模型血量显示的窗口
//------------------------------------------------------------------------------------------------------
void NinthCEGUI::CreateSrcBloodShowWindow(float ratio /* = 1.6f */)
{
	CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();

	//创建退格血条,血量数量,人物头像三个窗口
	m_BloodW = wmgr.createWindow("WindowsLook/StaticImage", "Beyond/Blood");
	m_BloodNumW = wmgr.createWindow("OgreTray/StaticText", "Beyond/BloodNum");
	CEGUI::Window* head = wmgr.createWindow("WindowsLook/StaticImage", "Beyond/head");
	//载入相关图片
	CEGUI::ImageManager::getSingleton().addFromImageFile("head", "head.jpg");
	for (size_t i = 0; i <= 10; i++)
		CEGUI::ImageManager::getSingleton().addFromImageFile("purple"+
		Ogre::StringConverter::toString(i), "purple_"+ Ogre::StringConverter::toString(i)+".jpg");
	//将图片添加到窗口中
	MyCEGUISystem::getSingletonPtr()->addImageToWindow(head, "head", 0.02f/ratio, 0.02f, 0.1f/ratio, 0.1f);
	MyCEGUISystem::getSingletonPtr()->addImageToWindow(m_BloodW, "purple10", 0.12f / ratio, 0.085f, 0.25f/ratio, 0.035f);
	m_BloodNumW->setArea(CEGUI::UDim(0.13f / ratio, 0), CEGUI::UDim(0.05f, 0),
		CEGUI::UDim(0.2f / ratio , 0), CEGUI::UDim(0.04f, 0));

	//去掉血量窗口的文本边框和背景,设置文本为浅紫色
	m_BloodNumW->setProperty("FrameEnabled", "false");
	m_BloodNumW->setProperty("BackgroundEnabled", "false");
	m_BloodNumW->setProperty("TextColours", "tl:FFFFAAFF tr:FFFFAAFF bl:FFFFAAFF br:FFFFAAFF");

	//添加到根窗口
	CEGUI::Window* root = CEGUI::System::getSingleton().getDefaultGUIContext().getRootWindow();
	root->addChild(m_BloodW);
	root->addChild(m_BloodNumW);
	root->addChild(head);
}

我在退格血条的上方显示了血量的具体数值,为了配合整体色调,将其设置为浅紫色,

以下是我自己封装完成的MyCEGUISystem州农工addFromImageFile和addImageToWindow具体细节:

//----------------------------------【addFromImageFile()函数】--------------------------------------
// Desc:添加一张图片
//--------------------------------------------------------------------------------------------------
void MyCEGUISystem::addFromImageFile(const CEGUI::String& imageName, const CEGUI::String& fileName)
{
	CEGUI::ImageManager::getSingleton().addFromImageFile(imageName, fileName);
}
//----------------------------------【createImageWindow()函数】-------------------------------------
// Desc:创建静态图片窗口
//--------------------------------------------------------------------------------------------------
void MyCEGUISystem::addImageToWindow(CEGUI::Window* window,const CEGUI::String& imageName,
	float left /* = 0.0f */, float top /* = 0.0f */, float width /* = 1.0f */, float height/* = 1.0f */)
{
	window->setArea(CEGUI::UDim(left, 0.0f), CEGUI::UDim(top, 0.0f),
		CEGUI::UDim(width, 0.0f), CEGUI::UDim(height, 0.0f));
	window->setProperty("Image", imageName);
}

之所以CreateSrcBloodShowW()函数中使用ratio参数是因为适应游戏窗口的变化,以致于人物头像和血条不至于变形,

这里的ratio=窗口宽度/窗口高度。

-------------------------------------------------------------------------------------------------------------------------------

人物头像,血量,血条的创建部分描述过了,接下来便讲述一下人物血量及血条的更新显示部分,

以下是frameRenderingQueued()中相关部分的核心代码:

	//血量及退格血条更新
	m_NinthCEGUI->getSrcBloodNumW()->setText("Blood: "+ Ogre::StringConverter::toString((int)m_HP));
	static int ibloodPart = -1;
	int i = 0;
	while (1)
	{
		if (m_HP <= i * MODEL_MAX_BLOOD / 10)
		{
			if (ibloodPart != i)
			{
				m_NinthCEGUI->getSrcBloodW()->setProperty("Image", "purple" + Ogre::StringConverter::toString(i));
				ibloodPart = i;
			}
			else
				break;
		}
		else
		{
			i++;
			if (i > 10)
				break;
		}
	}

有了以上代码,便会在每一帧中更新人物的血量,一旦退格血条越出了血量每X/10(X=0,1,2...9)边界,便会自动更新绘制并显示。

最后,我附上一张完整的整体效果图以便于大家理解:



Ogre之简易地模拟人物退格血条

时间: 2024-08-01 08:29:32

Ogre之简易地模拟人物退格血条的相关文章

横版游戏制作之英雄技能CD遮罩,人物头像血条属性

上图就是技能CD的一个效果,在此我需要给介绍下,cocosStuido这个工具中的UI Eidtor功能,编辑UI真的是很方便,至于怎么使用它,我相信您可以随便看看网上的东西,自己摸索,参考接下来的代码就知道了 在UI编辑器中,我们的技能是没有CD遮罩效果的,那怎么实现的呢? 答案就是:在点击触摸技能时,我们在技能的上方覆盖一张灰色的图片(这个你可以用PS去制作一张),大小与技能图标相同,然后根据每个技能的CD时间,产生一个扇形进度动画,动画结束后取消定时器跟这个遮罩对象就可以了 至于人物头像的

[汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)

汇编实现的一个简易的文本编辑器,代码中有详细的注释. 思路和细节: (1) 在屏幕中央初始化一片面积,并且定位光标,利用16号中断0号功能分别在ah,al中存储扫描码和ascii码,由此进行功能键的判断. (2) 实现对光标的操作,通过对dh,dl的变化和10号中断的2号功能进行光标的设置,上下左右分别改变dh,dl的值即可. (3)退格键的操作实现是 光标左移,然后利用21号中断输出空格即可实现删除操作. (4)下界超过某一个设定的值后就进行上卷一行的操作,此时当前光标位置随之上移. (5)注

解决hive交互模式退格键乱码

在hive的交互模式下,输入退格.方向键等,出现乱码,可以通过如下方法解决: 1.修改bashrc文件: vi ~/.bashrc 在文件最后添加一行: stty erase ^H. 2.使修改生效: source ~/.bashrc 这样,就不会乱码了.

Ubuntu使用VI编辑时退格键不能正常使用问题解决

新安装了Ubuntu,使用VI编辑文件时,发现删除不能像普通文本那样删除. 解决办法,新安装VIM解决问题. 参考文章: http://blog.sina.com.cn/s/blog_7d0c2fed01010zbi.html 这个问题主要是新系统直装了vi,没有装vim.因为vi是不能直接按退格键删除字符的,所以当你使用退格键删除字符,只有在按下esc时,那些字符才会消失...vim可以直接像记事本一样编辑字符!

SecureCRT终端上使用spark-shell时按退格键无反应的解决方法

问题:用SecureCRT远程连接至Spark集群,启动spark-shell却发现输错命令后却无法用退格键删除. 解决方法: 第一步: 在SecureCRT的菜单栏选择"OPtions(选项)"按钮,在弹出的选项中选择"Session Options(会话选项)" 第二步: 在弹出的对话框中选择左侧的"Emulation(终端)",再选择"仿真",在右侧Terminal(终端)的选择中选择"Linux"

关于python2.7交互模式&quot;退格键乱码&quot;

在RHEL上装好了python2.7.6, 进入到交互模式后(就是输入python之后进入的screen), 发现退格键和方向键都使用不了,(变成^H^H^H之类的乱码) 一个命令输入错误了只能从头开始,不能删除,很是痛苦. 查阅文档之后发现是readline模块没有安装的原因, 所以只能卸载掉python,先装上readline模块,然后再安装python来解决问题,T_T. 有没有readline模块可以在交互模式下输入 import readline来测试 需要安装的两个包为:readli

xshell下bpython使用退格键的问题

xshell中使用bpython的时候会出现按一下退格键就删除整行的情况,解决方法: 选择xshell属性中的terminal(终端)->keyboard(键盘),把backspace键序列修改成 ASCII 127.

centos7 编译python 退格 删除 字符不识别

环境:Centos7 源码编译Python3.5 问题:无法退格.删除 现象:删除或退格时出现 ^H^H^H^H^H^[[C^[[C 解决方案: yum install readline* /usr/local/python3/bin/python3.5 #试验后发现还是不能解决问题 yum list|grep 'readline' yum install readline-devel -y ./configure --help ./configure --prefix=/usr/local/p

关于cocos2dx3.0 UITextField不能使用退格键删除字符的解决方式

近日開始将项目移植到cocos2dx 3.0版本号,出现了一些问题,UI方面眼下就发现UITextField控件不能响应退格键或者删除键,在Windows以下调试如此,我開始以为是平台支持不好,后来公布到Android后也是如此. 没办法仅仅好跟踪了一下源代码.Key操作基本的处理是在CCGLView类里面的GLView::onGLFWKeyCallback().看了一下其它函数的处理,定位问题是没有通知IMEDispatcher.尝试在这个函数里面加入?了几行代码: if(GLFW_KEY_D