Package org.open2jam.render.entities

Source Code of org.open2jam.render.entities.BgaEntity

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.open2jam.render.entities;

import com.sun.jna.Memory;
import java.io.File;
import java.nio.ByteBuffer;
import java.util.LinkedList;
import java.util.logging.Level;
import org.open2jam.parsers.utils.Logger;
import org.open2jam.render.Sprite;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.direct.DirectMediaPlayer;
import uk.co.caprica.vlcj.player.direct.RenderCallback;

/**
*
* @author CdK
*/
public class BgaEntity extends Entity implements TimeEntity, RenderCallback {

    public boolean isVideo = false;
    public File videoFile;
    boolean isPlaying = false;
    boolean newBuffer = false;
   
    MediaPlayerFactory playerFactory;
    DirectMediaPlayer player;
    ByteBuffer videoBuffer = null;
   
    private static final int WIDTH = 320;
    private static final int HEIGHT = 240;
    private static final int DEPTH = 4;
    private static final int BUFFER_SIZE = WIDTH * HEIGHT * DEPTH;
   
   
    private LinkedList<Double> times;
   
    private LinkedList<Sprite> next_sprites;
   
    private double scale_w = 0, scale_h = 0;

    public BgaEntity(Sprite s, double x, double y) {
  super(s, x, y);
  scale_w = width;
  scale_h = height;
  next_sprites = new LinkedList<Sprite>();
  times = new LinkedList<Double>();
    }
   
    public BgaEntity(BgaEntity org) {
  this.sprite = org.sprite;
  this.x = org.x;
  this.y = org.y;
  this.scale_w = org.scale_w;
  this.scale_h = org.scale_h;
  this.next_sprites = org.next_sprites;
  this.times = org.times;
  this.playerFactory = org.playerFactory;
  this.player = org.player;
  this.isVideo = org.isVideo;
  this.videoFile = org.videoFile;
    }
   
    public void initVideo() {
  if(!isVideo) return;
  try {
      playerFactory = new MediaPlayerFactory(new String[] {"--no-video-title-show", "--noaudio"});
      player = playerFactory.newDirectMediaPlayer("RGBA", WIDTH, HEIGHT, WIDTH * DEPTH, this);
      player.prepareMedia(videoFile.getAbsolutePath());
            player.pause();
  } catch(Throwable t) {
      isVideo = false;
            t.printStackTrace();
      Logger.global.log(Level.WARNING, "VLC failed to load :(");
  }
    }
   
    public void draw() {
  if(isVideo) {
      if(newBuffer) {
    sprite.draw(x, y, WIDTH, HEIGHT, videoBuffer);
    newBuffer = false;
      } else {
    sprite.draw(x, y);
      }
  } else if(sprite != null) {
      super.draw();
  }
    }
   
    public void setSprite(Sprite s) {
  float w = (float) (scale_w/s.getWidth());
  float h = (float) (scale_h/s.getHeight());
  s.setScale(w, h);
  next_sprites.push(s);
    }
   
    @Override
    public void setTime(double t) {
  times.push(t);
    }

    @Override
    public double getTime() {
  if(times.isEmpty()) return -1;
  return times.getLast();
    }

    @Override
    public void judgment() {
  if(isVideo && !isPlaying) {
      float w = (float) (scale_w/WIDTH);
      float h = (float) (scale_h/HEIGHT);
      sprite.setScale(w, h);
      player.play();
      isPlaying = true;
  } else {
      if(next_sprites.isEmpty()) return;
      if(times.isEmpty()) return;

      times.removeLast();
      this.sprite = next_sprites.removeLast();
      this.width = sprite.getWidth();
      this.height = sprite.getHeight();
  }
    }
   
    public void release() {
  if(!isVideo) return;
  player.stop();
  player.release();
  playerFactory.release();
  player = null;
  playerFactory = null;
    }
      
    @Override
    public BgaEntity copy(){
        return new BgaEntity(this);
    }

    @Override
    public void display(Memory memory) {
  if(BUFFER_SIZE <= 0) return;
  videoBuffer = memory.getByteBuffer(0, BUFFER_SIZE);
  newBuffer = true;
    }
}
TOP

Related Classes of org.open2jam.render.entities.BgaEntity

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.