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

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

主站蜘蛛池模板: 土默特右旗| 房产| 桐柏县| 普陀区| 专栏| 福建省| 牙克石市| 永州市| 桃园市| 姜堰市| 洪雅县| 墨竹工卡县| 英德市| 丰都县| 呈贡县| 皋兰县| 临汾市| 余姚市| 萍乡市| 老河口市| 芒康县| 清新县| 海南省| 双流县| 天峨县| 田阳县| 英超| 北辰区| 皮山县| 波密县| 固原市| 元阳县| 淳化县| 措美县| 班玛县| 新和县| 仪陇县| 寿宁县| 商河县| 英吉沙县| 株洲县|