//把导弹从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(); }
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(); } }
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)); } }