2007年12月31日 星期一

Friendly.Flickr V2.7.2.2 released

http://richielin-programer.blogspot.com/2007/12/friendlyflickr-v2700-released.html

感謝 aren 的建議,補上群組上傳限制的資訊

更新項目

1. 上傳照片頁面,在群組顯示區補上上傳限制的資訊

檔案下載: Firendly.Flickr V2.7.2.2

---我是分隔線---

感謝 paichia 的建議
這小改版還是將指定相片為相片集封面的功能又先做回來了,但未做完整規劃
有幾項缺點必須先說明一下

1. 當一張相片設為封面,且指定二組相片集時
會變成該二組相片集都是以它為封面
2. 未判斷同一相片集只能指定一張相片當封面
所以當有二張相片都指定為同一組相片集封面時,將會以後來上傳的相片為相片集

所以請儘量手動避開上述情況

更新項目

1. 將上傳相片時指定某張相片為相片集封面的功能取回

檔案下載: Firendly.Flickr V2.7.2.1

---我是分隔線---

更新項目

1. 修正批次下載無法正常下載的問題

檔案下載: Firendly.Flickr V2.7.2.0

---我是分隔線---

更新項目

1. 修正編輯相片資訊時無法設定取代此照片的問題
2. 修正搜尋相片集相片時,相片公開、對家人公開、對朋友公開三選項會錯誤的問題
3. 修正軟體穩定性

檔案下載: Firendly.Flickr V2.7.1.0

---我是分隔線---

新年快樂! 不知道各位朋友 2007 年過得如何?
但無論 2007 年是不是如你所願,也邁向展新的 2008 年了
新的一年有新的生活、新的希望
Friendly.Flickr 也跟著更新版本了

這一次更新比較多項目,且 2008 年 release 時版號總得再進一版了
主要是加入每張相片可以分別指定相片集 (set)及上傳相片旋轉功能
所以更新為 V2.7.0.0

更新項目

1. 加入連絡人相片及相片集相片 Cache 機制,可加快每次軟體開啟時顯示連絡人及相片集相片速度
2. 每張相片可以分別指定相片集,且一張相片可指定多組相片集
3. 上傳相片時可以指定相片型態及安全等級
4. 修正軟體視覺效果,變得更美觀一點了
5. 上傳相片加入旋轉照片的功能
6. 點二下相片來放大瀏覽相片時,加入顯示相片資訊的功能
7. 加入判斷上傳的相片不可超過 Flickr 的相片大小限制
8. 修正指定 GPX 檔案後再加入上傳照片,沒有自動判斷 GPS 座標的問題

檔案下載: Firendly.Flickr V2.7.0.0

2007年12月23日 星期日

Friendly.Flickr 多國語言機制

http://richielin-programer.blogspot.com/2007/12/friendlyflickr.html

還記得天秤說過要加入多國語言機制嗎?
現在天秤已經把軟體中所有的中文字取出,做成 Excel 檔案了
也完成多國語言機制的準備
所以把語言檔提供給想幫忙翻譯的人,發揮你的長才!

另外預告一下,天秤已完成上傳相片時加入旋轉功能及相片可分別指定相片集功能
預計與多國語言(至少英文版)完成時再一起釋出
請各位幫忙一下了

Excel 語言檔案內容如下:
image

把左邊中文,翻譯成你會的語言 (例如 英文),寫在英文的 Column 中
且不限英文,簡體中文、日文、韓文、法文、德文等任何語言都行
不過請在綠色的欄位上寫上正確的語言名稱哦
翻譯時請注意保留特殊字元,如 (&T), {0}, \n 或是標點符號及空白
再 mail 給天秤即可,感謝~

PS. 下載的壓縮檔內含的 Excel 及文字檔為相同內容,如無 Excel 軟體或無法開啟,請以文字檔翻譯即可~

Excel 語言檔下載: Friendly.Flickr 多國語系壓縮檔
完成後請 Email 給天秤: richielin996@gmail.com

2007年12月15日 星期六

Flickr 上有一堆上傳錯誤的照片,怎麼辦?

http://richielin-programer.blogspot.com/2007/12/flickr.html

不知道有沒有人像天秤一樣迷糊,上傳了一堆照片到 Flickr 上
卻發現上傳的照片都錯誤了!!
有時候是尺寸不對了 (要上傳原尺寸的卻傳成 640*480 尺寸的)
有時候是忘了替照片加框或忘了後製一下
甚至日後想替照片加上浮水印怎麼辦?
砍掉重練? 又不是玩 Online Game~
一堆照片的標題、說明、標籤、座標都寫好了,怎麼可能砍掉重練?
如果你也遇過這些問題,那就用 Friendly.Flickr 來幫忙解決問題好了

解決這個問題有二種方式
1. 上傳錯的照片數量不多時那就簡單了,直接用新照片取代舊照片就好了
2. 如果照片是一大堆? 那就真的砍掉重練好了 (當然也是有技巧的)

##CONTINUE##

1. 上傳錯的照片數量不多時那就簡單了,直接用新照片取代舊照片就好了

這裡又有兩種作法,一種是以 Flickr 網頁操作,一種是透過 Friendly.Flickr

A. Flickr 網頁上就有取代照片的方式,直接使用即可
但就算只有幾張,還是得一張一張點選,一張一張上傳
有點麻煩就是了
image

B. 用 Friendly.Flickr 來指定數張照片取代舊照片,一次完成
當然可以多張照片一次設定完成後,再按確定讓軟體慢慢上傳
不用一張一張點選網頁,還得浪費等待時間
image

2. 如果照片是一大堆? 那就真的砍掉重練好了

是的,天秤沒說錯,不過還是要有點技巧的
首先先將照片備份下載,不管是按右鍵另存新檔
(在清單模式下操作必須勾選取得照片說明選項)
image

還是批次下載
image

最重要的是記得保留照片資訊
image

image

等待下載完成,至於 Flickr 上的照片就看你是否要刪除了
回到剛下載的目錄
可以看到每張照片都會有一個同檔名的 xml 檔案
image

現在可以開始把剛才下載的舊照片換成新的照片了,記得照片必須取與舊照片相同名稱
或是把 xml 檔案名稱改成與照片檔案名稱相同
修改完成後,接下來再用 Friendly.Flickr 上傳
可以發現要上傳的照片標題、說明、標籤、座標都保留下來了

然後呢? 不用天秤說了吧,開始上傳吧~
Enjoy Life with Photography

2007年12月13日 星期四

Google Map 上顯示景點照片及分享

http://richielin-programer.blogspot.com/2007/12/google-map.html


檢視較大的地圖

喜歡攝影的朋友,通常旅遊後總會拍一堆照片回家並放上 Flickr
但光是在 Flickr 瀏覽照片是不是總覺得不太夠
如果可以和地圖結合,在地圖上秀出你的旅遊足跡是很棒的概念
甚至提供給朋友分享你的喜悅

其實 Google Map 也可以使用 Google Earth 的格式檔案 .Kml 或 .Kmz
只要把 .Kml 或 .Kmz 放至開放的網路空間上即可
所以要在 Google Map 顯示景點,並秀出 Flickr 上的照片
以 Friendly.Flickr 來處理是非常方便的

天秤就示範從最開始的上傳至 Flickr 到最後的 Google Map 顯示操作,大致上步驟如下:
1. 上傳照片至 Flickr 上,並標上 GPS 座標
2. 搜尋照片並產生 Kmz 檔案
3. 放上開放的網路空間,並由 Google Map 顯示景點
4. 將 Google Map 景點連結分享給朋友或保存

##CONTINUE##

1. 上傳照片至 Flickr 上,並標上 GPS 座標

為照片標上 GPS 座標可以三種方式來完成後上傳至 Flickr  
A. 以照片本身 EXIF 上的 GPS 座標: 當然這得相機本身有此功能才行
B. 匯入 GPX 檔案: 拍照時候身邊有台 GPS 軌跡記錄器並儲存成 GPX 檔案
PS. 不要選擇匯出成 Google Earth KML 檔,後面有說明為什麼~ 
image
C. 直接在 Google Map 地圖上定位
image

出現此視窗後直接在地圖上定位
image

2. 搜尋照片並產生 Kmz 檔案

依條件搜尋出照片後,按下 "KML 產生視窗" 的按鈕
並拖曳選擇的照片到開啟的視窗上方容器內
image

打上 KMZ 的資料,如名稱及說明
此處的名稱及說明是指 KMZ 檔案的名稱及說明,不是指各張照片的名稱及說明
排版部份才是在 Google Map 上點選各張照片時,顯示出來的資訊
其為 HTML 格式,至於使用的標籤及方式與進階排版相同
另外一點,KMZ 檔案也可以鑲入照片,
只要把硬碟上照片拖曳入上方的容器內
"硬碟中照片" 即為鑲入照片的顯示資訊,且標籤用法相似,就不再另外說明了
PS. 剛才有提到不要用第一點的方式產生 KMZ 檔,因為在此產生才可依標籤來自訂顯示內容
及加入 Track 或 Point 等功能,彈性比較大

image

按下建立選擇檔案路徑名稱即可儲存,此處範例儲存為 hokkaido.kmz

3. 放上開放的網路空間,並由 Google Map 顯示景點

將剛才的 hokkaido.kmz 上傳至網路空間
如免費的 Google Page Creater (只要有 Google 帳號即可使用)
或 Hinet 等 ISP 提供的網路空間都行,並得知該檔案的 Url
以 Google Page Creater 為例,只要登入後,在右側按 Browse 並選擇檔案即可上傳
並在上傳後的檔案按右鍵 "覆製捷徑" 取得檔案連結 Url
image

此範例為上傳至 Google Page Creater 上,Url 為
http://richielin996.googlepages.com/hokkaido.kmz
到 Google Map 上,將剛才的 Url 填入 TextBox 中
Google Map 會至該網路空間讀取 KMZ 檔並顯示出所有景點
PS. Google Map 其實還有限制 KMZ 檔案大小,如果 KMZ 檔案太大是會讀取失敗的
所以不要放太多景點或路徑的檔案讓它讀取
 image

讀取成功後,左側會出現該檔的所有景點
點選後右側就會出現該景點資訊,並且顯示第二步驟的 HTML 資訊
如範例所示,即出現該景點照片及說明
image

4. 將 Google Map 景點連結分享給朋友或保存

點右側的連結 "連結此網頁",可以取得一組連結和 HTML 語法
將該連結分享的朋友,只要以此開啟此連結就可回到該 Google Map 及景點
或是將 HTML 語法鑲入部落格中也行
image

現在開始把你的旅遊足跡分享給大家吧~
Enjoy Life with Photography

2007年12月11日 星期二

Friendly.Flickr V2.6.5.2 released

http://richielin-programer.blogspot.com/2007/12/friendlyflickr-v2650-released.html

主要修正了清單模式下未勾選取得照片說明時,則照片的 Url 會失敗的問題

另外有朋友發現清單模式下與一般模式下 Tag 的排列順序不同
導致進階排版 {tag1}, {tag2} 取得的字串會不同
這點天秤做點說明
因為一般模式下,照片都會取得詳細資料 (需要比較長的時間取得)
所以 Tag 排列方式會與 Flickr 上網頁相同
但是清單模式下如果沒有取得詳細資料 (沒有勾選取得照片說明)
只由搜尋時候的回傳值來得知 Tag,速度快但排列順序可能與 Flickr 上的網頁不同了
這點不知為何,由 Flickr 回應的封包中 Tag 排列順序就是如此怪
也許是 Flickr API 的 Bug,也許是另有用意
總之如果以清單模式下希望 Tag 順序與 Flickr 上相同,以便應用 {tag1} 等語法時
請勾選 "取得照片說明" 這個選項吧,但會犧牲了搜尋速度
請自行衡量~
因為這點 Flickr 回應封包的訊息就是如此怪,天秤也無能無力了

更新項目

1. 在照片上右鍵選單上,可以一次覆製多張照片 URL 了
2. 修正清單模式下未取得照片說明時,照片連結會取得失敗的問題
3. 修正 WLW plugin 讀取圖片失敗的問題

檔案下載: Firendly.Flickr V2.6.5.2

---我是分隔線---

修正了一些不會影響操作及不是常態性的 Bug
為了不太常更新而影響使用者,所以日後不是大改版或是修正嚴重 Bug 時
並不做版本更新通知
請有該 Bug 困擾的使用者麻煩上天秤的部落格注意一下是否有更新版本了

更新項目

1. 修正剛執行軟體但連結人資料未自 Flickr 上取得時,點選連結人按鈕會 Crash 的問題
2. 修正清單模式下進階排版的 {tag1}, {tag2} ... 標籤失效的問題
3. 刪除照片改成背景執行,避免大量刪除照片時造成軟體卡住

檔案下載: Firendly.Flickr V2.6.5.1

---我是分隔線---

真是愈寫愈回去了,光個批次下載 Original Url 一直搞不定
前一版本才修正,後一版本又發生同樣錯誤了
此版主要就是修正批次下載 Original Url 錯誤的問題,抱歉~
其它也修正一些小錯誤或建議
比較有趣的是加入朋友建議的進階排版可以用 {tag1}, {tag2}, {tag3} ...
來取得第 1, 2, 3 ... 個標籤
當然同樣的照片集也是可以用 {set1}, {set2}, {set3} ... 來取得
記得 {tags}, {sets} 後面有 s 字元,但 {tag1}, {set1} 後面沒有加上 s 字元哦~

更新項目

1. 進階排版不把 " 字元改成輸出 ' 字元了
2. 下拉式選單文字顏色改成與系統顏色相符
3. 修正批次下載時,遇到 Original 時有時會失敗的問題
4. 清單模式下,取消取得照片集及 EXIF 資訊時,一定得取得照片說明的限制
讓只想單純取得照片集或 EXIF 資訊時可以加快速度
5. 進階排版加入 {tag1}, {tag2} ... 及 {set1}, {set2} ... 標籤

檔案下載: Firendly.Flickr V2.6.5.0

2007年12月7日 星期五

Friendly.Flickr V2.6.4.1 released

http://richielin-programer.blogspot.com/2007/12/friendlyflickr-v2640-released.html

12/07 再次更新 V2.6.4.1
大致完成大部份朋友的需求及 Bug 修正了
需要一些時間撰寫的建議就留在下一次改版好了

另外有朋友建議寫個日文版的,真是 @$!^%#@&#
天秤又不懂日文,所以想請各位幫忙了
既然要搞就搞大一點,來個多國語言版好了,但天秤連英文都上不了台面啊
目前想法是天秤會把軟體中顯示的中文以文字檔全部列出
並在天秤的部落格 Post 出來供下載
就請懂各種語言的朋友幫忙翻成各版本後再 mail 給天秤,並寫上是哪一國語言
天秤會在軟體說明頁上或是該語言畫面上寫上翻譯者的名稱哦~
當然各種語言都行,簡體中文、英文、日文、韓文、法文、德文 ... 都行啦
詳細情形天秤會再發佈,到時候就請各位幫忙了~

更新項目

1. 修正進階排版的 {sets} 標籤失效的問題 (其實上版是筆誤,將 {sets} 誤寫成 {set} 了)
2. 上傳視窗的 [選項] 頁,多了 [插入照片的標題是否包含檔案的副檔名] 選項
可以決定是否將副檔名也加入照片的標題
3. 進階排版多了 {image_st}, {image_t}, {image_s}, {image_m}, {image_l}, {image_o}
來代表 SquareThumbnail, Thumbnail, Small, Medium, Large, Original 尺寸的照片
所以可以在同一頁面同時輸出多種尺寸的照片了

--- 我是分隔線 ---

此次更新主要是加上許多朋友的意見,並在照片資訊上加入了 [照片集] 的資訊
還是老話一句,有問題及任何意見請回報給天秤知道
感謝~

更新項目

1. 修正清單模式下 Shift + 選取大數量照片時會造成軟體當掉的問題
2..批次下載選擇 Original Size 時,遇到有些照片無 Original Size 的照片時
則強制下載 Large 的照片,如果沒有 Large 的照片則下載 Medium 照片,以此類推
確保指定 Original 時一定會下載到照片
但指定其它尺寸時遇到沒有該尺寸的照片時則不下載,不一定會下載到照片
3. 批次下載指定以 Title 為檔名時,遇到 Title 已有副檔名了,則不再加上 .jpg 的副檔名了
避免出現 XXX.jpg.jpg 等奇怪的檔名
4. 照片資訊加入了 [照片集] 欄位,進階排版可以用 {sets} 來取得
5. 清單模式下多了三個選項,取得照片說明、取得照片 EXIF 資訊及取得照片集資訊
取得此三種資訊的速度十分緩慢,為了避免拖慢整體速度
搜尋時會先下載一般資訊,並在背景下載說明、照片集、EXIF 資訊
選項選擇愈多時搜尋速度會愈慢,可依使用者需求來開關

檔案下載: Firendly.Flickr V2.6.4.1

2007年12月2日 星期日

Friendly.Flickr V2.6.3.0

http://richielin-programer.blogspot.com/2007/12/friendlyflickr-v2630.html

先感謝大家的回報 
此版根據各位朋友的回報,修正了一些問題及功能
最主要修正從 V2.6.1.0 版之後上傳視窗時,如果你有設定將照片 EXIF 資訊填入標籤的功能
按下上傳照片按鈕後就會發生錯誤
還請近來一直無法上傳的朋友幫忙測試並回報一下是否有真正解決上傳的問題

更新項目

1. 編輯照片視窗及 KMZ 產生器視窗版面重新編排
2. 搜尋照片數量加大至 500 筆 (注意: 指定愈多數量會造成搜尋時速度愈慢,請斟酌使用)
3. 修正上傳照片至群組,遇到群組限制而失敗會繼續發表至其它群組,不會因此而中斷
4. 修正 HTML 新開視窗語法 '_blank'
5. 修正 V2.6.x 版後上傳照片時,讀取 EXIF 失敗而使得有設定插入 EXIF 資訊至標籤功能會出現錯誤訊息的問題
6. 加快產生 HTML 語法的速度,使一次插入多張照片時速度變快

檔案下載: Firendly.Flickr V2.6.3.0

2007年11月28日 星期三

Friendly.Flickr V2.6.2.0 released

http://richielin-programer.blogspot.com/2007/11/friendlyflickr-v2620-released.html

短時間內一直更新軟體,希望不會造成大家的困擾
因為天秤是利用空閒時間寫這個軟體,更新時間無法固定
且因為是自己一個人撰寫,無法將軟體測試的很完整
所以需要藉助大家的力量幫忙測試,才能找得出來一些問題
故有時候有 Bug 時會短時間密集更新,還請大家見諒
感謝一些朋友的建議及回報 (人數眾多無法一一列出,請見諒)
加入支援滑鼠滾輪及視窗縮放的功能,並修正 WLW 外掛判斷最新版本錯誤的問題

另外有二點請各位朋友幫忙確認一下
1. 有朋友提出在清單模式下以 tag 搜尋時
會出現類似搜尋 100 張但出現 50 張照片都重覆的錯誤
天秤測試結果都正確,一直無法模擬出該狀況
但已將 Flickr.NET 這個底層元件更新至最新版本,以期解決這個問題
還請大家幫忙注意一下,有類似此問題的請回報讓天秤知道
如果能回報 100% 出現的模式是最好不過的
例如搜尋某人的相簿及某 tag 條件時一定會出現某幾張照片重覆的問題
2. 有朋友提出在批次下載時會出現百分比跑完但照片未下載的狀況
有個狀況可能會出現這個問題
當指定某尺寸照片(如 Large),這時如果 Flickr 上沒有該尺寸照片時
Friendly.Flickr 會跳過該張照片(因為根本沒有該尺寸照片可下載)
如果選擇的照片剛好全部都是沒有該尺寸的,就剛好全部都沒有下載
不知道這個朋友是不是剛好在這個狀況下
但不排除在某個條件下軟體會判斷錯誤而真的沒下載到照片
所以也請大家幫忙注意一下批次下載的功能是否真的有天秤沒測到的錯誤
感謝~

更新項目

1. 照片預覽區支援滑鼠滾輪功能
2. 支援視窗縮放功能,可將視窗放大至全螢幕,增加可視範圍
3. 修正 Windows Live Writer 外掛讀取版本錯誤,造成判斷最新版本機制失敗的問題

檔案下載: Firendly.Flickr V2.6.2.0

2007年11月26日 星期一

Friendly.Flickr V2.6.1.0 released

http://richielin-programer.blogspot.com/2007/11/friendlyflickr-v2610-released.html

感謝 YDWU 及一些朋友的建議,這一版本修正及改善了一些東西
主要是清單搜尋時改善了速度及穩定度,搜尋大量照片清單時應該不會有類似卡住的問題了
且上傳照片時也修正了穩定度,並加入續傳的功能
有時因網路或一些問題會造成上傳失敗,這時軟體會再自動上傳
確定連續上傳 5 次都失敗才會跳出上傳失敗的提示視窗,避免影響操作的流暢度

另外在軟體右下角原本是 [關閉] 的按鈕 (要關閉時請軟體按右上角 X 按鈕了)
現在將由 [排版預覽] 來取代,按下 [排版預覽] 之後
會將你指定的排版結果秀出來,非常適合在 [進階排版] 貼上前先作預覽及修正
image

更新項目

1. 修正 GPS 座標輸入的防呆機制的錯誤
2. 修正 Tag 儲存成常用字後,會把每個字串儲存一組常用字的問題 (應該是存成同一組才對)
3. 加入續傳功能,上傳照片失敗時會再自動重試
4. 改善清單搜尋的穩定度,避免搜尋大量照片時會類似卡住的狀況
5. 改善清單搜尋的速度
6. 上傳照片時指定照片集時,有時候會造成軟體錯誤並結束的問題
7. 加入預覽模式,可以在貼上剪貼簿前先預覽排版狀況

檔案下載: Firendly.Flickr V2.6.1.0

2007年11月22日 星期四

好用的線上聽音樂

http://richielin-programer.blogspot.com/2007/11/blog-post.html

image

線上收聽音樂的概念應該不是第一次被應用了,如 KKBOX 等服務
但還是有些許的差異
KKBOX 等服務是與音樂廠商合作,取得有版權的合法音樂供付費用戶合法線上收聽
當然關鍵是 "使用者付費" "合法授權" "線上收聽" "廠商合作"
而 Songza 的概念是一個平台,所有線上音樂都是由網路上搜尋
包含 YouTube 等線上影片服務其中的音樂
當使用者搜尋時,列出找到的線上提供服務的相關音樂
讓使用者由 Songza 這個平台統一線上收聽音樂
由於網路上資源無遠弗界,各式各樣的音樂都有
找到的音樂或許會有別於 KKOBX 這種正統音樂服務
特色就是 "免費" "獨特" "多元" "方便"

最另人高興的是,中文搜尋完全沒問題
不用輸入任何資料,就可以將搜尋到的音樂儲成 playlist
我想是以 cookie 型式儲存吧~
好處是完全不需註冊就可以儘情享用網路上的音樂
壞處是當換台電腦後 playlist 就不見啦,有好有壞啦
不論如何,這個音樂服務網站都值得一試~

2007年11月20日 星期二

Visual Studio 2008 Express 正式版開放下載了

http://richielin-programer.blogspot.com/2007/11/visual-studio-2008-express.html

image

Visual Studio 2008 Express 開放下載了,不是 Beta 版,而是正式 Released 版本
如同 VS2005 一樣,微軟還是提供了免費的 Express 版本供下載使用
有興趣的快去下載吧!

檔案下載: http://www.microsoft.com/express/default.aspx

DVD iso 完整下載大約 900MB,裡面包含了
Visual C# 2008 Express Edition - 770 MB
Visual Basic 2008 Express Edition - 天秤沒興趣,所以沒安裝
Visual C++ 2008 Express Edition - 645 MB
Visual Web Developer 2008 Express Edition- 927 MB
一次下載就可以選擇安裝各種 Express 版本,還不賴!
不用移除舊版 Visual Studio,可以並存在同一台電腦
天秤電腦上裝有 VS2003, VS2005, VS2008,一樣 OK 啦~

##CONTINUE##

天秤先安裝 Visual C# 2008 Express Edition,邊安裝邊寫文章
它會主動安裝 .NET Framework 3.5,安裝過程都還順利
但也如同安裝 VS2005 一般的緩慢,其中倒是幾項讓天秤覺得很好奇

1. 最下一行是什麼? 可以由 Visual Studio 來接收 RSS 訊息?
不知道會包含什麼內容? 或許是一些教學或範例之類的吧
不過可想而知一定都是英文啦
image

2. 果然可以安裝 Silverlight Runtime 了
Silverlight 應該也可以算是 Visual Studio 2008 的重頭戲之一了
當然一定得包含它了
image

2007年11月19日 星期一

Friendly.Flickr V2.6.0.0 released

http://richielin-programer.blogspot.com/2007/11/friendlyflickr-v2600-released.html

先向各位說聲抱歉,前幾版為了加入 "清單模式" 而將內部機制做大變動
導致許多小地方都出現問題了
如上傳照片時按滑鼠右鍵加入標籤和說明、產生 KML 發生錯誤等
因天秤沒辦法在每次 release 前一一測試各項功能
所以還請各位當當白老鼠,幫忙測試一下
有問題還請回報給天秤,希望能有一版穩定的版本出現

從 V2.6.0.0 版開始加入了自動判斷是否有最新版本的功能
各位手上的 Friendly.Flickr 會自動連上 Server 判斷是否有新版本供下載
以後每當天秤更新版本時
就會跳出以下的視窗來提醒各位連上網頁下載,記得更新到 V2.6.0.0 以後才有此功能哦
image

更新項目

1. 加入判斷最新版本及提示下載功能
2. 修正上傳照片按滑鼠右鍵加入標籤及說明會造成錯誤的問題
3. 修正產生 KMZ 功能會失敗的問題

檔案下載: Firendly.Flickr V2.6.0.0

2007年11月15日 星期四

Friendly.Flickr 前傳

http://richielin-programer.blogspot.com/2007/11/friendlyflickr.html

image

天秤無聊在 Google 上閒逛,發現一套軟體 Flickr 照片管理精靈
才猛然想起這是天秤在 2006 年寫的一套 Flickr 工具軟體
應該算是 Friendly.Flickr 的前身吧,連天秤自己都已經忘了有寫過這套軟體了
連當初用的部落格都棄置了,已跳槽到 Blogger 了
還滿懷念的,呵呵~

當時剛入手單眼相機,且剛試用 Flickr 就決定加入付費會員
Flickr API 做得不錯,但當時 Flickr 實用的工具軟體實在不多
就決定自己來寫一套試試
以現在看來,軟體界面不夠優,讀取及下載照片速度不夠快
佔用資源高且容易造成系統卡住,實在連堪用都算不上
但決定寫一套完整的 Flickr 工具軟體的心和現在沒兩樣

##CONTINUE##

稍微回顧一下畫面
想要把大部份資訊及功能塞到畫面上,主畫面界面有點亂 - 失敗
image

資訊瀏覽模式
原意不錯,但因為 Flickr API 得另外發出封包來取得照片資訊
造成速度緩慢,且沒實作 cache 機制
更是讓系統長時間處於處理狀態 - 失敗
image

照片瀏覽狀態
原本企圖瀏覽照片可以做到無縫縮放功能,結果還是因為網頁傳輸問題
讓功能變成四不像
且搜尋瀏覽界面共用同一 Panel,造成操作上不便 - 失敗中的失敗
image

沒上傳、批次下載、編輯功能,界面不佳的問題
也讓該軟體最後被天秤放棄,改寫 Friendly.Flickr 的原因
不過話說回來
也因為部落格的發達,讓人可以把生活過程該錄下來
回頭檢討過去失敗的東西,不也是讓人成長的一種方式

2007年11月12日 星期一

在部落格上用 MSN Messenger 與版主聊天

http://richielin-programer.blogspot.com/2007/11/msn-messenger.html

介紹個由微軟提供部落格上使用的新奇玩具
直接在部落格上用 MSN Messenger 與版主聊天

加入方式

1. 進入設定網頁: http://settings.messenger.live.com/applications/Default.aspx

2. 以 MSN 帳號登入
image

3. 選 [網頁設定] 後,並勾選 [允許所有網際網路使用者看見我的線上狀態並傳送訊息給我]
按 [儲存] 鈕確定
image

4. 選 [建立 HTML],並選擇你要的樣式
第一項只會顯示你 MSN Messenger 狀態
第二項則可以在網頁上鑲入 MSN Messenger 來與你對話
image

5. 選擇後複製下方的 HTML 並貼至您的網頁即可
由於它是使用 iframe 格式鑲入
所以就算你網頁或部落格沒有支援 Javascript 應該也可以使用
畫面上不會顯示 MSN 帳號,不用擔心被其它有心人士利用
點開始對話後,可以選擇以 MSN 帳號登入或以訪客方式傳送訊息
不想讓 MSN 帳號曝光的就可以訪客方式登入~

2007年11月5日 星期一

Friendly.Flickr V2.5.4 released

http://richielin-programer.blogspot.com/2007/11/friendlyflickr-v251-released.html

11/15 感謝 paichia 大的回報
修正上傳照片時,照片依拍照時間排序會錯亂的問題

11/13 感謝 Jesse Lin 大的回報
修正批次下載照片時,設定 Original 格式照片會儲存成 Large 格式照片的錯誤

11/09 感謝 Jahong 大的回報
修正上傳照片時在照片上按右鍵會關閉程式的錯誤

感謝 Chris S. Lin @ TAIWAN 大的回報
修正自 V2.3.2.0 之後上傳照片時, 無法將 EXIF 的資訊寫入相片說明的功能
感謝 ShengWD 大的回報
修正 [複製照片 URL 到剪貼簿] 的功能有時無法正確取得照片 URL 的問題
對此問題再加上判斷,避免之前的版本當沒有該尺寸照片時
取得的照片連結會顯示如下圖照片的問題

另外如果不是按右鍵 [複製照片 URL 到剪貼簿] 而是而按下方按鈕選擇 [複製到剪貼簿] 時
例如設定 Large 尺寸照片但是沒有該尺寸照片時,則連結會自動以 Medium 的照片取代

更新項目

1. 修正設定上傳照片視窗,將 EXIF 資訊寫入說明或標籤的功能失效的問題
2. 修正搜尋後的照片按右鍵另存新檔時,選擇二張以上照片時會將所有照片都儲存的問題
3. 正確取得各尺寸的照片,避免下載到 Flickr Unavailable 的照片或該照片的連結
4. 修正上傳照片按右鍵會發生錯誤的問題
5. 修正批次下載照片時,設定 Original 格式照片會儲存成 Large 格式照片的錯誤

檔案下載: Firendly.Flickr V2.5.4

2007年11月2日 星期五

XNA Game Studio Express 控制模組的移動

http://richielin-programer.blogspot.com/2007/11/xna-game-studio-express.html

繼前幾篇文章 XNA Game Studio Express 初試 中示範 2D 遊戲畫面顯示
XNA Game Studio Express 顯示 3D 模組 中對示範 3D 遊戲畫面顯示
都還只是顯像輸出的範圍,遊戲中很重要的一項因素 - 互動
當然得包含輸出及輸入部份
本範例將介紹輸入的部份,還是以 XNA MSDN 上範例做示範
但由於該範例是以 XBOX360 控制器做為輸入界面,無法在 PC 上實際操控
所以天秤將稍微修改一下範例,以鍵盤當成輸入界面,使其在 PC 上可以動作

##CONTINUE##

準備工作

本範例是延續上一篇文篇的範例,直接跳至此篇的朋友
可以下載上一篇文章範例的程式碼來學習

讀取輸入裝置

前幾篇文章陸陸續續有提到,GraphicsDeviceManager 類別兩個重要的函式
draw 函式負責不斷的將畫面輸出至螢幕
而 update 函式即是負責不斷的計算、處理遊戲中的參數,如處理使用者的輸入
此範例即是在 update 函式加入判斷輸入的功能
其中有關 GamePad 物件為 XBOX360 特有的物件,用來取得 XBOX360 搖捍的輸入狀態
Keyboard 物件即為取得 PC 上鍵盤輸入的物件
而判斷某鍵是否有輸入,可以 Keyboard.GetState() 函式取得鍵盤狀態中該鍵是否有按下
再依是否按下狀態來做模組的移動

// Set the velocity of the model, applied each frame to the model's position.
Vector3 modelVelocity = Vector3.Zero;

protected override void Update(GameTime gameTime)
{
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();
    if (Keyboard.GetState().IsKeyDown(Keys.Escape) == true)
        this.Exit(); 

    // Get some input.
    UpdateInput(); 

    // Add velocity to the current position.
    modelPosition += modelVelocity; 

    // Bleed off velocity over time.
    modelVelocity *= 0.95f; 

    base.Update(gameTime);
}

protected void UpdateInput()
{
    // Get the game pad state.
    KeyboardState keyboard_currentState = Keyboard.GetState();
    if (keyboard_currentState != null)
    {
        // Rotate the model using the left thumbstick, and scale it down.
        if (keyboard_currentState.IsKeyDown(Keys.Left) == true)
            modelRotation += 1 * 0.10f;
        if (keyboard_currentState.IsKeyDown(Keys.Right) == true)
            modelRotation -= 1 * 0.10f; 

        // Create some velocity if the right trigger is down.
        Vector3 modelVelocityAdd = Vector3.Zero; 

        // Find out what direction we should be thrusting, using rotation.
        modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
        modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); 

        // Now scale our direction by how hard the trigger is down.
        if (keyboard_currentState.IsKeyDown(Keys.Up) == true)
            modelVelocityAdd *= 2;
        if (keyboard_currentState.IsKeyDown(Keys.Down) == true)
            modelVelocityAdd *= 0.5F; 

        // Finally, add this vector to our velocity.
        modelVelocity += modelVelocityAdd; 

        // In case you get lost, press A to warp back to the center.
        if (keyboard_currentState.IsKeyDown(Keys.Space) == true)
        {
            modelPosition = Vector3.Zero;
            modelVelocity = Vector3.Zero;
            modelRotation = 0.0f;
        }
    } 

    // Get the game pad state.
    GamePadState currentState = GamePad.GetState(PlayerIndex.One);
    if (currentState.IsConnected)
    {
        // Rotate the model using the left thumbstick, and scale it down.
        modelRotation -= currentState.ThumbSticks.Left.X * 0.10f; 

        // Create some velocity if the right trigger is down.
        Vector3 modelVelocityAdd = Vector3.Zero; 

        // Find out what direction we should be thrusting, using rotation.
        modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
        modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); 

        // Now scale our direction by how hard the trigger is down.
        modelVelocityAdd *= currentState.Triggers.Right; 

        // Finally, add this vector to our velocity.
        modelVelocity += modelVelocityAdd; 

        GamePad.SetVibration(PlayerIndex.One, currentState.Triggers.Right,
            currentState.Triggers.Right); 

        // In case you get lost, press A to warp back to the center.
        if (currentState.Buttons.A == ButtonState.Pressed)
        {
            modelPosition = Vector3.Zero;
            modelVelocity = Vector3.Zero;
            modelRotation = 0.0f;
        }
    }
}

本範例可以輸入鍵盤左、右鍵來控制飛行器的左右旋轉
上、下鍵來控制飛行器速度,如果飛行器飛出螢幕範圍了
按下 Space 鍵可以回復預設值,讓飛行器再次回到螢幕中央
最後按下 Escape 鍵結束

下載: 本範例程式碼及執行檔下載

2007年10月29日 星期一

Friendly.Flickr V2.5 released

http://richielin-programer.blogspot.com/2007/10/friendlyflickr-v25-released.html

Friendly.Flickr 又更新了,現在到了 V2.5 版了
這一次更新讓天秤很興奮,因為這是從古早的 V2.x 版就一直想加入的功能
但是一直不知道該怎麼做,導致延到這一版才找到解決方法~
主要加上照片 GPS 座標直接在地圖上定位的功能
首先不管是修改照片或是上傳照片,在 GPS 座標頁上可以找到 [定位] 按鈕
直接按下去就對了 (上下兩個定位按鈕都是一樣的功能啦)
image

接下來就會出現以 Google Map 為基礎的地圖定位視窗
直接在地圖上找到位置後點選,或是移動地圖上圖示都可以
也可以直接輸入座標,讓你看地圖來確認該座標是否正確
完成後按確定就 OK 啦
image

另外再附加說明一些功能
1. 此視窗經緯度右側的 [定位] 按鈕,是讓你亂移動地圖後
將地圖跳回到你照片的座標的功能
2. 右下角的自訂座標點功能,預設了幾個國家的地圖位置
直接雙擊就可以以地圖中心跳到該座標點上,快速以國家或座標找點
3. 下方 [加入地圖中心點] 按鈕功能是讓你移動地圖後,將該地圖以中心點記錄在自訂座標裡
日後可以快速的切換到該地圖上
4. [加入此座標] 按鈕是把目前指定的座標記錄在自訂座標裡
5. 在自訂座標按滑鼠右鍵或是按下 Delete 鍵,可以刪去自訂座標

基本上自訂座標點是讓你將一些常去的國家或常用的景點記錄下來
當然你也可以把 Friendly.Flickr 預設的國家刪去或是加入其它的國家座標點
甚至加入台北、台中、高雄、阿里山、日月潭等座標點
以便日後要定位時可以快速的把地圖找回來

更新項目

1. 新增上傳照片及修改照片資訊,在設定 GPS 座標時可以直接在 Google Map 地圖上定位
2. 補上 GPS 座標輸入的防呆機制

檔案下載: Firendly.Flickr V2.5

2007年10月25日 星期四

Friendly.Flickr V2.4.1.1 released

http://richielin-programer.blogspot.com/2007/10/friendlyflickr-v24-released.html

先感謝大家的支持,一直給天秤很多的鼓勵和建議
這一版還是和以往一樣,優先加入最多人建議的功能 - 清單顯示
在之前的版本搜尋照片的方式為搜尋指定數量的照片
且一併秀出照片來,如下圖
image

而這一版加入了清單顯示,會一直搜尋指定條件的照片直到完成
且不下載照片及詳細的照片資訊以加快搜尋速度
對一些不想看到照片,只想要照片清單的人很有用
使用方式只有一個步驟,左下角的 [每頁張數] 選擇最後一個選項 - 清單
然後再按搜尋就行了,如下圖
image

清單模式下的操作方式和一般模式下完全相同
接下來就是看客官是要下載照片或是貼上部落格都可
如果對照片名稱和照片聯想不起來的,還可以連點二下照片來快速瀏覽照片
image

另外提出很重要一點就是
因為要加入清單模式,所以將 Friendly.Flickr 底層機制做了大變動
陸陸續續的找到一些之前未修正的問題
天秤自己也不清楚到底修正了哪些 Bug,也不清楚又搞出了什麼 Bug
所以就請大家使用時發現什麼問題再回報給天秤了~

更新項目

1. 搜尋照片新增清單顯示模式
2. 產生 KMZ 檔時,可指定是否匯入 GPX 檔中的 Track 或 Point
3. 稍微改善搜尋速度及資料的可靠性
4. Windows Live Writer Plugin 版本設定檔目錄修改原與 Friendly.Flickr 一樣,讓兩者的資料可以共用
5. 10/29 補上清單模式下按 Column 會將資料排序的功能 (V2.4.1.1) 

PS. 為加快照片搜尋速度,清單模式下並不會下載完整的照片資訊
故當在清單模式下貼上照片及資訊時,有關 [照片說明] 及 [EXIF] 資訊可能會無法正確顯示
如需以上的資訊時,請在一般模式下搜尋照片後再貼上

PS. 在清單模式下,取得別人照片的 [原始照片的位址] 可能會因為該照片設為 private 而取得失敗
請在一般模式下搜尋再重試

檔案下載: Firendly.Flickr V2.4.1.1

2007年10月19日 星期五

Friendly.Flickr V2.3.2 released

http://richielin-programer.blogspot.com/2007/10/friendlyflickr-v232-released.html

感謝許多朋友提供意見
這一版主要修正最多人提出的 - 批次下載最多下載 500 張照片的問題
基本上可以批次下載的照片數量應該是無上限了吧
應該會讓批次下載更加的完整、好用吧
其它比較小的項目,容天秤再找時間慢慢修正~

更新項目

1. 修正批次下載 Set 照片時,最大只會下載 500 張的問題
2. 搜尋 Set 照片時,修改成會依照 [每頁張數] 選項來搜尋,並可按 [上一頁] 及 [下一頁] 來換頁
3. 排版貼圖多出個 [點擊照片是否在新視窗開啟] 選項

檔案下載: Firendly.Flickr V2.3.2

2007年10月11日 星期四

XNA Game Studio Express 聲音與 XACT

http://richielin-programer.blogspot.com/2007/10/xna-game-express-xact.html

聲音是遊戲很重要的一環,聲光效果都有的遊戲才會吸引人玩下去
在 XNA Framework 中,如果要加入音樂、音效等效果
必須使用 XACT - Microsoft Cross-Platform Audio Creation Tool 來幫忙達成
以下 XNA MSDN 的範例將一步步示範如果在遊戲中加入聲音

##CONTINUE##

準備工作,使用 XACT 建立聲音專案

開啟上一篇 XNA Game Studio Express 控制模組的移動 範例中的專案
並參考 XNA Game Studio Express 顯示 3D 模組 的文章中
由先前建立的 Spacewar Windows Starter Kit 專案取出聲音檔作示範
首先在開啟專案中先建立相關目錄 Content\Audio\Waves
並 Copy Spacewar Windows Starter Kit 專案中的
Ships\engine_2.wav 及 Weapons\hyperspace_activate.wav 到此專案的相同目錄下

1. 從 Windows 開始選單,選擇 所有程式 -> Microsoft XNA Game Studio Express -> Tools,執行 Microsoft Cross-Platform Audio Creation Tool (XACT)
2. 開啟 XACT 軟體後,儲存專案在此專案的 Contant\Audio 下名稱為 MyGameAudio
3. 新增 New Wave BankNew Sound Bank,並在 Wave Bank 下加入剛才 Copy 至專案目錄下的兩個聲音檔
image

將剛才加入 Wave Bank 的兩個聲音檔,拖曳到 Sound Bank 視窗的 Cue Name Panel 中
如下所示
image

最後,指定當我們播放 engine_2 聲音時,它必須不斷環境播放
這點就像是遊戲不斷環境播放的背景音樂一樣,總不希望背景音樂只播放一次就停止了吧
Sound Bank 視窗中選擇 engine_2 聲音,並在右上方視窗選擇 Play Wave 字樣
並在視窗最左下方 LoopEvent 中選擇 Infinite 指定環境播放
image

最後儲存離開 XACT 軟體
進行到此步驟,XACT 會將我們加入的聲音檔案指定相對目錄及聲音檔的播放動作
以 MyGameAudio.xap 描述檔儲存在 Content\Audio 這個指定的目錄下
接下來就可以將 XACT project 加入示範專案的 Content Pipeline 中

加入聲音至專案

回到 Visual Studio 2005 Express 示範專案中,在 Content\Audio 目錄按右鍵
加入 -> 現有項目,選擇剛才建立的 MyGameAudio.xap
image

在 Initialize 函式下加入以下程式碼將聲音資料載入遊戲中
AudioEngine: 讀入 XACT 專案,副檔名為 .xgs
WaveBank: 取出 AudioEngine 元件中 Wave Bank 的聲音資料,副檔名為 .xwb
SoundBank: 取出 AudioEngine 元件中 Sound Bank 的聲音資料,副檔名為 .xsb

AudioEngine audioEngine;
WaveBank waveBank;
SoundBank soundBank;

protected override void Initialize()
{
    audioEngine = new AudioEngine("Content\\Audio\\MyGameAudio.xgs");
    waveBank = new WaveBank(audioEngine, "Content\\Audio\\Wave Bank.xwb");
    soundBank = new SoundBank(audioEngine, "Content\\Audio\\Sound Bank.xsb");
    base.Initialize();
}

程式中使用 Cue 物件來處理聲音播放、停止的功能
在 update 函式中判斷鍵盤輸入及決定聲音的輸出與否
需注意的是,update 函式會不斷的被呼叫,必須判斷聲音播放的狀態決定執行的動作
避免已在播放中時還不斷的要求播放,造成系統的負載

// Cue so we can hang on to the sound of the engine.
Cue engineSound = null;

protected void UpdateInput()
{
    // Get the game pad state.
    KeyboardState keyboard_currentState = Keyboard.GetState();
    if (keyboard_currentState != null)
    {
        // Rotate the model using the left thumbstick, and scale it down.
        if (keyboard_currentState.IsKeyDown(Keys.Left) == true)
            modelRotation += 1 * 0.10f;
        if (keyboard_currentState.IsKeyDown(Keys.Right) == true)
            modelRotation -= 1 * 0.10f; 

        // Create some velocity if the right trigger is down.
        Vector3 modelVelocityAdd = Vector3.Zero; 

        // Find out what direction we should be thrusting, using rotation.
        modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
        modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); 

        // Now scale our direction by how hard the trigger is down.
        if (keyboard_currentState.IsKeyDown(Keys.Up) == true)
            modelVelocityAdd *= 3;
        if (keyboard_currentState.IsKeyDown(Keys.Down) == true)
            modelVelocityAdd *= 0.3F; 

        // Finally, add this vector to our velocity.
        modelVelocity += modelVelocityAdd; 

        // Set some audio based on whether we're pressing a trigger.
        if (keyboard_currentState.IsKeyDown(Keys.Up) == true)
        {
            if (engineSound == null)
            {
                engineSound = soundBank.GetCue("engine_2");
                engineSound.Play();
            } 
            else if (engineSound.IsPaused)
            {
                engineSound.Resume();
            }
        }
        else
        {
            if (engineSound != null && engineSound.IsPlaying)
            {
                engineSound.Pause();
            }
        } 

        // In case you get lost, press A to warp back to the center.
        if (keyboard_currentState.IsKeyDown(Keys.Space) == true)
        {
            modelPosition = Vector3.Zero;
            modelVelocity = Vector3.Zero;
            modelRotation = 0.0f; 

            // Make a sound when we warp.
            soundBank.PlayCue("hyperspace_activate");
        }
    } 

    // Get the game pad state.
    GamePadState currentState = GamePad.GetState(PlayerIndex.One);
    if (currentState.IsConnected)
    {
        // Rotate the model using the left thumbstick, and scale it down.
        modelRotation -= currentState.ThumbSticks.Left.X * 0.10f; 

        // Create some velocity if the right trigger is down.
        Vector3 modelVelocityAdd = Vector3.Zero; 

        // Find out what direction we should be thrusting, using rotation.
        modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
        modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); 

        // Now scale our direction by how hard the trigger is down.
        modelVelocityAdd *= currentState.Triggers.Right; 

        // Finally, add this vector to our velocity.
        modelVelocity += modelVelocityAdd; 

        GamePad.SetVibration(PlayerIndex.One, currentState.Triggers.Right,
            currentState.Triggers.Right); 

        // Set some audio based on whether we're pressing a trigger.
        if (currentState.Triggers.Right > 0)
        {
            if (engineSound == null)
            {
                engineSound = soundBank.GetCue("engine_2");
                engineSound.Play();
            } 
            else if (engineSound.IsPaused)
            {
                engineSound.Resume();
            }
        }
        else
        {
            if (engineSound != null && engineSound.IsPlaying)
            {
                engineSound.Pause();
            }
        } 

        // In case you get lost, press A to warp back to the center.
        if (currentState.Buttons.A == ButtonState.Pressed)
        {
            modelPosition = Vector3.Zero;
            modelVelocity = Vector3.Zero;
            modelRotation = 0.0f; 

            // Make a sound when we warp.
            soundBank.PlayCue("hyperspace_activate");
        }
    }
}

原本 XNA MSDN 範例中以 XBOX360 為示範平台
天秤將它改成以 PC 鍵盤輸入操作及聲音輸出
範例中按下上鍵時飛行器會加速,並發出加速的聲音,由於 engine_2 聲音在 XACT 中被指定為不斷播放,所以按住上鍵時會持續的播放直到放開
按下 Space 鍵時飛行器會回到預設值,並發出 hyperspace_activate 聲音

下載: 本範例程式碼及執行檔下載

XNA Game Studio Express 控制模組的移動

http://richielin-programer.blogspot.com/2007/10/xna-game-express_11.html

繼前幾篇文章 XNA Game Studio Express 初試 中示範 2D 遊戲畫面顯示
XNA Game Studio Express 顯示 3D 模組 中對示範 3D 遊戲畫面顯示
都還只是顯像輸出的範圍,遊戲中很重要的一項因素 - 互動
當然得包含輸出及輸入部份
本範例將介紹輸入的部份,還是以 XNA MSDN 上範例做示範
但由於該範例是以 XBOX360 控制器做為輸入界面,無法在 PC 上實際操控
所以天秤將稍微修改一下範例,以鍵盤當成輸入界面,使其在 PC 上可以動作

##CONTINUE##

準備工作

本範例是延續上一篇文篇的範例,直接跳至此篇的朋友
可以下載上一篇文章範例的程式碼來學習

讀取輸入裝置

前幾篇文章陸陸續續有提到,GraphicsDeviceManager 類別兩個重要的函式
draw 函式負責不斷的將畫面輸出至螢幕
而 update 函式即是負責不斷的計算、處理遊戲中的參數,如處理使用者的輸入
此範例即是在 update 函式加入判斷輸入的功能
其中有關 GamePad 物件為 XBOX360 特有的物件,用來取得 XBOX360 搖捍的輸入狀態
Keyboard 物件即為取得 PC 上鍵盤輸入的物件
而判斷某鍵是否有輸入,可以 Keyboard.GetState() 函式取得鍵盤狀態中該鍵是否有按下
再依是否按下狀態來做模組的移動

// Set the velocity of the model, applied each frame to the model's position.
Vector3 modelVelocity = Vector3.Zero;

protected override void Update(GameTime gameTime)
{
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();
    if (Keyboard.GetState().IsKeyDown(Keys.Escape) == true)
        this.Exit(); 

    // Get some input.
    UpdateInput(); 

    // Add velocity to the current position.
    modelPosition += modelVelocity; 

    // Bleed off velocity over time.
    modelVelocity *= 0.95f; 

    base.Update(gameTime);
}

protected void UpdateInput()
{
    // Get the game pad state.
    KeyboardState keyboard_currentState = Keyboard.GetState();
    if (keyboard_currentState != null)
    {
        // Rotate the model using the left thumbstick, and scale it down.
        if (keyboard_currentState.IsKeyDown(Keys.Left) == true)
            modelRotation += 1 * 0.10f;
        if (keyboard_currentState.IsKeyDown(Keys.Right) == true)
            modelRotation -= 1 * 0.10f; 

        // Create some velocity if the right trigger is down.
        Vector3 modelVelocityAdd = Vector3.Zero; 

        // Find out what direction we should be thrusting, using rotation.
        modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
        modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); 

        // Now scale our direction by how hard the trigger is down.
        if (keyboard_currentState.IsKeyDown(Keys.Up) == true)
            modelVelocityAdd *= 2;
        if (keyboard_currentState.IsKeyDown(Keys.Down) == true)
            modelVelocityAdd *= 0.5F; 

        // Finally, add this vector to our velocity.
        modelVelocity += modelVelocityAdd; 

        // In case you get lost, press A to warp back to the center.
        if (keyboard_currentState.IsKeyDown(Keys.Space) == true)
        {
            modelPosition = Vector3.Zero;
            modelVelocity = Vector3.Zero;
            modelRotation = 0.0f;
        }
    } 

    // Get the game pad state.
    GamePadState currentState = GamePad.GetState(PlayerIndex.One);
    if (currentState.IsConnected)
    {
        // Rotate the model using the left thumbstick, and scale it down.
        modelRotation -= currentState.ThumbSticks.Left.X * 0.10f; 

        // Create some velocity if the right trigger is down.
        Vector3 modelVelocityAdd = Vector3.Zero; 

        // Find out what direction we should be thrusting, using rotation.
        modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
        modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); 

        // Now scale our direction by how hard the trigger is down.
        modelVelocityAdd *= currentState.Triggers.Right; 

        // Finally, add this vector to our velocity.
        modelVelocity += modelVelocityAdd; 

        GamePad.SetVibration(PlayerIndex.One, currentState.Triggers.Right,
            currentState.Triggers.Right); 

        // In case you get lost, press A to warp back to the center.
        if (currentState.Buttons.A == ButtonState.Pressed)
        {
            modelPosition = Vector3.Zero;
            modelVelocity = Vector3.Zero;
            modelRotation = 0.0f;
        }
    }
}

本範例可以輸入鍵盤左、右鍵來控制飛行器的左右旋轉
上、下鍵來控制飛行器速度,如果飛行器飛出螢幕範圍了
按下 Space 鍵可以回復預設值,讓飛行器再次回到螢幕中央
最後按下 Escape 鍵結束

下載: 本範例程式碼及執行檔下載

2007年10月10日 星期三

XNA Game Studio Express 顯示 3D 模組

http://richielin-programer.blogspot.com/2007/10/xna-game-express-3d.html

image

繼上一篇 XNA Game Studio Express 初試 之後,對 XNA 架構愈來愈感興趣了
能以簡單易學易用的 .NET Framework 架構來撰寫遊戲實在是方便
接下來還是以 XNA MSDN 上範例來學習如何在遊戲中顯示 3D Model
3D 這應該是目前遊戲界的重頭戲了,且看以 XNA 如何快速的撰寫 3D 遊戲

##CONTINUE##

準備工作

因為此範例需要 3D 模組及紋理,所以必須先建立 Spacewar Windows Starter Kit 這專案
建立完成後即可儲存關閉,因為此範例只是運用該專案目錄下的模組來示範
image

開啟 Windows Game 範本的新專案,並在 方案總管 按右鍵 新增資料夾 上加入以下的目錄
按右鍵 新增現有項目,將 p1_wedge.fbx 檔案加入
並手動將 Textures\wedge_p1_diff_v1.tga Copy 到本專案的 Textures 目錄下
PS. p1_wedge.fbx 模組有需要有 wedge_p1_diff_v1.tga 圖檔當作紋理
但 p1_wedge.fbx 會自己至相對應目錄下取得 wedge_p1_diff_v1.tga
因專案不需使用此圖檔 (只有該模組使用),故只將該檔 Copy 到 Textures 目錄下即可
無需加入專案的 Content Pipeline 內
image

開始寫程式吧

首先當然是讀取 3D 模組等資源,和上個範例相同
在 LoadGraphicsContent 函式撰寫讀取資源的程式碼

// Set the 3D model to draw.
Model myModel;

// The aspect ratio determines how to scale 3d to 2d projection. float aspectRatio;

protected override void LoadGraphicsContent(bool loadAllContent)
{
    if (loadAllContent)
    {
        myModel = content.Load<Model>("Content\\Models\\p1_wedge");
    } 

    aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;
}

在 Draw 函式內顯示出該 3D 模組,其中
World: 控制模組在遊戲世界中的位置
View: 控制遊戲中攝影機在遊戲世界的位置及攝影的方向,相對於使用者看到世界
Projection: 控制遊戲中如果將 3D 世界以 2D 方式呈現出來 (螢幕)

// Set the position of the model in world space, and set the rotation.
Vector3 modelPosition = Vector3.Zero;
float modelRotation = 0.0f;

// Set the position of the camera in world space, for our view matrix.
Vector3 cameraPosition = new Vector3(0.0f, 50.0f, 5000.0f);

protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue); 

    // Copy any parent transforms.
    Matrix[] transforms = new Matrix[myModel.Bones.Count];
    myModel.CopyAbsoluteBoneTransformsTo(transforms);     // Draw the model. A model can have multiple meshes, so loop.
    foreach (ModelMesh mesh in myModel.Meshes)
    {
        // This is where the mesh orientation is set, as well as our camera and projection.
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(modelRotation)
                * Matrix.CreateTranslation(modelPosition);
            effect.View = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up);
            effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
                aspectRatio, 1.0f, 10000.0f);
        }
        // Draw the mesh, using the effects set above.
        mesh.Draw();
    }
}
動起來吧

在 update 函式裡,我們可以加上一些程式碼,讓飛行器的定時旋轉
只要改變 modelRotation 參數
讓 draw 函式被呼叫,計算 effect.World 時能依我們的參數改變模組的角度

protected override void Update(GameTime gameTime)
{
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit(); 

    modelRotation += (float)gameTime.ElapsedGameTime.TotalMilliseconds * MathHelper.ToRadians(0.1f); 

    base.Update(gameTime);
}

按下 F5 編譯執行,執行結果如下
遊戲畫面為一台 3D 飛行器,隨著時間不斷的原地旋轉著
image

顯示 3D 模組比 2D 複雜一些
但是 XNA Framework 有效的提供了一些元件供簡單的呼叫來顯示 3D 模組
範例其中有數個參數都可以決定顯示出的結果,各有各的重要性
建議新接觸 XNA 的人可以嘗試著修改一些參數,看執行結果會有什麼變化

下載: 本範例程式碼及執行檔下載

2007年10月9日 星期二

XNA Game Studio Express 初試

http://richielin-programer.blogspot.com/2007/10/xna-game-express_09.html

image
系統需求

Windows XP SP2 及 Vista 各版本 (看來 Microsoft 已徹底放棄 Windows 2000 了)
支援 Shader Model 1.1 及至少支援 DirectX 9.0c 的圖形界面卡

檔案下載

Visual Studio 2005 Express Editions 及 SP1
Microsoft XNA Game Studio Express 1.0 Refresh
.NET Framework 2.0
.NET Framework 1.1

##CONTINUE##

基本觀念

開啟 Windows Game 範本的新專案,一些繁瑣的前置作業都由 XNA 做好了
包含已建立最重要的螢幕顯示物件 GraphicsDeviceManager ,及以下五個主要的事件

  • Initialize: 初始化遊戲中任何與 Graphics 無關的資源,如設定、遊戲進度等資料
  • LoadGraphicsContent: 載入 Graphics 相關的資源,如模組、圖示等
  • UnloadGraphicsContent: 釋放載入的 Graphics 資源
  • Update: 處理、計算每個 Frame 要顯示的狀態,或做些程式判斷等動作
  • Draw: 顯示至螢幕

遊戲最重要的觀念就是處理使用者輸入的狀況,並將結果顯示於螢幕達成與使用者互動
在這裡就是由 UpdateDraw 兩個 Event 來負責處理輸入、運算及顯示輸出

第一個遊戲

這裡以 Microsoft 官網 MSDN 上範本來測試
在螢幕上貼上一個圖檔
以上一步產生的新專案為例,就直接顯示 GameThumbnail.png 這個新專案內建圖檔好了
但必須注意須將 GameThumbnail.png 的 XNA Framework Content 屬性設為 True
才會將 GameThumbnail.png 加入 XNA Content Pipeline 內讓程式可以呼叫使用

// This is a texture we can render.
Texture2D myTexture;

// Set the coordinates to draw the sprite at.
Vector2 spritePosition = Vector2.Zero;

// This is the object that will draw the sprites.
SpriteBatch spriteBatch;

protected override void LoadGraphicsContent( bool loadAllContent )
{
    if (loadAllContent)
    {
        myTexture = content.Load<Texture2D>("GameThumbnail");
        spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
    }
}
protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

    // Draw the sprite.

    spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
    spriteBatch.Draw(myTexture, spritePosition, Color.White);
    spriteBatch.End();

    base.Draw(gameTime);
}

加入程式碼後,按 F5 執行
遊戲畫面顯示如下,左上角為載入並顯示的圖檔
image

來吧! 加入移動及碰撞

我們之前有提到過,update 函式是用來處理輸入及運算用的
這是個會不斷被呼叫的 Event ,透過每次呼叫該函式來處理計算一些事情後
讓 draw 函式可以顯示正確的畫面
以本範例來說,可以在 update 被呼叫時將圖示移動固定位置並判斷是否碰到視窗邊緣
讓下次 draw 函式被呼叫時可以將圖示顯示在正確位置上


// Store some information about the sprite's motion.
Vector2 spriteSpeed = new Vector2(50.0f, 50.0f);

protected override void Update(GameTime gameTime)
{
    // Allows the default game to exit on Xbox 360 and Windows.
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit(); 

    // Move the sprite around.
    UpdateSprite(gameTime); 

    base.Update(gameTime);
}

void UpdateSprite(GameTime gameTime)
{
    // Move the sprite by speed, scaled by elapsed time.
    spritePosition += spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;

    int MaxX = graphics.GraphicsDevice.Viewport.Width - myTexture.Width;
    int MinX = 0;
    int MaxY = graphics.GraphicsDevice.Viewport.Height - myTexture.Height;
    int MinY = 0; 

    // Check for bounce.
    if (spritePosition.X > MaxX)
    {
        spriteSpeed.X *= -1;
        spritePosition.X = MaxX;
    } 
    else if (spritePosition.X < MinX)
    {
        spriteSpeed.X *= -1;
        spritePosition.X = MinX;
    }

    if (spritePosition.Y > MaxY)
    {
        spriteSpeed.Y *= -1;
        spritePosition.Y = MaxY;
    }
    else if (spritePosition.Y < MinY)
    {
        spriteSpeed.Y *= -1;
        spritePosition.Y = MinY;
    }
}

按 F5 後的執行結果如下
圖示會不斷的移動,當碰到視窗邊緣時即返回
image

當然寫個遊戲不是那麼簡單的事
本篇參考 Microsoft XNA MSDN 的範例可以改善的東西太多,如流暢度、聲音、輸入界面等
但本範例倒是很適合剛接觸 XNA 開發遊戲的人,分享出來與朋友共同成長
天秤之前也沒碰過 XNA 及 DirectX,只在 PPC 上寫過小遊戲 - 旋轉泡泡球 PPC 版
雖然使用的元件不同、平台不同,但概念卻相同
寫程式不也是如此,觀念正確就一通百通~

下載: 本範例程式碼及執行檔下載

2007年10月8日 星期一

XNA Game Express - 微軟的野心

http://richielin-programer.blogspot.com/2007/10/xna-game-express.html

微軟推出 XBOX360 目前已售出千萬台了
除了日本之外,其餘國家的接受度非常高,銷售成績也很好
主要原因為 XBOX360 效能很好,遊戲開發平台優異,加上了一堆原因
然而遊戲開發平台的優異是眾所皆知的,但微軟的目標不只於此

免費的 XNA Game Express 專案就是一個野心
它是一個跨 PC 與 XBOX360 的遊戲開發工具
以 XNA 在 PC 上開發遊戲及販賣都不需付費,但在 XBOX360 上必須付年費,但價格不高
憑藉著多年 Visual Studio 打下的基礎及 .Net Framework 及 C# 簡單易開發的特性
企圖打造個一魚多吃的境界,想想看以下情況

1. 當別的平台的遊戲開發業者開發的遊戲想跨最多人使用的 PC 平台
如果以 XNA 開發完成後,不只可以在 PC 上販賣遊戲,連 XBOX360 上也幾乎一併完成
多了個遊戲平台增加收入,何樂不為
2.遊戲相關科系單位以 XNA 教學,有效率且有系統 (目前美國多所大學已採用 XNA 教學)
這些學生日後都是 Windows 平台及 XBOX360 系統的潛在開發者
3. 一些程式設計師或有興趣的人都可以無條件的下載免費的 XNA 來玩
只要其中有 1/10000 的人玩出心得來了
都可以為 Windows or XBOX360 多一堆優秀的遊戲開發者
4. 優秀且免費的 XNA 開發平台,愈來愈多人有興趣且接觸之下
會吸引一些人才為其開發一堆引擎、套件等工具
這些都會讓 XNA 開發平台愈來愈強大,愈來愈易開發,吸引愈多人接觸
不斷的良性循環...

這些都是微軟遊戲快速向下札根的方式,也是日後微軟遊戲帝國的根基
當一家遊戲公司有資金 (超有錢),有技術,有人力為其開發遊戲
很難想像當它茁壯到一定程度,還有誰能與它競爭?

2007年10月4日 星期四

免費的虛擬光碟軟體 Alcohol 52% Free Edition

http://richielin-programer.blogspot.com/2007/10/alcohol-52-free-edition.html

隨著硬碟空間愈來愈來大,CD or DVD 光碟的容量與之相比愈顯得微不足道
甚至換片的不方便性及較慢的讀取速度愈來愈讓人不能忍受了
而虛擬光碟這種概念即是很好的解決方案

酒精 Alcohol 120% 是許多人使用的燒錄、虛擬光碟軟體
也有許多人只拿來當虛擬光碟用 (像天秤就是)
現在製作 Alcohol 120% 軟體的公司,拿掉了燒錄光碟的部份
推出個免費的虛擬光碟軟體 Alcohol 52% Free Edition

官方網站: Alcohol
軟體下載: Alcohol 52% Free Edition

免費版本的 Alcohol 52% Free Edition 最大支援 6 個虛擬光碟裝置 (應該夠用了)
25 種語言 (包含繁體中文)
CD 支援格式: CD-DA, CD+G, CD-ROM, CD-XA, Video CD, Photo CD, Mixed Mode, Multi-session CD
DVD 支援格式: DVD-ROM, DVD-Video, DVD-Audio
但必須注意的是,無法與 Alcohol 120% 並存在同一台電腦上
不過既然已安裝 Alcohol 120% 了,當然也不需要安裝 Alcohol 52% Free Edition
所以也不算缺點了吧

2007年10月3日 星期三

Excel 2007 Bug

http://richielin-programer.blogspot.com/2007/10/excel-2007-bug.html

天秤上個禮拜在網路上亂逛,就曾看到這個 Excel Bug 的消息了
只不過當時沒特別注意,只覺得管它的
反正天秤又不常用 Excel,也沒覺得有什麼大不了的

今天無聊時又想到了,剛好天秤也是安裝 Excel 2007
於是就來試了一下,還真的耶~
先用計算機得知 850 * 77.1 應該會得到 65535
但在 Excel 只要輸入 =SUM(850*77.1) 竟然會顯示 100000
於是天秤又試了其它運算式,不管是
=SUM(85*771) 或是 =SUM(8500*7.71) 都正確
就只有 =SUM(850*77.1) 顯示錯誤了,夠誇張了

不過如果輸入 =SUM((850*77.1)/65535) 則又會顯示正確的值 1
這表示這個 Bug 應該只是顯示錯誤,而不是運算錯誤
還好還好,如果是運算錯誤那代誌就超大條了
代表使用者不小心運算式中剛好有這個條件就完蛋了
不過光這個 Bug 應該也會讓 Microsoft 灰頭土臉了吧
就看 Microsoft 怎麼危機處理了

2007年10月2日 星期二

Friendly.Flickr V2.3.1.1 released

http://richielin-programer.blogspot.com/2007/10/friendlyflickr-v23-released.html

感謝 Mobile01 上網友 cjc_298 的建議
剛好有一些時間,於是將 Friendly.Flickr 加入了照片資訊修改的功能了
在 Flickr 上可以修改的項目很多
但是目前只加入修改標題、標籤、說明、權限、座標、群組的功能
及取代照片的功能 (這個功能很好用哦),其實應該也夠用了啦
如果想修改其它的項目,就請按照片右鍵 -> 瀏覽此照片
到 Flickr 網站上以網頁修改了
也許某天心血來潮,再來加上其它功能好了

更新項目

1. 修正 Urmap 及 Vitrual map 的連結
2. 加入修改照片資訊的功能 - 標題、標籤、說明、座標、群組、取代此照片
3. 自動儲存未上傳完成的照片

檔案下載: Firendly.Flickr V2.3.1.1

操作說明

點下右邊多出來的按鈕,就會開啟修改照片的視窗
image

拖曳照片到新視窗,只能拖曳自己的照片
選擇照片並輸入新的照片資訊
image

值得一提的如果上傳的照片錯誤,可以在此頁重新上傳照片
image

最後按下 [確定修改] 按鈕,等待修正完成即可
照片修改後,記得必須已在顯示中的照片資訊是不會跟著更新的
必須重新搜尋一遍,才會更新新的照片資訊
image

順便一提的是,前幾版本就有的刪除照片功能也許很多人都還不知道
只要在搜尋照片後,在主視窗的照片上按下右鍵選單 -> [刪除 Flickr 上的照片即可]
但只能刪除自己的照片哦
image

PS. 10/04 懶得再寫一篇文章,於是偷偷的更新一下版號成 V2.3.1
多加入了自動儲存未上傳完成的照片
在上傳視窗的照片及標題、標籤等資訊,只要未成功上傳至 Flickr
就算關閉軟體了也沒關係,下次開啟時還會保留著
但須注意的是硬碟上該照片必須還保留著才行

PS. 10/11 再偷偷更新一版本 V2.3.1.1
修正輸入兩個以上標籤時,上傳後標籤會錯誤的問題