Skip to content

1 你好示例 Hello Sample

xuduo edited this page Oct 8, 2018 · 12 revisions

核心概念

本章主要介绍如何使用PHOENIXEngine开发一个示例程序,首先我们需要了解应用程序中的核心概念。

Application:

应用程序,表示当前正在运行的程序,在一个项目中Application唯一,可以通过PX2_APP快速方位应用程序单例。

Project:

工程是一个承载项目逻辑的结构,它是一个单件。他包含了Scene和UI。Scene通常表示一个当前正在运行的3D的场景,UI表示界面元素。Project是一个单件,在运行时状态,只存一个Project。

Scene

场景是一个容纳三维世界的容器,在这里结构你所有元素都是基于节点Node的。你可以在这里增加“树木” “车辆” “环境”等。

UI

UI被称为用户界面,这里包含各种UI控件的集合。在UI中最基础的类为UIFrame。引擎支持自适应UI系统,可以满足不同分辨率需要。

SampleLua

查看我们的核心项目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开发用户界面非常的快速。将会加快项目的开发进程。

PHOENIXEngine 是一款从游戏引擎发展而来的,融合游戏技术和机器人技术的一款开发引擎。引擎最大的特点是寻找游戏领域和机器人领域的相似之处,将游戏技术和机器人技术进行良好的整合,以满足人们对实用,易用,快速的机器人开发解决方案的需求。

引擎由深圳许多米科技进行维护,许多米科技是一家基于游戏技术,DeepLearning,SLAM技术聚焦机器人智能玩具软硬件解决方案的创业公司。 公司官网:www.manykit.com

Clone this wiki locally