-
Notifications
You must be signed in to change notification settings - Fork 23
1 你好示例 Hello Sample
本章主要介绍如何使用PHOENIXEngine开发一个示例程序,首先我们需要了解应用程序中的核心概念。
应用程序,表示当前正在运行的程序,在一个项目中Application唯一,可以通过PX2_APP快速方位应用程序单例。
工程是一个承载项目逻辑的结构,它是一个单件。他包含了Scene和UI。Scene通常表示一个当前正在运行的3D的场景,UI表示界面元素。Project是一个单件,在运行时状态,只存一个Project。
场景是一个容纳三维世界的容器,在这里结构你所有元素都是基于节点Node的。你可以在这里增加“树木” “车辆” “环境”等。
UI被称为用户界面,这里包含各种UI控件的集合。在UI中最基础的类为UIFrame。引擎支持自适应UI系统,可以满足不同分辨率需要。
查看我们的核心项目SampleLua的项目,
是我们的启动脚本,当项目启动之前会调用preplay()函数,当项目启动时会调用play()函数。在play中,调用了sampleLua_Sample()函数,这里是我们所有项目功能写入的地方。 scripts/lua/play.lua
设置引擎Canvas和场景Canvas的清空颜色,场景Canvas是引擎Canvas的字Canvas,所以引擎的Canvas首先清空,然后场景的Canvas会覆盖引擎的Canvas进行再一次清空。
PX2_ENGINECANVAS:SetClearColor(Float4.BLACK)
PX2_ENGINESCENECANVAS:SetClearColor(Float4.BLACK)
将mp3文件输出到一个可写目录。mp3文件是一种流媒体文件,如果直接读入到内存,占用内存太大,通常是将其写入的一个可写目录,通过流媒体的方式进行读取。
local musicName = "thelittleadventurer.mp3"
PX2_RM:ReWriteFileToWriteablePath("Data/SampleLua/media/music/"..musicName, musicName)
local dstPath = ResourceManager:GetWriteablePath()..musicName
PX2_SS:PlayMusic(0, dstPath, true, 0.0)
创建一个场景,设置为项目的场景。
local scene = Scene:New()
PX2_PROJ:SetScene(scene)
为场景中添加一个盒子,设置位置和缩放等参数。
local box = PX2_CREATER:CreateMovable_Box()
scene:AttachChild(box)
box.LocalTransform:SetTranslateZ(1.0)
box.LocalTransform:SetUniformScale(2.0)
创建一个3D模型,并且加载3D资源,设置缩放和旋转相关参数,通过控制器播放一个动画。引擎蒙皮谷歌动画支持的非常强大,用户不需要将动作一个个导出来,只需要将整个模型导出来,就可以进行播放,并且通过ModelController对动画进行各种相关的操作。包含设置动画播放频率。
local model = PX2_CREATER:CreateNode_Model("Data/SampleLua/models/actors/swk/model.px2obj")
scene:AttachChild(model)
model.LocalTransform:SetUniformScale(0.1)
model.LocalTransform:SetRotateDegree(0.0, 0.0, 180.0)
model.LocalTransform:SetTranslate(2.5, 0.0, 0.0)
g_s_AnimCtrl = model:GetControllerByName("ModelController")
g_s_AnimCtrl:SetSkinAnimationConfig("Data/SampleLua/models/actors/swk/anim.xml")
local anim = g_s_AnimCtrl:GetAnimByName("show0")
anim:SetPlayOnce(false)
anim:SetFrequency(1.0)
g_s_AnimCtrl:PlayAnim(anim)
引擎支持面向对象的Lua编程,你可以通过创建角色控制器,操纵模型,就像UnityEngine的组件一样。
local ctrlSphere = ActorCtrl:New({val = 1000, _name="Sphere"})
ctrlSphere._val = 1000
model:AttachController(Cast:ToSC(ctrlSphere.__object))
获得场景相机,并且为相机创建一个控制器,添加控制器到一个节点中。
local mainCameraNode = scene:GetMainCameraNode()
local cameraPlayCtrl = PX2_CREATER:CreateCameraPlayController()
model:AttachController(cameraPlayCtrl)
cameraPlayCtrl:SetCameraNode(mainCameraNode)
cameraPlayCtrl:SetCameraDistance(60.0)
cameraPlayCtrl:SetCameraDist(30.0, 60.0)
cameraPlayCtrl:ResetPlay()
为场景添加一个相机
local rectangle = PX2_CREATER:CreateMovable_Rectangle()
scene:AttachChild(rectangle)
rectangle.LocalTransform:SetUniformScale(10.0)
创建天空
local sky = PX2_CREATER:CreateSkyBox("Data/engine/sky/skybox/thickcloudswater/")
scene:AttachChild(sky)
添加UI相关函数,添加各种控件,设置控件的相应函数等。例如,为整个UI层添加一个UIFrame,并且在UIFrame上添加一个按钮 local ui = PX2_PROJ:GetUI()
local frame = UIFrame:New()
ui:AttachChild(frame)
frame.LocalTransform:SetTranslateY(-1.0)
frame:SetAnchorHor(0.0, 1.0)
frame:SetAnchorVer(0.0, 1.0)
local but = UIButton:New()
frame:AttachChild(but)
but:SetName("ButHome")
but:SetAnchorHor(0.0, 0.0)
but:SetAnchorVer(1.0, 1.0)
but:SetSize(50, 50)
but:SetAnchorParamHor(50, 50)
but:SetAnchorParamVer(-100, -100)
but:SetScriptHandler("s_Callback")
在回调函数中,我们对按钮的相应进行了相关处理
function s_Callback(objPtr, callType)
local obj = Cast:ToO(objPtr)
local name = obj:GetName()
if UICT_PRESSED==callType then
if "But0"==name then
s_PrintMsg("UICT_PRESSED But0")
elseif "But1"==name then
s_PrintMsg("UICT_PRESSED But1")
elseif "But2"==name then
s_PrintMsg("UICT_PRESSED But2")
end
elseif UICT_RELEASED==callType then
if "ButHome" == name then
g_s_UIFrame:Show(not g_s_UIFrame:IsShow())
elseif "ButAnim0" == name then
g_s_AnimCtrl:PlayAnimByName("walk")
elseif "ButAnim1" == name then
g_s_AnimCtrl:PlayAnimByName("attack0")
elseif "But0"==name then
s_PrintMsg("UICT_RELEASED But0")
elseif "But1"==name then
s_PrintMsg("UICT_RELEASED But1")
elseif "But2"==name then
s_PrintMsg("UICT_RELEASED But2")
end
elseif UICT_RELEASED_NOTPICK==callType then
s_PrintMsg("UICT_RELEASED_NOTPICK")
elseif UICT_CHECKED==callType then
s_PrintMsg("UICT_CHECKED")
elseif UICT_DISCHECKED==callType then
s_PrintMsg("UICT_DISCHECKED")
elseif UICT_EDITBOX_TEXTCHANGED==callType then
s_PrintMsg("UICT_EDITBOX_TEXTCHANGED")
elseif UICT_EDITBOX_ENTER==callType then
s_PrintMsg("UICT_EDITBOX_ENTER")
elseif UICT_LIST_SELECTED==callType then
s_PrintMsg("UICT_LIST_SELECTED")
elseif UICT_COMBOBOX_CHOOSED==callType then
s_PrintMsg("UICT_COMBOBOX_CHOOSED")
elseif UICT_TREE_SELECTED==callType then
s_PrintMsg("UICT_TREE_SELECTED")
elseif UICT_COLOR_SELECT==callType then
s_PrintMsg("UICT_COLOR_SELECT")
elseif UICT_ROUND_DRAG==callType then
local dirSimple = obj:GetDragingDirSimple()
s_PrintMsg("UICT_ROUND_DRAG"..dirSimple)
elseif UICT_SLIDERCHANGED==callType then
local perc = obj:GetPercent()
s_PrintMsg("UICT_SLIDERCHANGED"..perc)
end
end
通过SampleLua项目基本可以理解引擎在3D场景,UI界面处理的方法。通过代码的方式可以创建任意需要的界面。使用Lua开发用户界面非常的快速。将会加快项目的开发进程。
cross platform engine to create Games/AR/Robot www.manykit.com
PHOENIXEngine 是一款从游戏引擎发展而来的,融合游戏技术和机器人技术的一款开发引擎。引擎最大的特点是寻找游戏领域和机器人领域的相似之处,将游戏技术和机器人技术进行良好的整合,以满足人们对实用,易用,快速的机器人开发解决方案的需求。
引擎由深圳许多米科技进行维护,许多米科技是一家基于游戏技术,DeepLearning,SLAM技术聚焦机器人智能玩具软硬件解决方案的创业公司。 公司官网:www.manykit.com