CEGUI作用思考
- 格式:doc
- 大小:21.00 KB
- 文档页数:2
guice的能⼒简述guice这个google出的bean容器框架,ES有⽤到他。
1. 是⼀个bean容器2. 能AOP1. 以module创建injector。
可以看成是⼀个容器。
Module需要⾃定义且继承⾃他的AbstractModule。
覆写config⽅法完成装配关系的确定。
详细参见2. 绑定顶层接⼝到具体实现类。
bind(TransactionLog.class).to(DatabaseTransactionLog.class); ⽀持bind(A).to(B) 然后链式的bind(B).to(C)3. ⽀持在构造函数上打上Inject注解标签,⽤于注⼊字段4. ⽀持⾃定义注解⽤于标志装配⽬标,⽐如⾃定义注解Paypal。
对于加了PayPal注解的参数,注⼊PaypalCreditCardProcessor实现,其余的注⼊GoogleCheckoutProcessor实现。
bind(CreditCardProcessor.class).annotatedWith(PayPal.class).to(PaypalCreditCardProcessor.class);5. 对于加了Named注解其值为testnamed的地⽅注⼊TestNamedCreditCardProcessor实现。
bind(CreditCardProcessor.class).annotatedWith(d("testnamed")).to(TestNamedCreditCardProcessor.class);6. 结合Named注解可以将⼀个参数绑定⼀个特定的instance ⽽不是⼀个实现类。
bind(Integer.class).annotatedWith(d("chargeTimeout")).toInstance(200);7. 可以使⽤Provides注解主动对外提供创建的bean 有点类似 Spring的@Bean注解,这种⽅式可以对bean做⾃定义加⼯。
在游戏中使用“CEGUI”—第一章(底层)日期:2006/4/13 – 2006/10/10 本文首次刊登于《游戏创造》,现开放与大家共享,转载请注明出处。
作者介绍唐亮(千里马肝),四年游戏从业经验,曾任职于大宇软星科技(上海)有限公司任程序技术指导,现在ATI任Engineer,主要负责XP/Vista下的Display Driver。
迄今为止主要个人作品为《阿猫阿狗2》,参与开发《汉朝与罗马》、《阿猫阿狗大作战OLG》和《仙剑奇侠传4》,主要研究方向为C++、图形渲染技术和系统架构。
blog地址:简介CEGUI(Crazy Eddie’s GUI )是一个自由免费的GUI库,基于LGPL协议,使用C++实现,完全面向对象设计。
CEGUI开发者的目的是希望能够让游戏开发人员从繁琐的GUI实现细节中抽身出来,以便有更多的开发时间可以放在游戏性上。
CEGUI的渲染需要3D图形API的支持,如OpenGL或Direct3D。
另外,使用更高级的图形库也是可以的,像是OGRE、Irrlicht和RenderWare,关键需求可以简化为二点:1.纹理(Texture)的支持2.直接写屏(RHW的顶点格式、正交投影、或者使用shader实现)本文截止日时,CEGUI的最新版本是0.4.1(本文的讨论也是基于此版本),提供了SDK 和全部源码的下载,同时为了适应不同的使用需求,还根据STL的使用区分为Native(VC 自带的P.J. 版STL)和STLport(基于SGI STL实现的跨编译器版本,详细见),以及VC6.0、VC7.0、VC7.1和VC8.0几种。
除此之外,CEGUI还同步提供了官方界面编辑器LayoutEditor,以方便UI的制作,下载地址:/downloads/CELayoutEditorSetup_0.4.1.exe。
作为界面编辑器,它需要系统级界面以提供编辑器操作,在此之前的0.3.0版是基于MFC实现的;而在0.4.1版本中,改为基于wxWidgets(跨平台的本地UI框架,这里的UI指Window操作系统底层,如:Windows、Unix和Mac,详见)实现。
使用CEGUI步骤:初始化CEGUI(Renderer,system)加载文件(scheme,font,mousecursor)创建CEGUI窗口注入输入事件,添加事件处理函数渲染CEGUI(ogre自动渲染)程序框架:CEGUIBaseApp.h:初始化CEGUICEGUIDemo.h:创建CEGUI窗口CEGUIFrameListener.h:监听器CEGUImain.cpp:创建要显示的窗口/*********************************************************** CEGUIBaseApp.h葛娟<gejuan@>************************************************************/ #ifndef_CEGUIBaseApp_h_#define_CEGUIBaseApp_h_///包含头文件#include<CEGUI/CEGUI.h>#include<OgreCEGUIRenderer.h>#include<Ogre.h>#include"CEGUIFrameListener.h"#include"CEGUIDemo.h "///前向声明class CEGUIDemo;class CEGUIFrameListener;class CEGUIBaseApp{public:CEGUIBaseApp();virtual ~CEGUIBaseApp();//初始化实例并进行渲染virtual bool execute(CEGUIDemo* sampleApp);virtual void cleanup();virtual void setQuitting(bool quit = true) { d_quitting = quit; }virtual bool isQuitting() const { return d_quitting; }protected:bool d_quitting; //程序是否退出bool d_initialised; //是否已经初始化Ogre::Root* d_ogreRoot;Ogre::Camera* d_camera;Ogre::RenderWindow* d_window;CEGUI::OgreCEGUIRenderer* d_renderer;CEGUIFrameListener* d_frameListener;/*------------------------------------------------------------------增加资源组及路径--------------------------------------------------------------------*/void initialiseResources(void);};#endif//end of guard _CEGUIBaseApp_h_/***********************************************************CEGUIBaseApp.cpp葛娟<gejuan@>************************************************************/#include"CEGUIBaseApp.h"//--------------------------------------------------------------------------------------------------------------- void CEGUIBaseApp::initialiseResources(void){using namespace Ogre;ResourceGroupManager& rgm = ResourceGroupManager::getSingleton();// 创建资源组rgm.createResourceGroup("imagesets");rgm.createResourceGroup("fonts");rgm.createResourceGroup("layouts");rgm.createResourceGroup("schemes");rgm.createResourceGroup("looknfeels");ResourceGroupManager::getSingleton().addResourceLocation("ceguifiles/fonts", "FileSystem", "fonts");ResourceGroupManager::getSingleton().addResourceLocation("ceguifiles/imagesets", "FileSystem", "imagesets");ResourceGroupManager::getSingleton().addResourceLocation("ceguifiles/layouts", "FileSystem", "layouts");ResourceGroupManager::getSingleton().addResourceLocation("ceguifiles/looknfeel", "FileSystem", "looknfeels");ResourceGroupManager::getSingleton().addResourceLocation("ceguifiles/schemes", "FileSystem", "schemes");ResourceGroupManager::getSingleton().addResourceLocation("ceguifiles/configs", "FileSystem");ResourceGroupManager::getSingleton().addResourceLocation("ceguifiles/lua_scripts", "FileSystem");}//---------------------------------------------------------------------------------------------------------------------CEGUIBaseApp::CEGUIBaseApp():d_quitting(false),d_ogreRoot(0),d_renderer(0),d_initialised(false),d_frameListener(0){using namespace Ogre;d_ogreRoot = new Root();//创建根initialiseResources();if (d_ogreRoot->showConfigDialog()){d_window = d_ogreRoot->initialise(true,"GeJuan");// 初始化渲染系统,返回自动创建的窗口SceneManager* sm = d_ogreRoot->createSceneManager(ST_GENERIC, "SampleSceneMgr");// 创建场景管理器d_camera = sm->createCamera("SampleCam");// 创建摄像机d_camera->setPosition(Vector3(0,0,500));d_camera->lookAt(Vector3(0,0,-300));d_camera->setNearClipDistance(5);Viewport* vp = d_window->addViewport(d_camera);// 创建占据整个窗口的视口vp->setBackgroundColour(ColourValue(0,0,0));d_camera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));ResourceGroupManager::getSingleton().initialiseAllResourceGroups();// 初始化资源组//CEGUI的初始化///////////////////////////////////////////////////////////////////////////////////d_renderer = new CEGUI::OgreCEGUIRenderer(d_window, RENDER_QUEUE_OVERLAY, false, 0, sm);// 初始化GUInew CEGUI::System(d_renderer);CEGUI::Imageset::setDefaultResourceGroup("imagesets");CEGUI::Font::setDefaultResourceGroup("fonts");CEGUI::Scheme::setDefaultResourceGroup("schemes");CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");CEGUI::WindowManager::setDefaultResourceGroup("layouts");CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");// 创建帧监听器d_frameListener= new CEGUIFrameListener(this, d_window, d_camera);d_ogreRoot->addFrameListener(d_frameListener);d_initialised = true;}else{delete d_ogreRoot;d_ogreRoot = 0;}}//-------------------------------------------------------------------------------------------------------- CEGUIBaseApp::~CEGUIBaseApp(){delete d_frameListener;delete CEGUI::System::getSingletonPtr();delete d_renderer;delete d_ogreRoot;}//-------------------------------------------------------------------------------------------------------------- bool CEGUIBaseApp::execute(CEGUIDemo* sampleApp){if (d_ogreRoot && d_initialised){sampleApp->initialiseSample();// 通过Ogre3D 渲染try{d_ogreRoot->startRendering();}catch(Ogre::Exception&){return false;}catch(CEGUI::Exception&){return false;}return true;}else{return false;}}//----------------------------------------------------------------------------------------------------- void CEGUIBaseApp::cleanup(){}Demo1:Demo2:Demo3:代码创建窗口#include"CEGUIDemo.h "using namespace CEGUI;//----------------------------------------------------------------------class CEGUIDemoApp:public CEGUIDemo{public:bool initialiseSample(){WindowManager& winMgr = WindowManager::getSingleton();SchemeManager::getSingleton().loadScheme("TaharezLook.scheme");System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow");FontManager::getSingleton().createFont("Commonwealth-10.font");ImagesetManager::getSingleton().createImagesetFromImageFile("BackgroundImage", "GPN-2000-001437.tga");Window* background = winMgr.createWindow("TaharezLook/StaticImage", "root_wnd");background->setPosition(UVector2(cegui_reldim(0), cegui_reldim( 0)));background->setSize(UVector2(cegui_reldim(1), cegui_reldim( 1)));background->setProperty("FrameEnabled", "false");background->setProperty("BackgroundEnabled", "false");background->setProperty("Image", "set:BackgroundImage image:full_image");System::getSingleton().setGUISheet(background);createDemoWindows();initDemoEventWiring();return true;}void cleanupSample(){}private:void createDemoWindows(void){ListboxTextItem* itm;WindowManager& winMgr = WindowManager::getSingleton();Window* root = winMgr.getWindow("root_wnd");MultiColumnList* mcl = static_cast<MultiColumnList*>(winMgr.createWindow("TaharezLook/MultiColumnList", "Demo6 root->addChildWindow(mcl);mcl->setPosition(UVector2(cegui_reldim(0.01f), cegui_reldim( 0.1f)));mcl->setSize(UVector2(cegui_reldim(0.5f), cegui_reldim( 0.8f)));FrameWindow* fwnd = static_cast<FrameWindow*>(winMgr.createWindow("TaharezLook/FrameWindow", "Demo6/ControlPan root->addChildWindow(fwnd);fwnd->setPosition(UVector2(cegui_reldim(0.53f), cegui_reldim( 0.03f)));fwnd->setMaxSize(UVector2(cegui_reldim(1.0f), cegui_reldim( 1.0f)));fwnd->setSize(UVector2(cegui_reldim(0.44f), cegui_reldim( 0.94f)));fwnd->setText("Demo 6 - Control Panel");Combobox* cbbo = static_cast<Combobox*>(winMgr.createWindow("TaharezLook/Combobox", "Demo6/ControlPanel/SelMode fwnd->addChildWindow(cbbo);cbbo->setPosition(UVector2(cegui_reldim(0.04f), cegui_reldim( 0.06f)));cbbo->setSize(UVector2(cegui_reldim(0.66f), cegui_reldim( 0.33f)));const CEGUI::Image* sel_img = &ImagesetManager::getSingleton().getImageset("TaharezLook")->getImage("MultiList itm = new ListboxTextItem("Full Row (Single)", 0);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Full Row (Multiple)", 1);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Full Column (Single)", 2);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Full Column (Multiple)", 3);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Single Cell (Single)", 4);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Single Cell (Multiple)", 5);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Nominated Column (Single)", 6);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Nominated Column (Multiple)", 7);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Nominated Row (Single)", 8);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);itm = new ListboxTextItem("Nominated Row (Multiple)", 9);itm->setSelectionBrushImage(sel_img);cbbo->addItem(itm);cbbo->setReadOnly(true);Window* st = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/ColumnPanel");fwnd->addChildWindow(st);st->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.12f)));st->setSize(UVector2(cegui_reldim(0.96f), cegui_reldim( 0.25f)));st->setText("Column Control");st->setProperty("VertFormatting", "TopAligned");Window* label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label1");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("ID Code:");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label2");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.23f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("Width:");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label3");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.44f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("Caption:");PushButton* btn = static_cast<PushButton*>(winMgr.createWindow("TaharezLook/Button", "Demo6/ControlPanel/Column st->addChildWindow(btn);btn->setPosition(UVector2(cegui_reldim(0.81f), cegui_reldim( 0.32f)));btn->setSize(UVector2(cegui_reldim(0.15f), cegui_reldim( 0.2f)));btn->setText("Add");Editbox* ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPane st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.2f)));ebox->setValidationString("\\d*");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/NewColW st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.23f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.2f)));ebox->setValidationString("\\d*");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/NewColT st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.44f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.36f), cegui_reldim( 0.2f)));ebox->setValidationString(".*");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label4");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.55f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("ID Code:");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/DelColI st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.67f)));ebox->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.2f)));ebox->setValidationString("\\d*");btn = static_cast<PushButton*>(winMgr.createWindow("TaharezLook/Button", "Demo6/ControlPanel/ColumnPanel/DelCol st->addChildWindow(btn);btn->setPosition(UVector2(cegui_reldim(0.25f), cegui_reldim( 0.67f)));btn->setSize(UVector2(cegui_reldim(0.4f), cegui_reldim( 0.2f)));btn->setText("Delete Column");st = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/RowControl");fwnd->addChildWindow(st);st->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.38f)));st->setSize(UVector2(cegui_reldim(0.96f), cegui_reldim( 0.25f)));st->setText("Row Control");st->setProperty("VertFormatting", "TopAligned");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label5");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("Col ID:");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label6");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.23f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.55f), cegui_reldim( 0.12f)));label->setText("Item Text:");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/RowColI st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.2f)));ebox->setValidationString("\\d*");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/RowText st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.23f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.55f), cegui_reldim( 0.2f)));ebox->setValidationString(".*");btn = static_cast<PushButton*>(winMgr.createWindow("TaharezLook/Button", "Demo6/ControlPanel/ColumnPanel/AddRow st->addChildWindow(btn);btn->setPosition(UVector2(cegui_reldim(0.81f), cegui_reldim( 0.32f)));btn->setSize(UVector2(cegui_reldim(0.15f), cegui_reldim( 0.2f)));btn->setText("Add");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label7");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.55f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("Row Idx:");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/DelRowI st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.67f)));ebox->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.2f)));ebox->setValidationString("\\d*");btn = static_cast<PushButton*>(winMgr.createWindow("TaharezLook/Button", "Demo6/ControlPanel/ColumnPanel/DelRowst->addChildWindow(btn);btn->setPosition(UVector2(cegui_reldim(0.25f), cegui_reldim( 0.67f)));btn->setSize(UVector2(cegui_reldim(0.4f), cegui_reldim( 0.2f)));btn->setText("Delete Row");st = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/SetItemPanel");fwnd->addChildWindow(st);st->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.65f)));st->setSize(UVector2(cegui_reldim(0.96f), cegui_reldim( 0.25f)));st->setText("Item Modification");st->setProperty("VertFormatting", "TopAligned");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label8");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("Row Idx:");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label9");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.23f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("Col ID:");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/Label10");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.44f), cegui_reldim( 0.2f)));label->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.12f)));label->setText("Item Text:");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/SetItem st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.2f)));ebox->setValidationString("\\d*");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/SetItem st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.23f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.2f), cegui_reldim( 0.2f)));ebox->setValidationString("\\d*");ebox = static_cast<Editbox*>(winMgr.createWindow("TaharezLook/Editbox", "Demo6/ControlPanel/ColumnPanel/SetItem st->addChildWindow(ebox);ebox->setPosition(UVector2(cegui_reldim(0.44f), cegui_reldim( 0.32f)));ebox->setSize(UVector2(cegui_reldim(0.36f), cegui_reldim( 0.2f)));ebox->setValidationString(".*");btn = static_cast<PushButton*>(winMgr.createWindow("TaharezLook/Button", "Demo6/ControlPanel/ColumnPanel/SetIt st->addChildWindow(btn);btn->setPosition(UVector2(cegui_reldim(0.81f), cegui_reldim( 0.32f)));btn->setSize(UVector2(cegui_reldim(0.15f), cegui_reldim( 0.2f)));btn->setText("Set");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/RowCount");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.55f)));label->setSize(UVector2(cegui_reldim(1.0f), cegui_reldim( 0.12f)));label->setText("Current Row Count:");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/ColCount");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.67f)));label->setSize(UVector2(cegui_reldim(1.0f), cegui_reldim( 0.12f)));label->setText("Current Column Count:");label = winMgr.createWindow("TaharezLook/StaticText", "Demo6/ControlPanel/SelCount");st->addChildWindow(label);label->setProperty("FrameEnabled", "false");label->setProperty("BackgroundEnabled", "false");label->setPosition(UVector2(cegui_reldim(0.02f), cegui_reldim( 0.79f)));label->setSize(UVector2(cegui_reldim(1.0f), cegui_reldim( 0.12f)));label->setText("Current Selected Count:");btn = static_cast<PushButton*>(winMgr.createWindow("TaharezLook/Button", "Demo6/QuitButton"));fwnd->addChildWindow(btn);btn->setPosition(UVector2(cegui_reldim(0.25f), cegui_reldim( 0.93f)));btn->setSize(UVector2(cegui_reldim(0.50f), cegui_reldim( 0.05f)));btn->setText("Quit This Demo!");}void initDemoEventWiring(void){WindowManager& winMgr = WindowManager::getSingleton();winMgr.getWindow("Demo6/ControlPanel/ColumnPanel/AddColButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(&CEGUIDemoApp::handleAddColumn, this));winMgr.getWindow("Demo6/ControlPanel/ColumnPanel/DelColButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(&CEGUIDemoApp::handleDeleteColumn, this));winMgr.getWindow("Demo6/ControlPanel/ColumnPanel/AddRowButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(&CEGUIDemoApp::handleAddRow, this));winMgr.getWindow("Demo6/ControlPanel/ColumnPanel/DelRowButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(&CEGUIDemoApp::handleDeleteRow, this));winMgr.getWindow("Demo6/ControlPanel/ColumnPanel/SetItemButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(&CEGUIDemoApp::handleSetItem, this));winMgr.getWindow("Demo6/QuitButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(&CEGUIDemoApp::handleQuit, this));winMgr.getWindow("Demo6/ControlPanel/SelModeBox")->subscribeEvent(Combobox::EventListSelectionAccepted, Event::Subscriber(&CEGUIDemoApp::handleSelectModeChanwinMgr.getWindow("Demo6/MainList")->subscribeEvent(MultiColumnList::EventSelectionChanged, Event::Subscriber(&CEGUIDemoApp::handleSelectChangewinMgr.getWindow("Demo6/MainList")->subscribeEvent(MultiColumnList::EventListContentsChanged, Event::Subscriber(&CEGUIDemoApp::handleContentsC }//--------------事件处理函数-----------------------------------------------------------------------bool handleQuit(const CEGUI::EventArgs& e){d_sampleApp->setQuitting();return true;}bool handleAddColumn(const CEGUI::EventArgs& e){MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Demo6/MainList") Editbox* idbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPanel/ Editbox* widthbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPanEditbox* textbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPaneCEGUI::uint id = atoi(idbox->getText().c_str());float width = atof(widthbox->getText().c_str());String text = textbox->getText();//idbox->setText("");//widthbox->setText("");//textbox->setText("");if (width < 10.0f)width = 10.0f;mcl->addColumn(text, id, cegui_absdim(width));return true;}bool handleDeleteColumn(const CEGUI::EventArgs& e){MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Demo6/MainList") Editbox* idbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPanel/CEGUI::uint id = atoi(idbox->getText().c_str());try{mcl->removeColumnWithID(id);}catch (InvalidRequestException){}//idbox->setText("");return true;}bool handleAddRow(const CEGUI::EventArgs& e){MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Demo6/MainList") Editbox* idbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPanel/ Editbox* textbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPaneCEGUI::uint id = atoi(idbox->getText().c_str());String text = textbox->getText();//idbox->setText("");//textbox->setText("");ListboxTextItem* item = new ListboxTextItem(text);item->setSelectionBrushImage(&ImagesetManager::getSingleton().getImageset("TaharezLook")->getImage("MultiListStry{mcl->addRow(item, id);//?????????????????????????????????????}catch (InvalidRequestException){delete item;}return true;}bool handleDeleteRow(const CEGUI::EventArgs& e){MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Demo6/MainList") Editbox* idxbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPanelCEGUI::uint idx = atoi(idxbox->getText().c_str());try{mcl->removeRow(idx);}catch (InvalidRequestException){}//idxbox->setText("");return true;}bool handleSetItem(const CEGUI::EventArgs& e){MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Demo6/MainList") Editbox* idbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPanel/ Editbox* rowbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPane Editbox* textbox = static_cast<Editbox*>(WindowManager::getSingleton().getWindow("Demo6/ControlPanel/ColumnPaneCEGUI::uint id = atoi(idbox->getText().c_str());CEGUI::uint row = atoi(rowbox->getText().c_str());String text = textbox->getText();//idbox->setText("");。
计 算 机 系 统 应 用 2010 年 第 19 卷 第1期36 研究开发 R es earch Devel op ment基于CEGUI 的界面框架设计与实现①黄伟强 1 夏科艺2 (1 华南师范大学 网络中心 广东 广州 510631;2 广州博冠信息科技有限公司 广东 广州 510665)摘 要: 通过对界面开发库CEGUI(Crazy Eddie’s GUI)的研究基础上,采用归纳与总结、流程优化及代码与框架重构的思想实现对CEGUI 界面库的p ython 脚本封装,形成框架而进行界面开发,并以此框架开发界面编辑器,实现对界面开发流程优化,降低界面开发成本以及提高界面开发效率。
通过游戏界面开发框架脚本化,对产品开发起到良好的促进作用。
关键词: 界面开发 封装 框架 CEGUI python 编辑器Design and Implementation of User Interface Framework Based on CEGUIHUANG Wei-Qiang 1, XIA Ke-Yi 2(1.Center of Netw ork,Sou th C hina Normal University, Guangzhou 510631, C hina;2.B oguan Tenglong Information Tech Ltd, Guangzhou 510665, C hina)Abstract : Through applying the CEGUI(Crazy Eddie's GUI )user interface LIB research, this paper accomplishes theCEGUI’s python encapsulation by using induction, f low optimization and f rame Refactoring. User interface development and User interf ace editor can use this CEGUI python f rame to build, optimize the developing f low , reduce the cost of User interf ace development and improve eff i ciency.Keywords: UI development; encapsulation; f ram e; CEGUI; python; UI editor1 引言目前游戏业已经形成一个发展快速的产业链,游戏产品层出不穷,市场需求巨大,而作为游戏产品重要的界面开发往往对游戏产品质量起到重要作用。
研究了一下午,总算是在OGRE中使用上CEGUI了。
参考了许多网友的文章,这里结合自己的经验给出详细的步骤。
新手一般都使用OGRE提供的ExampleApplication+ExampleFrameListener框架。
这个框架默认是屏幕独占模式,而且是没有鼠标的。
要使用鼠标,或者进一步创建UI界面,必须使用CEGUI。
下面给出通过CEGUI使用鼠标的详细步骤(VS2005 + Ogre1.6.5):1.工程配置确保VS选项中的项目和解决方案配置中已经添加了Dependencies\include\CEGUI目录。
工程属性-->链接中增加依赖项CEGUIBase_d.lib和OgreGUIRenderer_d.lib(如果是release则没有"_d",下同,不再赘述)这2个lib库分别在ogre\Dependencies\lib\和ogre\lib下。
根据这个目录配置好附加库目录。
2.头文件支持需要用到的头文件有OgreCEGUIRenderer.h,OgreCEGUIResourceProvider.h,OgreCEGUITexture.h他们在ogre\Samples\Common\CEGUIRenderer\include下面,你可以复制到你的工程,也可以增加引用该目录。
3.dll运行时支持在ogre\Samples\Common\bin\Debug里面找到CEGUIBase_d.dll,CEGUIExpatParser_d.dll,CEGUIFalagardWRBase_d.dll,OgreGUIRenderer_d.dll把他们复制到你的工程的目标文件夹里供exe调用。
4.添加代码派生你自己的监听类:view plaincopy to clipboardprint?class GuiFrameListener : public ExampleFrameListener, public OIS::KeyListener, publicOIS::MouseListener{private:CEGUI::Renderer* mGUIRenderer;SceneManager *mSceneMgr; // A pointer to the scene managerRaySceneQuery *mRaySceneQuery; // The ray scene query pointerpublic:// NB using buffered input, this is the only changeGuiFrameListener(RenderWindow* win, Camera* cam, CEGUI::Renderer* renderer, SceneManager* pSceneMgr);// 省略...};class GuiFrameListener : public ExampleFrameListener, public OIS::KeyListener, publicOIS::MouseListener{private:CEGUI::Renderer* mGUIRenderer;SceneManager *mSceneMgr; // A pointer to the scene managerRaySceneQuery *mRaySceneQuery; // The ray scene query pointerpublic:// NB using buffered input, this is the only changeGuiFrameListener(RenderWindow* win, Camera* cam, CEGUI::Renderer* renderer, SceneManager* pSceneMgr);// 省略...};从ExampleApplication类派生你自己的App类,最重要的是重写createFrameListener,如下:view plaincopy to clipboardprint?void MyApplication::createFrameListener(void){mFrameListener= new GuiFrameListener(mWindow, mCamera, mGUIRenderer, mSceneMgr);mFrameListener->showDebugOverlay(true);mRoot->addFrameListener(mFrameListener);};void MyApplication::createFrameListener(void){mFrameListener= new GuiFrameListener(mWindow, mCamera, mGUIRenderer, mSceneMgr);mFrameListener->showDebugOverlay(true);mRoot->addFrameListener(mFrameListener);};这样给你的app关联了GuiFrameListener类监听鼠标操作。
CEGUI lua接口说明一.界面1.生成初始代码在initres_i3k.lua中,添加一个新ID添加一个新名字配置文件名然后创建一个对应名称的lua文件进入编辑器,打开对应的界面选择生成lua代码点确定,就会生成初始化代码到剪贴板中。
之后拷贝到lua文件里就行了。
例如:注意:lua名称、layout名,lua名,layout中的根窗体名全部都需要保持一致。
在这个例子中是bcts1。
2.绑定代码中需要操作的窗体选中窗体,点生成lua定义控件类型分为None,Click和Button,None类型的不会响应事件。
Click类型的,可以响应点击事件。
Button类型的,只有当这个窗体是以按钮的资源规格做的时候,才用这个类型。
生成的代码:--说明文字txt1 = {uiname = "bcts1/1/z2",win = nil,},应当把这个段代码,粘贴到wins这个table下,例如:如果是可点击的Click和Button类型控件,则要加入如下处理代码:3.窗体的常用属性win:setProperty( name, val )4.推荐写法以bcts1为例,推荐在模块lua中添加两个函数,比如说:function huodong_OpenBCTS1()i3k_openui_byid( global_BCTS1_WINID )bcts1_OnShow()endfunction huodong_CloseBCTS1()i3k_closeui_byid( global_BCTS1_WINID )end打开或关闭界面通过调用函数就可以完成二.动画相关1.打开动画实际上,打开动画时在编辑器中设置好的,代码里不用做处理。
2.打开动画的回调所有的动画的接口,都是通过UIDefaultWin这个类调用的。
rootwins[WINNAME]就是这个类的对象,但这个对象在xx_OnInit函数中不能调用,因为那个时候rootwins[WINNAME]还没有赋值。
CEGUI初级入门CEGUI初级入门一 CEGUI渲染入门不管你用的是什么引擎,至少要做如下所示最基础的三步,才能使CEGUI运行起来。
1. 创建 CEGUI::Renderer 对象。
2. 创建 CEGUI::System 对象。
3. 调用渲染函数。
当然,真正实现游戏GUI,你还需要装载相关的数据文件、进行一些最基础的初始化(这在装载数据文件和初始化入门一文中进行讲解),你也需要处理用户输入(这在输入处理入门一文中进行讲解)。
1. 创建 CEGUI::Renderer 对象这一步相当直观,对于所支持的渲染组件(比如:Direct 3D9, OpenGL, Ogre3D等),这步应该没有问题。
当然,要记得包含所使用渲染组件的头文件。
还有,Ogre3D现在已经将它的渲染组件改为Ogre而不是CEGUI。
(切记:在程序结束的时候,要删除此Renderder对象)创建 CEGUI::Renderer 对象代码如下:Ogre3D :CEGUI::OgreCEGUIRenderer* myRenderer =new CEGUI::OgreCEGUIRenderer( myRenderWindow );2. 创建 CEGUI::System 对象来对系统进行初始化这一步更简单。
只需new一个CEGUI::System对象,并把刚创建的CEGUI::Renderer对象的指针传送给它即可。
这时整个系统将自动初始化。
new CEGUI::System( myRenderer );3. 调用渲染函数这一步有点特殊,所使用的引擎不同,此步的代码也会不同。
不过,说白了,你所要做的只是在每帧渲染后调用CEGUI::System::renderGUI而已。
使用Ogre3D的同学该高兴了,因为它将由Ogre3D自动完成。
二资源管理入门如果你已经读了 CEGUI渲染入门这篇文章,你已经知道:要想让CEGUI跑起来,至少要对CEGUI进行最基础的初始化,并调用System::renderGUI方法,这看起来很不错。
gui基础知识点总结一、什么是GUI?GUI通常被翻译成“图形用户界面”,它是指在计算机程序中提供给用户的图形化界面。
与传统的命令行界面相比,GUI更加直观、易用,并且更容易被普通用户所接受。
用户通过在屏幕上的图形界面上进行点击、拖拽和输入来与计算机程序进行交互。
二、GUI的发展历程1. 文字界面时代:早期的计算机系统使用文字界面进行交互,用户需要通过输入命令来操作计算机程序,这种方式需要用户具备一定的计算机知识,操作起来相对繁琐。
2. 图形界面时代:20世纪80年代,苹果公司和微软公司推出了第一代图形用户界面操作系统,分别是苹果的Macintosh系统和微软的Windows系统。
这些系统首次将图形化界面带入了个人计算机领域,取代了传统的命令行界面,大大提升了用户的操作体验。
3. 现代GUI:随着技术的不断发展,GUI的设计越来越美观、交互方式也越来越多样化,包括触摸屏、手势操作等。
现代GUI不仅仅是单纯的界面展示,还承担了很多其他功能,如数据可视化、用户行为分析等。
三、GUI的基本元素1. 窗口(Window):窗口是GUI界面的基本单元,它是一个独立的用户界面组件,用户可以通过拖拽和放大来调整窗口的大小和位置。
2. 控件(Widget):控件是指GUI界面上的各种可交互的元素,比如按钮、文本框、下拉框、复选框等。
控件用来与用户进行交互,用户可以通过它们来输入数据、选择选项、执行命令等。
3. 布局(Layout):布局是指控件在窗口中的排列方式,常见的布局包括流式布局、网格布局、绝对布局等。
良好的布局可以使界面看起来更加美观、整洁,并且提高用户的使用体验。
4. 事件处理(Event Handling):GUI程序通常会响应用户的各种操作,比如点击按钮、拖拽元素、键盘输入等。
这些操作会触发相应的事件,程序需要能够捕获并处理这些事件,从而做出相应的响应。
5. 图形渲染(Graphics Rendering):GUI界面中可能会包含一些图形元素,比如图片、图标、图表等。
三:在CEGUI中使用layout文件(3)打开任意一个layout文件,可见其为一个树形结构,父子窗体的组织结构比较清晰。
<?xml version="1.0" encoding="UTF-8"?><GUILayout ><Window Type="type1" Name="window1" ><Window Type="type2" Name=" window1" ></Window></Window></GUILayout>由于使用的是TinyXML作的xml解析器,其是基于DOM的,所以正合适。
注意文件当中的Property tag,这个是layout的重点,通过设定这个东西,CEGUI就活起来了。
<Property Name="Font" Value="SimHei-12" />先写Name,再写Value。
如果想在游戏中使用你编辑的layout文件,那么就不是单个文件这么简单了。
由于CEGUI当中的窗体名称是一个全局的向量,所以不能有同名的窗体,这样,命名规则就成了一个问题,当游戏制作到了大规模的UI制作阶段,这个问题尤为明显。
我的经验是如下的规则:1. 规则1 Layout文件命名layout文件以场景形式组织,每个layout文件对应一个场景下的UI,文件名为场景的英文名称,首字母大写,如yout。
2. 规则2 顶级控件命名&设定layout文件内部使用Root_场景英文名的defaultWindow作为根窗口(顶级窗口),如示例场景的UI使用Root_SampleScence作为根窗口。
顶级窗口大小为整个显示屏幕大小。
eprime实验设计控制5个要素
【原创实用版】
目录
1.eprime 实验设计简介
2.eprime 实验设计的五个要素
3.五个要素的详细解释和操作方法
4.eprime 实验设计的优点和局限性
5.结论
正文
eprime 是一款广泛应用于心理学实验设计的软件,它能够帮助研究者有效地控制实验过程中的各种变量,以获得更准确、可靠的实验结果。
在 eprime 中,实验设计主要控制五个要素,分别是:样本、任务、条件、变量和事件。
首先,样本是指参与实验的被试者。
在 eprime 中,研究者可以根据实验需要设定样本的属性,如性别、年龄、教育程度等。
其次,任务是指被试者在实验中需要完成的任务,它可以是反应时任务、认知任务或是情绪任务等。
接着,条件是指实验中不同的处理条件,可以是实验组与控制组的区别,也可以是不同实验条件下的变量操作。
然后,变量是指实验中需要测量的因变量和自变量,如反应时、正确率等。
最后,事件是指实验中的时间事件,可以是某个时间点的事件标志,也可以是任务开始或结束等。
eprime 实验设计的优点在于,它能够帮助研究者有效地控制实验中的各种变量,从而获得更准确、可靠的实验结果。
同时,eprime 也能够方便地实现实验中的各种操作,如随机分组、条件匹配等。
然而,eprime 实验设计也存在一些局限性,例如对于一些复杂的实验设计,可能需要研究者具备一定的编程技能。
总的来说,eprime 实验设计是一个有效的工具,能够帮助研究者控制实验中的各种变量,从而获得更准确的实验结果。
cegui 例子-回复什么是CEGUI?CEGUI(Crazy Eddie's GUI)是一套开源的跨平台图形用户界面(GUI)库,用于开发游戏、多媒体应用和其他交互式应用程序。
CEGUI提供了一套功能强大的GUI工具,使开发人员能够创建各种各样的用户界面,从简单的按钮和文本框到复杂的菜单和窗口。
如何安装CEGUI?安装CEGUI相对简单且可在多个操作系统上进行。
首先,您需要下载CEGUI的最新版本,可以在其官方网站上找到该版本。
然后,根据您的操作系统选择相应的安装说明进行安装。
例如,在Windows上,您可以直接下载预编译的可执行文件,而在Linux上,您可能需要使用软件包管理器安装CEGUI。
安装完成后,您还需要设置适当的编译环境和链接库,以便可以使用CEGUI进行开发。
如何创建一个简单的CEGUI界面?在安装和设置好CEGUI环境后,您可以开始创建一个简单的CEGUI界面。
首先,您需要在您的项目中包含CEGUI库文件,并确保正确链接。
然后,您可以创建一个CEGUI的窗口或布局文件,用于定义用户界面的布局和元素。
利用CEGUI提供的控件和属性,您可以添加按钮、文本框、标签等元素,并设置它们的位置、大小和样式。
最后,将您创建的布局文件与您的代码关联,以便在您的应用程序中使用该界面。
如何绘制CEGUI界面并与应用程序交互?一旦您创建好CEGUI界面,您需要使用CEGUI的渲染器将其绘制到屏幕上。
CEGUI支持多种渲染器,如OpenGL和DirectX,您可以根据您的项目需求选择合适的渲染器。
通过调用CEGUI API中提供的函数,您可以将界面绘制到特定的窗口或缓冲区,并处理用户的输入和事件。
您可以通过连接CEGUI事件系统中的回调函数来实现应用程序和用户界面之间的交互。
例如,您可以在用户点击按钮时执行特定的操作,或者在文本框中输入时更新其他元素。
如何自定义CEGUI界面的外观和主题?CEGUI还提供了丰富的定制功能,允许您根据自己的需求和偏好自定义界面的外观和主题。
《深入探讨Google Guice的使用方法》1.导言在现代软件开发领域中,依赖注入框架是一项非常重要的技术。
Google Guice作为一款轻量级的依赖注入框架,被广泛应用于Java 项目中。
本文将从浅入深地探讨Google Guice的使用方法,并结合个人观点共享对该框架的理解。
2.初识Google GuiceGoogle Guice是一款开源的依赖注入框架,它简化了在Java应用程序中进行依赖注入的过程。
通过使用Guice,开发者可以更加优雅和类型安全地管理应用程序的依赖关系。
在实际使用中,Guice通过绑定和注解来处理依赖注入,其简洁的语法和灵活的特性为Java开发者带来了很大的便利。
3.深入探讨Guice的使用方法在实际项目中,使用Guice进行依赖注入需要经历模块配置、绑定注解、生命周期管理等多个步骤。
开发者需要创建一个Guice的模块(Module),并在其中配置需要注入的依赖关系。
随后,通过绑定注解将接口和实现进行绑定,从而告诉Guice如何满足依赖。
4.依赖注入的实践经验在实际项目中,合理使用Google Guice可以极大地简化代码结构和提高系统的可维护性。
通过合理划分模块和配置绑定关系,开发者能够实现松耦合的依赖注入,提高代码的灵活性和可扩展性。
Guice还提供了AOP、作用域管理等强大的特性,为开发者提供了更多的可能性。
5.我的观点和理解个人认为,Guice作为一款优秀的依赖注入框架,其简洁的代码和强大的功能为Java开发者提供了便利。
在实际项目中,合理使用Guice 可以使代码更加清晰和易于维护,同时也能提高系统的扩展性和灵活性。
在今后的项目开发中,我将更加深入地学习和应用Guice,以提升代码质量和开发效率。
6.总结通过本文对Google Guice的深入探讨,我希望读者能够对该框架有一个更加深入的理解。
在实际项目中,合理使用Guice可以极大地提高代码的可维护性和系统的灵活性。
CEGUI中文输入的完美解决[ 2009-03-18 16:25:18 | 作者: Admin ]字体大小: 大| 中| 小CEGUI中实现中文输入是一个老话题了,网上的资料也很多,但是实现的都不是那么完美,其中最重要的问题就是输入法界面的跟随和输入状态时对按键的屏蔽。
先来说下如何把中文输入进入。
先添加一个中文注入的函数://///// 中文输入注入字符(Added by Azure)static bool ChnInjectChar(CEGUI::utf32 code_point);///////函数的实现如下:bool Win32AppHelper::ChnInjectChar(CEGUI::utf32 code_point){#ifndef UNICODEstatic char s_tempChar[3] = "";static wchar_t s_tempWchar[2] = L"";static bool s_flag = false;unsigned char uch = (unsigned char)code_point;if( uch >= 0xA1 ){if( !s_flag ){s_tempChar[0] = (char)uch; //第一个字节s_flag = true;return true;}else if( uch >= 0xA1 ){s_tempChar[1] = (char)uch; //第二个字节s_flag = false;MultiByteToWideChar( 0, 0, s_tempChar, 2, s_tempWchar, 1); //转成宽字节 s_tempWchar[1] = L'\0';CEGUI::utf32 code = (CEGUI::utf32)s_tempWchar[0];return CEGUI::System::getSingleton().injectChar( code );}else{return CEGUI::System::getSingleton().injectChar(code_point);}}else{s_flag = false;return CEGUI::System::getSingleton().injectChar(code_point);}#elsereturn CEGUI::System::getSingleton().injectChar(code_point );#endif}此函数是我从网上抄来的一个,没有什么特别的,挺好用的。
cegui 例子-回复問題:什麼是CEGUI?CEGUI是一個用於開發圖形用戶界面(GUI)的開源庫。
它是用C++編寫的,可以在多個平台上運行,例如Windows,Mac OS X和Linux。
CEGUI 提供了一個豐富的功能集,用於創建各種用戶界面元素,例如按鈕,文本框,進度條和下拉列表框,以幫助開發人員輕鬆地創建互動性豐富和視覺上吸引人的應用程序。
CEGUI提供了一個基於層次結構的界面設計方式,可以將元素組織成不同的層次和容器。
開發人員可以使用XML文件來描述和定義界面元素,這使得界面的設計和佈局更加靈活和易於管理。
該庫還提供了一組豐富的API,用於以編程方式創建和修改界面元素。
問題:如何安裝CEGUI?安裝CEGUI可以分為幾個步驟。
第一步是下載CEGUI的最新版本。
可以從CEGUI的官方網站(一旦下載完成,解壓縮下載的文件到您首選的位置。
接下來,您需要編譯CEGUI。
在大多數情況下,CEGUI提供了一個CMake 文件,可以使用CMake工具生成特定平台的項目文件。
進入解壓縮的文件夾,運行CMake工具並配置項目文件的生成位置。
完成配置後,您可以使用CMake生成項目文件。
根據您的開發環境和配置,生成的項目文件可能是一個Visual Studio解決方案文件或一個Makefile。
最後,根據生成的項目文件,您可以編譯CEGUI。
對於Visual Studio解決方案文件,打開該文件並選擇要編譯的配置,然後生成代碼。
對於Makefile,運行make命令進行編譯。
問題:如何使用CEGUI創建用戶界面?使用CEGUI創建用戶界面可以按照以下步驟進行。
首先,您需要初始化CEGUI庫。
這可以通過調用相關的初始化函數來完成。
在這一步中,您還可以設置一些庫的屬性,例如日誌記錄級別和佈局設置。
接下來,您需要創建一個窗口或容器,用於容納其他界面元素。
可以使用CEGUI提供的窗口類型(例如DefaultWindow)來創建容器。
CEGUI的重要作用在于:
嵌套!
这只是我的一种假设,还没有实际操作的经验,
但是问过大牛,他们回答是嵌入其他引擎或工具中不难。
现在我的第一目标就是先完成嵌套,主要以下步骤来实施:
制定方案(尝试方案)如下:
a、利用CEGUI创建简单Window窗口
b、在窗口上,创建简单按钮
c、将创建按钮方法嵌入我们引擎中
目标是测试CEGUI是否可嵌入及嵌入难度
在我看来,
CEGUI关心的不主窗口创建、消息机制、渲染,
它关心的是UI表现及逻辑实现,
所以这样的东西,如何嵌入就应该是第一目标。
为什么不用MFC,或者游戏引擎自带UI?
1、MFC自身是UI工具,如果说应用程序的一套东西都是由自身开发倒没问题,
但是要将做的东西嵌入其他应用程序中,可能就比较麻烦。
理由:
1、消息机制处理问题,MFC自成一套消息系统,如果嵌入其他引擎,消息系统处理流程不同,可能会比较麻烦.
暂时只想到这个理由,不过凭我的感觉,应该是比较麻烦的,如有不对,欢迎指正^^。
总结:MFC之类的工具嵌入其他程序困难。
2、为什么不用游戏引擎自带UI系统
理由:
1、CEGUI专业,如果只是一般的游戏引擎自带UI系统,我想不一定会比CEGUI好,不然也不会这么多人肯定它的存在了^^,
最后全面总结:
CEGUI多用于嵌入式开发中,一般用在中低档的引擎里,应该还是合适的。