2013年10月29日 星期二

新增範例: 連連看遊戲(link)

* 新增範例:連連看遊戲

這是根據之前的研究,改以Good實作而成的範例。這個範例實作出gameplay的部份,只需要新增新的關卡就可以一直玩下去。


* 關卡編輯器(LevelEditor)新增自訂貼齊格線大小

這個功能是因應編輯新的連連看link範例而新增的功能。因為link使用的tileset的tile大小是24x34,而原來的關卡編輯器格線都是8的倍數。增加自訂功能後,方便編輯。

* 線上API參考手冊改連至WIKI

現在終於把API參考手冊都搬到wiki上了。

* 除此之外,還修正了一些bug..

2013年10月27日 星期日

WIN32 EditBox顯示行號

前面介紹過在.NET平台使用C#語言怎麼讓TextBox顯示行號,這篇文章則是介紹怎麼用WIN32的方式在EditBox上顯示行號。


基本概念如下:

首先,透過EM_SETMARGINS設定EditBox的LeftMargin,讓EditBox的內容往右縮排保留一定空間。接著處理WM_PAINT訊息,先透過DefWindowProc讓系統預設處理後,接著我們再疊畫上行號的部份。底下虛擬碼使用CEdit成員。
    int FirstLine = GetFirstVisibleLine();
    int FirstLineIndex = LineIndex(FirstLine);
    POINT ptBottom = {0, rcClient.bottom - GetSystemMetrics(SM_CYHSCROLL) - 1};
    int LastLineIndex = CharFromPos(ptBottom);
    int LastLine = LineFromChar(LastLineIndex);
上面的程式片段用來計算目前顯示的行號範圍。
    for (int i = FirstLine; i <= LastLine; i++) {
      int Index = LineIndex(i);
      POINT pos = PosFromChar(Index);
      if (-1 == pos.x) {
        break;
      }
      DrawText(LineNumber, Pos);
    }
知道要顯示的行號範圍後,接著再把它們畫出來。到此為止就完成的行號的顯示工作。但是,在測試時會發現當EditBox作水平捲動,或Selection變更時有重繪的問題。

一個簡單的解決辨法是,設定一個Timer。每當TextSelection變更時就作重畫動作,這樣就可以消除重繪問題。
  void OnTimer(UINT_PTR nIDEvent)
  {
    int Start, End;
    GetSel(Start, End);
    if (Start != nStartChar || End != nEndChar) {
      DrawLineNumbers();
      nStartChar = Start;
      nEndChar = End;
    }
  }

2013年10月18日 星期五

改良動作編輯器(Sprite Editor)

* 修正API Good.Clone的錯誤。

* 改良動作編輯器(Sprite Editor),將原來右上角的Preview小視窗整合到編輯區。

如下圖,是原來的設計。


改成如下新的設計。


2013年10月6日 星期日

連連看遊戲原理

之前玩了一陣子的連連看小遊戲,不過一直沒有去想想這類型的遊戲的主要gameplay的原理。現在花了點時間思考一下,研究看它的模式,設計了一個簡單的演算法,寫了支小程式來試試,效果基本上還不錯。


基本玩法是這樣子的。地圖大小是NxM,填滿X種類的圖形,每一個圖形一定可以跟另一個同樣的圖形作配對。配對方法是找出一條二個同樣圖形之間的連線,就可以同時把這二個圖形消除。連線最多只允許二個轉折,中間必須暢通。

以下對基本判定原理作概述,如下圖。


現在要找出A點和B點之間的連線。r0和rn是上邊界及下邊界,c1-c2線在r0至rn之間滑動。只要確定A-c1及B-c2及c1-c2三條線是暢通,即找到連線。若找不到連線,再以同樣原理找垂直方向一次。

若水平或垂直方向都找不到,則連線不存在。

Related Posts Plugin for WordPress, Blogger...