mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
fix trigger vertical limit
This commit is contained in:
parent
d87cc72abe
commit
2418c7e524
3 changed files with 89 additions and 7 deletions
|
|
@ -2006,20 +2006,94 @@ class MarbleWorld extends Scheduler {
|
|||
if (contact.go is Trigger) {
|
||||
var trigger:Trigger = cast contact.go;
|
||||
var triggeraabb = trigger.collider.boundingBox;
|
||||
|
||||
if (triggeraabb.collide(box)) {
|
||||
trigger.onMarbleInside(marble, timeState);
|
||||
if (!this.shapeOrTriggerInside.contains(contact.go)) {
|
||||
this.shapeOrTriggerInside.push(contact.go);
|
||||
trigger.onMarbleEnter(marble, timeState);
|
||||
if (trigger.accountForGravity) {
|
||||
var up = marble.currentUp;
|
||||
var extents = triggeraabb.getCenter();
|
||||
var enterExtents = box.getCenter();
|
||||
var diffExtents = enterExtents.sub(extents);
|
||||
var upAmount = up.dot(diffExtents.toVector());
|
||||
if (upAmount > 0) {
|
||||
var boxC = box.clone();
|
||||
boxC.xMin -= up.x * upAmount;
|
||||
boxC.yMin -= up.y * upAmount;
|
||||
boxC.zMin -= up.z * upAmount;
|
||||
boxC.xMax -= up.x * upAmount;
|
||||
boxC.yMax -= up.y * upAmount;
|
||||
boxC.zMax -= up.z * upAmount;
|
||||
// Debug.drawSphere(boxC.getCenter().toVector(), 0.3, 0.25);
|
||||
if (triggeraabb.collide(boxC)) {
|
||||
trigger.onMarbleInside(marble, timeState);
|
||||
if (!this.shapeOrTriggerInside.contains(contact.go)) {
|
||||
this.shapeOrTriggerInside.push(contact.go);
|
||||
trigger.onMarbleEnter(marble, timeState);
|
||||
}
|
||||
inside.push(contact.go);
|
||||
}
|
||||
} else {
|
||||
// Debug.drawSphere(box.getCenter().toVector(), 0.3, 0.25);
|
||||
if (triggeraabb.collide(box)) {
|
||||
trigger.onMarbleInside(marble, timeState);
|
||||
if (!this.shapeOrTriggerInside.contains(contact.go)) {
|
||||
this.shapeOrTriggerInside.push(contact.go);
|
||||
trigger.onMarbleEnter(marble, timeState);
|
||||
}
|
||||
inside.push(contact.go);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (triggeraabb.collide(box)) {
|
||||
trigger.onMarbleInside(marble, timeState);
|
||||
if (!this.shapeOrTriggerInside.contains(contact.go)) {
|
||||
this.shapeOrTriggerInside.push(contact.go);
|
||||
trigger.onMarbleEnter(marble, timeState);
|
||||
}
|
||||
inside.push(contact.go);
|
||||
}
|
||||
inside.push(contact.go);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (object in shapeOrTriggerInside) {
|
||||
if (object is Trigger) {
|
||||
var trigger:Trigger = cast object;
|
||||
var triggeraabb = trigger.collider.boundingBox;
|
||||
if (trigger.accountForGravity) {
|
||||
var up = marble.currentUp;
|
||||
var extents = triggeraabb.getCenter();
|
||||
var enterExtents = box.getCenter();
|
||||
var diffExtents = enterExtents.sub(extents);
|
||||
var upAmount = up.dot(diffExtents.toVector());
|
||||
if (upAmount > 0) {
|
||||
var boxC = box.clone();
|
||||
boxC.xMin -= up.x * upAmount;
|
||||
boxC.yMin -= up.y * upAmount;
|
||||
boxC.zMin -= up.z * upAmount;
|
||||
boxC.xMax -= up.x * upAmount;
|
||||
boxC.yMax -= up.y * upAmount;
|
||||
boxC.zMax -= up.z * upAmount;
|
||||
// Debug.drawSphere(boxC.getCenter().toVector(), 0.3, 0.25);
|
||||
if (triggeraabb.collide(boxC)) {
|
||||
trigger.onMarbleInside(marble, timeState);
|
||||
if (!this.shapeOrTriggerInside.contains(object)) {
|
||||
this.shapeOrTriggerInside.push(object);
|
||||
trigger.onMarbleEnter(marble, timeState);
|
||||
}
|
||||
inside.push(object);
|
||||
}
|
||||
} else {
|
||||
// Debug.drawSphere(box.getCenter().toVector(), 0.3, 0.25);
|
||||
if (triggeraabb.collide(box)) {
|
||||
trigger.onMarbleInside(marble, timeState);
|
||||
if (!this.shapeOrTriggerInside.contains(object)) {
|
||||
this.shapeOrTriggerInside.push(object);
|
||||
trigger.onMarbleEnter(marble, timeState);
|
||||
}
|
||||
inside.push(object);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!inside.contains(object)) {
|
||||
this.shapeOrTriggerInside.remove(object);
|
||||
object.onMarbleLeave(marble, timeState);
|
||||
|
|
|
|||
|
|
@ -1,10 +1,17 @@
|
|||
package triggers;
|
||||
|
||||
import mis.MissionElement.MissionElementTrigger;
|
||||
import src.TimeState;
|
||||
import src.ResourceLoader;
|
||||
import src.Marble;
|
||||
import src.MarbleWorld;
|
||||
|
||||
class InBoundsTrigger extends Trigger {
|
||||
public function new(element:MissionElementTrigger, level:MarbleWorld) {
|
||||
super(element, level);
|
||||
this.accountForGravity = true;
|
||||
}
|
||||
|
||||
override function onMarbleLeave(marble:Marble, timeState:TimeState) {
|
||||
this.level.goOutOfBounds(marble);
|
||||
// this.level.replay.recordMarbleLeave(this);
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ class Trigger extends GameObject {
|
|||
var vertices:Array<Vector>;
|
||||
|
||||
public var collider:BoxCollisionEntity;
|
||||
public var accountForGravity:Bool = false;
|
||||
|
||||
public function new(element:MissionElementTrigger, level:MarbleWorld) {
|
||||
super();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue