Пример #1
0
        public void UpdateDebugAIRegions(DrawingSurface ds)
        {
            ds.DrawingColor = Game.GetColorFromRGB(255, 255, 255);
            int i = 0;

            for (i = 0; i < MAX_RACING_CARS; i += 1)
            {
                int veh = RobotsRB[i].vehicleIndex;
                if (veh < 0)
                {
                    continue;
                }
                VectorF pos = Cars[veh].position;
                if (pos == null)
                {
                    continue;
                }
                VectorF dir = VectorF.create(50, 0);
                dir.rotate(RobotsRB[i].targetAngle);
                dir.add(pos);
                int x1 = FloatToInt(pos.x, eRoundNearest) - GetViewportX();
                int y1 = FloatToInt(pos.y, eRoundNearest) - GetViewportY();
                int x2 = FloatToInt(dir.x, eRoundNearest) - GetViewportX();
                int y2 = FloatToInt(dir.y, eRoundNearest) - GetViewportY();
                ds.DrawLine(x1, y1, x2, y2);
            }
        }
Пример #2
0
        public void UpdateBody()
        {
            int i = 0;

            for (i = 0; i < NUM_COLLISION_POINTS; i += 1)
            {
                VectorF colpt = this.collPoint[i];
                colpt.set(this.collPointOff[i]);
                colpt.rotate(this.direction.angle());
                colpt.add(this.position);
            }
        }
Пример #3
0
        public void processInteraction(float deltaTime)
        {
            int i = 0;

            float[] friction     = new float[NUM_COLLISION_POINTS];
            float   avg_friction = 0.0f;

            bool[] hit_area = new bool[NUM_COLLISION_POINTS];
            for (i = 0; i < NUM_COLLISION_POINTS; i += 1)
            {
                VectorF colpoint = this.collPointOff[i].clone();
                colpoint.rotate(this.direction.angle());
                colpoint.add(this.position);
                this.collPoint[i] = colpoint;
                int room_x   = FloatToInt(colpoint.x, eRoundNearest);
                int room_y   = FloatToInt(colpoint.y, eRoundNearest);
                int screen_x = room_x - GetViewportX();
                int screen_y = room_y - GetViewportY();
                int area     = GetWalkableAreaAt(screen_x, screen_y);
                if (area == 0)
                {
                    hit_area[i] = true;
                }
                else
                {
                    friction[i]           = Track.TerraSlideFriction[area];
                    avg_friction         += friction[i];
                    this.terrafriction[i] = friction[i];
                }
                this.colpt[i].x = FloatToInt(colpoint.x, eRoundNearest);
                this.colpt[i].y = FloatToInt(colpoint.y, eRoundNearest);
            }
            avg_friction /= IntToFloat(NUM_COLLISION_POINTS);
            this.friction = avg_friction;
            for (i = 0; i < NUM_COLLISION_POINTS; i += 1)
            {
                if (!hit_area[i])
                {
                    continue;
                }
                VectorF impact = VectorF.subtract(this.position, this.collPoint[i]);
                impact.normalize();
                impact.scale(Maths.AbsF(this.driveVelocityValue));
                this.impactVelocity.add(impact);
                float projection = VectorF.projection(impact, this.driveVelocity);
                if (this.driveVelocityValue < 0.0f)
                {
                    projection = -projection;
                }
                this.driveVelocityValue += projection;
            }
        }
Пример #4
0
        public void RunCollision(VectorF impactVelocity, float deltaTime)
        {
            if (this.numHits == 0)
            {
                return;
            }
            VectorF posImpact = VectorF.zero();
            VectorF negImpact = VectorF.zero();
            int     i         = 0;

            for (i = 0; i < NUM_COLLISION_POINTS; i += 1)
            {
                if (this.collPtHit[i] < 0)
                {
                    continue;
                }
                if (this.oldCollPtHit[i] == this.collPtHit[i])
                {
                    continue;
                }
                VectorF impact = VectorF.subtract(this.collPoint[i], this.oldCollPt[i]);
                if (impact.isZero())
                {
                    continue;
                }
                impact.normalize();
                float velProjection = VectorF.projection(this.velocity, impact);
                if (velProjection > 0.0f)
                {
                    impact.scale(-velProjection * (2.0f - this.hardImpactLossFactor));
                    posImpact.max(impact);
                    negImpact.min(impact);
                }
            }
            impactVelocity.add(posImpact);
            impactVelocity.add(negImpact);
        }
Пример #5
0
        public int TryInsertNode(int refNode, int x, int y)
        {
            if (FreePathSlot < 0)
            {
                return(0);
            }
            int nodep = Paths[refNode].prev;
            int noden = Paths[refNode].next;

            if (nodep < 0 && noden < 0)
            {
                return(PutNewNode(x, y));
            }
            int nodeopp = 0;

            if (nodep < 0)
            {
                nodeopp = noden;
            }
            else if (noden < 0)
            {
                nodeopp = nodep;
            }
            else
            {
                VectorF hit     = VectorF.create(x, y);
                VectorF hitDir  = VectorF.subtract(hit, Paths[refNode].pt);
                VectorF nextDir = VectorF.subtract(Paths[noden].pt, Paths[refNode].pt);
                VectorF prevDir = VectorF.subtract(Paths[nodep].pt, Paths[refNode].pt);
                if (Maths.AbsF(VectorF.angleBetween(hitDir, nextDir)) <= Maths.AbsF(VectorF.angleBetween(hitDir, prevDir)))
                {
                    nodeopp = noden;
                }
                else
                {
                    nodeopp = nodep;
                }
            }
            VectorF newpt = Paths[refNode].pt.clone();

            newpt.add(Paths[nodeopp].pt);
            newpt.scale(0.5f);
            int insertPrev = 0;
            int insertNext = 0;

            if (nodeopp == noden)
            {
                insertPrev = refNode;
                insertNext = noden;
            }
            else
            {
                insertPrev = nodep;
                insertNext = refNode;
            }
            int newnode = FreePathSlot;

            Paths[newnode].Reset();
            Paths[newnode].pt = newpt;
            OnNewNode(newnode, insertPrev, insertNext);
            PathNodeCount += 1;
            FindFirstFreeNode();
            return(newnode);
        }
Пример #6
0
        public int TryInsertNode(int refNode, int x, int y)
        {
            if (FreeCheckptSlot < 0)
            {
                return(0);
            }
            int nodep = Checkpoints[refNode].prev;
            int noden = Checkpoints[refNode].next;

            if (nodep < 0 && noden < 0)
            {
                return(PutNewNode(x, y));
            }
            int nodeopp = 0;

            if (nodep < 0)
            {
                nodeopp = noden;
            }
            else if (noden < 0)
            {
                nodeopp = nodep;
            }
            else
            {
                VectorF hit     = VectorF.create(x, y);
                VectorF hitDir  = VectorF.subtract(hit, Checkpoints[refNode].pt);
                VectorF nextDir = VectorF.subtract(Checkpoints[noden].pt, Checkpoints[refNode].pt);
                VectorF prevDir = VectorF.subtract(Checkpoints[nodep].pt, Checkpoints[refNode].pt);
                if (Maths.AbsF(VectorF.angleBetween(hitDir, nextDir)) <= Maths.AbsF(VectorF.angleBetween(hitDir, prevDir)))
                {
                    nodeopp = noden;
                }
                else
                {
                    nodeopp = nodep;
                }
            }
            VectorF newpt = Checkpoints[refNode].pt.clone();

            newpt.add(Checkpoints[nodeopp].pt);
            newpt.scale(0.5f);
            int insertPrev = 0;
            int insertNext = 0;

            if (nodeopp == noden)
            {
                insertPrev = refNode;
                insertNext = noden;
            }
            else
            {
                insertPrev = nodep;
                insertNext = refNode;
            }
            int newnode = FreeCheckptSlot;

            Checkpoints[newnode].Reset();
            Checkpoints[newnode].pt = newpt;
            OnNewNode(newnode, insertPrev, insertNext);
            CheckptCount += 1;
            int fixnode = insertNext;

            while (fixnode != FirstCheckpt)
            {
                Checkpoints[fixnode].order += 1;
                fixnode = Checkpoints[fixnode].next;
            }
            FindFirstFreeCheckpoint();
            return(newnode);
        }
Пример #7
0
        public VectorF DetectCollision(VectorF[] rect, VectorF otherVelocity, int otherIndex)
        {
            this.numCarHits = 0;
            VectorF p21 = VectorF.subtract(rect[1], rect[0]);
            VectorF p41 = VectorF.subtract(rect[3], rect[0]);
            float   p21magnitude_squared = p21.x * p21.x + p21.y * p21.y;
            float   p41magnitude_squared = p41.x * p41.x + p41.y * p41.y;
            int     i = 0;

            for (i = 0; i < NUM_COLLISION_POINTS; i += 1)
            {
                this.collPtCarHit[i] = -1;
                VectorF p    = VectorF.subtract(this.collPoint[i], rect[0]);
                float   pp21 = p.x * p21.x + p.y * p21.y;
                if (pp21 >= 0.0 && pp21 <= p21magnitude_squared)
                {
                    float pp41 = p.x * p41.x + p.y * p41.y;
                    if (pp41 >= 0.0 && pp41 <= p41magnitude_squared)
                    {
                        this.collPtCarHit[i] = otherIndex;
                        this.numCarHits     += 1;
                    }
                }
            }
            if (this.numCarHits == 0)
            {
                return(null);
            }
            VectorF impactVelocity = new VectorF();
            VectorF posImpact      = VectorF.zero();
            VectorF negImpact      = VectorF.zero();

            for (i = 0; i < NUM_COLLISION_POINTS; i += 1)
            {
                if (this.collPtCarHit[i] < 0)
                {
                    continue;
                }
                if (this.oldCollPtCarHit[i] == this.collPtCarHit[i])
                {
                    continue;
                }
                VectorF impact = VectorF.subtract(this.collPoint[i], this.oldCollPt[i]);
                if (impact.isZero())
                {
                    continue;
                }
                impact.normalize();
                float velProjection = VectorF.projection(this.velocity, impact);
                if (velProjection > 0.0f)
                {
                    impact.scale(-velProjection * (1.0f - this.softImpactLossFactor));
                    posImpact.max(impact);
                    negImpact.min(impact);
                    impact.negate();
                    impact.normalize();
                }
                float otherProjection = VectorF.projection(otherVelocity, impact);
                if (otherProjection < 0.0f)
                {
                    impact.scale(otherProjection * (1.0f - this.softImpactLossFactor));
                    posImpact.max(impact);
                    negImpact.min(impact);
                }
            }
            impactVelocity.add(posImpact);
            impactVelocity.add(negImpact);
            return(impactVelocity);
        }