Package examples

Source Code of examples.SpriteMapExample$Ball

package examples;

import static dwlab.platform.Functions.*;
import dwlab.base.Project;
import dwlab.base.service.Align;
import dwlab.base.service.Service;
import dwlab.base.service.Vector;
import dwlab.platform.LWJGL;
import dwlab.shapes.maps.SpriteMap;
import dwlab.shapes.sprites.Camera;
import dwlab.shapes.sprites.Sprite;
import dwlab.shapes.sprites.SpriteCollisionHandler;
import dwlab.shapes.sprites.shape_types.ShapeType;
import dwlab.visualizers.Color;
import dwlab.visualizers.ContourVisualizer;
import java.util.LinkedList;

public class SpriteMapExample extends Project {
  static SpriteMapExample instance = new SpriteMapExample();
 
  public static void main(String[] argv) {
    LWJGL.init();
    main();
  }
 
  public static void main() {
    instance.act();
    initCamera();
  }
 
 
  static final int spritesQuantity = 800;
  static final int mapSize = 192;

  static final Sprite rectangle = new Sprite( 0, 0, mapSize, mapSize );
  static SpriteMap fieldSpriteMap = new SpriteMap( rectangle, 2d );
  static SpriteCollisionHandler collisionHandler = new SpriteCollisionHandler() {
    @Override
    public void handleCollision( Sprite sprite1, Sprite sprite2 ) {
      if( ParticleArea.class.isInstance( sprite2 ) ) return;
      sprite1.pushFrom( sprite2 );
      sprite1.angle = sprite2.directionTo( sprite1 );
      sprite2.angle = sprite1.directionTo( sprite2 );
      ParticleArea.create( sprite1, sprite2 );
    }
  };

 
  @Override
  public void init() {
    for( int n = 1; n <= spritesQuantity; n++ ) Ball.create();
    rectangle.visualizer = new ContourVisualizer( 0.1d, "FF0000" );
    fieldSpriteMap.initialArraysSize = 2;
    cursor.shapeType = ShapeType.pivot;
  }

 
  @Override
  public void logic() {
    Camera.current.move( 0.1d * ( mouseX() - 400 ), 0.1d * ( mouseY() - 300 ) );
    fieldSpriteMap.act();
  }

 
  @Override
  public void render() {
    fieldSpriteMap.draw();
    rectangle.draw();
    drawOval( 400, 300, 5, 5 );
    cursor.draw();
    printText( "LTSpriteMap, CollisionsWithSpriteMap example", Align.TO_CENTER, Align.TO_BOTTOM );
    showDebugInfo();
  }



  public static class Ball extends Sprite {
    public static Ball create() {
      Ball ball = new Ball();
      ball.setCoords( Service.random( -0.5d * ( mapSize - 2 ), 0.5d * ( mapSize - 2 ) ), Service.random( -0.5d * ( mapSize - 2 ), 0.5d * ( mapSize - 2 ) ) );
      ball.setDiameter( Service.random( 0.5d, 1.5d ) );
      ball.angle = Service.random( 360d );
      ball.velocity = Service.random( 3d, 7d );
      ball.shapeType = ShapeType.oval;
      ball.visualizer.setRandomColor();
      fieldSpriteMap.insertSprite( ball );
      return ball;
    }
   

    @Override
    public void act() {
      super.act();
      Camera.current.bounceInside( rectangle );
      moveForward();
      bounceInside( rectangle );
      collisionsWith( fieldSpriteMap, collisionHandler );
    }
  }


  public static class ParticleArea extends Sprite {
    static int particlesQuantity = 30;
    static double fadingTime = 1d;

    LinkedList<Sprite> particles = new LinkedList<Sprite>();
    double startingTime;

    public static void create( Sprite ball1, Sprite ball2 ) {
      ParticleArea area = new ParticleArea();
      double diameters = ball1.getDiameter() + ball2.getDiameter();
      area.setCoords( ball1.getX() + ( ball2.getX() - ball1.getX() ) * ball1.getDiameter() / diameters, ball1.getY() + ( ball2.getY() - ball1.getY() ) * ball1.getDiameter() / diameters );
      area.setSize( 4d, 4d );
      area.startingTime = instance.time;
      double angle = ball1.directionTo( ball2 ) + 0.5d * Math.PI;
      for( int n = 1; n <= particlesQuantity; n++ ) {
        Sprite particle = new Sprite();
        particle.jumpTo( area );
        particle.angle = angle + Service.random( -Math.PI / 12d, Math.PI / 12d ) + ( n % 2 ) * Math.PI;
        particle.setDiameter( Service.random( 0.2d, 0.6d ) );
        particle.velocity = Service.random( 0.5d, 3d );
        area.particles.addLast( particle );
      }
      area.insertTo( fieldSpriteMap );
    }
   

   
    private final Vector vector1 = new Vector(), vector2 = new Vector();
   
    @Override
    public void draw( Color drawingColor ) {
      double a = 1d - 1d * ( instance.time - startingTime ) / fadingTime;
      if( a >= 0 ) {
        Platform.setCurrentColor( 1d, 0.75d, 0d, a );
        for( Sprite sprite : particles ) {
          double dX = Math.cos( sprite.angle ) * sprite.getDiameter() * 0.5d;
          double dY = Math.sin( sprite.angle ) * sprite.getDiameter() * 0.5d;
         
          Camera.current.fieldToScreen( sprite.getX() - dX, sprite.getY() - dY, vector1 );
          Camera.current.fieldToScreen( sprite.getX() + dX, sprite.getY() + dY, vector2 );
          drawLine( vector1.x, vector1.y , vector2.x, vector2.y );
          sprite.moveForward();
        }
        Platform.resetCurrentColor();
      }
    }
   

    @Override
    public void act() {
      if( instance.time > startingTime + fadingTime ) removeFrom( fieldSpriteMap );

      if( collidesWith( Camera.current ) ) {
        for( Sprite sprite : particles ) sprite.moveForward();
      }
    }
  }
}
TOP

Related Classes of examples.SpriteMapExample$Ball

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.