mirror of
https://github.com/minetest/irrlicht.git
synced 2025-07-05 09:40:24 +02:00
Import irrlicht 1.8.4 release
This commit is contained in:
166
examples/06.2DGraphics/main.cpp
Normal file
166
examples/06.2DGraphics/main.cpp
Normal file
@ -0,0 +1,166 @@
|
||||
/** Example 006 2D Graphics
|
||||
|
||||
This Tutorial shows how to do 2d graphics with the Irrlicht Engine.
|
||||
It shows how to draw images, keycolor based sprites,
|
||||
transparent rectangles, and different fonts. You may consider
|
||||
this useful if you want to make a 2d game with the engine, or if
|
||||
you want to draw a cool interface or head up display for your 3d game.
|
||||
|
||||
As always, I include the header files, use the irr namespace,
|
||||
and tell the linker to link with the .lib file.
|
||||
*/
|
||||
#include <irrlicht.h>
|
||||
#include "driverChoice.h"
|
||||
|
||||
using namespace irr;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment(lib, "Irrlicht.lib")
|
||||
#endif
|
||||
|
||||
/*
|
||||
At first, we let the user select the driver type, then start up the engine, set
|
||||
a caption, and get a pointer to the video driver.
|
||||
*/
|
||||
int main()
|
||||
{
|
||||
// ask user for driver
|
||||
video::E_DRIVER_TYPE driverType=driverChoiceConsole();
|
||||
if (driverType==video::EDT_COUNT)
|
||||
return 1;
|
||||
|
||||
// create device
|
||||
|
||||
IrrlichtDevice *device = createDevice(driverType,
|
||||
core::dimension2d<u32>(512, 384));
|
||||
|
||||
if (device == 0)
|
||||
return 1; // could not create selected driver.
|
||||
|
||||
device->setWindowCaption(L"Irrlicht Engine - 2D Graphics Demo");
|
||||
|
||||
video::IVideoDriver* driver = device->getVideoDriver();
|
||||
|
||||
/*
|
||||
All 2d graphics in this example are put together into one texture,
|
||||
2ddemo.png. Because we want to draw colorkey based sprites, we need to
|
||||
load this texture and tell the engine, which part of it should be
|
||||
transparent based on a colorkey.
|
||||
|
||||
In this example, we don't tell it the color directly, we just say "Hey
|
||||
Irrlicht Engine, you'll find the color I want at position (0,0) on the
|
||||
texture.". Instead, it would be also possible to call
|
||||
driver->makeColorKeyTexture(images, video::SColor(0,0,0,0)), to make
|
||||
e.g. all black pixels transparent. Please note that
|
||||
makeColorKeyTexture just creates an alpha channel based on the color.
|
||||
*/
|
||||
video::ITexture* images = driver->getTexture("../../media/2ddemo.png");
|
||||
driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));
|
||||
|
||||
/*
|
||||
To be able to draw some text with two different fonts, we first load
|
||||
them. Ok, we load just one. As the first font we just use the default
|
||||
font which is built into the engine. Also, we define two rectangles
|
||||
which specify the position of the images of the red imps (little flying
|
||||
creatures) in the texture.
|
||||
*/
|
||||
gui::IGUIFont* font = device->getGUIEnvironment()->getBuiltInFont();
|
||||
gui::IGUIFont* font2 =
|
||||
device->getGUIEnvironment()->getFont("../../media/fonthaettenschweiler.bmp");
|
||||
|
||||
core::rect<s32> imp1(349,15,385,78);
|
||||
core::rect<s32> imp2(387,15,423,78);
|
||||
|
||||
/*
|
||||
Prepare a nicely filtering 2d render mode for special cases.
|
||||
*/
|
||||
driver->getMaterial2D().TextureLayer[0].BilinearFilter=true;
|
||||
driver->getMaterial2D().AntiAliasing=video::EAAM_FULL_BASIC;
|
||||
|
||||
/*
|
||||
Everything is prepared, now we can draw everything in the draw loop,
|
||||
between the begin scene and end scene calls. In this example, we are
|
||||
just doing 2d graphics, but it would be no problem to mix them with 3d
|
||||
graphics. Just try it out, and draw some 3d vertices or set up a scene
|
||||
with the scene manager and draw it.
|
||||
*/
|
||||
while(device->run() && driver)
|
||||
{
|
||||
if (device->isWindowActive())
|
||||
{
|
||||
u32 time = device->getTimer()->getTime();
|
||||
|
||||
driver->beginScene(true, true, video::SColor(255,120,102,136));
|
||||
|
||||
/*
|
||||
First, we draw 3 sprites, using the alpha channel we
|
||||
created with makeColorKeyTexture. The last parameter
|
||||
specifies that the drawing method should use this alpha
|
||||
channel. The last-but-one parameter specifies a
|
||||
color, with which the sprite should be colored.
|
||||
(255,255,255,255) is full white, so the sprite will
|
||||
look like the original. The third sprite is drawn
|
||||
with the red channel modulated based on the time.
|
||||
*/
|
||||
|
||||
// draw fire & dragons background world
|
||||
driver->draw2DImage(images, core::position2d<s32>(50,50),
|
||||
core::rect<s32>(0,0,342,224), 0,
|
||||
video::SColor(255,255,255,255), true);
|
||||
|
||||
// draw flying imp
|
||||
driver->draw2DImage(images, core::position2d<s32>(164,125),
|
||||
(time/500 % 2) ? imp1 : imp2, 0,
|
||||
video::SColor(255,255,255,255), true);
|
||||
|
||||
// draw second flying imp with colorcylce
|
||||
driver->draw2DImage(images, core::position2d<s32>(270,105),
|
||||
(time/500 % 2) ? imp1 : imp2, 0,
|
||||
video::SColor(255,(time) % 255,255,255), true);
|
||||
|
||||
/*
|
||||
Drawing text is really simple. The code should be self
|
||||
explanatory.
|
||||
*/
|
||||
|
||||
// draw some text
|
||||
if (font)
|
||||
font->draw(L"This demo shows that Irrlicht is also capable of drawing 2D graphics.",
|
||||
core::rect<s32>(130,10,300,50),
|
||||
video::SColor(255,255,255,255));
|
||||
|
||||
// draw some other text
|
||||
if (font2)
|
||||
font2->draw(L"Also mixing with 3d graphics is possible.",
|
||||
core::rect<s32>(130,20,300,60),
|
||||
video::SColor(255,time % 255,time % 255,255));
|
||||
|
||||
/*
|
||||
Next, we draw the Irrlicht Engine logo (without
|
||||
using a color or an alpha channel). Since we slightly scale
|
||||
the image we use the prepared filter mode.
|
||||
*/
|
||||
driver->enableMaterial2D();
|
||||
driver->draw2DImage(images, core::rect<s32>(10,10,108,48),
|
||||
core::rect<s32>(354,87,442,118));
|
||||
driver->enableMaterial2D(false);
|
||||
|
||||
/*
|
||||
Finally draw a half-transparent rect under the mouse cursor.
|
||||
*/
|
||||
core::position2d<s32> m = device->getCursorControl()->getPosition();
|
||||
driver->draw2DRectangle(video::SColor(100,255,255,255),
|
||||
core::rect<s32>(m.X-20, m.Y-20, m.X+20, m.Y+20));
|
||||
|
||||
driver->endScene();
|
||||
}
|
||||
}
|
||||
|
||||
device->drop();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
That's all. I hope it was not too difficult.
|
||||
**/
|
Reference in New Issue
Block a user