Từ 1 tới 7 trên tổng số 7 kết quả

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

  1. #1
    Ngày gia nhập
    12 2006
    Bài viết
    24

    Mặc định 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 :

    Code:
    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ụ :

    Code:
    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 :

    Code:
    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 :
    Code:
    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 :

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

    Code:
    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 :
    Code:
    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 :
    Code:
    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 :
    Code:
    #include <irrKlang.h>
    Code:
    using namespace audio; //add cai nay vao de IrrKlang co the hoat dong
    Code:
    #pragma comment(lib, "irrKlang.lib")
    Rồi trong int_main() bạn khai báo Engine irrKlang
    Code:
    irr::audio::ISoundEngine* KLengine = irr::audio::createIrrKlangDevice();
    Bây giờ, để play 1 file âm thanh nào, bạn viết :
    Code:
    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 :
    Code:
    KLengine->drop();
    +Xoay SN :
    Code:
    node->setRotation(vector3df(0,0,0));
    +Điều chỉnh kích thước SN :
    Code:
    node->setScale(vector3df(0,0,0));
    +Load scene từ file Irr :
    Code:
    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
    Code:
    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 :
    Code:
    MyEventReceiver receiver; //Khoi tao device su kien
    sau đó, add receiver vào IrrlichtDevice :
    Code:
    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 gia nhập
    12 2006
    Bài viết
    24

    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 đó
    Code:
    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
    Code:
    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 gia nhập
    12 2006
    Bài viết
    24

    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
    Code:
    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)

    Code:
    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:

    Code:
    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

    Code:
        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\n");
        }else{
            //Nếu chưa phải, thì in ra chữ FALSE
            printf("FALSE\n");
        }
    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 gia nhập
    12 2006
    Bài viết
    24

    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 :
    Code:
    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:

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

    Code:
    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 gia nhập
    07 2007
    Nơi ở
    Hồ Chí Minh
    Bài viết
    66

    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
    Thèm khát con gái !!
    ......................

  6. #6
    Ngày gia nhập
    12 2006
    Bài viết
    24

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

    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
    Forum phát triển game Việt Nam
    http://forum.gamedev.vn
    Forum Irrlicht Việt Nam
    http://forum.gamedev.vn/index.php?showforum=72

  7. #7
    Ngày gia nhập
    05 2009
    Nơi ở
    Russian
    Bài viết
    18

    Mặc định install irrlicht

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

Các đề tài tương tự

  1. Dịch thuật, công ty dịch thuật, dịch vụ dịch thuật chuyên nghiệp
    Gửi bởi vecvn trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 4
    Bài viết cuối: 18-11-2012, 10:44 PM
  2. Dịch vụ kế toán: Báo cáo thuế, dịch vụ tư vấn thuế, báo cáo thuế tncn vnnp
    Gửi bởi ecomvnnp01 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 16-02-2012, 11:07 AM
  3. Tài liệu hướng dẫn Irrlicht Cơ Bản
    Gửi bởi huytd trong diễn đàn Tutorials và Thủ thuật Visual C++
    Trả lời: 0
    Bài viết cuối: 27-09-2007, 06:45 AM
  4. Giới thiệu Irrlicht - 3D Game Engine mã nguồn mở
    Gửi bởi huytd trong diễn đàn Tutorials và Thủ thuật Visual C++
    Trả lời: 0
    Bài viết cuối: 27-09-2007, 06:36 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn