官术网_书友最值得收藏!

Shooting blocks

Now that we have some basic lighting, a physics plane, and the ability to create and simulate physics objects, it's time to start shooting things. Before we jump head-first into creating agents, we'll take a quick detour into accessing some of the physics aspects of sandbox objects, as well as interacting with input controls.

The Sandbox_HandleEvent function allows the sandbox to respond to mouse and keyboard inputs. The event parameter is a Lua table that stores the source of the event, whether the event was generated by a down or up key press, and what key caused the event. Mouse-movement events are similar, but contain the width and height location of the mouse cursor.

As we already know how to create a sandbox object, all we need to do to shoot objects is position the object at the camera's position and orientation and apply a physics impulse on the object.

In this case, we're going to create and shoot a block on a space_key press event. The camera's position and forward vector can be returned from the sandbox using the Sandbox.GetCameraPosition and Sandox.GetCameraForward functions. We'll assign the position and orientation to the block and apply a force to the block in the camera's forward direction. To add a bit of spin to the object, you can use the Core.ApplyAngularImpulse function to cause the block to start spinning as it flies through the air:

Sandbox.lua:

function Sandbox_HandleEvent(sandbox, event)
    if (event.source == "keyboard" and
        event.pressed and event.key == "space_key" ) then

        local block = Sandbox.CreateObject(
            sandbox,
            "models/nobiax_modular/modular_block.mesh");

        local cameraPosition =            
            Sandbox.GetCameraPosition(sandbox);
        -- Normalized forward camera vector.
        local cameraForward =
            Sandbox.GetCameraForward(sandbox);
        -- Offset the block's position in front of the camera.
        local blockPosition =
            cameraPosition + cameraForward * 2;
        local rotation = Sandbox.GetCameraOrientation(sandbox);

        -- Mass of the block in kilograms.
        Core.SetMass(block, 15);
        Core.SetRotation(block, rotation);
        Core.SetPosition(block, blockPosition);
    
        -- Applies instantaneous force for only one update tick.
        Core.ApplyImpulse(
            block, Vector.new(cameraForward * 15000));

        -- Applies instantaneous angular force for one update 
        -- tick.  In this case blocks will always spin forwards  
        -- regardless where the camera is looking. 
        Core.ApplyAngularImpulse(
            block, Sandbox.GetCameraLeft(sandbox) * 10);
    end
end

If we run the sandbox now, we can move around, point the camera, and shoot blocks.

Shooting blocks in the sandbox

主站蜘蛛池模板: 庆云县| 蛟河市| 涞水县| 合肥市| 丰城市| 兖州市| 隆安县| 新干县| 翁源县| 二连浩特市| 浦城县| 泊头市| 通辽市| 荔波县| 义乌市| 宜兰县| 湖北省| 青海省| 阜南县| 肥乡县| 子长县| 通辽市| 连江县| 增城市| 凤翔县| 芷江| 白朗县| 育儿| 依安县| 醴陵市| 永寿县| 西畴县| 潮州市| 丁青县| 固原市| 息烽县| 香格里拉县| 镶黄旗| 孟连| 张家口市| 深泽县|