source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Ai/Orders/OrderMove.cs @ 4592

Revision 4592, 2.9 KB checked in by dezhidki, 8 years ago (diff)

Lisätty toimiva sotilas. Korjattu OrderMove:n epätarkkuuksia. Lisätty AStariin muuttuja, jolla voi jättää loppupisteen läpipääsemättömyyden huomioimatta.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using CastleMaster.Ai.Orders;
6using CastleMaster.Graphics;
7using CastleMaster.Units.Mobs;
8
9namespace IsometricEngineTest.Ai.Orders
10{
11    public class OrderMove : Order
12    {
13        private float x, z;
14        private int ppi = 0;
15        private bool excludeEndSolidness;
16        private float stopDistance;
17        private int moveFails = 0;
18        private float lastDist = 0.0F;
19
20        public OrderMove(float x, float z, float stopDistance = 2.0F, bool excludeEndSolidness = false)
21        {
22            this.stopDistance = stopDistance;
23            this.excludeEndSolidness = excludeEndSolidness;
24            this.x = x;
25            this.z = z;
26        }
27
28        public override Order Initialize(Mob mob)
29        {
30            base.Initialize(mob);
31            mob.PathFinder.InitializePathFinder((int)(mob.X / Viewport.TILESIZE), (int)(mob.Z / Viewport.TILESIZE), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), excludeEndSolidness);
32            return this;
33        }
34
35        public override void Update()
36        {
37            if (!mob.PathFinder.CanFindPath)
38                return;
39            if (mob.PathFinder.IsPathFinding)
40                mob.PathFinder.FindPath(50);
41
42            if (mob.PathFinder.Path.Count > 0 && ppi < mob.PathFinder.Path.Count)
43            {
44                Node currentTarget = mob.PathFinder.Path[ppi];
45                float xtPoint = currentTarget.X * Viewport.TILESIZE + 8.0F;
46                float ztPoint = currentTarget.Z * Viewport.TILESIZE + 8.0F;
47
48                float dist = mob.DistanceTo(xtPoint, ztPoint);
49                if (dist > 8.0F)
50                {
51                    if (mob.TurnTowards(xtPoint, ztPoint))
52                    {
53                        mob.MoveForward();
54
55                        if (dist == lastDist)
56                            moveFails++;
57                        else
58                            moveFails = 0;
59                        lastDist = dist;
60                    }
61                }
62                else
63                    ppi++;
64            }
65            else
66            {
67                float dist = mob.DistanceTo(x, z);
68                if (dist > 1.0F)
69                {
70                    if (mob.TurnTowards(x, z))
71                    {
72                        mob.MoveForward();
73
74                        if (dist == lastDist)
75                            moveFails++;
76                        else
77                            moveFails = 0;
78                        lastDist = dist;
79                    }
80                }
81            }
82        }
83
84        public override bool Finished
85        {
86            get
87            {
88                return (mob.DistanceTo(x, z) < stopDistance) || moveFails > 10 || !mob.PathFinder.CanFindPath;
89            }
90        }
91    }
92}
Note: See TracBrowser for help on using the repository browser.