You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.1 KiB
75 lines
2.1 KiB
3 years ago
|
// Playable Character
|
||
|
//
|
||
|
// If not controlled by the player, its AI is to move left and
|
||
|
// right and is able to pick up keys, press buttons and generally
|
||
|
// get up to mischief.
|
||
|
var playerSpeed = 4,
|
||
|
direction = "right";
|
||
|
|
||
|
function main() {
|
||
|
Self.SetMobile(true); // Needed to activate most objects
|
||
|
Self.SetInventory(true); // Can pick up keys and items (automatic)
|
||
|
Self.SetGravity(true); // Is pulled down by gravity
|
||
|
Self.SetHitbox(0, 0, 32, 52);
|
||
|
setupAnimations();
|
||
|
|
||
|
// Are we the player character?
|
||
|
if (Self.IsPlayer()) {
|
||
|
return playerControls();
|
||
|
}
|
||
|
return ai()
|
||
|
}
|
||
|
|
||
|
function setupAnimations() {
|
||
|
Self.AddAnimation("walk-left", 200, ["stand-left", "walk-left-1", "walk-left-2", "walk-left-3", "walk-left-2", "walk-left-1"]);
|
||
|
Self.AddAnimation("walk-right", 200, ["stand-right", "walk-right-1", "walk-right-2", "walk-right-3", "walk-right-2", "walk-right-1"]);
|
||
|
}
|
||
|
|
||
|
// Player controls
|
||
|
function playerControls() {
|
||
|
Events.OnKeypress(function (ev) {
|
||
|
if (ev.Right) {
|
||
|
if (!Self.IsAnimating()) {
|
||
|
Self.PlayAnimation("walk-right", null);
|
||
|
}
|
||
|
} else if (ev.Left) {
|
||
|
if (!Self.IsAnimating()) {
|
||
|
Self.PlayAnimation("walk-left", null);
|
||
|
}
|
||
|
} else {
|
||
|
Self.StopAnimation();
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// AI controls. The AI is very simple:
|
||
|
// walk to the right until you hit an obstacle,
|
||
|
// then walk to the left until you hit an obstacle,
|
||
|
// and repeat.
|
||
|
// It will automatically pickup keys and interact with things
|
||
|
// as it passes because it HasInventory and IsMobile.
|
||
|
function ai() {
|
||
|
// Sample our X position every few frames and detect if we've hit a solid wall.
|
||
|
var sampleTick = 0;
|
||
|
var sampleRate = 5;
|
||
|
var lastSampledX = 0;
|
||
|
|
||
|
setInterval(function () {
|
||
|
if (sampleTick % sampleRate === 0) {
|
||
|
var curX = Self.Position().X;
|
||
|
var delta = Math.abs(curX - lastSampledX);
|
||
|
if (delta < 5) {
|
||
|
direction = direction === "right" ? "left" : "right";
|
||
|
}
|
||
|
lastSampledX = curX;
|
||
|
}
|
||
|
sampleTick++;
|
||
|
|
||
|
var Vx = parseFloat(playerSpeed * (direction === "left" ? -1 : 1));
|
||
|
Self.SetVelocity(Vector(Vx, 0.0));
|
||
|
|
||
|
if (!Self.IsAnimating()) {
|
||
|
Self.PlayAnimation("walk-" + direction, null);
|
||
|
}
|
||
|
}, 100);
|
||
|
}
|