SDL愛因斯坦棋

林品儒

2016/12/16

今日重點

類別使用

單一實體類別

SDL簡單功能介紹

類別使用

類別

除了實體可以有方法

也可以定義類別方法

類別也有自己的實體變數和類別變數

類別方法

一樣是使用關鍵字def

但是方法名稱要加上self.

def self.singleton_method
end

使用時對該類別呼叫該方法

文件表示

在文件中可以看到兩種方法的表示

以Symbol類別為例

::all_symbols的"::"代表為類別方法

#to_s的"#"代表是實體方法

類別方法也有可能寫成"."開頭

類別變數

再次複習一下

類別變數是"@@"開頭

所有實體或是在類別內都可以操作類別變數

單一實體類別

實體化?

有些類別只產生一個物件

真的有需要產生物件嗎?

單一實體類別

英文為Singleton

在Ruby中可以直接把類別當實體用

所以就不需要實體化了

類別實體變數

類別也是物件所以也有實體變數

但是類別的實體變數不是物件的實體變數

實體例子

class C
  @class_inst_var = "No instance"
  def output
    p @class_inst_var
  end
  def self.output
    p @class_inst_var
  end
end

特殊效果

利用類別的實體變數就可以把類別當實體用

只要另外初始化就可以不用建構子

模組

模組

模組類似於類別但是沒有實體

用來將相關的函式包裝起來

可以呼叫模組函式來使用者各種功能

模組函式

呼叫方法和類別方法很像

對模組呼叫指定名稱的函式即可

模組常數

在模組中可能會有一些預定義的變數

使用"::"來取得該變數

要學習SDL一定要會模組的使用歐

SDL功能簡介

SDL

Simple DirectMedia Layer

提供繪圖音訊輸出入等各項基本功能

Ruby中的套件經過額外包裝

SDL相關函式庫

SDL image:增加圖檔支援種類

SDL ttf:提供字體繪圖支援

SDL mixer:提供音訊效果支援

SDL gfx:各種額外功能(我沒用過...)

SDL功能

初始化

視窗

繪圖

事件

鍵盤、滑鼠

初始化

SDL.Init(flag)

flag是一個常數

SDL::INIT_VIDEO初始化繪圖

SDL::INIT_EVERYTHING初始化所有功能

建立視窗

SDL.SetVideoMode(w,h,bpp,flag)

bpp為色彩深度通常使用32

flag一般為SDL::SWSURFACE

flag可以額外加入全螢幕、無邊框或可縮放之類功能

要記得把得到的視窗物件賦值給變數

改變視窗標題

SDL.WM_SetCaption(title,icon)

title為標題用字串

icon直接用空字串就好

繪圖

其實功能還可以再區分

圖檔載入

圖檔繪製

畫矩形

圖檔載入

圖檔預設支援只有BMP

需要其他檔案要使用SDL::Image的功能

SDL.LoadBMP(path)

給予檔名載入後會給予一個圖片物件

設定背景色

SDL.SetColorKey(pic,flag,color)

一般flag都用SDL::SRCCOLORKEY

而color則為整數(小心RGB或BGR!!)

這樣在把圖片貼到另一張圖片上color就會被忽略

圖檔繪製

螢幕和圖片其實可以視為一樣的東西

只是要畫在螢幕才能顯示

SDL.BlitSurface(src,sRect,dst,dRect)

需要用SDL::Rect給予[x,y,w,h]指定繪圖範圍

螢幕翻轉(?)

除了把圖片畫上螢幕之外

還要把螢幕翻轉才能把螢幕顯示出來

畫好圖要記得SDL.Flip(screen)給大家看

填滿矩形

SDL.FillRect(pic,rect,color)

一樣記得要用SDL::Rect指定[x,y,w,h]

顏色color還是一樣是整數

這次還有當成畫直線來用...

事件處理

SDL.PollEvent可以取得一個發生的事件

事件包含鍵盤滑鼠關閉視窗各式動作

要對各種狀況進行比對

事件種類

列出一些常用的事件

SDL::MouseMotionEvent:滑鼠移動

SDL::MouseButtonEvent:滑鼠按鍵起落

SDL::KeyboardEvent:鍵盤按鍵起落

SDL::QuitEvent:關閉視窗

滑鼠事件

#state可以取得狀態

#x,#y取得座標

#button可以取得按鍵

滑鼠移動

和滑鼠事件類似但是沒有按鍵

額外有移動距離的差值

#xrel,#yrel取得相對移動距離

鍵盤起落

#type可以得到SDL::KEYDOWN或SDL::KEYUP

#keysym可以取得鍵盤按鍵

鍵盤按鍵需要另外參考按鍵編碼

視窗關閉

關閉視窗會觸發此事件

一定要攔截才能正常關閉視窗

這次有講解到很多新功能

除了投影片也可以參考官方網站歐