bad RPG AI

This commit is contained in:
2021-03-09 19:57:03 -07:00
parent 652b83242e
commit 96d5e68ac3
5 changed files with 63 additions and 2 deletions

View File

@@ -1,6 +1,11 @@
(defvar &inline :Float SPEED 140) (defvar &inline :Float SPEED 140)
(defprop &mut :EnemyType type null) (defprop &mut :EnemyType type null)
(defprop &mut :FSM brain null)
(defprop &mut :Float idleTimer null)
(defprop &mut :Float moveDirection null)
(defprop &mut :Bool seesPlayer false)
(defprop &mut :FlxPoint playerPosition null)
(defmethod new [:Float x :Float y :EnemyType type] (defmethod new [:Float x :Float y :EnemyType type]
(super x y) (super x y)
@@ -24,6 +29,9 @@
(set height 14) (set height 14)
(set offset.x 4) (set offset.x 4)
(set offset.y 2) (set offset.y 2)
(set brain (new FSM idle))
(set idleTimer 0)
(set playerPosition (FlxPoint.get))
(return)) (return))
(defmethod &override update [:Float elapsed] (defmethod &override update [:Float elapsed]
@@ -46,7 +54,35 @@
(animation.play "u")) (animation.play "u"))
(FlxObject.DOWN (FlxObject.DOWN
(animation.play "d"))) (animation.play "d"))))
(super.update elapsed)) (brain.update elapsed)
(super.update elapsed)
(return))
(defmethod idle [:Float elapsed]
(cond
(seesPlayer
// TODO (the FSM) here should not be necessary!
(set .activeState (the FSM brain) chase))
((<= idleTimer 0)
(if (FlxG.random.bool 1)
{
(set moveDirection -1)
(set velocity.x (set velocity.y 0))
}
{
(set moveDirection (* 45 (FlxG.random.int 0 8)))
(velocity.set (* SPEED 0.5) 0)
(velocity.rotate (FlxPoint.weak) moveDirection)
})
(set idleTimer (FlxG.random.int 1 4)))
(true
(-= idleTimer elapsed)))
(return))
(defmethod chase [:Float elapsed]
(if !seesPlayer
(set brain.activeState idle)
(FlxVelocity.moveTowardsPoint this playerPosition (Std.int SPEED)))
(return)) (return))

View File

@@ -0,0 +1,4 @@
package;
@:build(kiss.Kiss.build("source/FSM.kiss"))
class FSM {}

View File

@@ -0,0 +1,9 @@
(defprop &mut :Float->Void activeState null)
(defmethod new [:Float->Void initialState]
(set activeState initialState)
(return))
(defmethod update [:Float elapsed]
(activeState elapsed)
(return))

View File

@@ -39,6 +39,17 @@
(super.update elapsed) (super.update elapsed)
(FlxG.collide player walls) (FlxG.collide player walls)
(FlxG.overlap player coins playerTouchCoin) (FlxG.overlap player coins playerTouchCoin)
(FlxG.collide enemies walls)
(enemies.forEachAlive checkEnemyVision)
(return))
(defmethod checkEnemyVision [:Enemy enemy]
(if (walls.ray (enemy.getMidpoint) (player.getMidpoint))
{
(set enemy.seesPlayer true)
(set enemy.playerPosition (player.getMidpoint))
}
(set enemy.seesPlayer false))
(return)) (return))
(defmethod playerTouchCoin [:Player player :Coin coin] (defmethod playerTouchCoin [:Player player :Coin coin]

View File

@@ -7,6 +7,7 @@ import flixel.FlxSprite;
import flixel.util.FlxColor; import flixel.util.FlxColor;
import flixel.input.keyboard.FlxKey; import flixel.input.keyboard.FlxKey;
import flixel.math.FlxPoint; import flixel.math.FlxPoint;
import flixel.math.FlxVelocity;
import flixel.FlxObject; import flixel.FlxObject;
import flixel.addons.editors.ogmo.FlxOgmo3Loader; import flixel.addons.editors.ogmo.FlxOgmo3Loader;
import flixel.group.FlxGroup; import flixel.group.FlxGroup;