场景拼图工具开发

原创 2015年07月10日 15:46:15
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ResPublish
{
    class Program
    {
        //迭代计数器
        public static int count=0;
        /// <summary>
        /// 函数入口
        /// 程晗0709
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //获取所有步骤的返回值
            Result result = new Result(true,"");
            //运行程序时,检测 texture路径,图片路径是否存在
            result = checkAll();
            if (!result.isSuccess)
            {
                Console.WriteLine(result.msg);
                Console.ReadLine();
            }
            //程序调用texture生成图片

            //递归开始
            result = doTexture(Settings.Default.imagePath+@"\temp0");
            Console.WriteLine("操作成功");
            Console.ReadLine();           
        }
        
        /// <summary>
        /// 运行程序时,检测 texture路径,图片路径是否存在
        /// 程晗0709
        /// </summary>
        /// <returns></returns>
        public static Result checkAll()
        {
            //验证texture是否存在
            if (!Directory.Exists(Settings.Default.texturePath)) {
                return new Result(false,"texture路径错误");
            };
            //验证image是否存在
            if (!Directory.Exists(Settings.Default.imagePath)) {
                return new Result(false, "image路径错误");
            }
            //检测图片是否超过大小,并存入temp0中
            //创建temp0文件夹
            if (!Directory.Exists(Settings.Default.imagePath + @"\temp0"))
            {
                // Create the directory it does not exist.
                Directory.CreateDirectory(Settings.Default.imagePath + @"\temp0");
            }
            else
            {
                Directory.Delete(Settings.Default.imagePath + @"\temp0", true);
                Directory.CreateDirectory(Settings.Default.imagePath + @"\temp0");
            }
            //将样本图片存入文件夹
            //读取文件夹中所有文件 存入数组中
            string[] dir = Directory.GetFiles(Settings.Default.imagePath);
            //将数组中的文件存入新的文件夹中。
            Image img;
            //验证是否存在图片
            bool isImage = false;
            Regex reg = new Regex("jpg|png");
            for (int i = 0; i < dir.Length; i++)
            {
                //判断是否是图片
                if (reg.IsMatch(dir[i])) {
                    isImage = true;
                    img = System.Drawing.Image.FromFile(dir[i]);
                    if (img.Width > 2048 || img.Height > 2048) {
                    return new Result(false,dir[i]+"图片大小超标!");
                     }
                    img.Dispose();
                    //取出文件名
                    string imageName = dir[i].Substring(Settings.Default.imagePath.Length + 1);
                    System.IO.File.Copy(dir[i], Settings.Default.imagePath + @"\temp0\" + imageName);
                    //剪切文件
                    //File.Move(listStr[i], path + @"\temp" + count);
                }
            }
            //验证是否存在图片
            if (!isImage)
            {
                return new Result(false, "选中文件夹不存在图片,无法拼图");
            }
            return new Result(true, "");
        }

        /// <summary>
        /// 程序调用texture生成图片
        /// 程晗0710
        /// </summary>
        /// <returns></returns>
        public static Result doTexture(string imagePath)
        {
            Result result= new Result(true,"");
            //新建进程并生成拼图
            try
            {
                //进程所在文件夹
                ProcessStartInfo startInfo = new ProcessStartInfo(Settings.Default.texturePath + @"TexturePacker.exe");
                //重定向输出 
                startInfo.RedirectStandardOutput = true;
                //错误输出
                startInfo.RedirectStandardError = true;
                startInfo.UseShellExecute = false;
                //进程不打开窗口
                startInfo.CreateNoWindow = true;
                //打开进程的时候附带的命令行
                startInfo.Arguments = @"--data e:\" + count + @".plist --format cocos2d --sheet e:\" + count + ".png --size-constraints POT --dither-fs-alpha " + " " + Settings.Default.imagePath + @"\temp" + count;
                //开启进程,并读取信息
                result.msg=Process.Start(startInfo).StandardError.ReadToEnd();
                //正则匹配error 并且切片大于1
                Regex reg = new Regex("error");
                if (reg.IsMatch(result.msg))
                {
                    //溢出一次就会迭代一次
                    result.isSuccess = false;
                    //将错误信息拆分为单词
                    string[] errorWord = result.msg.Split(' ');
                    //提取多出来的图片
                    List<string> images = new List<string>();
                    Regex regImage=new Regex("jpg|png");
                    for (int i = 0; i < errorWord.Length; i++) {
                        if (regImage.IsMatch(errorWord[i])) {
                            images.Add(errorWord[i]);
                        }
                    }
                        //调用移动文件函数
                        moveImage(images, Settings.Default.imagePath + @"\temp" + count);
                }
            }
            catch (Exception e ) {
                result.isSuccess = false;
                result.msg += e;
            }
            //回调本身
                if (count > 0)
                {
                    result = doTexture(Settings.Default.imagePath + @"\temp" + --count);
                }
            return result;
        }

        /// <summary>
        /// 将数组中的文件剪切到指定文件夹中。
        /// </summary>
        /// <param name="images">多出的文件</param>
        /// <param name="path">指定文件路径</param>
        /// <returns></returns>
        public static Result moveImage(List<string> images, string path)
        {
            count++;
            //读取文件夹中所有文件 存入数组中
            string[] dir = Directory.GetFiles(path);
            //正则匹配获取图片
            Regex reg=new Regex("jpg|png");
            //循环正则,如果有后缀则存入list中
            List<string> listStr=new List<string>();
            for(int i=0;i<dir.Length;i++){
                if(reg.IsMatch(dir[i])){
                   listStr.Add(dir[i]);
                }
            }
            //创建临时文件夹,如果存在就则删除后再创建空文件夹
            try
            {
                if (!Directory.Exists(Settings.Default.imagePath + @"\temp" + count))
                {
                    // Create the directory it does not exist.
                    Directory.CreateDirectory(Settings.Default.imagePath + @"\temp" + count);
                }
                else
                {
                    Directory.Delete(Settings.Default.imagePath + @"\temp" + count, true);
                    Directory.CreateDirectory(Settings.Default.imagePath + @"\temp" + count);
                }
                //如果list中没有多出图片,则存入temp并调用拼图函数
                string regStr = "";
                foreach (string str in images) {
                    regStr = str + "|" + regStr;
                }
                Regex regOver = new Regex(regStr.Substring(0,regStr.Length-1));
                for (int i = 0; i < listStr.Count; i++)
                {
                    //如果当前图片不存在,则复制入新的文件夹 
                    if (regOver.IsMatch(listStr[i]))
                    {
                        //取出文件名
                        string imageName = listStr[i].Substring(path.Length+1);
                        System.IO.File.Move(listStr[i], Settings.Default.imagePath + @"\temp" + count + @"\" + imageName);
                        //剪切文件
                        //File.Move(listStr[i], path + @"\temp" + count);
                    }
                }
            }
            catch (Exception e) {
                return new Result(false,e.ToString());
            }
            //调用拼图函数对temp中的图片进行拼图
            doTexture(Settings.Default.imagePath + @"\temp" + count);
            return new Result(true, ""); 
        }
    }

    /// <summary>
    /// 结果类
    /// </summary>
    public class Result {
        public bool isSuccess { get; set; }
        public string msg { get; set; }

        public Result(bool isSuccess, string msg) {
            this.isSuccess = isSuccess;
            this.msg = msg;
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【iphone游戏开发】Iphone游戏开发之五:游戏场景切换,点阵字的实现和Hiero工具的利用

Andy--清风 原创,转载请注明,谢谢 一、游戏场景切换 在iPhone游戏开发中,游戏之间的场景开发中有很多动画可以实现,具体实现的动画如下:   [cshar...
  • icash
  • icash
  • 2012-07-20 14:16
  • 707

【iphone游戏开发】Iphone游戏开发之五:游戏场景切换,点阵字的实现和Hiero工具的利用

Andy--清风 原创,转载请注明,谢谢 一、游戏场景切换 在iPhone游戏开发中,游戏之间的场景开发中有很多动画可以实现,具体实现的动画如下:   CCTransitionRotoZo...

TexturePacker 一款功能强大的拼图工具 TexturePacker -- to create your sprites sheet!

今天收到(CodeAndWeb)的Texture Packer的Free License,这里写一篇文章感谢一下作者,同时推荐一个这个相当不错的工具。 在游戏开发中,为了节省内存,同时方便地管理资...

系列文章之四 用shell脚本制作TexturePacker批量拼图工具(1)

源代码发布在github上:https://github.com/linyouhappy/kongkongxiyou。 本项目有两个拼图工具build_character.command和build...

J2ME 拼图游戏 快速开发 全过程 之代码祥解(5 )——记录集操作类、序列的奇偶性检查类

记录集操作类,代码: package cn.edu.xtu.tilepuzzle.model; import java.io.ByteArrayInputStream; import j...

3D场景捕获工具

  • 2012-05-26 09:13
  • 1.34MB
  • 下载

J2ME 拼图游戏 快速开发 全过程 (六)——图片设置界面设计

代码: package cn.edu.xtu.tilepuzzle.ui; import java.io.IOException; import java.util.Vector; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)