Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Một số kĩ thuật cơ bản với Irrlicht

    +Lấy tọa độ một SceneNode(SN)
    Giả sử trên Scene đã có một SN tên node , để lấy tọa độ của SN này, viết code như sau :

    Mã:
    core::vector3df v = node->getPosition(); //Khởi tạo biến v để nhận tọa độ của node
    Bây giờ, v trở thành 1 object chứa các thông tin của node, v sẽ có các thuộc tính : v.X , v.Y, v.Z -> là giá trị tọa độ của node trên trục tọa độ Oxyz

    +Đặt tọa độ cho một SN
    Cũng như trên, sau khi khai báo code, bạn thiết lập giá trị cho v.X hoặc v.Y rồi dùng hàm node->setPosition(v); để đặt tọa độ, ví dụ :

    Mã:
    v.X = 50;
    v.Y = 10;
    node->setPosition(v);
    Kết quả : đưa node đến điểm có tọa độ (50,10)

    +Hiển thị một MessageBox
    Để hiển thị một MsgBox, bạn viết code :

    Mã:
    device->getGUIEnvironment()->addMessageBox(L"Tiêu đề",L"Nội dung");
    Với device là tên của IrrlichtDevice

    +Thay đổi tiêu đề cửa sổ
    Thay đổi tiêu đề cửa sổ lúc đang thực thi, dùng code sau :
    Mã:
    device->setWindowCaption(L"Tiêu đề cửa sổ");
    +Tắt ứng dụng
    Để tắt ứng dụng Irrlicht khi đang chạy, bạn dùng :

    Mã:
    device->closeDevice();
    +Khởi tạo ứng dụng trong chế độ FullScreen

    Mã:
    device = createDevice( video::EDT_DIRECT3D9, dimension2d<s32>(1024, 768), 16, <fs>, false, false, 0);
    Với <fs> có giá trị true để FullScreen, false để dùng WindowMode

    +Dùng tiếng Việt trong Irrlicht
    Khi dùng Irrlicht với VC++6, bạn không thể sử dụng tiếng Việt Unicode cho Irrlicht được, để khắc phục, ta có thể chọn một loại font khác với một bảng mã khác, ở đây mình sẽ dùng font VK Sans Serif, bảng mã TCVN3 vì font này rất sắc nét.
    Đầu tiên, vào thư mục Tools trong bộ thư viện Irrlicht, vào thư mục IrrFontTool -> oldFontTool, chạy file IrrFontTool.exe, chọn font VK Sans Serif (hoặc font nào bạn muốn), chỉnh các thông số như size, bold, italic... cho phù hợp với mục đích sử dụng của bạn, rồi nhấn nút : Create bitmap font and copy to clipboard, rồi vào Paint dán cái hình đó vào, lưu lại với tên gì đó, vd: font.bmp
    Rồi vào VC++6, code như sau :
    Mã:
    IGUISkin* skin = guienv->getSkin();
    IGUIFont* font = guienv->getFont("Data/font.bmp"); //Font VK Sans Serif - Tieng Viet TCVN3
    if (font)
        skin->setFont(font);
    Đoạn code này phải đặt sau phần khai báo IGUIEnvironment* guienv = device->getGUIEnvironment(); , nếu không, khi chạy sẽ bị lỗi.
    Từ lúc này, bạn có thể dùng tiếng Việt thoải mái (lưu ý là bảng mã phải phù hợp với loại font bạn chọn)

    +Đặt một đoạn text lên màn hình
    Code :
    Mã:
    device->getGUIEnvironment()->addStaticText(L"Nội dung",rect<s32>(10,50,300,200),[B],true,0,-1,false);
    Trong đó, rect<s32>(10,50,300,200) sẽ tạo ra một ô text size 300x200, tại vị trí (10,50), [B] có giá trị true nếu muốn hiển thị khung của ô text, false nếu không muốn hiển thị.

    +Âm thanh với IrrKlang
    Âm thanh là phần không thể thiếu trong Game, khi dùng Irrlicht, bạn có thể play 1 file âm thanh bằng cách sử dụng thư viện IrrKlang, cách khai báo như sau :
    Mã:
    #include <irrKlang.h>
    Mã:
    using namespace audio; //add cai nay vao de IrrKlang co the hoat dong
    Mã:
    #pragma comment(lib, "irrKlang.lib")
    Rồi trong int_main() bạn khai báo Engine irrKlang
    Mã:
    irr::audio::ISoundEngine* KLengine = irr::audio::createIrrKlangDevice();
    Bây giờ, để play 1 file âm thanh nào, bạn viết :
    Mã:
    KLengine->play2D("Data/cobemuadong.mp3",true);
    Thuộc tính True là để KLengine loop (lặp lại - replay) file nhạc mỗi khi chơi xong.
    Kết thúc chương trình, bạn nên Delete KLengine :
    Mã:
    KLengine->drop();
    +Xoay SN :
    Mã:
    node->setRotation(vector3df(0,0,0));
    +Điều chỉnh kích thước SN :
    Mã:
    node->setScale(vector3df(0,0,0));
    +Load scene từ file Irr :
    Mã:
    smgr->loadScene("Data/thunglung.irr");
    smgr là IScreenManager

    +Nhận biết sự kiện nhấn phím
    Đầu tiên, bạn phải viết class làm nhiệm vụ Nhận và xử lý các sự kiện, ở ví dụ này, class đó đc đặt tên là MyEventReceiver
    Mã:
    class MyEventReceiver : public IEventReceiver
    {
    public:
        virtual bool OnEvent(SEvent event)
        {
            if (node != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT)
            {
                switch(event.KeyInput.Key)
                {
                case KEY_UP:
                    {
                        //Code của sự kiện KEY_UP
                    }
                    return true;
            }
    
            return false;
        }
    };
    Như đã thấy ở trên, khi có sự kiện KEY_UP (tức là nhấn phím mũi tên Up), MyEventReceiver sẽ thự hiện code ở phần sự kiện KEY_UP
    Các thông số tên của phím được nhấn, bạn có thể tham khảo trong file Keycodes.h của Irrlicht.
    Sau khi viết xong class MyEventReceiver, bạn vào main() viết code khai báo IEventReceiver :
    Mã:
    MyEventReceiver receiver; //Khoi tao device su kien
    sau đó, add receiver vào IrrlichtDevice :
    Mã:
    device = createDevice( video::EDT_DIRECT3D9, dimension2d<s32>(1024, 768), 16,false, false, false, &receiver); //Khoi tao man hinh va add EventReceiver vao
    Diễn đàn Irrlicht tại Việt Nam : http://forum.gamedev.vn/index.php?showforum=72

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Làm việc với file nén (ZIP,PAK) trong Irrlicht
    Thường trong các game được phát hành, bạn thường ít khi truy cập trực tiếp được vào data của game (hình ảnh, âm thanh,...) vì đa phần chúng được nén lại thành 1 "gói", giống như trong game Quake hay Thiên Long Bát Bộ, bạn thấy toàn file .pak
    Irrlicht cũng làm được như thế, ví dụ bạn có một 3 file , bạn không muốn người dùng truy cập và sửa đổi các file đó, bạn hãy nén những file đó lại thành một file ZIP (hoặc PAK nếu thích)
    Thành phần file zip sẽ như sau :

    Data.zip
    + bgmusic.mp3
    + font.png
    + char.png
    Khi đó, để Irrlicht có thể truy cập đến từng file, bạn chỉ việc khai báo cho chương trình biết FileSystem nằm trong file ZIP đó
    Mã:
    device->getFileSystem()->addZipFileArchive("Data.zip",true,true);
    bây giờ thì bạn có thể thao tác với như bình thường, ví dụ load file font.png
    Mã:
    font = device->getGUIEnvironment()->getFont("font.png");
    LƯU Ý : Đường dẫn đến file bây giờ là đường dẫn đến file nằm trong file ZIP

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Sử dụng chuột trong Irrlicht
    Phần 1 : Xác định node đc chuột chạm vào
    Mặc dù bên topic Thủ thuật đã có trình bày rồi, nhưng ko phải ai đọc cũng hiểu, mình xin trình bày lại, dễ hiểu hơn và ngắn gọn hơn.
    Để xác định con trỏ chuột (trong hệ trục 2D) đang trỏ tới đối tượng nào (trong hệ trục 3D), đơn giản bạn chỉ cần khai báo 3 biến
    - pos : để lấy tọa độ chuột (2D)
    - ray : là một đường thẳng chạy từ điểm mà con trỏ chuột đang đứng trên màn hình, đâm thẳng vào trong, trên đường đi của nó, node nào bị dính chưởng, sẽ là node đc trỏ tới
    - n : con trỏ để lấy node vừa bị dính chưởng

    Cách làm như sau
    Tạo 1 project Irrlicht mới, khai báo 2 biến con trỏ mesh và node
    Mã:
    scene::IAnimatedMesh* mesh;
    scene::IAnimatedMeshSceneNode* node;
    sau đó khởi tạo chúng, gán ID cho node là 100 (số mấy cũng đc)

    Mã:
    mesh = smgr->getMesh("dwarf/dwarf.x");
    node = smgr->addAnimatedMeshSceneNode(mesh);
    node->setID(100);
    Bây giờ bạn đã có node trên màn hình, giờ thì bắt đầu làm phần trỏ chuột
    tại phần khai báo, bạn thêm vào 3 biến pos, ray và n với các kiểu position2d, ISceneNode và line3df:

    Mã:
    scene::ISceneNode* n;
    core::position2d<s32> pos;
    core::line3df ray;
    tại vòng lặp chính, bạn viết lệnh như thế này

    Mã:
        pos = device->getCursorControl()->getPosition(); //lấy tọa độ chuột
        // Kẻ một đường thẳng từ màn hình vào sâu bên trong
        ray = smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(pos,smgr->getActiveCamera());
        // Xác định node bị dính chưởng của ray
        n = smgr->getSceneCollisionManager()->getSceneNodeFromRayBB(ray);
        // Nếu node có ID bằng 100 (tức node đó chính là node mà ta vừa tạo) thì...
        if (n->getID() == 100)
        {
            // In ra dòng chữ TRUE
            printf("TRUE
    ");
        }else{
            //Nếu chưa phải, thì in ra chữ FALSE
            printf("FALSE
    ");
        }
    Xong rồi, khi chạy, bạn thử đưa con chuột ra ngoài, đừng chạm vào node, thì trên cửa sổ console, bạn sẽ thấy dòng chữ FALSE, nếu đưa chuột vào node, nó sẽ ra dòng chữ TRUE

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Phần 2 : Xác định điểm được nhấn trên node
    Ở phần trên, chỉ xác định xem node nào được nhấn, nên đơn giản, phần này ta sẽ tìm ra điểm nào được trỏ tới, tức là con trỏ chuột đang chạm vào vị trí nào của node đó luôn.
    Khác với phần trên chỉ cần 3 biến, ở đây ta cần 6 biến :
    Mã:
    core::vector3df intersection;
    core::triangle3df tri;
    core::position2d<s32> pos;
    core::line3df ray;
    scene::ITerrainSceneNode* terrain;
    scene::ITriangleSelector* selector;
    thay vì dùng 1 node để xác định, tại đây ta dùng TriangleSelector
    bạn phải gán TriangleSelector cho Node cần xử lý, giả sử node đó có tên là nodeN, đặt đoạn code này vào trước phần mainloop:

    Mã:
    selector = smgr->createTriangleSelector(meshN,nodeN);
    nodeN->setTriangleSelector(selector);
    selector->drop();
    sau đó, bên trong main loop, đặt đoạn code sau vào :

    Mã:
    pos = device->getCursorControl()->getPosition(); //lấy tọa độ chuột
    ray = smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(pos,smgr->getActiveCamera()); // tạo ray
    if (smgr->getSceneCollisionManager()->getCollisionPoint(ray,selector,intersection,tri)){
        driver->draw3DTriangle(tri, video::SColor(0,255,0,0)); // Vẽ tam giác tại điểm đc chuột trỏ tới
    }
    ngoài ra, sau khi thực hiện lệnh trên, biến intersection, đây là 1 vector3d, chỉ tọa độ điểm vừa đc chuột chạm vào trong môi trường 3D, bạn hoàn toàn có thể tương tác đc với nó.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    huytd thân,
    Mình search thì thấy
    Irrlicht là 1 Game Engine
    Ưu điểm của Irrlicht là code ngắn gọn, dễ hiểu, lại có hiệu quả cao, và đa môi trường, tương tự như Java, với Irrlicht, bạn chỉ cần code 1 lần, nhưng bạn có thể chạy ứng dụng trong bất kì môi trường đồ họa nào (DirectX9, DirectX8, OpenGL...)
    ....
    Bạn có thể giới thiệu nhiều hơn về Irrlicht, cách sử dụng...
    Đây là lần đầu tiên thấy nó, Irrlicht

  6. #6
    Irrlicht là một game engine crossplatform (chạy đc trên nhiều môi trường), mình đã có bài viết giới thiệu về nó tại đây
    http://forums.congdongcviet.com/showthread.php?t=3272
    đây là forum tiếng việt về engine này
    http://forum.gamedev.vn/index.php?showforum=72

  7. #7
    huytd có thể chỉ cho mọi người cách cài đặt Irrlicht được ko?

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •