/// <summary> /// 重绘精灵 /// </summary> /// <param name="id">精灵id</param> /// <param name="vector">精灵所在向量</param> /// <param name="rType">资源类型</param> /// <param name="descriptor">精灵描述子</param> /// <param name="forceReload">是否强制重新载入资源文件</param> private void ReDrawSprite(int id, List<YuriSprite> vector, ResourceType rType, SpriteDescriptor descriptor, bool forceReload) { // 不需要重绘的情况 if (descriptor == null) { return; } YuriSprite sprite = vector[id], newSprite = null; // 强制重新载入或资源名称不同时重新加载资源文件 if (sprite == null || sprite.ResourceName != descriptor.ResourceName || forceReload) { switch (rType) { case ResourceType.Background: vector[id] = newSprite = ResourceManager.GetInstance().GetBackground(descriptor.ResourceName, descriptor.CutRect); break; case ResourceType.Stand: vector[id] = newSprite = ResourceManager.GetInstance().GetCharacterStand(descriptor.ResourceName, descriptor.CutRect); break; case ResourceType.Pictures: vector[id] = newSprite = ResourceManager.GetInstance().GetPicture(descriptor.ResourceName, descriptor.CutRect); break; } } // 重绘精灵 this.RemoveSprite(sprite); this.DrawSprite(newSprite, descriptor); }
/// <summary> /// 为屏幕增加一个图片精灵描述子 /// </summary> /// <param name="id">图片的id</param> /// <param name="source">资源名称</param> /// <param name="X">左上角在画面的X坐标</param> /// <param name="Y">左上角在画面的Y坐标</param> /// <param name="Z">Z坐标</param> /// <param name="Angle">角度</param> /// <param name="Opacity">不透明度</param> /// <param name="anchor">锚点类型</param> /// <param name="cut">纹理切割矩</param> public void AddPicture(int id, string source, double X, double Y, int Z, double ScaleX, double ScaleY, double Angle, double Opacity, SpriteAnchorType anchor, Int32Rect cut) { SpriteDescriptor sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Pictures, ResourceName = source, X = X, Y = Y, Z = Z + GlobalDataContainer.GAME_Z_PICTURES, ScaleX = ScaleX, ScaleY = ScaleY, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; this.pictureDescVec[id] = sd; }
/// <summary> /// 为主窗体描绘一个精灵 /// </summary> /// <param name="sprite">精灵</param> /// <param name="descriptor">精灵描述子</param> private void DrawSprite(YuriSprite sprite, SpriteDescriptor descriptor) { if (sprite == null) { return; } Image spriteImage = new Image(); BitmapImage bmp = sprite.SpriteBitmapImage; spriteImage.Width = bmp.PixelWidth; spriteImage.Height = bmp.PixelHeight; spriteImage.Source = bmp; spriteImage.Opacity = descriptor.Opacity; sprite.CutRect = descriptor.CutRect; sprite.DisplayBinding = spriteImage; sprite.Anchor = descriptor.AnchorType; Canvas.SetLeft(spriteImage, descriptor.X); Canvas.SetTop(spriteImage, descriptor.Y); Canvas.SetZIndex(spriteImage, descriptor.Z); spriteImage.Visibility = Visibility.Visible; this.view.BO_MainGrid.Children.Add(spriteImage); sprite.InitAnimationRenderTransform(); SpriteAnimation.RotateToAnimation(sprite, TimeSpan.FromMilliseconds(0), descriptor.Angle, 0); SpriteAnimation.ScaleToAnimation(sprite, TimeSpan.FromMilliseconds(0), descriptor.ScaleX, descriptor.ScaleY, 0, 0); }
/// <summary> /// 为屏幕增加一个立绘精灵描述子 /// </summary> /// <param name="id">立绘位置id号</param> /// <param name="source">资源名称</param> /// <param name="X">左上角在画面的X坐标</param> /// <param name="Y">左上角在画面的Y坐标</param> /// <param name="Z">Z坐标</param> /// <param name="Angle">角度</param> /// <param name="Opacity">不透明度</param> /// <param name="anchor">锚点类型</param> /// <param name="cut">纹理切割矩</param> public void AddCharacterStand(int id, string source, double X, double Y, int Z, double Angle, double Opacity, SpriteAnchorType anchor, Int32Rect cut) { SpriteDescriptor sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Stand, ResourceName = source, X = X, Y = Y, Z = Z + GlobalDataContainer.GAME_Z_CHARACTERSTAND, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; this.characterDescVec[id] = sd; }
/// <summary> /// 为屏幕增加一个立绘精灵描述子 /// </summary> /// <param name="id">立绘位置id号</param> /// <param name="source">资源名称</param> /// <param name="cst">立绘位置枚举</param> /// <param name="Z">Z坐标</param> /// <param name="Angle">角度</param> /// <param name="Opacity">不透明度</param> /// <param name="anchor">锚点类型</param> /// <param name="cut">纹理切割矩</param> public void AddCharacterStand(int id, string source, CharacterStandType cst, int Z, double Angle, double Opacity, SpriteAnchorType anchor, Int32Rect cut) { SpriteDescriptor sd = null; switch (cst) { case CharacterStandType.Left: sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Stand, ResourceName = source, X = GlobalDataContainer.GAME_CHARACTERSTAND_LEFT_X, Y = GlobalDataContainer.GAME_CHARACTERSTAND_LEFT_Y, Z = Z + GlobalDataContainer.GAME_Z_CHARACTERSTAND, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; break; case CharacterStandType.MidLeft: sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Stand, ResourceName = source, X = GlobalDataContainer.GAME_CHARACTERSTAND_MIDLEFT_X, Y = GlobalDataContainer.GAME_CHARACTERSTAND_MIDLEFT_Y, Z = Z, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; break; case CharacterStandType.Mid: sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Stand, ResourceName = source, X = GlobalDataContainer.GAME_CHARACTERSTAND_MID_X, Y = GlobalDataContainer.GAME_CHARACTERSTAND_MID_Y, Z = Z, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; break; case CharacterStandType.MidRight: sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Stand, ResourceName = source, X = GlobalDataContainer.GAME_CHARACTERSTAND_MIDRIGHT_X, Y = GlobalDataContainer.GAME_CHARACTERSTAND_MIDRIGHT_Y, Z = Z, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; break; case CharacterStandType.Right: sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Stand, ResourceName = source, X = GlobalDataContainer.GAME_CHARACTERSTAND_RIGHT_X, Y = GlobalDataContainer.GAME_CHARACTERSTAND_RIGHT_Y, Z = Z, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; break; } this.characterDescVec[id] = sd; }
/// <summary> /// 为屏幕增加一个按钮描述子 /// </summary> /// <param name="id">按钮的id</param> /// <param name="enable">是否可点击</param> /// <param name="X">左上角在画面的X坐标</param> /// <param name="Y">左上角在画面的Y坐标</param> /// <param name="jumpTarget">按下后要跳转的标签名</param> /// <param name="funcCallSign">函数调用签名</param> /// <param name="type">按钮存续类型</param> /// <param name="normalDesc">正常时的精灵描述子</param> /// <param name="overDesc">鼠标悬停时的精灵描述子</param> /// <param name="onDesc">鼠标按下时的精灵描述子</param> public void AddButton(int id, bool enable, double X, double Y, string jumpTarget, string funcCallSign, string type, SpriteDescriptor normalDesc, SpriteDescriptor overDesc = null, SpriteDescriptor onDesc = null) { SpriteButtonDescriptor sbd = new SpriteButtonDescriptor() { Enable = enable, X = X, Y = Y, Z = GlobalDataContainer.GAME_Z_BUTTON + id, JumpLabel = jumpTarget, InterruptFuncSign = funcCallSign, NormalDescriptor = normalDesc, OverDescriptor = overDesc, OnDescriptor = onDesc, Opacity = 1.0, Eternal = type == "once" ? false : true }; this.buttonDescVec[id] = sbd; }
/// <summary> /// 为屏幕增加一个选择支描述子 /// </summary> /// <param name="id">选择支按钮id</param> /// <param name="X">左上角在画面的X坐标</param> /// <param name="Y">左上角在画面的Y坐标</param> /// <param name="jumpTarget">按下后要跳转的标签名</param> /// <param name="text">选择支按钮上的文本</param> /// <param name="normalDesc">正常时的精灵描述子</param> /// <param name="overDesc">鼠标悬停时的精灵描述子</param> /// <param name="onDesc">鼠标按下时的精灵描述子</param> public void AddBranchButton(int id, double X, double Y, string jumpTarget, string text, SpriteDescriptor normalDesc, SpriteDescriptor overDesc = null, SpriteDescriptor onDesc = null) { BranchButtonDescriptor bbd = new BranchButtonDescriptor() { Id = id, JumpTarget = jumpTarget, X = X, Y = Y, Z = GlobalDataContainer.GAME_Z_BRANCHBUTTON + id, Text = text, NormalDescriptor = normalDesc, OverDescriptor = overDesc, OnDescriptor = onDesc }; this.branchDescVec[id] = bbd; }
/// <summary> /// 为屏幕增加一个背景精灵描述子 /// </summary> /// <param name="id">背景层的类型:0-背景 1-前景</param> /// <param name="source">资源名称</param> /// <param name="X">左上角在画面的X坐标</param> /// <param name="Y">左上角在画面的Y坐标</param> /// <param name="Z">Z坐标</param> /// <param name="Angle">角度</param> /// <param name="Opacity">不透明度</param> /// <param name="anchor">锚点类型</param> /// <param name="cut">纹理切割矩</param> public void AddBackground(int id, string source, double X, double Y, int Z, double Angle, double Opacity, double ScaleX, double ScaleY, SpriteAnchorType anchor, Int32Rect cut) { SpriteDescriptor sd = new SpriteDescriptor() { Id = id, ResourceType = ResourceType.Background, ResourceName = source, X = X, Y = Y, Z = Z + GlobalDataContainer.GAME_Z_BACKGROUND, ScaleX = ScaleX, ScaleY = ScaleY, Angle = Angle, Opacity = Opacity, AnchorType = anchor, CutRect = cut }; this.backgroundDescVec[id] = sd; }
/// <summary> /// 演绎函数:放置按钮 /// </summary> /// <param name="id">按钮id</param> /// <param name="enable">按钮是否可点击</param> /// <param name="x">X坐标</param> /// <param name="y">Y坐标</param> /// <param name="target">跳转目标</param> /// <param name="funcsign">中断函数调用签名</param> /// <param name="normal">正常图资源名</param> /// <param name="over">悬停图资源名</param> /// <param name="on">按下图资源名</param> /// <param name="type">存续类型</param> private void Button(int id, bool enable, double x, double y, string target, string funcsign, string normal, string over, string on, string type) { SpriteDescriptor normalDesc = new SpriteDescriptor() { ResourceName = normal }, overDesc = null, onDesc = null; if (over != "") { overDesc = new SpriteDescriptor() { ResourceName = over }; } if (on != "") { onDesc = new SpriteDescriptor() { ResourceName = on }; } Director.ScrMana.AddButton(id, enable, x, y, target, funcsign, type, normalDesc, overDesc, onDesc); this.viewMana.Draw(id, ResourceType.Button); }
/// <summary> /// 选择项 /// </summary> /// <param name="linkStr">选择项跳转链</param> private void Branch(string linkStr) { // 处理跳转链 List<KeyValuePair<string, string>> tagList = new List<KeyValuePair<string, string>>(); string[] linkItems = linkStr.Split(';'); foreach (var linkItem in linkItems) { string[] linkPair = linkItem.Split(','); if (linkPair.Length == 2) { tagList.Add(new KeyValuePair<string,string>(linkPair[0].Trim(), linkPair[1].Trim())); } else { CommonUtils.ConsoleLine(String.Format("Ignore Branch Item: {0}", linkItem), "UpdateRender", OutputStyle.Error); } } if (tagList.Count == 0) { return; } // 处理按钮显示参数 double GroupX = GlobalDataContainer.GAME_WINDOW_WIDTH / 2.0 - GlobalDataContainer.GAME_BRANCH_WIDTH / 2.0; double BeginY = GlobalDataContainer.GAME_WINDOW_ACTUALHEIGHT / 2.0 - (GlobalDataContainer.GAME_BRANCH_HEIGHT * 2.0) * (tagList.Count / 2.0); double DeltaY = GlobalDataContainer.GAME_BRANCH_HEIGHT; // 描绘按钮 for (int i = 0; i < tagList.Count; i++) { SpriteDescriptor normalDesc = new SpriteDescriptor() { ResourceName = GlobalDataContainer.GAME_BRANCH_BACKGROUNDNORMAL }, overDesc = new SpriteDescriptor() { ResourceName = GlobalDataContainer.GAME_BRANCH_BACKGROUNDSELECT }, onDesc = new SpriteDescriptor() { ResourceName = GlobalDataContainer.GAME_BRANCH_BACKGROUNDSELECT }; Director.ScrMana.AddBranchButton(i, GroupX, BeginY + DeltaY * 2 * i, tagList[i].Value, tagList[i].Key, normalDesc, overDesc, onDesc); this.viewMana.Draw(i, ResourceType.BranchButton); } // 追加等待 Director.RunMana.UserWait("UpdateRender", String.Format("BranchWaitFor:{0}", linkStr)); }