你们团圆过端午,我无聊在家打飞机(有图为证)

今天一天哪也没去。我的vmware坏了,vmmon模块启不来,所以所有的虚拟机里的系统都进不去,于是我也没心情看kernel的书了。 前天一个同事问我怎么在linux下载入一个图片显示出来,我给他推荐了sdl image这个库。结果他发现这个库的demo里面有一个打飞机的游戏很好玩。 于是我今天就想把那个程序好好看一看,改改。最初准备用c++/SDL重写那段代码,写了一大半之后觉得SDL太low level了,吃晚饭的时候就想要不要换成别的库。考察了下orge,觉得orge太复杂了。然后就换成了Irrlicht。不得不承认Irrlicht上手太容易了。
dafeiji
Irrlicht是个3D引擎。我的做法是靠摄像机来达到2D效果。

IrrlichtDevice *device;
...
ISceneManager* smgr = device->getSceneManager();
ICameraSceneNode* cam = smgr->addCameraSceneNode();
matrix4 projMat;
cam->setProjectionMatrix(projMat.buildProjectionMatrixOrthoLH(width, height, 1, 1000), true);

把视点设在很远的位置,然后站在Z轴上对XY平台做垂直投影。

但是我不会设置天空盒这样东西,也没有地形信息。于是我就不能用它自带的碰撞检测系统。

我是在主循环函数里手动画背景图的:

while (device->run() && driver) {
if (device->isWindowActive()) {
driver->beginScene(true, true, video::SColor(255, 120, 102, 136));
for (int i = 0; i <= width; i += images->getSize().Width) {
driver->draw2DImage(images, core::position2d(i, 0), core::rect(0, 0, images->getSize().Width, 480), 0,
video::SColor(255, 255, 255, 255), 0);
}

背景图纹理的高度是我设计好的,但是宽度不满足要求,所以要写一个for循环横向的铺开。我现在还没想过窗口被resize之后怎么办。

alpha透明我还是不大会。

irr::video::IVideoDriver* driver = device->getVideoDriver();
irr::scene::ISceneManager* smgr = device->getSceneManager();
node = smgr->addCubeSceneNode(playerSize);
irr::video::ITexture* playerTexture = driver->getTexture("../share/dafeiji/player.png");
driver->makeColorKeyTexture(playerTexture, irr::core::position2d(0, 0));
node->setPosition(irr::core::vector3df(0, playerMinY, 0));
node->setMaterialTexture(0, playerTexture);
node->setMaterialFlag(irr::video::EMF_LIGHTING, false);
node->setMaterialType(irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);

尽管能用,但是感觉应该不需要这么多代码。

另外,假如我希望模型不是一个正立方体,而是长和宽有所不同的立方体,那么是应该通过setScale缩放吗?

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥