irrlicht/examples.net/Examples_CSharp/example05.cs

216 lines
7.3 KiB
C#

/* This tutorial shows how to use the built in User Interface
of the Irrlicht Engine. It will give a brief overview and show
how to create and use windows, buttons, scroll bars, static texts
and list boxes.
Lets start like the HelloWorld example: We include
the irrlicht header files and an additional file to be able
to ask the user for a driver type using the console.
*/
using System;
using System.Text;
using System.IO;
using Irrlicht;
using Irrlicht.Video;
using Irrlicht.GUI;
using Irrlicht.Core;
using Irrlicht.Scene;
namespace _05.UserInterface
{
class Program : IEventReceiver
{
// path to standard Irrlicht media folder
//string path = "../../../../media/";
// empty path for executable folder:
string path = string.Empty;
IrrlichtDevice device;
int cnt = 0;
IGUIListBox listbox;
/// <summary>
/// Main entry point for the program.
/// </summary>
/// <param name="args">Arguments to pass the software.</param>
[STAThread]
static void Main(string[] args)
{
Program prog = new Program();
prog.run();
}
/*The Event Receiver is not only capable of getting keyboard and mouse input events,
but also events of the graphical user interface (gui). There are events for almost
everything: Button click, Listbox selection change, events that say that a element
was hovered and so on. To be able to react to some of these events, we create an
event receiver. We only react to gui events, and if it's such an event, we get the
id of the caller (the gui element which caused the event) and get the pointer to the
gui environment.*/
public bool OnEvent(Event p_e)
{
if (p_e.Type == EventType.GUIEvent)
{
int id = p_e.GUIEventCaller.ID;
IGUIEnvironment env = device.GUIEnvironment;
switch (p_e.GUIEventType)
{
case (GUIEvent.SCROLL_BAR_CHANGED):
if (id == 104)
{
// I think this is still not implemented
//int pos=p_e.GUIEventCaller.Position;
}
break;
/*If a button was clicked, it could be one of 'our' three buttons.
If it is the first, we shut down the engine. If it is the second,
we create a little window with some text on it. We also add a string
to the list box to log what happened. And if it is the third button,
we create a file open dialog, and add also this as string to the list
box. That's all for the event receiver.*/
case (GUIEvent.BUTTON_CLICKED):
if (id == 101)
{
device.CloseDevice();
return true;
}
if (id == 102)
{
listbox.AddItem("Window Created");
cnt += 30;
if (cnt > 200)
cnt = 0;
IGUIElement window = env.AddWindow(
new Rect(100 + cnt, 100 + cnt, 300 + cnt, 200 + cnt),
false, //modal?
"Test Window",
null, //parent
0); // id
env.AddStaticText("Please close me",
new Rect(35, 35, 140, 50),
true, //border
false, //wordwrap
window, //parent
0); //id
return true;
}
if (id == 103)
{
listbox.AddItem("File open");
env.AddFileOpenDialog("Please choose a file", false, null, 0);
return true;
}
break;
}
}
return false;
}
public void run()
{
// ask user for driver
DriverType driverType;
// Ask user to select driver:
StringBuilder sb = new StringBuilder();
sb.Append("Please select the driver you want for this example:\n");
sb.Append("\n(a) Direct3D 9.0c\n(b) Direct3D 8.1\n(c) OpenGL 1.5");
sb.Append("\n(d) Software Renderer\n(e) Apfelbaum Software Renderer");
sb.Append("\n(f) Null Device\n(otherKey) exit\n\n");
// Get the user's input:
TextReader tIn = Console.In;
TextWriter tOut = Console.Out;
tOut.Write(sb.ToString());
string input = tIn.ReadLine();
// Select device based on user's input:
switch (input)
{
case "a":
driverType = DriverType.DIRECT3D9;
break;
case "b":
driverType = DriverType.DIRECT3D8;
break;
case "c":
driverType = DriverType.OPENGL;
break;
case "d":
driverType = DriverType.SOFTWARE;
break;
case "e":
driverType = DriverType.SOFTWARE2;
break;
case "f":
driverType = DriverType.NULL_DRIVER;
break;
default:
return;
}
// Create device and exit if creation fails:
device = new IrrlichtDevice(driverType, new Dimension2D(1024, 768), 32, false, true, true);
if (device == null)
{
tOut.Write("Device creation failed.");
return;
}
/* set this as event receiver*/
device.EventReceiver = this;
/*
Get a pointer to the video driver and the SceneManager so that
we do not always have to write device.VideoDriver and
device.SceneManager and device.GUIEnvironment.
*/
ISceneManager smgr = device.SceneManager;
IVideoDriver driver = device.VideoDriver;
IGUIEnvironment env = device.GUIEnvironment;
/*We add three buttons. The first one closes the engine. The second creates
a window and the third opens a file open dialog. The third parameter is
the id of the button, with which we can easily identify the button in the
event receiver.*/
env.AddButton(new Rect(10, 210, 100, 240), null, 101, "Quit");
env.AddButton(new Rect(10, 250, 100, 290), null, 102, "New Window");
env.AddButton(new Rect(10, 300, 100, 340), null, 103, "File Open");
/*Now, we add a static text and a scrollbar, which modifies the transparency
of all gui elements. We set the maximum value of the scrollbar to 255,
because that's the maximal value for a color value. Then we create an other
static text and a list box.*/
env.AddStaticText("Transparent Control:", new Rect(150, 20, 350, 40), true, false, null, 0);
IGUIElement scrollbar = env.AddScrollBar(true, new Rect(150, 45, 350, 60), null, 104);
//nopt implemented yet
//scrollbar.Max=255;
env.AddStaticText("Logging Listbox:", new Rect(50, 80, 250, 100), true, false, null, 0);
listbox = env.AddListBox(new Rect(50, 110, 250, 180), null, 0, true);
/*To make the font a little bit nicer, we load an external font and set it as
new font in the skin. An at last, we create a nice Irrlicht Engine logo in the
top left corner. */
IGUISkin skin = env.Skin;
IGUIFont font = env.GetFont(path + "fonthaettenschweiler.bmp");
if (font != null)
{
skin.Font = font;
}
IGUIElement img = env.AddImage(driver.GetTexture(path + "irrlichtlogoalpha.tga"),
new Position2D(10, 10),
false, //UseAlphaChannel
null, //Parent
0, //ID
""); //Text
/*
We have done everything, so lets draw it.
*/
while (device.Run())
{
if (device.WindowActive)
{
device.VideoDriver.BeginScene(true, true, new Color(0, 122, 65, 171));
device.SceneManager.DrawAll();
device.GUIEnvironment.DrawAll();
device.VideoDriver.EndScene();
}
}
/*
In the end, delete the Irrlicht device.
*/
// Instead of device->drop, we'll use:
GC.Collect();
}
}
}
// Retrieved from "http://www.irrforge.org/index.php/CS_Tutorial_5"
// This page has been accessed 221 times. This page was last modified 06:10, 20 Jan 2006.