⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameturret.java

📁 JAKE2用JAVA写的queck2的3D游戏开发引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                    dmin += 360;                else if (dmin > 180)                    dmin -= 360;                dmax = Math.abs(self.pos2[Defines.YAW]                        - self.move_angles[Defines.YAW]);                if (dmax < -180)                    dmax += 360;                else if (dmax > 180)                    dmax -= 360;                if (Math.abs(dmin) < Math.abs(dmax))                    self.move_angles[Defines.YAW] = self.pos1[Defines.YAW];                else                    self.move_angles[Defines.YAW] = self.pos2[Defines.YAW];            }            Math3D.VectorSubtract(self.move_angles, current_angles, delta);            if (delta[0] < -180)                delta[0] += 360;            else if (delta[0] > 180)                delta[0] -= 360;            if (delta[1] < -180)                delta[1] += 360;            else if (delta[1] > 180)                delta[1] -= 360;            delta[2] = 0;            if (delta[0] > self.speed * Defines.FRAMETIME)                delta[0] = self.speed * Defines.FRAMETIME;            if (delta[0] < -1 * self.speed * Defines.FRAMETIME)                delta[0] = -1 * self.speed * Defines.FRAMETIME;            if (delta[1] > self.speed * Defines.FRAMETIME)                delta[1] = self.speed * Defines.FRAMETIME;            if (delta[1] < -1 * self.speed * Defines.FRAMETIME)                delta[1] = -1 * self.speed * Defines.FRAMETIME;            Math3D.VectorScale(delta, 1.0f / Defines.FRAMETIME, self.avelocity);            self.nextthink = GameBase.level.time + Defines.FRAMETIME;            for (ent = self.teammaster; ent != null; ent = ent.teamchain)                ent.avelocity[1] = self.avelocity[1];            // if we have adriver, adjust his velocities            if (self.owner != null) {                float angle;                float target_z;                float diff;                float[] target = { 0, 0, 0 };                float[] dir = { 0, 0, 0 };                // angular is easy, just copy ours                self.owner.avelocity[0] = self.avelocity[0];                self.owner.avelocity[1] = self.avelocity[1];                // x & y                angle = self.s.angles[1] + self.owner.move_origin[1];                angle *= (Math.PI * 2 / 360);                target[0] = GameTurret.SnapToEights((float) (self.s.origin[0] +                 			Math.cos(angle) * self.owner.move_origin[0]));                target[1] = GameTurret.SnapToEights((float) (self.s.origin[1] +                 			Math.sin(angle) * self.owner.move_origin[0]));                target[2] = self.owner.s.origin[2];                Math3D.VectorSubtract(target, self.owner.s.origin, dir);                self.owner.velocity[0] = dir[0] * 1.0f / Defines.FRAMETIME;                self.owner.velocity[1] = dir[1] * 1.0f / Defines.FRAMETIME;                // z                angle = self.s.angles[Defines.PITCH] * (float) (Math.PI * 2f / 360f);                target_z = GameTurret.SnapToEights((float) (self.s.origin[2]                                + self.owner.move_origin[0] * Math.tan(angle) + self.owner.move_origin[2]));                diff = target_z - self.owner.s.origin[2];                self.owner.velocity[2] = diff * 1.0f / Defines.FRAMETIME;                if ((self.spawnflags & 65536) != 0) {                    turret_breach_fire(self);                    self.spawnflags &= ~65536;                }            }            return true;        }    };    static EntThinkAdapter turret_breach_finish_init = new EntThinkAdapter() {    	public String getID() { return "turret_breach_finish_init"; }        public boolean think(edict_t self) {            // get and save info for muzzle location            if (self.target == null) {                GameBase.gi.dprintf(self.classname + " at "                        + Lib.vtos(self.s.origin) + " needs a target\n");            } else {                self.target_ent = GameBase.G_PickTarget(self.target);                Math3D.VectorSubtract(self.target_ent.s.origin, self.s.origin,                        self.move_origin);                GameUtil.G_FreeEdict(self.target_ent);            }            self.teammaster.dmg = self.dmg;            self.think = turret_breach_think;            self.think.think(self);            return true;        }    };    /*     * QUAKED turret_driver (1 .5 0) (-16 -16 -24) (16 16 32) Must NOT be on the     * team with the rest of the turret parts. Instead it must target the     * turret_breach.     */    static EntDieAdapter turret_driver_die = new EntDieAdapter() {    	public String getID() { return "turret_driver_die"; }        public void die(edict_t self, edict_t inflictor, edict_t attacker,                int damage, float[] point) {            edict_t ent;            // level the gun            self.target_ent.move_angles[0] = 0;            // remove the driver from the end of them team chain            for (ent = self.target_ent.teammaster; ent.teamchain != self; ent = ent.teamchain)                ;            ent.teamchain = null;            self.teammaster = null;            self.flags &= ~Defines.FL_TEAMSLAVE;            self.target_ent.owner = null;            self.target_ent.teammaster.owner = null;            M_Infantry.infantry_die.die(self, inflictor, attacker, damage, null);        }    };    static EntThinkAdapter turret_driver_think = new EntThinkAdapter() {    	public String getID() { return "turret_driver_think"; }        public boolean think(edict_t self) {            float[] target = { 0, 0, 0 };            float[] dir = { 0, 0, 0 };            float reaction_time;            self.nextthink = GameBase.level.time + Defines.FRAMETIME;            if (self.enemy != null                    && (!self.enemy.inuse || self.enemy.health <= 0))                self.enemy = null;            if (null == self.enemy) {                if (!GameUtil.FindTarget(self))                    return true;                self.monsterinfo.trail_time = GameBase.level.time;                self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT;            } else {                if (GameUtil.visible(self, self.enemy)) {                    if ((self.monsterinfo.aiflags & Defines.AI_LOST_SIGHT) != 0) {                        self.monsterinfo.trail_time = GameBase.level.time;                        self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT;                    }                } else {                    self.monsterinfo.aiflags |= Defines.AI_LOST_SIGHT;                    return true;                }            }            // let the turret know where we want it to aim            Math3D.VectorCopy(self.enemy.s.origin, target);            target[2] += self.enemy.viewheight;            Math3D.VectorSubtract(target, self.target_ent.s.origin, dir);            Math3D.vectoangles(dir, self.target_ent.move_angles);            // decide if we should shoot            if (GameBase.level.time < self.monsterinfo.attack_finished)                return true;            reaction_time = (3 - GameBase.skill.value) * 1.0f;            if ((GameBase.level.time - self.monsterinfo.trail_time) < reaction_time)                return true;            self.monsterinfo.attack_finished = GameBase.level.time                    + reaction_time + 1.0f;            //FIXME how do we really want to pass this along?            self.target_ent.spawnflags |= 65536;            return true;        }    };    public static EntThinkAdapter turret_driver_link = new EntThinkAdapter() {    	public String getID() { return "turret_driver_link"; }        public boolean think(edict_t self) {            float[] vec = { 0, 0, 0 };            edict_t ent;            self.think = turret_driver_think;            self.nextthink = GameBase.level.time + Defines.FRAMETIME;            self.target_ent = GameBase.G_PickTarget(self.target);            self.target_ent.owner = self;            self.target_ent.teammaster.owner = self;            Math3D.VectorCopy(self.target_ent.s.angles, self.s.angles);            vec[0] = self.target_ent.s.origin[0] - self.s.origin[0];            vec[1] = self.target_ent.s.origin[1] - self.s.origin[1];            vec[2] = 0;            self.move_origin[0] = Math3D.VectorLength(vec);            Math3D.VectorSubtract(self.s.origin, self.target_ent.s.origin, vec);            Math3D.vectoangles(vec, vec);            AnglesNormalize(vec);                        self.move_origin[1] = vec[1];            self.move_origin[2] = self.s.origin[2] - self.target_ent.s.origin[2];            // add the driver to the end of them team chain            for (ent = self.target_ent.teammaster; ent.teamchain != null; ent = ent.teamchain)                ;            ent.teamchain = self;            self.teammaster = self.target_ent.teammaster;            self.flags |= Defines.FL_TEAMSLAVE;            return true;        }    };}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -