中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

Silverlight 2.5D RPG游戲技巧與特效處理:(二)紙娃娃系統(tǒng)

  紙娃娃系統(tǒng),或許大家聽起來并不陌生。早在十幾年前,當時不論是文字游戲“泥巴(Mud)”或是交友、社交網(wǎng)站,我們只能通過屏幕上的文字來傳達與交互信息;隨著技術(shù)不斷進步,2D/3D圖形技術(shù)高速崛起,通過在基礎(chǔ)模型上由客戶隨意挑選、任意更換各種造型(素材),即可打造出真正屬于“自我”獨特風格的網(wǎng)絡(luò)虛擬形象,QQ秀便是我們耳熟能詳?shù)拇恚N近真實的如(RPG)游戲及虛擬現(xiàn)實中的換裝/換膚系統(tǒng)同樣亦得益于紙娃娃機制。

  本節(jié),我將向大家講解如何最好的實現(xiàn)Silverlight 2.5D網(wǎng)絡(luò)游戲中的紙娃娃系統(tǒng),以最大程度控制性能損失為前提,將游戲資源占用最小化,綜合效果及用戶體驗最優(yōu)化。

  以《Silverlight MMORPG網(wǎng)頁游戲開發(fā)課程(Game Lesson)一期》的源碼為基礎(chǔ),我將其再一次的進行了大規(guī)模重構(gòu)。

  素材來源于網(wǎng)絡(luò),取《封神榜3》中的角色系統(tǒng)(紙娃娃系統(tǒng))做示例,每個角色大致都包含3個部件:鎧甲(身體)、武器、騎乘(乘)等,而其中的騎乘道具又由2個部份組成,比如異人(弓手)的翅膀分為左右兩支;甲士(戰(zhàn)士)的坐騎分為前后兩半;而方士(法師)的飛劍則僅為單獨對象:

  2D/2.5D游戲中角色帶翅膀飛行要考慮左右翼與身體的層次關(guān)系,騎馬則需要考慮馬頭/馬尾與身體間的層次問題。而且武器長短,角色朝向,行為姿勢等也都可能影響到各部件的層次關(guān)系。因此,一些游戲為了簡化設(shè)計,同時又不失華麗,便誕生了比如“踏云”,“御劍”,“乘鶴”,“踩蝶”等諸多天馬行空的駕馭模式,這些乘具的共同點就是均被踩在腳上,自然而然處理起來更簡單明了。當然,如果角色是3D模型的話則無需考慮這么多層疊關(guān)系。

  鑒于以上的參考分析,在Silverlight中構(gòu)造裝備紙娃娃系統(tǒng)框架便會輕松很多。暫時以帶翅膀的弓手為例子,依葫蘆畫瓢,我們首先新建如下幾個類:

  如圖,EquipBase乃裝備(紙娃娃)系統(tǒng)中的核心,所有的裝備部件類比如鎧甲(身體)Armor/武器Weapon/翅膀Wing/坐騎Ride均繼承自該類:

    /// <summary>
/// 裝備部件基類
/// </summary>
public abstract class EquipBase : ObjectBase {

/// <summary>
/// 加載完畢
/// </summary>
public event EventHandler Ready;

/// <summary>
/// 獲取或設(shè)置部件名
/// </summary>
protected string partName { get; set; }

long index = 0; // 異步加載與換裝同步協(xié)調(diào)
public override int Code {
get { return base.Code; }
set {
index
++;
if (value == -1) { base.Code = value; return; }
string key = string.Format("{0}{1}", partName, value);
if (Res.ContainsKey(key)) {
base.Code = value;
loadConfig(key);
}
else {
Downloader downloader
= new Downloader();
downloader.OpenReadCompleted
+= new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
downloader.OpenReadAsync(
string.Format("{0}{1}.xap", partName, value), string.Format("{0},{1}", index, value), 2000);
}
}
}

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) {
Downloader downloader
= sender as Downloader;
downloader.OpenReadCompleted
-= webClient_OpenReadCompleted;
string[] str = e.UserState.ToString().Split(',');
if (Convert.ToInt64(str[0]) == index) {
int code = Convert.ToInt32(str[1]);
string key = string.Format("{0}{1}", partName, str[1]);
if (!Res.ContainsKey(key)) { Res.Add(key, new StreamResourceInfo(e.Result as Stream, "application/binary")); }
base.Code = code;
loadConfig(key);
}
}

Dictionary
<string, Point> frameOffset = new Dictionary& lt;string, Point>(); //各幀偏移
/// <summary>
/// 加載配置
/// </summary>
void loadConfig(string key) {
XElement info
= XElement.Load(Application.GetResourceStream(Res[key], new Uri("Info.xml", UriKind.Relative)).Stream).DescendantsAndSelf(partName).Single();
FullName
= info.Attribute("FullName").Value;
// 解析各幀偏移
IEnumerable<XElement> iFrame = info.Element("Frames").Elements();
frameOffset.Clear();
foreach (XElement element in iFrame) {
frameOffset.Add(element.Attribute(
"ID").Value, new Point() {
X
= (double)element.Attribute("OffsetX"),
Y
= (double)element.Attribute("OffsetY"),
});
}
if (Ready != null) { Ready(this, null); }
}

bool _IsTurn;
/// <summary>
/// 獲取或設(shè)置是否水平翻轉(zhuǎn)
/// </summary>
public bool IsTurn {
get { return _IsTurn; }
set {
if (_IsTurn != value) {
Transform
= (_IsTurn = value) ? scaleTransform : null;
}
}
}

bool _Flash;
/// <summary>
/// 獲取或設(shè)置是否閃光
/// </summary>
public bool Flash {
get { return _Flash; }
set {
if (_Flash != value) {
//if (_Flash = value) {
// dispatcherTimer.Start();
//} else {
// this.Opacity = 1;
// dispatcherTimer.Stop();
//}
this.Opacity = (_Flash = value) ? 0.4 : 1;
}
}
}

bool order = false;
DispatcherTimer dispatcherTimer
= new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(100) }; // 換裝時的閃光特效計時器
public EquipBase() {
dispatcherTimer.Tick
+= new EventHandler(dispatcherTimer_Tick);
}

void dispatcherTimer_Tick(object sender, EventArgs e) {
if (order) {
this.Opacity = this.Opacity + 0.1;
if (this.Opacity >= 1) { order = false; }
}
else {
this.Opacity = this.Opacity - 0.1;
if (this.Opacity <= 0.3) { order = true; }
}
}

static Dictionary<string, Stream> equipRes = new Dictionary<string, Stream>();

ScaleTransform scaleTransform
= new ScaleTransform() { ScaleX = -1 };
/// <summary>
/// 呈現(xiàn)幀圖
/// </summary>
public void Display(string key) {
string resKey = string.Format("{0}{1}{2}", partName, Code, key);
if (!equipRes.ContainsKey(resKey)) {
equipRes.Add(resKey, Application.GetResourceStream(Res[
string.Format("{0}{1}", partName, Code)], new Uri(string.Format("{0}.png", key), UriKind.Relative)).Stream);
}
this.StreamSource = equipRes[resKey];
this.InternalOffset = frameOffset[key];
if (IsTurn) { scaleTransform.CenterX = Center.X - frameOffset[key].X; }
}

public override void Dispose(object sender, EventArgs e) {
dispatcherTimer.Stop();
dispatcherTimer.Tick
-= dispatcherTimer_Tick;
base.Dispose(sender, e);
}
}

NET技術(shù)Silverlight 2.5D RPG游戲技巧與特效處理:(二)紙娃娃系統(tǒng),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久综合一区 | 激情伊人网 | 自拍偷拍精品 | 天堂色综合| 午夜精品久久久久久 | 一区二区三区视频 | 久久久久久久久久久久久久久久久久久久 | 国产免费观看视频 | 国产一级一级毛片 | 中文字幕日韩av | 九色视频网站 | 北条麻妃99精品青青久久主播 | 51ⅴ精品国产91久久久久久 | 日日夜夜精品视频 | 男女羞羞免费视频 | 狠狠干五月天 | 日韩成人精品 | 九九综合九九 | 欧美精品一区二区三 | 亚洲一区二区精品视频在线观看 | 亚洲免费观看视频 | 国产亚洲一区二区在线观看 | 国产精品国产三级国产aⅴ中文 | 久久高清 | 国产欧美精品 | 亚洲福利在线视频 | 久久久.com| 中文字幕视频在线 | 国产精品久久久久久婷婷天堂 | 国产精品久久久久av | 亚洲福利av | 欧美精品在线播放 | 日韩一区二区在线免费观看 | 久久精品手机视频 | 奇米超碰 | 国产一区二区三区在线 | 亚洲精选久久 | 波多野结衣一区二区 | 在线看片网站 | 黑人精品欧美一区二区蜜桃 | 日本成人片在线观看 |