Package pu.web.client

Source Code of pu.web.client.PU_Resources

package pu.web.client;

import java.util.HashMap;

import pu.web.client.resources.fonts.Fonts;
import pu.web.client.resources.gui.GuiImages;
import pu.web.client.resources.pokemon.Pokemon;
import pu.web.client.resources.tiles.Tiles;
import pu.web.shared.ImageLoadEvent;

import com.google.gwt.dom.client.ImageElement;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Element;
import com.google.gwt.xml.client.NodeList;
import com.google.gwt.xml.client.XMLParser;
import com.googlecode.gwtgl.binding.WebGLTexture;

public class PU_Resources
{
  private PU_Font[] mFonts = new PU_Font[Fonts.FONT_COUNT];
  private PU_Image[] mGuiImages = null;
  private HashMap<Integer, PU_Image> mTiles = new HashMap<Integer, PU_Image>();
  private HashMap<Long, PU_Image> mCreatureImages = new HashMap<Long, PU_Image>();
  private HashMap<Integer, PU_Image> mPokeImage_Front = new HashMap<Integer, PU_Image>();
  private HashMap<Integer, PU_Image> mPokeImage_Back = new HashMap<Integer, PU_Image>();
  private HashMap<Integer, PU_Image> mPokeImage_Icon = new HashMap<Integer, PU_Image>();
 
  private int mFontCount = 0;
  private int mFontCountLoaded = 0;
 
  private int mGuiImageCount = 0;
  private int mGuiImageCountLoaded = 0;
 
  private int mSpriteCount = 0;
  private int mSpriteCountLoaded = 0;
 
  private int mPokemonCount = 0;
  private int mPokemonCountLoaded = 0;
 
  private WebGLTexture mSpriteTexture = null;
  private WebGLTexture mPokemonTexture = null;
 
  private boolean mResourcesLoaded = false;
 
  public PU_Resources()
  {
    mFontCount = Fonts.FONT_COUNT;
    mGuiImageCount = GuiImages.getImages().length;
  }
 
  public void checkComplete()
  {
    if(!mResourcesLoaded)
    {
      boolean complete = true;
     
      if(mFontCount <= 0 || mFontCount != mFontCountLoaded)
      {
        complete = false;
      }
     
      if(mGuiImageCount <= 0 || mGuiImageCount != mGuiImageCountLoaded)
      {
        complete = false;
      }
     
      if(mSpriteCount <= 0 || mSpriteCount != mSpriteCountLoaded)
      {
        complete = false;
      }
     
      if(mPokemonCount <= 0 || mPokemonCount != mPokemonCountLoaded)
      {
        complete = false;
      }
     
      if(complete)
      {
        mResourcesLoaded = true;
        PUWeb.resourcesLoaded();
     
    }
  }
 
  public float getLoadProgress()
  {
    float progress = 0.0f;
   
    // Font progress (10%)
    progress += ((float)mFontCountLoaded/(float)mFontCount)*0.1f;
   
    // GUI progress (30%)
    progress += ((float)mFontCountLoaded/(float)mFontCount)*0.3f;
   
    // Sprites progress (30%)
    if(mSpriteCount > 0)
    {
      progress += ((float)mSpriteCountLoaded/(float)mSpriteCount)*0.3f
    }
   
    // Pokemon progress (30%)
    if(mPokemonCount > 0)
    {
      progress += ((float)mPokemonCountLoaded/(float)mPokemonCount)*0.3f
    }
   
    // Check if loading is complete
    checkComplete();
   
    return progress;
  }
 
  public int getFontLoadProgress()
  {
    return (int)((float)((float)mFontCountLoaded/(float)mFontCount)*100.0);
  }
 
  public int getGuiImageLoadProgress()
  {
    return (int)((float)((float)mGuiImageCountLoaded/(float)mGuiImageCount)*100.0);
  }
 
  public native boolean imageLoaded(ImageElement image) /*-{
    return image.complete;
  }-*/;
 
  public native void loadImage(ImageLoadEvent callback, ImageElement image) /*-{
    var events = this;
   
    if(image.complete)
    {
      callback.@pu.web.shared.ImageLoadEvent::loaded()();
    }
    else
    {
      image.addEventListener("load", function(e) {
        callback.@pu.web.shared.ImageLoadEvent::loaded()();
      }, false);
     
      image.addEventListener("error", function(e) {
        callback.@pu.web.shared.ImageLoadEvent::error()();
      }, false);
    }
  }-*/;
 
  public void loadFonts()
  {
    loadFont(Fonts.FONT_ARIALBLK_BOLD_14, (ImageResource) Fonts.INSTANCE.puritanBold14Bitmap(), Fonts.INSTANCE.puritanBold14Info().getText());
    loadFont(Fonts.FONT_ARIALBLK_BOLD_14_OUTLINE, (ImageResource) Fonts.INSTANCE.arialBlk14OutlineBitmap(), Fonts.INSTANCE.arialBlk14OutlineInfo().getText());
  }
 
  public void loadFont(final int fontId, ImageResource imageResource, final String fontInfo)
  {
    final WebGLTexture texture = PUWeb.engine().createEmptyTexture();
    final ImageElement image = PUWeb.engine().getImageElement(imageResource);
    loadImage(new ImageLoadEvent()
    {
      @Override
      public void loaded()
      {
        PUWeb.engine().fillTexture(texture, image);
        setFont(fontId, new PU_Font(texture, fontInfo));
       
        mFontCountLoaded++;
      }

      @Override
      public void error()
      {
        mFontCountLoaded++;
      }
    }, image);
  }
 
  public PU_Font getFont(int fontId)
  {
    return mFonts[fontId];
  }
 
  public void setFont(int fontId, PU_Font font)
  {
    mFonts[fontId] = font;
  }
 
  public void loadGuiImages()
  {
    final ImageResource[] resources = GuiImages.getImages();
    mGuiImages = new PU_Image[resources.length];
    for(int i = 0; i < resources.length; i++)
    {
      final int id = i;
     
      final WebGLTexture texture = PUWeb.engine().createEmptyTexture();
      final ImageElement image = PUWeb.engine().getImageElement(resources[i]);
      loadImage(new ImageLoadEvent()
      {
        @Override
        public void loaded()
        {
          PUWeb.engine().fillTexture(texture, image);
          if(id >= 0 && id < resources.length)
          {
            mGuiImages[id] = new PU_Image(image.getWidth(), image.getHeight(), texture);
          }
         
          mGuiImageCountLoaded++;
        }

        @Override
        public void error()
        {
          mGuiImageCountLoaded++;
        }
      }, image);
    }
  }
 
  public PU_Image getGuiImage(int id)
  {
    if(mGuiImages != null && id >= 0 && id < mGuiImages.length)
    {
      return mGuiImages[id];
    }
    return null;
  }
 
  public void loadSprites()
  {
    final ImageResource imageResource = Tiles.INSTANCE.getTilesBitmap();
    final String imageInfo = Tiles.INSTANCE.getTilesInfo().getText();
 
    mSpriteTexture = PUWeb.engine().createEmptyTexture();
    final ImageElement image = PUWeb.engine().getImageElement(imageResource);
    loadImage(new ImageLoadEvent()
    {
      @Override
      public void loaded()
      {
        PUWeb.engine().fillTexture(mSpriteTexture, image);
       
        Document infoDom = XMLParser.parse(imageInfo);
       
        NodeList sprites = infoDom.getElementsByTagName("sprite");
        PU_Resources.this.mSpriteCount = sprites.getLength();
        for(int i = 0; i < sprites.getLength(); i++)
        {
          Element element = (Element) sprites.item(i);
         
          String name = element.getAttribute("n");
         
          PU_Rect texCoords = new PU_Rect();
          texCoords.x = Integer.parseInt(element.getAttribute("x"));
          texCoords.y = Integer.parseInt(element.getAttribute("y"));
          texCoords.width = Integer.parseInt(element.getAttribute("w"));
          texCoords.height = Integer.parseInt(element.getAttribute("h"));
         
          int offsetX = 0;
          if(element.hasAttribute("oX"))
            offsetX = Integer.parseInt(element.getAttribute("oX"));
         
          int offsetY = 0;
          if(element.hasAttribute("oY"))
            offsetY = Integer.parseInt(element.getAttribute("oY"));
         
          int width = texCoords.width;
          if(element.hasAttribute("oW"))
            width = Integer.parseInt(element.getAttribute("oW"));
         
          int height = texCoords.height;
          if(element.hasAttribute("oH"))
            height = Integer.parseInt(element.getAttribute("oH"));
         
          PU_Image spriteImage = new PU_Image(width, height, null);
          spriteImage.setTextureCoords(texCoords, image.getWidth(), image.getHeight());
          spriteImage.setOffsetX(offsetX);
          spriteImage.setOffsetY(offsetY);
          if(name.contains("creatures/"))
          {
            // Creature sprite
            parseCreatureSprite(name, spriteImage);
          }
          else
          {
            // Tile sprite
            parseTileSprite(name, spriteImage);
          }
          PU_Resources.this.mSpriteCountLoaded++;
        }
      }

      @Override
      public void error()
      {
        PUWeb.log("Error loading sprites");
      }
    }, image);
  }
 
  public WebGLTexture getSpriteTexture()
  {
    return mSpriteTexture;
  }
 
  public void parseTileSprite(String name, PU_Image image)
  {
    int id = Integer.parseInt(name);
    mTiles.put(id, image);
  }

  public void parseCreatureSprite(String name, PU_Image image)
  {
    String ids = name.replace("creatures/", "");
    String[] parts = ids.split("_");
    long bodypart = Long.parseLong(parts[0]);
    long id = Long.parseLong(parts[1]);
    long dir = Long.parseLong(parts[2]);
    long frame = Long.parseLong(parts[3]);
   
    long key = ((bodypart) | (id << 8) | (dir << 16) | (frame << 24));
    mCreatureImages.put(key, image);
  }
 
  public PU_Image getTileImage(int id)
  {
    return mTiles.get(id);
  }
 
  public PU_Image getCreatureImage(int bodypart, int id, int dir, int frame)
  {
    long key = ((bodypart) | (id << 8) | (dir << 16) | (frame << 24));
    return mCreatureImages.get(key);
  }
 
  public void loadPokemonImages()
  {
    final ImageResource imageResource = Pokemon.INSTANCE.getPokemonBitmap();
    final String imageInfo = Pokemon.INSTANCE.getPokemonInfo().getText();
 
    mPokemonTexture = PUWeb.engine().createEmptyTexture();
    final ImageElement image = PUWeb.engine().getImageElement(imageResource);
    loadImage(new ImageLoadEvent()
    {
      @Override
      public void loaded()
      {
        PUWeb.engine().fillTexture(mPokemonTexture, image);
       
        Document infoDom = XMLParser.parse(imageInfo);
       
        NodeList sprites = infoDom.getElementsByTagName("sprite");
        PU_Resources.this.mPokemonCount = sprites.getLength();
        for(int i = 0; i < sprites.getLength(); i++)
        {
          Element element = (Element) sprites.item(i);
         
          String name = element.getAttribute("n");
         
          PU_Rect texCoords = new PU_Rect();
          texCoords.x = Integer.parseInt(element.getAttribute("x"));
          texCoords.y = Integer.parseInt(element.getAttribute("y"));
          texCoords.width = Integer.parseInt(element.getAttribute("w"));
          texCoords.height = Integer.parseInt(element.getAttribute("h"));
         
          int offsetX = 0;
          if(element.hasAttribute("oX"))
            offsetX = Integer.parseInt(element.getAttribute("oX"));
         
          int offsetY = 0;
          if(element.hasAttribute("oY"))
            offsetY = Integer.parseInt(element.getAttribute("oY"));
         
          int width = texCoords.width;
          if(element.hasAttribute("oW"))
            width = Integer.parseInt(element.getAttribute("oW"));
         
          int height = texCoords.height;
          if(element.hasAttribute("oH"))
            height = Integer.parseInt(element.getAttribute("oH"));
         
          PU_Image spriteImage = new PU_Image(width, height, null);
          spriteImage.setTextureCoords(texCoords, image.getWidth(), image.getHeight());
          spriteImage.setOffsetX(offsetX);
          spriteImage.setOffsetY(offsetY);
         
          if(name.contains("back/"))
          {
            int id = Integer.parseInt(name.replace("back/", ""));
            mPokeImage_Back.put(id, spriteImage);
          }
          else if(name.contains("front/"))
          {
            int id = Integer.parseInt(name.replace("front/", ""));
            mPokeImage_Front.put(id, spriteImage);
          }
          else if(name.contains("icon/"))
          {
            int id = Integer.parseInt(name.replace("icon/", ""));
            mPokeImage_Icon.put(id, spriteImage);
         
         
          PU_Resources.this.mPokemonCountLoaded++;
        }
      }

      @Override
      public void error()
      {
        PUWeb.log("Error loading sprites");
      }
    }, image);
  }
 
  public WebGLTexture getPokemonTexture()
  {
    return mPokemonTexture;
  }
 
  public PU_Image getPokemonFront(int id)
  {
    return mPokeImage_Front.get(id);
  }
 
  public PU_Image getPokemonBack(int id)
  {
    return mPokeImage_Back.get(id);
  }
 
  public PU_Image getPokemonIcon(int id)
  {
    return mPokeImage_Icon.get(id);
  }
}
TOP

Related Classes of pu.web.client.PU_Resources

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.