STDIO
Tìm kiếm gần đây

    Nội dung

    Chipmunk - Phần 5: Ray Casting

    23/01/2015
    Chipmunk - Phần 5: Ray Casting
    Tiếp tục loạt bài viết giới thiệu về thư viện vật lý trò chơi Chipmunk. Trong bài viết này tôi sẽ giới thiệu về một thành phần mới là Ray Casting và hiện thực một Ray Casting với Cocos2d-x 3.4.

    Giới thiệu

    Tiếp tục loạt bài viết tìm hiểu về thư viện vật lý trò chơi Chipmunk, trong bài viết này tôi sẽ giới thiệu về một thành phần mới đó là Ray Casting. Ví dụ về Ray Casting của Chipmunk được sự hỗ trợ của Cocos2d-x 3.4.

    Tiền đề bài viết

    Bài viết này nằm trong loạt bài viết của tôi về tìm hiểu thư viện vật lý trò chơi Chipmunk.

    Bài viết nằm trong những loạt bài viết của chương trình Tự Học Cocos2d-x 3.x.x:: www.stdio.vn/programs/content/2/lap-trinh-game-voi-cocos2dx của Stdio.vn :: www.stdio.vn.

    Đối tượng hướng đến

    Bài viết này tôi hướng đến những lập trình viên đã có kiến thức cơ bản về lập trình games 2D và chưa có kiến thước tương đương.

    Ray Casting là gì?

    Là một đoạn thẳng, được xác định trong Physics World. Có tác dụng tìm ra các đối tượng đang ở trong một phần nhất định của Physics World. Bạn có thể tưởng tượng rằng Ray Casting khá giống với rada.

    Thành phần

    Input

    Là thành phần mà bạn xác định khởi tạo.

    • position1
    • position2
    • maxFraction
    Phân tích
    • Với position1 và position2 bạn có thể xác định được hướng của Ray Casting. Có điểm đầu là position1 và điểm cuối là position2.
    • Bạn có khoảng cách của position1 và position2 là một giá trị lenght. Lúc này, độ dài của Ray Casting bằng giá trị của length*maxFraction.

    Output

    Là thành phần mà bạn nhận được khi Ray Casting bị một đối tượng cắt qua.

    • normal
    • fraction

    ss_1

    Ví dụ

    Trong Chipmunk, Ray Casting dễ dàng được tạo ra hơn so với Box2D. 

    float m_angle = 0.0f;
    DrawNode* m_node;
    
    float lengthRayCasting = 400.0f;
    Vec2 position1 = Vec2(visibleSize.width / 2, visibleSize.height / 2);
    Vec2 d(lengthRayCasting * cosf(m_angle), L * sinf(m_angle));
    Vec2 position2 = position1 + d;
    
    Vec2 positionFraction = position2 ;
    float fraction = 1000.0f;
    PhysicsRayCastCallbackFunc func = [&positionFraction , &fraction ]
         (PhysicsWorld& world, const PhysicsRayCastInfo& info, void* data)->bool {
         if (friction > info.fraction)  {
             positionFraction = info.contact;
             friction = info.fraction;
    	 }
    	 return true;
     };
    
    m_world->rayCast(func, position1 , position2,  nullptr);
    m_node->drawSegment(position1 , positionFraction , 1, Color4F(1.0f, 0.0f, 0.0f, 1.0f));
    
    if (position2 != positionFraction)  {
    	m_node->drawDot(positionFraction , 2, Color4F(1.0f, 1.0f, 1.0f, 1.0f));
     }
    addChild(m_node);
    Phân tích
    • Dòng 1-2: Khởi tạo hai thuộc tính là m_angle và m_node. Thuộc tính m_node có tác dụng vẽ lên màn hình như đoạn thẳng,...
    • Dòng 4-7: Khởi tạo position1 và position2. Ở đây khi bạn giá trị của maxFraction là 1.
    • Dòng 9: Khởi tạo positionFraction. Bình thường khi chưa có đối tượng nào cắt qua Ray Casting positionFraction chính là position2. Nếu có đối tượng cắt qua thì đây là tọa độ của fraction.
    • Dòng 10-17: Đây là phương thức có chức năng xác định tọa độ của fraction (positionFraction) khi có đối tượng nào đó cắt qua Ray Casting.
    • Dòng 19: Khởi tạo Ray Casting trong Physics World.
    • Dòng 20: Vẽ một đường thẳng từ điểm position1 đến positionFraction, có bán kính là 1 và có giá trị màu là (1.0f, 0.0f, 0.0f, 1.0f).
    • Dòng 22-24: Nếu tìm được tọa độ của fraction, thì vẽ một điểm ngay tại tọa độ này.
    • Dòng 25: Thêm đối tượng m_node vào layer hiện tại.

    ss_2

    Hoặc:

    #define MAX_MULTI_RAYCAST_NUM 5
    Vec2 positionFraction[MAX_MULTI_RAYCAST_NUM];
    int num = 0;
    
    PhysicsRayCastCallbackFunc func = [&positionFraction, &num]
        (PhysicsWorld& world, const PhysicsRayCastInfo& info, void* data)->bool {
    	if (num < MAX_MULTI_RAYCAST_NUM) {
    		positionFraction[num++] = info.contact;
    	}
    
    	return true;
    };
    
    m_world->rayCast(func, position1, position2, nullptr);
    
    m_node->drawSegment(position1, position2, 1, Color4F(1.0f, 0.0f, 0.0f, 1.0f));
    
    for (int index = 0; index < num; ++index) {
    	m_node->drawDot(positionFraction[index], 2, Color4F(1.0f, 1.0f, 1.0f, 1.0f));
    }
    
    addChild(m_node);

    ss_3

    Tổng kết

    Ray Casting là một thành phần thường xuất hiện rất nhiều trong các hiện tượng vật lý, nhất là ở trong games. Trong bài viết này tôi đã hoàn thành việc giới thiệu về Ray Casting trong Chipmunk. Mọi thắc mắc bạn có thể bình luận tại bài viết hoặc liên hệ với Trương Đạt :: www.stdio.vn/users/index/11/truong-dat.

    Tham khảo

    http://www.cocos2d-x.org

     

    Thảo luận

    Đăng nhập

    Bài viết liên quan

    Box2D - Phần 6: Ray Casting

    Box2D - Phần 6: Ray Casting

    Tiếp tục loạt bài viết giới thiệu về thư viện vật lý trò chơi Box2D. Bài viết này giới thiệu một thành phần của Box2D là Ray Casting. Ray Casting ...

    Trương Xuân Đạt

    23/01/2015

    Chipmunk - Phần 2: Một Số Thuật Ngữ Và Khái Niệm

    Chipmunk - Phần 2: Một Số Thuật Ngữ Và Khái Niệm

    Tiếp tục loạt bài viết giới thiệu thư viện vật lý trò chơi Chipmunk. Tìm hiểu về một số khái niệm và thuật ngữ trong Chipmunk, cách di chuyển các bodies, va ...

    Trương Xuân Đạt

    23/01/2015

    Chipmunk - Phần 1: Giới Thiệu

    Chipmunk - Phần 1: Giới Thiệu

    Bài viết này trong loạt bài viết của tôi giới thiệu về thư viện vật lý trò chơi Chipmunk. Trong bài viết này sẽ giới thiệu các khái niệm và thuật ...

    Trương Xuân Đạt

    23/01/2015

    Chipmunk - Phần 3: Constraints

    Chipmunk - Phần 3: Constraints

    Tiếp tục loạt bài viết giới thiệu về thư viện vật lý trò chơi Chipmunk. Trong bài viết này tôi sẽ giới thiệu về constraints và các loại constraint ...

    Trương Xuân Đạt

    23/01/2015

    Chipmunk - Phần 4: Constraints (Tiếp Theo)

    Chipmunk - Phần 4: Constraints (Tiếp Theo)

    Tiếp tục loạt bài viết giới thiệu về thư viện vật lý trò chơi Chipmunk. Trong bài viết này tôi sẽ giới thiệu về constraints và các loại constraint ...

    Trương Xuân Đạt

    23/01/2015

    HTML - Phần 5: Các Thẻ Hình Ảnh, Video, Audio

    HTML - Phần 5: Các Thẻ Hình Ảnh, Video, Audio

    Âm thanh, hình ảnh, audio làm cho trang web của chúng ta thêm đẹp đẽ, sống động hơn. Những thành phần này được thể hiện bằng HTML như thế nào thì trong bài viết này tôi ...

    Nguyễn Nghĩa

    26/10/2015

    Hiện Thực Game Zero Với Unity - Phần 5 - Âm Thanh Và Effect

    Hiện Thực Game Zero Với Unity - Phần 5 - Âm Thanh Và Effect

    Tiếp tục chuỗi bài viết Hướng Dẫn Hiện Thực Game Zero Với Unity, trong bài viết này, tôi sẽ hướng dẫn bạn đọc thêm các hiệu ứng âm thanh và hiệu ứng của gameplay. Đây là ...

    Rye Nguyen

    11/08/2015

    Box2D - Phần 1: Giới Thiệu Và Một Số Thuật Ngữ Và Khái Niệm

    Box2D - Phần 1: Giới Thiệu Và Một Số Thuật Ngữ Và Khái Niệm

    Giới thiệu về engine vật lý sử dụng trong games là Box2D. Giới thiệu Box2D, các khái niệm, cách thành phần liên quan, cách khởi tạo và thao tác với một số thành phần ...

    Trương Xuân Đạt

    23/01/2015

    CBP-7: Cài Đặt Phản Ứng Cho Entity

    CBP-7: Cài Đặt Phản Ứng Cho Entity

    Thiết lập phản ứng của Entity nhằm điều khiển các Component. Mỗi Entity đều có một phản ứng riêng biệt, tùy thuộc vào người định nghĩa nó, hệ thống phản ứng này sẽ giúp ...

    Tuấn Trần

    20/08/2015

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 2: Quản Lý Bộ Nhớ Phân Mảnh

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 2: Quản Lý Bộ Nhớ Phân Mảnh

    Vấn đề phân mảnh trong quá trình cấp phát và thu hồi bộ nhớ liên tục dẫn đến thiếu bộ nhớ với các thiết bị có bộ nhớ thấp đã từng làm tôi tốn thời gian. Giải quyết vấn đề ...

    La Kiến Vinh

    19/09/2014

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    [email protected]

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020