package snakemeleon.types; import java.awt.Color; import java.awt.Graphics2D; import org.jbox2d.callbacks.ContactImpulse; import org.jbox2d.callbacks.ContactListener; import org.jbox2d.collision.Manifold; import org.jbox2d.dynamics.BodyType; import org.jbox2d.dynamics.contacts.Contact; import snakemeleon.Snakemeleon; import toritools.debug.Debug; import toritools.entity.Entity; import toritools.entity.Level; import toritools.entity.sprite.AbstractSprite.AbstractSpriteAdapter; import toritools.math.Vector2; import toritools.scripting.EntityScript; public class ChameleonFootSensor extends Entity { private int jumpTouchQueue = 0; public ChameleonFootSensor(final Entity chameleon) { setDim(new Vector2(20, 20)); addScript(new EntityScript() { @Override public void onSpawn(Entity self, Level level) { /* * Register the contact listener with the universe. */ Snakemeleon.uni.addContactListener(new ContactListener() { @Override public void beginContact(Contact c) { boolean playerisA = ((Entity) c.m_fixtureA.m_userData).getType().equals("player"); boolean playerisB = ((Entity) c.m_fixtureB.m_userData).getType().equals("player"); if (c.m_fixtureA.m_userData instanceof ChameleonFootSensor && !playerisB) { ChameleonFootSensor.this.jumpTouchQueue++; } else if (c.m_fixtureB.m_userData instanceof ChameleonFootSensor && !playerisA) { ChameleonFootSensor.this.jumpTouchQueue++; } } @Override public void endContact(Contact c) { boolean playerisA = ((Entity) c.m_fixtureA.m_userData).getType().equals("player"); boolean playerisB = ((Entity) c.m_fixtureB.m_userData).getType().equals("player"); if (c.m_fixtureA.m_userData instanceof ChameleonFootSensor && !playerisB) { ChameleonFootSensor.this.jumpTouchQueue--; } else if (c.m_fixtureB.m_userData instanceof ChameleonFootSensor && !playerisA) { ChameleonFootSensor.this.jumpTouchQueue--; } } @Override public void postSolve(Contact arg0, ContactImpulse arg1) { } @Override public void preSolve(Contact arg0, Manifold arg1) { } }); } @Override public void onUpdate(Entity self, float time, Level level) { Snakemeleon.uni.setTransform(self, chameleon.getPos().add(chameleon.getDim().scale(.5f, 1)), 0); } @Override public void onDeath(Entity self, Level level, boolean isRoomExit) { } }); setSprite(new AbstractSpriteAdapter() { @Override public void draw(Graphics2D g, Entity self) { if (Debug.showDebugPrintouts) { g.setColor(canJump() ? Color.GREEN : Color.RED); g.drawRect(self.getPos().getWidth(), self.getPos().getHeight(), self.getDim().getWidth(), self .getDim().getHeight()); } } }); setPos(chameleon.getPos().add(chameleon.getDim())); Snakemeleon.uni.addEntity(this, BodyType.DYNAMIC, true, true, 1f, .3f, null, true); } public boolean canJump() { return jumpTouchQueue > 0 && !ChameleonStickyScript.isGrabbing; } }