主選單

2018-02-25

Unity:[新手練習] 2D GAME (2/2)

續上篇...
【STEP-5】角色移動屬性設定

加入鋼體 (Rigidbody) 屬性,讓物件可以移動:


沒有重力,將 Gravity Scale 設為 0。
角色不旋轉,將 Freeze Rotation Z 打勾。




【STEP-6】撰寫程式控制角色移動

使用程式來控制角色,新增 Script,語言選擇 C#:



程式結構,Start(){} 區塊是啟動時會執行,Update(){} 區塊是更新時會執行:


撰寫互動的程式碼: Input.GetKey 輸入.取得按鍵
KeyCode.RightArrow 按鍵碼.右箭頭
gameObject.transform.position 物件位置
new Vector3 是 3D 向量,(X方向, Y方向, Z方向)
void Update () {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            //按下鍵盤方向右鍵後,貓向左移
            gameObject.transform.position += new Vector3(0.1f, 0, 0);
        }
        else if (Input.GetKey(KeyCode.LeftArrow))
        {
            //按下鍵盤方向左鍵後,貓向左移
            gameObject.transform.position -= new Vector3(0.1f, 0, 0);
        }
    }

預覽,貓動起來:




【STEP-7】限制角色移動範圍

建立空白物件,並可以重新命名:


設定碰撞屬性 Box Collider 2D,並調整物件尺寸為邊界大小。



如果兩個物件都有設定 Box Collider 2D,就會有碰撞的機制。




參考的教學網站: http://readandplay.pixnet.net/blog/post/197395500-unity%E6%95%99%E5%AD%B8-2d%E5%B0%8F%E9%81%8A%E6%88%B2%E8%A3%BD%E4%BD%9C-part-1

Unity:[新手練習] 2D GAME (1/2)

依找到的教學步驟練習...

準備的圖檔素材 (背景、貓、物件):


【STEP-1】建立專案

建立專案:


專案相關設定:




【STEP-2】建立背景

將素材檔案拖曳至 Assets 區塊:


將要使用的元件拖曳至場景,左側清單也會同時出現元件項目:


右側工作區塊為目前選取的物件的屬性設定,Position 設定為 0 可將物件置中:


新增一個用來放背景物件的 Sorting Layer:



將背景物件移至剛剛新增的 Sorting Layer:




【STEP-3】圖層管理

新增圖層...不知道怎麼形容這個 Layer 跟 Sorting Layer 的關係,感覺像是個群組的概念...(目前一知半解@@)


Layer 名子可以自己取:


把物件歸到這個 Layer:


可將此 Layer 鎖定,避免手滑 XD:




【STEP-4】角色物件

步驟跟背景物件相同,將貓圖元件拖曳進來設定。圖層的順序是越下面越接近前景,可自行調整:



依圖層設定,貓會在背景圖前面:


設定碰撞屬性,讓物件可以被碰撞 (Collider 屬性):


選擇碰撞範圍的類型,Box Collider 2D 是矩形範圍:


調整碰撞區域的範圍:




參考的教學網站:http://readandplay.pixnet.net/blog/post/197395500-unity%E6%95%99%E5%AD%B8-2d%E5%B0%8F%E9%81%8A%E6%88%B2%E8%A3%BD%E4%BD%9C-part-1

2018-01-01

理財筆記:布林通道 B-Band

布林帶(Bollinger Bands,BBands)也稱為布林通道,是由約翰·包寧傑(John Bollinger)在1980年代發明的技術分析工具。應用上結合了移動平均和標準差的概念,其基本的型態是由三條軌道線組成的帶狀通道(中軌和上、下軌各一條)。中軌為股價的平均成本,上軌和下軌可分別視為股價的壓力線和支撐線。

「布林帶」是這樣定義的:
中軌(SMA) = N時間段的簡單移動平均線
上軌(UB) = 中軌 + K × N時間段的標準差
下軌(LB) = 中軌 − K × N時間段的標準差

一般情況下,設定N=20和K=2,這兩個數值也是在布林帶當中使用最多的。在日線圖裡,N=20其實就是「月均線」(MA20)。依照常態分布規則,約有 95% 的數值會分布在距離平均值有正負2個標準差(± 2σ)的範圍內。 《維基百科》


布林通道公式:

1.先求出 N 日均線作為基準:MAt = (Pt +Pt-1 +...+Pt-n+1)/n

2.求各天價格對 MAt 的標準差 SDt = [Σ(Pt-i - MAt)^2 /n ]^0.5

3.每天的上界限 UB 及下界限 LB 則可求出 (2倍標準差):
   UBt = MAt + 2*SDt
   LBt = MAt - 2*SDt


漲到 UB 容易「回檔」、跌到 LB 容易「反彈」:
1、當股價形成開口擴張向上,表示漲勢啟動。
2、當股價形成開口收斂,表示漲多拉回。
3、當股價形成開口擴張向下,表示跌勢啟動。
4、當股價形成開口收斂,表示跌深反彈。

多頭:股價夾在通道上緣線和中值的平均線往右上方移動。
多空:股價夾在通道下緣線和中值的平均線往右下方移動。

布林通道進行壓縮時,即是區間整理,醞釀變盤方向。

參考資料1:http://ebigmoney.pixnet.net/blog/post/152356080-%5B%E6%95%99%E5%AD%B8%5D---%E5%B8%83%E6%9E%97%E9%80%9A%E9%81%93%E8%88%87%E6%B3%A2%E5%8B%95%E7%8E%87
參考資料2:https://zh-tw.facebook.com/bestcooker/posts/672459966130967

2017-05-24

日本的產鬼,姑獲鳥

在某個人煙稀少的竹林裡,傳聞會出現一個沾滿血跡的女人,抱著用紅布包裹著的嬰孩徘徊於林中,沒有一點生氣,有人說那是因喪子而傷心欲絕的母親,也有人說那是含怨的幽靈鬼怪。



日本的姑獲鳥比較類似中國的「產鬼」,但描述稍有不同,也許是傳到日本時被混淆了吧。在日本,姑獲鳥指的是產後死亡的女人所化成的妖怪﹝由怨念所生?﹞,分娩時的出血染紅了她的下半身,據說會抱著一個冰冷的小孩出現在無人煙的荒野,也曾出現在路旁、海邊、寺院門口等地方。她往往在下著雨的深夜裡出現,像在尋覓什麼似的,眼神透露出困惑與無助,當路人靠近時,她會說:「請抱我的孩子好嗎?」,傳聞如果拒絕便會遭遇不幸的事,像是一陣惡寒後死掉!但若是幫忙的話則會有好事發生,而抱過來的小孩則會變成一顆普通的石頭。也有不同版本的故事,但都大同小異。

鳥山石燕畫圖百鬼夜行》


寺島良安和漢三才圖會》中的姑獲鳥  (這是...@@)


中國的「產鬼」是死於難產的母親所化的妖怪,因為沒有見到孩子就已經死去,成為妖怪後就不斷地在尋找孩子。另外也有說法是,產鬼會纏上孕婦,使其無法順利生產,但產鬼會害怕雨傘,只要將雨傘放於門後,產鬼就無法進入。

在中國,「姑獲鳥 ( うぶめどり ) 」指的是另一種妖怪,又稱夜行游女、天帝少女、鬼鳥。姑獲鳥蛻去羽毛後能變成女子。會在喜歡的嬰兒衣服或棉被上滴血做記號,之後會把小孩偷走。

《本草綱目》中紀載「《玄中記》云︰姑獲鳥,鬼神類也。衣毛為飛鳥,脫毛為女人。云是產婦死後化作,故胸前有兩乳,喜取人子養為己子。凡有小兒家,不可夜露衣物。此鳥夜飛,以血點之為志。兒輒病驚癇及疳疾,謂之無辜疳也。荊州多有之。亦謂之鬼鳥。時珍曰︰此鳥純雌無雄,七八月夜飛,害人尤毒也。」
(原來本草綱目也記載妖怪傳說啊~ XD)


2017-05-18

C#:拖曳上傳檔案 (drag and drop file uploading)

在網頁上製作一個區塊,將檔案拖曳過去後,可以自動上傳檔案到 Server 端。



網頁內容加入以下HTML,包含接受拖曳檔案的區塊 drop_block,以及顯示上傳進度的進度條 upload_progress。
<body>
    <div>
        <div id="drop_block" ondragover="javascript: drag_handler(event);" ondrop="javascript: drop_file(event);" class="upload-block">
            請將檔案拖曳到此...
            <div class="progress">
                <div id="upload_progress" class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="" aria-valuemin="0" aria-valuemax="100">
                </div>
            </div>
        </div>
    </div>
</body>
外觀對應的 CSS 如下,因為進度條使用 bootstrap,所以也要引用 bootstrap.min.css。
<head>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
    <style type="text/css">
        .upload-block
         { 
             width: 300px; 
             height:200px; 
             border-style: dotted; 
             border-color: #999999;        
             text-align:center;
             padding: 20px;
             margin: 20px; 
        } 
        .dragover 
        { 
            border-color:#FF9900; 
        } 
        .progress 
        { 
            text-align:center;
            width: 100%; 
        } 
    </style>
</head>

主要的 JavaScript 如下。event.dataTransfer 是負責處理拖曳事件的物件,可以從中取得被拖曳檔案清單 (關於DataTransfer)。XMLHttpRequest 物件可將資料傳送出去, TestUpload.aspx 是準備要負責處理接收的網頁。
<script>
    function drop_file(e) 
    {
        e.preventDefault();
        var upload_image = document.getElementById('drop_block');
        var elProgress = document.getElementById('upload_progress');
        var images_container = document.getElementById('images_container');
        var objXhr  = new XMLHttpRequest();
        var files = e.dataTransfer.files;
        var objForm = new FormData();
        var sucess_count = 0;

        objXhr.upload.onprogress = function(e) 
        {
            if (e.lengthComputable) 
            {
                var intComplete = (e.loaded / e.total) * 100 | 0;

                elProgress.innerHTML = intComplete + '%';
                elProgress.style.width = intComplete + '%';

                elProgress.setAttribute('aria-valuenow', intComplete);
            }
        }

        objXhr.onload = function(e) 
        {
            upload_image.className = upload_image.className.replace(' dragover', '');
            elProgress.className = elProgress.className.replace(' active', '');

            alert(objXhr.responseText); //接收網頁回傳結果
        }

        objXhr.open('POST', 'TestUpload.aspx');
        for (var i = 0; i < files.length; i++) 
        {
            if (!files[i].type.match('image')) 
            {
                var name = files[i].name;
                alert(name + '格式不正確,須為圖檔!');
                continue;
            }
            objForm.append('images[]', files[i]);
            objForm.append('save_file', "Y");
        }

        objXhr.send(objForm);
    }
</script>
避免某些瀏覽器執行自己的預設動作,如自動開啟圖檔等...
<script>
    function drag_handler(e) 
    {
        var upload_image = document.getElementById('drop_block');
        var elProgress = document.getElementById('upload_progress');
        e.preventDefault();  //防止瀏覽器執行預設動作
        if (!upload_image.className.match('dragover')) 
        {
            upload_image.className = upload_image.className + ' dragover';
        }

        if (upload_progress.style.width != '0%') 
        {
            upload_progress.style.width = '0%';
        }
    }
</script>


後端可使用不同程式來接收,下面是使用 ASP.NET 3.5 的例子。
protected void Page_Load(object sender, EventArgs e)
{
    if (Request["save_file"] != null)
    {
        MyUpload();
        Response.Write("上傳完成");
        Response.End();
    }
}

protected void MyUpload()
{
    for (int i = 0; i < Request.Files.Count; i++)
    {
        HttpPostedFile postedFile = Request.Files[i];

        if (postedFile.ContentLength > 0)
        {
            string fileName = Path.GetFileName(postedFile.FileName);
            postedFile.SaveAs(Server.MapPath("~/Uploads/") + fileName);
        }
    }
}


原始參考資料(使用PHP):http://code-beginner.logdown.com/posts/313821