⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logopanel.java

📁 一款Java开发的打飞机小游戏
💻 JAVA
字号:
import java.awt.*;
import javax.swing.*;

/**
 * Logon动画面板
 * @author fantasyer
 * @version 1.0
 */
public class LogoPanel extends JPanel implements Runnable
{
    //String text = "Fantasyer Studio";             //显示的文字
    private String text = "幻想工作室";              //显示的文字
    private char[] eachChar;                        //单个字符
    private int[] startPosition;                    //字符的起始位置
    private int[] finalPosition;                    //字符的最终位置
    private int charSpace;                          //字符间隔
    private int sleepTime;                          //字体动画延迟时间
    private boolean[] isMoving;                     //单个字符是否移动
    private boolean isTextOver;                     //整个字体移动是否结束
    private boolean isFadeIn;                       //淡入效果是否结束
    private int textWidth;                          //字体的宽度

    private int width;                              //面板的宽度
    private int height;                             //面板的高度
    private int[] red, green, blue;                 //单个字符的颜色
    private Image img;                              //背景图片
    private Thread thread;                          //动画线程

    private final int TEXT_OUT = 1;                 //动画状态
    private final int FADE_IN  = 2;
    private final int BACK_IMG = 3;
    private int step = TEXT_OUT;

    private int r = 0, g = 0, b = 0;                //背景颜色

    /**
     * 构造函数加载图片、初始化相关变量
     */
    LogoPanel()
    {
        setPreferredSize(new Dimension(Utility.SCREEN_WIDTH,Utility.SCREEN_HEIGHT));

        //初始化各个属性
        width = (int)this.getPreferredSize().getWidth();
        height = (int)this.getPreferredSize().getHeight();

        Font f = new Font("Courier", Font.BOLD, 28);
        FontMetrics fm = this.getFontMetrics(f);
        textWidth = fm.stringWidth(text);

        eachChar = new char[text.length()];
        for (int i = 0; i<text.length(); i++)
        {
            eachChar[i] = text.charAt(i);
        }

        int leftChar = (width-textWidth)/2;
        int s = leftChar+fm.stringWidth(text.substring(0, text.length()/2));
        startPosition = new int[text.length()];
        for (int i = 0; i<text.length(); i++)
        {
            startPosition[i] = s;
        }
        charSpace = 14;

        finalPosition = new int[text.length()];
        finalPosition[0] = leftChar;
        for (int i = 1; i<text.length(); i++)
        {
            finalPosition[i] = finalPosition[i-1]+fm.charWidth(text.charAt(i-1));
        }

        isMoving = new boolean[text.length()];
        for (int i = 0; i<text.length(); i++)
        {
            isMoving[i] = true;
        }
        isMoving[text.length()/2] = false;
        isTextOver = false;
        sleepTime = 30;

        red = new int[text.length()];
        green = new int[text.length()];
        blue = new int[text.length()];
        for (int i = 0; i<text.length(); i++)
        {
            red[i] = 255;
            green[i] = 0;
            blue[i] = 0;
        }
        isFadeIn = false;

        thread = new Thread(this);
        thread.start();
    }

    /**
     * 在面板上绘制背景图片
     * @param g 用于绘图的对象
     */
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        g.setColor(Color.black);
        g.fillRect(0, 0, width, height);
        if (step==TEXT_OUT)
        {
            g.setColor(Color.red);
            g.setFont(new Font("Courier", Font.BOLD, 28));
            for (int i = 0; i<text.length(); i++)
            {
                g.drawChars(eachChar, i, 1, startPosition[i]-1, height/2);
                float leftPadding = (float)(width-textWidth)/2;
                int redVal = (int)( ((Math.abs((float)this.width/2-(float)startPosition[i])) / ((float)this.width/2-leftPadding))*255.0 );

                Color textColor = new Color(redVal, 75, 250);
                g.setColor(textColor);
                red[i] = textColor.getRed();
                green[i] = textColor.getGreen();
                blue[i] = textColor.getBlue();
                //阴影
                g.drawChars(eachChar, i, 1, startPosition[i], height/2);
            }
        }
        else if (step==FADE_IN)
        {
            g.setFont(new Font("Courier", Font.BOLD, 28));
            for (int i = 0; i<text.length(); i++)
            {
                g.setColor(new Color(red[i], green[i], blue[i]));
                g.drawChars(eachChar, i, 1, startPosition[i], height/2);
            }
        }
    }

    /**
     * 负责动画的线程函数
     */
    public void run()
    {
        //动画一 字体的变化
        while (!isTextOver)
        {
            for (int i = 0; i<text.length(); i++)
            {
                if (!isMoving[i])
                {
                    continue;
                }
                else
                {
                    if (startPosition[i]<finalPosition[i])
                    {
                        startPosition[i]++;
                    }
                    else if (startPosition[i]>finalPosition[i])
                    {
                        startPosition[i]--;
                    }
                    else
                    {
                        isMoving[i] = false;
                    }
                }
            }

            int i = 0;
            for (i = 0; i<text.length(); i++)
            {
                if (isMoving[i])
                {
                    break;
                }
            }

            if (i==text.length())
            {
                isTextOver = true;
            }

            try
            {
                Thread.sleep(12);
                repaint();
            }
            catch (Exception e)
            {

            }
        }

        //动画二 字体淡出效果
        step = FADE_IN;
        while (!isFadeIn)
        {
            for (int i = 0; i<text.length(); i++)
            {
                if (red[i]>r)
                {
                    red[i]--;
                }
                else if (red[i]<r)
                {
                    red[i]++;
                }
                if (green[i]>g)
                {
                    green[i]--;
                }
                else if (green[i]<g)
                {
                    green[i]++;
                }
                if (blue[i]>b)
                {
                    blue[i]--;
                }
                else if (blue[i]<b)
                {
                    blue[i]++;
                }

            }

            int j = 0;
            for (j = 0; j<text.length(); j++)
            {
                if ((red[j]!=r)||(green[j]!=g)||(blue[j]!=b))
                {
                    break;
                }
            }

            if (j==text.length())
            {
                isFadeIn = true;
            }

            repaint();
        }

        //通知主界面开场动画已结束
        synchronized(Game.getInstance())
        {
            Game.getInstance().notify();
        }

    }//run
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -