package com.arretadogames.pilot.entities; import com.arretadogames.pilot.R; import com.arretadogames.pilot.physics.PhysicalWorld; import com.arretadogames.pilot.render.PhysicsRect; import com.arretadogames.pilot.render.AnimationSwitcher; import com.arretadogames.pilot.render.opengl.GLCanvas; import org.jbox2d.callbacks.ContactImpulse; import org.jbox2d.collision.shapes.PolygonShape; import org.jbox2d.common.MathUtils; import org.jbox2d.dynamics.BodyType; import org.jbox2d.dynamics.Fixture; import org.jbox2d.dynamics.contacts.Contact; public class Breakable extends Entity implements Steppable{ private boolean m_broke; private boolean m_break; private int life = 5; /** * * @param x center x position * @param y center y position * @param width * @param height * @param angle radians. 0 -> standing * @param dynamic if it is dynamic body or static */ public Breakable(float x, float y, float width, float height, float angle, boolean dynamic) { super(x, y); if( dynamic ){ body.setType(BodyType.DYNAMIC); } else { body.setType(BodyType.STATIC); } body.setTransform(body.getPosition(), angle); PolygonShape shape = new PolygonShape(); shape.setAsBox(width/2, height/2); Fixture fix = body.createFixture(shape, 3f); fix.setFriction(0.8f); body.setUserData(this); m_break = false; m_broke = false; physRect = new PhysicsRect(width, height); } @Override public void render(GLCanvas canvas, float timeElapsed) { canvas.saveState(); canvas.translatePhysics(body.getPosition().x, body.getPosition().y); canvas.rotate((float) (180 * - body.getAngle() / Math.PI)); if( life > 3 )canvas.drawBitmap(R.drawable.muro_inteiro, physRect); else canvas.drawBitmap(R.drawable.muro_quebrado, physRect); canvas.restoreState(); } @Override public void postSolve(Entity e, Contact contact, ContactImpulse impulse) { if (m_broke) return; int count = contact.getManifold().pointCount; float maxImpulse = 0.0f; for (int i = 0; i < count; ++i) { maxImpulse = MathUtils.max(maxImpulse, impulse.normalImpulses[i]); } // if (maxImpulse > 6.0f) { // m_break = true; // } life -= (int)((maxImpulse)/2); } @Override public void step(float timeElapsed) { if(life <= 0) Break(); if(m_break) Break(); } private void Break() { m_broke = true; PhysicalWorld.getInstance().addDeadEntity(this); //TODO breaking animation } @Override public EntityType getType() { return EntityType.BREAKABLE; } @Override public void setSprite(AnimationSwitcher sprite) { } }