mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-27 13:11:42 +00:00
fix trigger vertical limit
This commit is contained in:
parent
c6abf52c36
commit
2477299746
3 changed files with 89 additions and 7 deletions
|
|
@ -2005,20 +2005,94 @@ class MarbleWorld extends Scheduler {
|
||||||
if (contact.go is Trigger) {
|
if (contact.go is Trigger) {
|
||||||
var trigger:Trigger = cast contact.go;
|
var trigger:Trigger = cast contact.go;
|
||||||
var triggeraabb = trigger.collider.boundingBox;
|
var triggeraabb = trigger.collider.boundingBox;
|
||||||
|
if (trigger.accountForGravity) {
|
||||||
if (triggeraabb.collide(box)) {
|
var up = marble.currentUp;
|
||||||
trigger.onMarbleInside(marble, timeState);
|
var extents = triggeraabb.getCenter();
|
||||||
if (!this.shapeOrTriggerInside.contains(contact.go)) {
|
var enterExtents = box.getCenter();
|
||||||
this.shapeOrTriggerInside.push(contact.go);
|
var diffExtents = enterExtents.sub(extents);
|
||||||
trigger.onMarbleEnter(marble, timeState);
|
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) {
|
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)) {
|
if (!inside.contains(object)) {
|
||||||
this.shapeOrTriggerInside.remove(object);
|
this.shapeOrTriggerInside.remove(object);
|
||||||
object.onMarbleLeave(marble, timeState);
|
object.onMarbleLeave(marble, timeState);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,17 @@
|
||||||
package triggers;
|
package triggers;
|
||||||
|
|
||||||
|
import mis.MissionElement.MissionElementTrigger;
|
||||||
import src.TimeState;
|
import src.TimeState;
|
||||||
import src.ResourceLoader;
|
import src.ResourceLoader;
|
||||||
import src.Marble;
|
import src.Marble;
|
||||||
|
import src.MarbleWorld;
|
||||||
|
|
||||||
class InBoundsTrigger extends Trigger {
|
class InBoundsTrigger extends Trigger {
|
||||||
|
public function new(element:MissionElementTrigger, level:MarbleWorld) {
|
||||||
|
super(element, level);
|
||||||
|
this.accountForGravity = true;
|
||||||
|
}
|
||||||
|
|
||||||
override function onMarbleLeave(marble:Marble, timeState:TimeState) {
|
override function onMarbleLeave(marble:Marble, timeState:TimeState) {
|
||||||
this.level.goOutOfBounds(marble);
|
this.level.goOutOfBounds(marble);
|
||||||
// this.level.replay.recordMarbleLeave(this);
|
// this.level.replay.recordMarbleLeave(this);
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ class Trigger extends GameObject {
|
||||||
var vertices:Array<Vector>;
|
var vertices:Array<Vector>;
|
||||||
|
|
||||||
public var collider:BoxCollisionEntity;
|
public var collider:BoxCollisionEntity;
|
||||||
|
public var accountForGravity:Bool = false;
|
||||||
|
|
||||||
public function new(element:MissionElementTrigger, level:MarbleWorld) {
|
public function new(element:MissionElementTrigger, level:MarbleWorld) {
|
||||||
super();
|
super();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue