Skip to content

Commit 36555bd

Browse files
committed
Rotation-based homing
1 parent 34174dd commit 36555bd

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

src/progressed/entities/bullet/pseudo3d/ArcBulletType.java

+29-14
Original file line numberDiff line numberDiff line change
@@ -233,12 +233,27 @@ public void updateHoming(Bullet b){
233233
}
234234
}
235235

236-
if(target != null){
237-
Tmp.v1.set(b.aimX, b.aimY).approachDelta(Tmp.v2.set(target.x(), target.y()), homingPower);
238-
b.aimX = Tmp.v1.x;
239-
b.aimY = Tmp.v1.y;
236+
if(target != null){ //idk what I'm doing, but https://stackoverflow.com/questions/22099490/calculate-vector-after-rotating-it-towards-another-by-angle-θ-in-3d-space
240237
ArcBulletData data = (ArcBulletData)b.data;
241-
data.updateAccel(b);
238+
Tmp.v31.set(b.vel, data.zVel); //Current direction
239+
Tmp.v32.set(target.x() - b.x, target.y() - b.y, -data.z).setLength2(Tmp.v31.len2()); //Target direction
240+
//TODO better target direction calculation. Take gravity into account for z.
241+
242+
float vel = Tmp.v31.len();
243+
float angle = (float)Math.acos(Tmp.v31.dot(Tmp.v32) / (vel * vel)) * Mathf.radDeg;
244+
245+
if(angle <= homingPower * Time.delta){
246+
Tmp.v31.set(Tmp.v32);
247+
}else{
248+
Tmp.v33.set(Tmp.v31).crs(Tmp.v32).crs(Tmp.v31).nor(); //Thingy
249+
250+
float c = Mathf.cosDeg(homingPower);
251+
float s = Mathf.sinDeg(homingPower);
252+
Tmp.v31.scl(c).add(Tmp.v33.scl(s));
253+
}
254+
255+
b.vel.set(Tmp.v31);
256+
data.zVel = Tmp.v31.z;
242257
}
243258
}
244259
}
@@ -434,8 +449,8 @@ public Bullet create3DInherit(Bullet b, float angle, float inaccCone, float grav
434449
Bullet bullet;
435450
if(!Mathf.zero(inaccCone)){
436451
PMMathf.randomCirclePoint(Tmp.v1, inaccCone);
437-
data.driftRot = Tmp.v1.x + oldData.driftRot;
438-
data.driftTilt = Tmp.v1.y + oldData.driftTilt;
452+
data.driftYaw = Tmp.v1.x + oldData.driftYaw;
453+
data.driftPitch = Tmp.v1.y + oldData.driftPitch;
439454
}
440455

441456
bullet = beginBulletCreate(b.owner, b.team, b.x, b.y, b.aimX, b.aimY);
@@ -484,7 +499,7 @@ public Bullet beginBulletCreate(Entityc owner, Team team, float x, float y){
484499
public static class ArcBulletData implements Cloneable{
485500
public float xAccel, yAccel;
486501
public float lastZ, z, zVel, gravity;
487-
public float driftRot, driftTilt;
502+
public float driftYaw, driftPitch;
488503
public ArcBulletType splitFrom;
489504

490505
public ArcBulletData(float z, float zVel, float gravity){
@@ -536,15 +551,15 @@ public void update(Bullet b){
536551
zVel -= gravity * Time.delta;
537552

538553
boolean needUpdate = false;
539-
if(!Mathf.zero(driftRot)){
540-
b.vel.rotate(driftRot);
541-
driftRot *= 1f - ((ArcBulletType)b.type).angleDriftDrag;
554+
if(!Mathf.zero(driftYaw)){
555+
b.vel.rotate(driftYaw);
556+
driftYaw *= 1f - ((ArcBulletType)b.type).angleDriftDrag;
542557
needUpdate = true;
543558
}
544-
if(!Mathf.zero(driftTilt)){
545-
Tmp.v1.set(b.vel.len(), zVel).rotate(driftTilt);
559+
if(!Mathf.zero(driftPitch)){
560+
Tmp.v1.set(b.vel.len(), zVel).rotate(driftPitch);
546561
zVel = Tmp.v1.y;
547-
driftTilt *= 1f - ((ArcBulletType)b.type).angleDriftDrag;
562+
driftPitch *= 1f - ((ArcBulletType)b.type).angleDriftDrag;
548563

549564
updateLifetime(b);
550565
needUpdate = true;

0 commit comments

Comments
 (0)