示例#1
0
        /// <summary>
        /// resourcesフォルダ中のcsvの1行を読んで新しいリソースを作る(or既存のアニメーションスプライトに1フレーム追加する)
        /// </summary>
        /// <param name="tokens"></param>
        /// <param name="dir"></param>
        /// <param name="currentAnime"></param>
        /// <param name="sp"></param>
        /// <returns></returns>
        static private AContentItem CreateFromCsv(string[] tokens, string dir, SpriteAnime currentAnime, ScriptPosition sp)
        {
            if (tokens.Length < 2)
            {
                return(null);
            }
            string name = tokens[0].Trim().ToUpper();     //
            string arg2 = tokens[1].ToUpper();            //画像ファイル名

            if (name.Length == 0 || arg2.Length == 0)
            {
                return(null);
            }
            //アニメーションスプライト宣言
            if (arg2 == "ANIME")
            {
                if (tokens.Length < 4)
                {
                    ParserMediator.Warn("アニメーションスプライトのサイズが宣言されていません", sp, 1);
                    return(null);
                }
                //w,h
                int[] sizeValue = new int[2];
                bool  sccs      = true;
                for (int i = 0; i < 2; i++)
                {
                    sccs &= int.TryParse(tokens[i + 2], out sizeValue[i]);
                }
                if (!sccs || sizeValue[0] <= 0 || sizeValue[1] <= 0 || sizeValue[0] > AbstractImage.MAX_IMAGESIZE || sizeValue[1] > AbstractImage.MAX_IMAGESIZE)
                {
                    ParserMediator.Warn("アニメーションスプライトのサイズの指定が適切ではありません", sp, 1);
                    return(null);
                }
                SpriteAnime anime = new SpriteAnime(name, new Size(sizeValue[0], sizeValue[1]));

                return(anime);
            }
            //アニメ宣言以外(アニメ用フレーム含む

            if (arg2.IndexOf('.') < 0)
            {
                ParserMediator.Warn("第二引数に拡張子がありません:" + arg2, sp, 1);
                return(null);
            }
            string parentName = dir + arg2;

            //親画像のロードConstImage
            if (!resourceDic.ContainsKey(parentName))
            {
                string filepath = parentName;
                if (!File.Exists(filepath))
                {
                    ParserMediator.Warn("指定された画像ファイルが見つかりませんでした:" + arg2, sp, 1);
                    return(null);
                }
                Bitmap bmp = new Bitmap(filepath);
                if (bmp == null)
                {
                    ParserMediator.Warn("指定されたファイルの読み込みに失敗しました:" + arg2, sp, 1);
                    return(null);
                }
                bmp.name = name;
                if (bmp.Width > AbstractImage.MAX_IMAGESIZE || bmp.Height > AbstractImage.MAX_IMAGESIZE)
                {
                    //1824-2 すでに8192以上の幅を持つ画像を利用したバリアントが存在してしまっていたため、警告しつつ許容するように変更
                    //	bmp.Dispose();
                    ParserMediator.Warn("指定された画像ファイルの大きさが大きすぎます(幅及び高さを" + AbstractImage.MAX_IMAGESIZE.ToString() + "以下にすることを強く推奨します):" + arg2, sp, 1);
                    //return null;
                }
                ConstImage img = new ConstImage(parentName);
                img.CreateFrom(bmp, Config.TextDrawingMode == TextDrawingMode.WINAPI);
                if (!img.IsCreated)
                {
                    ParserMediator.Warn("画像リソースの作成に失敗しました:" + arg2, sp, 1);
                    return(null);
                }
                resourceDic.Add(parentName, img);
            }
            ConstImage parentImage = resourceDic[parentName] as ConstImage;

            if (parentImage == null || !parentImage.IsCreated)
            {
                ParserMediator.Warn("作成に失敗したリソースを元にスプライトを作成しようとしました:" + arg2, sp, 1);
                return(null);
            }
            Rectangle rect  = new Rectangle(new Point(0, 0), parentImage.Bitmap.Size);
            Point     pos   = new Point();
            int       delay = 1000;

            //name,parentname, x,y,w,h ,offset_x,offset_y, delayTime
            if (tokens.Length >= 6)           //x,y,w,h
            {
                int[] rectValue = new int[4];
                bool  sccs      = true;
                for (int i = 0; i < 4; i++)
                {
                    sccs &= int.TryParse(tokens[i + 2], out rectValue[i]);
                }
                if (sccs)
                {
                    rect = new Rectangle(rectValue[0], rectValue[1], rectValue[2], rectValue[3]);
                    pos  = new Point(rectValue[0], rectValue[1]);

                    if (rect.Width <= 0 || rect.Height <= 0)
                    {
                        ParserMediator.Warn("スプライトの高さ又は幅には正の値のみ指定できます:" + name, sp, 1);
                        return(null);
                    }
                    //uEmuera在此时尚未获取图片尺寸
                    //if (!rect.IntersectsWith(new Rectangle(0,0,parentImage.Bitmap.Width, parentImage.Bitmap.Height)))
                    //{
                    //	ParserMediator.Warn("親画像の範囲外を参照しています:" + name, sp, 1);
                    //	return null;
                    //}
                }
                if (tokens.Length >= 8)
                {
                    sccs = true;
                    for (int i = 0; i < 2; i++)
                    {
                        sccs &= int.TryParse(tokens[i + 6], out rectValue[i]);
                    }
                    if (sccs)
                    {
                        pos = new Point(rectValue[0], rectValue[1]);
                    }
                    if (tokens.Length >= 9)
                    {
                        sccs = int.TryParse(tokens[8], out delay);
                        if (sccs && delay <= 0)
                        {
                            ParserMediator.Warn("フレーム表示時間には正の値のみ指定できます:" + name, sp, 1);
                            return(null);
                        }
                    }
                }
            }
            //既存のスプライトに対するフレーム追加
            if (currentAnime != null && currentAnime.Name == name)
            {
                if (!currentAnime.AddFrame(parentImage, rect, pos, delay))
                {
                    ParserMediator.Warn("アニメーションスプライトのフレームの追加に失敗しました:" + arg2, sp, 1);
                    return(null);
                }
                return(null);
            }

            //新規スプライト定義
            ASprite image = new SpriteF(name, parentImage, rect, pos);

            return(image);
        }