• 文件参数LibGdx在LibGdx中使用Toast


    今天一直在研究文件参数之类的问题,下午正好有机会和大家分享一下.

        在网上找到的一篇关于如何在LibGdx中应用Toast:http://www.badlogicgames.com/forum/viewtopic.php?f=11&t=484&p=3094&hilit=toast#p3094

        

    package com.joye3g.superjump.util;
    
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.graphics.Pixmap;
    import com.badlogic.gdx.graphics.Pixmap.Format;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.g2d.BitmapFont;
    import com.badlogic.gdx.graphics.g2d.SpriteBatch;
    import com.badlogic.gdx.graphics.g2d.TextureRegion;
    
    
    /** TOAST like android CLASS
     * 
     * <p>you create it by<br>Toast render_toast = new Toast(7, 6);</p>
     * <p>then you feed it a new text<br>render_toast.makeText("test string", "font", Toast.COLOR_PREF.RED, Toast.STYLE.NORMAL, Toast.TEXT_POS.middle, Toast.TEXT_POS.middle, Toast.ETERNAL);</p>
     * <p>the font should lie in data/</p>
     * <p>and you game Renderer continue to call<br>render_toast.toaster();</p>
     *
     * */
    
    public class Toast {
    
       public int max_toasts = 15; // default max_toasts
       public int margin = 6;
    
       public static final int VERY_SHORT = 1; // 1 second (hence it's fading a bit faster cause it disappears if blending < 0.15 if fade_mode is not ROUND)
       public static final int SHORT = 2;
       public static final int MED = 4;
       public static final int LONG = 8;
       public static final int ETERNAL = -1;
    
       /**
        * Color Prefered (green, red or blue)
        */
       public static interface COLOR_PREF {
          public static final int GREEN = 1;
          public static final int RED = 0;
          public static final int BLUE = 2;
       }
    
       /**
        * Text position definitions (middle, middle_down, middle_up, middle_left, middle_right)<br>
        * You can setup a custom value, then this value will be used to generate random on the three colors (see makeText code)
        */
       public static interface TEXT_POS {
          public static final float middle = 0;
          public static final float middle_down = -1;
          public static final float middle_up = -2;
          public static final float middle_left = -1;
          public static final float middle_right = -2;
       }
    
       /**
        * fading, blinking .. style
        *
        */
       public static interface STYLE {
          public static final int NORMAL = 0;
          public static final int ROUND = 1;
          public static final int PSYCOTIC = 2;
       }
    
       /** the sprite batch : used for the object instancied with new Toast */
       private SpriteBatch spriteBatch;
       private Pixmap [] pix_back = new Pixmap [max_toasts];
       private TextureRegion [] back = new TextureRegion [max_toasts];
       private BitmapFont [] font = new BitmapFont [max_toasts];
       private int [] font_width = new int [max_toasts];
       private int [] font_height = new int [max_toasts];
       private String [] string = new String [max_toasts];
       private float [] time = new float [max_toasts];
       private float [] blend = new float [max_toasts];
       private int [] fade_mode = new int [max_toasts];
       private float [] X = new float [max_toasts];
       private float [] Y = new float [max_toasts];
       private float [] R = new float [max_toasts];
       private float [] G = new float [max_toasts];
       private float [] B = new float [max_toasts];
       /** to count total number of texts living with the Toast */
       private int i = 0;
       /** direction (for ROUND mode that is blink by fading then staining) */
       private boolean [] direction = new boolean [max_toasts];
    
    
       /** A new Toast()
        * @param max_toasts maximum number of toast texts
        * @param margin margin to left between texts
        * */
       public Toast(int max_toasts, int margin) {
          this.max_toasts = max_toasts;
          this.margin = margin;
       }
    
    
       /**  Function to emulate an android like Toast : use toaster() FROM your game Renderer
        *  @param string string to display
        *  @param time time desired into seconds
        *  @param _font font desired, should lie in /data/"_font".png/fnt
        *  @param prefered_color color (see {@linkplain COLOR_PREF}) that is prefered (it will random for the 2 other colors, but for this one, it will stay at 1.0f)
        *  @param fade_mode fading, blinking .. style (see {@link TEXT_POS})
        *  @param x where we want the text on X coords
        *  @param y where we want the text on Y coords, it will offset by number of total texts to display in this Toast
        *  @param time_to_spend the time to diplay THIS text
        * */
       public boolean makeText(String string, String _font, int prefered_color, int fade_mode, float x, float y, float time_to_spend) {
    
          // no more than max_toasts texts
          if (i >= max_toasts)
             return false;
    
          spriteBatch = new SpriteBatch(); // a new spriteBatch for a new text
    
          // we load the desired font
          font[i] = new BitmapFont(Gdx.files.internal("data/"+_font+".fnt"), Gdx.files.internal("data/"+_font+".png"), false);
    
          font_width[i] = (int) (font[i].getBounds(string).width + margin); // width of the string + margin
          font_height[i] = (int) font[i].getLineHeight() + margin; // height of the string
          float x_bounds = font[i].getBounds(string).width / 2; // we center the string
          float y_bounds = font[i].getLineHeight() + ((font[i].getLineHeight()+margin) * (-i)); // we offset by number of line to display in this Toast
    
          float width = Gdx.graphics.getWidth(); // becare that all calculations are made here, so if screen display resolution change (it happens with android), Strings will display at wrong place
          float height = Gdx.graphics.getHeight(); // change this behaviour if you want, i only prefered to NOT make calculations IN the for-loop in toaster()
          // you could also implement on ApplicationListener:resize to bring a new call in there
    
          if (x == TEXT_POS.middle)
             X[i] = (width/2) - x_bounds;
          else if (x == TEXT_POS.middle_left)
             X[i] = (width/3) - x_bounds;
          else if (x == TEXT_POS.middle_right)
             X[i] = (width - (width/3)) -x_bounds;
          if (y == TEXT_POS.middle)
             Y[i] = (height/2) + y_bounds;
          else if (y == TEXT_POS.middle_down)
             Y[i] = (height/3) + y_bounds;
          else if (y == TEXT_POS.middle_up)
             Y[i] = (height - (height/3)) + y_bounds;
    
          // no more than 9 seconds (except for ETERNAL, see for-loop in toaster())
          if (time_to_spend >= 9)
             this.time[i] = 7f;
    
          this.string[i] = string;
          this.time[i] = time_to_spend;
          blend[i] = 1f;
    
          // Color TINT prefered
          java.util.Random r = new java.util.Random();
          switch (prefered_color) {
          case COLOR_PREF.RED: // RED prefered
             G[i] = r.nextFloat();
             B[i] = r.nextFloat();
             R[i] = 1.0f;
             break;
          case COLOR_PREF.GREEN: // GREEN prefered
             R[i] = r.nextFloat();
             B[i] = r.nextFloat();
             G[i] = 1.0f;
             break;
          case COLOR_PREF.BLUE: // BLUE prefered
             R[i] = r.nextFloat();
             G[i] = r.nextFloat();
             B[i] = 1.0f;
             break;
          default: //custom value : we take the custom value just to generate randomness
             R[i] = r.nextInt(prefered_color);
             G[i] = r.nextInt(prefered_color);
             B[i] = r.nextInt(prefered_color);
             break;
          }
    
          this.fade_mode[i] = fade_mode;
    
          // transparent background is just a pixmap with a color
          pix_back[i] = new Pixmap(next_power_of_two(font_width[i]), next_power_of_two(font_height[i]), Format.RGBA4444);
          pix_back[i].setColor(R[i]/2, G[i]/2, B[i]/2, 0.25f); // 1/4 transparency for backgroud, you could customize.. factorize well you know :)
          pix_back[i].fill();
          back[i] = new TextureRegion(new Texture(pix_back[i]), X[i], Y[i], font_width[i], font_height[i]);
    
    
          // OK to return, we increment i that is a global for the Toast object
          i++;
          return true;
       }
    
    
       /** to get a power of two number (for Texture), taken from http://acius2.blogspot.com/2007/11/calculating-next-power-of-2.html
        * @param val value to round on the next power of two
        * */
       private int next_power_of_two(int val) {
          val--;
          val = (val >> 1) | val;
          val = (val >> 2) | val;
          val = (val >> 4) | val;
          val = (val >> 8) | val;
          val = (val >> 16) | val;
          val++; // Val is now the next highest power of 2.
          return val;
       }
    
    
       /** Trash all, in order <u>to end an eternal toast</u> */
       public boolean trash_all() {
          // becare race-conditions with toaster (that will never happen with only one thread running, but if you have toaster calling while this for-loop is executing in another thread, it will crash)
          for (int j=0; j < i; j++) {
             font[j].dispose();
             pix_back[j].dispose();
          }
          spriteBatch.dispose();
          i = 0;
          return true;
       }
    
    
       /** This function has to be called <u>every</u> frame from your renderer */
       public void toaster() {
          if (spriteBatch != null) {
             spriteBatch.begin();
             for (int j=0; j < i; j++) {
                if (time[j] != ETERNAL)
                   time[j] -= Gdx.graphics.getDeltaTime(); // we substrac time
                //we want to draw if some time remains - BUT NOT if NOT "ROUND" fade_mode OR some blend remains (just to avoid 'end blinking' in NORMAL fade_mode)
                if ((time[j] == ETERNAL ||time[j] > 0) && (fade_mode[j] == STYLE.ROUND || blend[j] > 0.15)) {
    
                   switch (fade_mode[j]) { //different modes (you would generally use NORMAL with a timed toast)
                   case STYLE.NORMAL:
                      blend[j] -= 0.01 / time[j]; // so it will just and only fade
                      break;
    
                   case STYLE.ROUND:
                      if (direction[j] == true)
                         if (time[j] > 0)
                            blend[j] -= 0.01 * time[j]; //to speed up / down things with time remaining (because you can use ROUND even without using ETERNAL)
                         else
                            blend[j] -= 0.01;
                      else
                         if (time[j] > 0)
                            blend[j] += 0.01 * time[j];
                         else
                            blend[j] += 0.01;
                      if (blend[j] < 0.15) // we define direction (fade or reappear) for ROUND mode
                         direction[j] = false;
                      if (blend[j] > 0.95)
                         direction[j] = true;
                      break;
    
                   case STYLE.PSYCOTIC:
                      blend[j] = (float) (0.15 + Math.random() * (0.95 - 0.15)); //randomness like eyes will love
                      break;
                   }
    
                   // we draw .. finally
                   spriteBatch.draw(back[j], X[j]-(margin/2), Y[j]-(font_height[j])+(margin/2), font_width[j], font_height[j]);
                   font[j].setColor(R[j], G[j], B[j], blend[j]);
                   font[j].draw(spriteBatch, string[j], X[j], Y[j]);
                }
             }
             spriteBatch.end();
          }
       }
    
    }
        每日一道理
    微笑着,去唱生活的歌谣,不要埋怨生活给予了太多的磨难,不必抱怨生命中有太多的曲折。大海如果失去了巨浪的翻滚,就会失去雄浑;沙漠如果失去了飞沙的狂舞,就会失去壮观。人生如果仅去求得两点一线的一帆风顺,生命也就失去了存在的意义。

        像实例化UI控件一样实例化一个Toast:

    render_toast = new Toast(7, 6);
    		render_toast.makeText("G", "font", Toast.COLOR_PREF.BLUE, Toast.STYLE.ROUND, Toast.TEXT_POS.middle_right, Toast.TEXT_POS.middle_down, Toast.MED);

        这里makeText的第一个参数的意义为要表现的内容,第二个参数为data文件下的字体文件,这里的font是字体文件的前缀

        即如果你的data文件下的字体文件为font.png,font.fnt,这里的参数就为font,如果为first.png,first.fnt就为first

        

        在SpriteBatcher.begin()和SpriteBatcher.end()中间调用

    render_toast.toaster();

        如:

    batcher.begin();
    		render_toast.toaster();
    		batcher.end();

        

        其他参数详情请自行浏览Toast.java文件

    文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
      波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
      波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”

  • 相关阅读:
    应用JConsole学习Java GC
    删除MySQL重复数据
    Linux后台运行程序
    Jvm基础(2)-Java内存模型
    一个word合并项目的分布式架构设计
    Jvm基础(1)-Java运行时数据区
    【JPA】01 快速上手
    【Ubuntu】下载安装 20.04.版本 桌面端
    【Ubuntu】下载安装 12.04.5版本 桌面端
    【CentOS】tar包安装Tomcat
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3078531.html
Copyright © 2020-2023  润新知