Package com.google.gwt.maeglin89273.game.ashinyballonthecross.client.core.creation.line

Source Code of com.google.gwt.maeglin89273.game.ashinyballonthecross.client.core.creation.line.BreakableStaticLine$LineFragment

/**
*
*/
package com.google.gwt.maeglin89273.game.ashinyballonthecross.client.core.creation.line;

import org.jbox2d.callbacks.ContactImpulse;
import org.jbox2d.collision.Manifold;
import org.jbox2d.collision.WorldManifold;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.BodyType;
import org.jbox2d.dynamics.Fixture;
import org.jbox2d.dynamics.contacts.Contact;

import com.google.gwt.canvas.dom.client.CssColor;
import com.google.gwt.maeglin89273.game.mengine.physics.CoordinateConverter;
import com.google.gwt.maeglin89273.game.mengine.physics.Point;

/**
* @author Maeglin Liao
*
*/
public abstract class BreakableStaticLine extends ContactStaticLine {
  protected Vec2 impOnNormal=null;
  protected Point breakPoint=null;
 
  private LineFragment[] lineFragments=new LineFragment[2];
 
  /**
   * @param creator
   * @param contentPower
   * @param beControlled
   * @param p1
   * @param p2
   * @param color
   */
  public BreakableStaticLine(int contentPower,
      boolean beControlled, Point p1, Point p2, CssColor color) {
    super(contentPower, beControlled, p1, p2, color);
  }
  @Override
  public void update(){
    if(breakPoint!=null&&impOnNormal!=null){// if it broke
      double fric=Point.getDistance(breakPoint, pointA)/Point.getDistance(pointA, pointB);
      int conPA=(int)Math.floor(getContentPower()*fric);
      int conPB=getContentPower()-conPA;
      lineFragments[0]=new LineFragment(conPA,pointA,breakPoint);
      lineFragments[1]=new LineFragment(conPB,breakPoint,pointB);
      this.fakeDestroy();
    }
  }
  private void fakeDestroy(){
    /*
     * parent's destroy processes, except recycling.
     *  we do not recycle the power
     */
    creator.getWorld().removeLine(this);
    creator.getWorld().removeContactListener(this);
    body=null;
    aabb=null;
    lineColor=null;
    //the own field
    impOnNormal=null;
   
  }
  @Override
  public void destroy(){
    if(breakPoint==null){
      super.destroy();
      lineFragments=null;
      impOnNormal=null;
    }else{
      for(LineFragment line:lineFragments){
        if(!line.isDestroyed()){
          line.destroy();
        }
      }
     
    }
   
  }
  /* (non-Javadoc)
   * @see org.jbox2d.callbacks.ContactListener#beginContact(org.jbox2d.dynamics.contacts.Contact)
   */
  @Override
  public void beginContact(Contact contact,Fixture thisFixture, Fixture thatFixture) {
    // TODO Auto-generated method stub

  }

  /* (non-Javadoc)
   * @see org.jbox2d.callbacks.ContactListener#endContact(org.jbox2d.dynamics.contacts.Contact)
   */
  @Override
  public void endContact(Contact contact,Fixture thisFixture, Fixture thatFixture) {
    // TODO Auto-generated method stub

  }

  /* (non-Javadoc)
   * @see org.jbox2d.callbacks.ContactListener#preSolve(org.jbox2d.dynamics.contacts.Contact, org.jbox2d.collision.Manifold)
   */
  @Override
  public void preSolve(Contact contact, Manifold oldManifold,Fixture thisFixture, Fixture thatFixture) {
    // TODO Auto-generated method stub

  }
  @Override
  public void postSolve(Contact contact, ContactImpulse impulse,Fixture thisFixture, Fixture thatFixture) {
    if(thatFixture.getBody().getType()==BodyType.DYNAMIC){
      for(int i=0;i<impulse.tangentImpulses.length;i++){
        if(impulse.normalImpulses[i]!=0){
          if(doesLineBreak(impulse.normalImpulses[i])){
            WorldManifold wm=new WorldManifold();
            contact.getWorldManifold(wm);
               
            breakPoint=CoordinateConverter.coordWorldToPixels(wm.points[0]);
            impOnNormal=wm.normal.clone();
               
            if(contact.getFixtureA().equals(fixture)){
              impOnNormal.negateLocal();
            }
            impOnNormal.mulLocal(impulse.normalImpulses[i]);
            //give a bonus!
            creator.bonus(Math.round(impulse.normalImpulses[i]));   
          }
          return;
        }
      }
    }
  }
  public abstract boolean doesLineBreak(float normalImpulse);
 
  private class LineFragment extends FragmentalLine{
   
    private int conPowerForDestroy=0;
   
   
    private LineFragment(int contentPower,Point p1, Point p2) {
      super(0,false, p1, p2, BreakableStaticLine.this.getColor());
      this.conPowerForDestroy=contentPower;
      this.body.applyForce(impOnNormal, CoordinateConverter.coordPixelToWorld(breakPoint));
    }
   
    @Override
    public void destroy(){
      checkFragments();
      super.destroy();
    }
    @Override
    public int getContentPower(){
      return conPowerForDestroy;
    }
    private void checkFragments(){
      if(lineFragments[0].isDestroyed()&&lineFragments[1].isDestroyed()){
        if(BreakableStaticLine.this.beControlled){
          creator.remove(BreakableStaticLine.this);
        }
        breakPoint=null;
        lineFragments=null;
       
      }
    }
  }
}
TOP

Related Classes of com.google.gwt.maeglin89273.game.ashinyballonthecross.client.core.creation.line.BreakableStaticLine$LineFragment

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.