场景拼图工具开发

原创 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;
        }
    }
}

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

【Android 2D 游戏开发(5)】——九宫格拼图(苍老师版)

效果:开始界面: 3x3: 4x4: 5x5: 拼图成功后苍老师对你表示爱意。。 图片切割方法 有些朋友看到这篇文章可能会想知道怎么切割图片(虽然我做这个游戏并没有切割图片。。),我就把...
  • potato47
  • potato47
  • 2016年04月09日 10:35
  • 1791

基于Android平台游戏之小拼图

一:需求描述 拼图是一款益智类经典游戏了,本游戏学习了一些前辈们的经验,整体来说讲,将图片用切图工具进行切割,监听用户手指滑动事件,当用户对凌乱的图片,在一定的时间内拼凑恢复成原来的样子,则成功闯关。...
  • qq_35260622
  • qq_35260622
  • 2016年06月16日 10:50
  • 4074

【android】拼图实现浅谈(类似美图秀秀拼图功能

又好久没有写东西。本来这个东西在两个月之前就该记录下来的,拖了那么久,醉过醉过。 今天介绍的是android实现一个基础的拼图功能。之前项目中需要到拼图的功能,首先就是第一反应就是geogle有没有可...
  • u014641010
  • u014641010
  • 2016年02月28日 18:14
  • 3274

opencv实现拼图功能

简介   在使用美图秀秀之类工具的时候,发现了一个拼图功能,然后这里用opencv实现了类似效果。 实现原理 具体代码 #include #include #include #incl...
  • u011630458
  • u011630458
  • 2015年05月28日 08:29
  • 2927

基于IOS平台的游戏之小拼图

IOS/Xcode工具 一:主要功能 在拼图小游戏开发过程中,实现的主要的功能。 压缩图片:需要给传递过来的任意图片,根据手机模拟器中View大小,重新设置图片的尺寸,即压缩图片运用UIGrap...
  • qq_35260622
  • qq_35260622
  • 2016年06月13日 19:10
  • 641

Android 实战美女拼图游戏 你能坚持到第几关

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40595385,本文出自:【张鸿洋的博客】1、概述继2048之后,今天给大家带来一...
  • lmj623565791
  • lmj623565791
  • 2014年11月03日 09:37
  • 25638

定制自己的Unity场景编辑工具界面(一)

Unity场景编辑工具界面(一)我的界面工具命名为CustomAssist,下面简称CA; CA添加以下功能 Transform相对变换位置、方向、大小 快速切换对象激活关闭 快速编组对象 快速命...
  • u012186837
  • u012186837
  • 2017年07月28日 17:56
  • 247

【Android基础】利用布局来拼图

这次我们来讲一个拼图的例子,主要讲解下相对布局。使用布局将下面的碎片排列成一张完整的图片: 完成效果图:...
  • yabg_zhi_xiang
  • yabg_zhi_xiang
  • 2016年04月09日 17:03
  • 2727

拼图算法分析...

From: http://blog.sina.com.cn/s/blog_6a4b57e30100mfch.html 一、题目说明:   (九宫问题)在一个3×3的九宫中有1-8这8个数及一个空格随...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2015年01月08日 17:19
  • 1226

Android拼图游戏开发全纪录1

今天我们继续来讲解Android拼图游戏全纪录的第二篇,今天要完成的任务比较简单:界面布局和资源文件 1资源文件: 我们在开发一个项目的时候,首先要定下这个App的基调,是小清新呢还是重口...
  • x359981514
  • x359981514
  • 2014年01月31日 11:39
  • 22413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:场景拼图工具开发
举报原因:
原因补充:

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