//把导弹从source反射到destination,然后爆炸
 public void Throw(Vector2 source, MissileDirection direction, float distance)
 {
     print("Cannon Throw Missile!");
     ChangeDirection(direction);
     transform.position = source;
     this.fly_direction = direction;
     this.rest_distance = distance;
 }
        //开火
        IEnumerator Fire()
        {
            yield return(new WaitForSeconds(1f));

            //随机选取一个射程进行开火,射程只有2~4之间
            float launch_distance = Random.Range(2.0f, 5.0f);
            //float launch_distance = 5.0f;

            //随机选取开火次数,有1次
            int launch_times = Random.Range(1, 2);

            //开火!
            for (int i = 0; i < launch_times; i++)
            {
                //随机选取一个方向进行开火
                int direction = Random.Range(0, 4);
                MissileDirection launch_direction = MissileDirection.UP;

                //生成导弹
                GameObject go = Instantiate(prefabMissile) as GameObject;
                switch (direction)
                {
                //旋转战车车身
                case 0:           //上
                    launch_direction = MissileDirection.UP;
                    break;

                case 1:           //下
                    launch_direction = MissileDirection.DOWN;
                    break;

                case 2:           //左
                    launch_direction = MissileDirection.LEFT;
                    break;

                case 3:           //右
                    launch_direction = MissileDirection.RIGHT;
                    break;
                }
                //真的发射!
                go.GetComponent <Missile_Cannon> ().Throw(transform.position, launch_direction, launch_distance);
                on_moving = true;
            }
        }
        public Bitmap CreateMissileFromFile(FileInfo file, string name, MissileDirection direction, out bool isMissing)
        {
            isMissing = false;
            var nameReplaced = name.ToFileName();

            if (!file.Exists)
            {
                isMissing = true;
                var bitmap = MissingMissileTileCreator.CreateTile(_missileMissingType, direction.ToString(), nameReplaced);
                return(bitmap);
            }
            else
            {
                using (var bitmap = (Bitmap)Bitmap.FromFile(file.FullName))
                {
                    return(CreateMissile(bitmap, direction));
                }
            }
        }
    //旋转炮弹方向
    private void ChangeDirection(MissileDirection direction)
    {
        //Quaternion temp = transform.rotation.SetEulerAngles(0,0,180);
        switch (direction)
        {
        case MissileDirection.UP:
            transform.rotation = Quaternion.Euler(0, 0, 180);
            break;

        case MissileDirection.DOWN:
            break;

        case MissileDirection.LEFT:
            transform.rotation = Quaternion.Euler(0, 0, 270);
            break;

        case MissileDirection.RIGHT:
            transform.rotation = Quaternion.Euler(0, 0, 90);
            break;
        }

        print("Missile change direction!");
    }
        public override void CompileOne(string[] splitLine)
        {
            if (splitLine.Length < _lineLength)
            {
                throw new Exception(string.Format("Cmap line '{0}' has too few elements.", string.Join(',', splitLine)));
            }

            var map  = splitLine[1];
            var name = splitLine[2];
            var desc = splitLine[3];

            if (desc == _noDescription)
            {
                desc = "";
            }

            int widthInTiles  = int.Parse(splitLine[4]);
            int heightInTiles = int.Parse(splitLine[5]);
            MainTileAlignment mainTileAlignment = GetMainTileAlignment(splitLine[6]);

            var subDir2 = map.ToFileName();
            var name2   = name.Substring(2);

            var      dirPath      = Path.Combine(BaseDirectory.FullName, subDir2);
            var      fileName     = map.ToFileName() + "_" + name2.ToFileName() + Program.ImageFileExtension;
            var      relativePath = Path.Combine(_subDirName, subDir2, fileName);
            var      cmapName     = name.Substring(2).ToFileName();
            var      filePath     = Path.Combine(dirPath, fileName);
            FileInfo file         = new FileInfo(filePath);

            if (file.Exists)
            {
                WriteCmapTileNameSuccess(relativePath, desc);
                using (var image = new Bitmap(Image.FromFile(file.FullName)))
                {
                    if (image.Size == Program.MaxTileSize)
                    {
                        DrawImageToTileSet(image);
                    }
                    else
                    {
                        DrawMainTileToTileSet(image, widthInTiles, heightInTiles, mainTileAlignment, file);
                    }
                    StoreTileFile(file, image.Size);
                }
            }
            else if (name.StartsWith(_boomerangString))
            {
                string suffix = name.Substring(name.Length - 2, 2);

                if (!_boomerangMissileData.ContainsKey(suffix))
                {
                    throw new Exception(string.Format("_boomerangMissileData does not contain suffix '{0}'.", suffix));
                }

                MissileDirection missileDirection = _boomerangMissileData[suffix].Direction;

                string   sourceRelativePath = @"Objects\weapons\boomerang\weapon_boomerang.png";
                string   sourceFullPath     = Path.Combine(Program.InputDirectory.FullName, sourceRelativePath);
                FileInfo sourceFile         = new FileInfo(sourceFullPath);

                bool isTileMissing = false;

                using (var missileBitmap = ItemMissileCreator.CreateMissileFromFile(sourceFile, name.ToProperCaseFirst(), missileDirection, out isTileMissing))
                {
                    if (!isTileMissing)
                    {
                        Console.WriteLine("Autogenerated Cmap Missile Tile {0} Successfully.", relativePath);
                        WriteTileNameAutogenerationSuccess(sourceRelativePath, relativePath, _boomerangCmapMissileType);
                        StoreTileFile(sourceFile, missileBitmap.Size);
                    }
                    else
                    {
                        Console.WriteLine("Autogenerated Missing Cmap Missile Tile {0}.", relativePath);
                        WriteTileNameAutogenerationError(sourceRelativePath, relativePath, _boomerangCmapMissileType);
                    }
                    DrawImageToTileSet(missileBitmap);
                }
            }
            else
            {
                Console.WriteLine("File '{0}' not found. Creating Missing Cmap tile.", file.FullName);
                WriteCmapTileNameErrorFileNotFound(relativePath, desc, "Creating Missing Cmap tile.");

                using (var image = MissingCmapTileCreator.CreateTile(_missingCmapType, null, name2))
                {
                    DrawImageToTileSet(image);
                }
            }
            IncreaseCurXY();
        }
Exemple #6
0
        public override void CompileOne(string[] splitLine)
        {
            if (splitLine.Length < _lineLength)
            {
                throw new Exception(string.Format("Artifact line '{0}' has too few elements.", string.Join(',', splitLine)));
            }

            var type       = splitLine[1];
            var name       = splitLine[2];
            var desc       = splitLine[3];
            var desc2      = splitLine[5];
            var nameOrDesc = name;

            if (!string.IsNullOrWhiteSpace(desc))
            {
                nameOrDesc = desc;
            }
            else if (!string.IsNullOrWhiteSpace(desc2))
            {
                nameOrDesc = desc2;
            }

            if (!_typeSuffix.ContainsKey(type))
            {
                throw new Exception(string.Format("Artifact Type '{0}' unknown. Line: '{1}'.", type, string.Join(',', splitLine)));
            }

            string direction        = null;
            bool   isFullSizeBitmap = true;

            if (type == _typeMissile)
            {
                direction = splitLine[6];
                if (!_missileData.ContainsKey(direction))
                {
                    throw new Exception(string.Format("Invalid direction '{0}'. Line: '{1}'.", direction, string.Join(',', splitLine)));
                }
            }
            else
            {
                isFullSizeBitmap = int.Parse(splitLine[6]) > 0;
            }

            int widthInTiles         = int.Parse(splitLine[7]);
            int heightInTiles        = int.Parse(splitLine[8]);
            int mainTileAlignmentInt = int.Parse(splitLine[9]);

            if (!Enum.IsDefined(typeof(MainTileAlignment), mainTileAlignmentInt))
            {
                throw new Exception(string.Format("MainTileAlignment '{0}' is invalid. Should be 0 or 1.", mainTileAlignmentInt));
            }
            MainTileAlignment mainTileAlignment = (MainTileAlignment)mainTileAlignmentInt;

            int   colorCode     = int.Parse(splitLine[10]);
            Color templateColor = GetColorFromColorCode(colorCode);

            int    subTypeCode        = int.Parse(splitLine[11]);
            string subTypeName        = splitLine[12];
            string objectType         = splitLine[13];
            var    objectTypeSingular = GetSingular(objectType);

            int  hasFloorTileInt = int.Parse(splitLine[14]);
            bool hasFloorTile    = hasFloorTileInt > 0;

            if (type == _typeMissile)
            {
                //Autogenerate missile icon
                var subDir2         = name.ToFileName();
                var fileNameBase    = name.ToFileName() + Program.ImageFileExtension;
                var fileNameMissile = name.ToFileName() + _missileSuffix + Program.ImageFileExtension;
                var fileNameFloor   = name.ToFileName() + _floorSuffix + Program.ImageFileExtension;

                if (!_missileData.ContainsKey(direction))
                {
                    throw new Exception(string.Format("_missileData does not contain direction '{0}'.", direction));
                }

                MissileDirection missileDirection = _missileData[direction].Direction;

                string   dirPath          = Path.Combine(BaseDirectory.FullName, subDir2);
                var      relativePathBase = Path.Combine(_subDirName, subDir2, fileNameBase);
                var      filePathBase     = Path.Combine(dirPath, fileNameBase);
                FileInfo fileBase         = new FileInfo(filePathBase);

                var      relativePathFloor = Path.Combine(_subDirName, subDir2, fileNameFloor);
                var      filePathFloor     = Path.Combine(dirPath, fileNameFloor);
                FileInfo fileFloor         = new FileInfo(filePathFloor);

                var      relativePathMissile = Path.Combine(_subDirName, subDir2, fileNameMissile);
                var      filePathMissile     = Path.Combine(dirPath, fileNameMissile);
                FileInfo fileMissile         = new FileInfo(filePathMissile);

                var targetSubDir2  = name.ToFileName();
                var targetFileName = name.ToFileName() +
                                     _typeSuffix[type] +
                                     _missileData[direction].FileSuffix + Program.ImageFileExtension;
                var targetRelativePath = Path.Combine(_subDirName, targetSubDir2, targetFileName);

                bool isTileMissing = false;

                FileInfo file         = null;
                string   relativePath = null;
                if (fileMissile.Exists)
                {
                    file         = fileMissile;
                    relativePath = relativePathMissile;
                }
                else if (fileFloor.Exists)
                {
                    file         = fileFloor;
                    relativePath = relativePathFloor;
                }
                else
                {
                    file         = fileBase;
                    relativePath = relativePathBase;
                }

                using (var missileBitmap = ItemMissileCreator.CreateMissileFromFile(file, nameOrDesc.ToProperCaseFirst(), missileDirection, out isTileMissing))
                {
                    if (!isTileMissing)
                    {
                        Console.WriteLine("Autogenerated Artifact Missile Tile {0} successfully.", relativePath);
                        WriteTileNameAutogenerationSuccess(relativePath, targetRelativePath, _missileAutogenerateType);
                    }
                    else
                    {
                        Console.WriteLine("Autogenerated Missing Artifact Missile Tile {0}.", relativePath);
                        WriteTileNameAutogenerationError(relativePath, targetRelativePath, _missileAutogenerateType);
                    }
                    DrawImageToTileSet(missileBitmap);
                    StoreTileFile(file, missileBitmap.Size);
                    IncreaseCurXY();
                }
            }
            else
            {
                var subDir2  = name.ToFileName();
                var dirPath  = Path.Combine(BaseDirectory.FullName, subDir2);
                var fileName = name.ToFileName() + _typeSuffix[type] + Program.ImageFileExtension;

                var      relativePath = Path.Combine(_subDirName, subDir2, fileName);
                var      filePath     = Path.Combine(dirPath, fileName);
                FileInfo file         = new FileInfo(filePath);

                string   fileNameFloor     = name.ToFileName() + _typeSuffix[type] + _floorSuffix + Program.ImageFileExtension;
                string   relativePathFloor = Path.Combine(_subDirName, subDir2, fileNameFloor);
                string   filePathFloor     = Path.Combine(dirPath, fileNameFloor);
                FileInfo fileFloor         = hasFloorTile ? new FileInfo(filePathFloor) : null;

                //-----------------------------------------------
                // Template 1 is found under Artifacts directory
                //-----------------------------------------------
                string templateFileName = null;
                if (string.IsNullOrEmpty(subTypeName))
                {
                    templateFileName = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateSuffix + Program.ImageFileExtension;
                }
                else
                {
                    templateFileName = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateSuffix + "_" + subTypeName.ToDashed() + Program.ImageFileExtension;
                }

                string   templateDirPath      = BaseDirectory.FullName;
                string   templateRelativePath = Path.Combine(_subDirName, templateFileName);
                string   templateFilePath     = Path.Combine(templateDirPath, templateFileName);
                FileInfo templateFile         = new FileInfo(templateFilePath);

                //---------------------------------------------
                // Template 2 is found under Objects directory
                //---------------------------------------------
                string template2SubDir = objectType.ToFileName();

                string template2FileName = null;
                if (string.IsNullOrEmpty(subTypeName))
                {
                    template2FileName = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateSuffix + Program.ImageFileExtension;
                }
                else
                {
                    template2FileName = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateSuffix + "_" + subTypeName.ToDashed() + Program.ImageFileExtension;
                }

                string   template2DirPath      = Path.Combine(ObjectBaseDirectory.FullName, template2SubDir);
                string   template2RelativePath = Path.Combine(_objectSubDirName, template2SubDir, template2FileName);
                string   template2FilePath     = Path.Combine(template2DirPath, template2FileName);
                FileInfo template2File         = new FileInfo(template2FilePath);

                var subType = "";
                if (type != _typeNormal)
                {
                    subType = type;
                }

                if (file.Exists)
                {
                    using (var image = new Bitmap(Image.FromFile(file.FullName)))
                    {
                        using (var floorImage = GetFloorTile(fileFloor, hasFloorTile, subType, nameOrDesc, file))
                        {
                            DrawItemToTileSet(image, isFullSizeBitmap, mainTileAlignment, floorImage);
                            StoreTileFile(file, image.Size, new FloorTileData(fileFloor, hasFloorTile, subType, nameOrDesc));
                        }
                    }

                    Console.WriteLine("Compiled Artifact '{0}' successfully.", relativePath);
                    WriteTileNameSuccess(relativePath);
                }
                else if (templateFile.Exists)
                {
                    string templateFileNameFloor = null;
                    if (string.IsNullOrEmpty(subTypeName))
                    {
                        templateFileNameFloor = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateFloorSuffix + Program.ImageFileExtension;
                    }
                    else
                    {
                        templateFileNameFloor = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateFloorSuffix + "_" + subTypeName.ToDashed() + Program.ImageFileExtension;
                    }
                    string   templateFilePathFloor = Path.Combine(templateDirPath, templateFileNameFloor);
                    FileInfo templateFileFloor     = new FileInfo(templateFilePathFloor);

                    using (var image = CreateItemFromTemplate(templateFile, templateColor, subTypeCode, subTypeName))
                    {
                        using (var floorTemplateImage = GetFloorTileFromTemplate(templateFileFloor, templateColor, subTypeCode, subTypeName, hasFloorTile, subType, nameOrDesc, templateFile))
                        {
                            DrawItemToTileSet(image, isFullSizeBitmap, mainTileAlignment, floorTemplateImage);
                            StoreTileFile(templateFile, image.Size, false, true,
                                          new TemplateData(templateColor, subTypeCode, subTypeName),
                                          new FloorTileData(templateFileFloor, hasFloorTile, subType, nameOrDesc));
                        }
                    }

                    Console.WriteLine("Created Object {0} from Template {1} successfully.", relativePath, templateRelativePath);
                    WriteTileNameTemplateGenerationSuccess(relativePath, templateRelativePath);
                }
                else if (template2File.Exists)
                {
                    string template2FileNameFloor = null;
                    if (string.IsNullOrEmpty(subTypeName))
                    {
                        template2FileNameFloor = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateFloorSuffix + Program.ImageFileExtension;
                    }
                    else
                    {
                        template2FileNameFloor = objectTypeSingular.ToFileName() + _typeSuffix[type] + _templateFloorSuffix + "_" + subTypeName.ToDashed() + Program.ImageFileExtension;
                    }
                    string   template2FilePathFloor = Path.Combine(template2DirPath, template2FileNameFloor);
                    FileInfo template2FileFloor     = new FileInfo(template2FilePathFloor);

                    using (var image = CreateItemFromTemplate(template2File, templateColor, subTypeCode, subTypeName))
                    {
                        using (var floorTemplateImage = GetFloorTileFromTemplate(template2FileFloor, templateColor, subTypeCode, subTypeName, hasFloorTile, subType, nameOrDesc, template2File))
                        {
                            DrawItemToTileSet(image, isFullSizeBitmap, mainTileAlignment, floorTemplateImage);
                            StoreTileFile(template2File, image.Size, false, true,
                                          new TemplateData(templateColor, subTypeCode, subTypeName),
                                          new FloorTileData(template2FileFloor, hasFloorTile, subType, nameOrDesc));
                        }
                    }

                    Console.WriteLine("Created Object {0} from Template {1} successfully.", relativePath, template2RelativePath);
                    WriteTileNameTemplateGenerationSuccess(relativePath, template2RelativePath);
                }
                else
                {
                    Console.WriteLine("File '{0}' not found. Creating Missing Artifact icon.", file.FullName);
                    WriteTileNameErrorFileNotFound(relativePath, "Creating Missing Artifact icon.");

                    var missingTileCreator = isFullSizeBitmap ? MissingArtifactTileCreator : MissingArtifactFloorTileCreator;
                    using (var image = missingTileCreator.CreateTile(_artifactMissingTileType, subType, nameOrDesc))
                    {
                        using (var floorImage = GetFloorTile(fileFloor, hasFloorTile, subType, nameOrDesc, file))
                        {
                            DrawItemToTileSet(image, isFullSizeBitmap, mainTileAlignment, floorImage);
                        }
                    }
                }

                IncreaseCurXY();
            }
        }
Exemple #7
0
 public MissileData(string fileSuffix, MissileDirection direction)
 {
     FileSuffix = fileSuffix;
     Direction  = direction;
 }
        public Bitmap CreateMissile(Bitmap itemBitmap, MissileDirection direction)
        {
            MissileBitmapTransformation transformation = _transformations[direction];
            Bitmap targetBitmap = new Bitmap(Program.MaxTileSize.Width, Program.MaxTileSize.Height);

            targetBitmap.SetResolution(itemBitmap.HorizontalResolution, itemBitmap.VerticalResolution);

            if (itemBitmap.Size == Program.ItemSize)
            {
                using (Graphics gTargetBitmap = Graphics.FromImage(targetBitmap))
                {
                    if (transformation.Rotation == 0f)
                    {
                        int x = (targetBitmap.Width - itemBitmap.Width) / 2;
                        int y = (targetBitmap.Height - itemBitmap.Height) / 2;
                        gTargetBitmap.DrawImage(itemBitmap, x, y);
                        if (transformation.FlipHorizontally)
                        {
                            targetBitmap.RotateFlip(RotateFlipType.RotateNoneFlipX);
                        }
                        return(targetBitmap);
                    }
                    else
                    {
                        //Create square bitmap
                        int sideLength = Math.Min(Program.MaxTileSize.Width, Program.MaxTileSize.Height);
                        using (Bitmap centerBitmap = new Bitmap(sideLength, sideLength))
                        {
                            centerBitmap.SetResolution(itemBitmap.HorizontalResolution, itemBitmap.VerticalResolution);
                            using (Graphics gCenterBitmap = Graphics.FromImage(centerBitmap))
                            {
                                int x = (centerBitmap.Width - itemBitmap.Width) / 2;
                                int y = (centerBitmap.Height - itemBitmap.Height) / 2;
                                gCenterBitmap.DrawImage(itemBitmap, x, y);
                            }
                            RotateSquareBitmap(targetBitmap, gTargetBitmap, centerBitmap, transformation);
                            return(targetBitmap);
                        }
                    }
                }
            }
            else if (itemBitmap.Size == Program.MaxTileSize)
            {
                using (Graphics gTargetBitmap = Graphics.FromImage(targetBitmap))
                {
                    if (transformation.Rotation == 0f)
                    {
                        gTargetBitmap.DrawImage(itemBitmap, 0, 0);
                        if (transformation.FlipHorizontally)
                        {
                            targetBitmap.RotateFlip(RotateFlipType.RotateNoneFlipX);
                        }
                        return(targetBitmap);
                    }
                    else
                    {
                        //Create square bitmap
                        int sideLength = Math.Min(Program.MaxTileSize.Width, Program.MaxTileSize.Height);
                        int x          = (itemBitmap.Width - sideLength) / 2;
                        int y          = (itemBitmap.Height - sideLength) / 2;
                        using (Bitmap centerBitmap = itemBitmap.Clone(new Rectangle(new Point(x, y), new Size(sideLength, sideLength)), itemBitmap.PixelFormat))
                        {
                            centerBitmap.SetResolution(itemBitmap.HorizontalResolution, itemBitmap.VerticalResolution);
                            using (Graphics gCenterBitmap = Graphics.FromImage(centerBitmap))
                            {
                                gCenterBitmap.DrawImage(itemBitmap, x, y);
                            }
                            RotateSquareBitmap(targetBitmap, gTargetBitmap, centerBitmap, transformation);
                            return(targetBitmap);
                        }
                    }
                }
            }
            else
            {
                throw new Exception(string.Format("Image for missile creations is of wrong size: {0}x{1}.", itemBitmap.Width, itemBitmap.Height));
            }
        }