iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

30天遊戲原型開發系列 第 8

Day8 基礎LPC學習筆記 ch3-8

//把基礎LPC看完了,對語言有初步認識,另外能夠寫一些簡單區域、可互動物件。
//需要查詢room.c才能更深入了解區域撰寫

ch3 資料型態
作者說90%以上的程式錯誤都是用錯資料型態,搞懂這章很重要

所有LPMUD driver都支援的資料型態:
void status(bool) int* string* object* mixed**

部分支援:
float* %mapping*

極少數:
function enum struct char

  • 包含指標
    ** 僅有指標
    % 中階會講

"5"+5 -> "55" 基於整數和字串的處理規則

ch4 函數
eFun,外部函數,寫在driver 比較接近內建函數的概念,但用語容易讓人誤解。
sFun,模擬外部函數,寫在mudlib。

文件路徑 /doc/efun
查詢指令 man [cmd] or help [cmd] or more [path/to/cmd]
write() 無回傳值

作者建議: 某些driver不要求宣告函數,或是註明回傳值型態,但建議使用它,這是好習慣

ch5 基礎繼承
說明物件導向的出發點:為了增加代碼重用性
inherit "/std/room";
這邊的繼承比較像是宣告物件
creat() 則是instance的過程

::creat() 意思是呼叫繼承來物件內的函數
藉此區隔「自己定義的creat()」和「room原本定義的creat()」

注意:忘記加::可能會造成creat()呼叫自己,無窮遞迴引發系統崩潰

ch6 變數處理
區域變數vs全域變數
存在於driver的instruction(指令)是用來處理變數的

X=1 這個運算式也是有值的,會等於1

i = ( (x=sizeof(tmp=users())) ? --x : sizeof(tmp=children("/std/monster"))-1)
//個人不建議這個用法,可讀性很差,它會造成可怕的程式運行錯誤,而且難以除錯
//章節編排順序蠻怪的,一般講完資料類別就會進運算式了,可能想提高函數的重要性吧
//6.6總結之後又再開新的一節,神奇

運算子
= + - * / % += -= *= /= %=
-- ++ == != > < >= <= ! && ||
-> ?:

x->y 呼叫x物件的y方法,X必須是物件,Y必須存在於X內,否則結果為0
x?y:z 如果X為真,則結果為Y,否則為Z。
//可以當作if-else的簡化版,但到現在為止都還沒教分支阿阿阿阿

注意:==跟=非常非常非常容易搞混,初學者小心。

ch7 流程控制
基本上跟C是一樣的,有基本概念的可以跳過,範例偏複雜,不看也沒關係

//if() 是運算式??? 看來當年好像沒很嚴格區分差別,可能作者也搞混了
//現在一般會把if當成語句而不是運算式,但詳細要看實作是怎麼處理它的?
//有點煩的地方是,它舉例是一下子講一堆之前沒出現過的東西,然後運算式又擠在一起

this_object() 應該是代表自身的意思
present(s, obj) 檢查物件obj裡面有沒有s

//舉例還是偏複雜,先講意圖再給程式碼會好一點
//HP翻成「可承受傷害」,好古老的譯名0.0

if while for switch
return continue break

作者的程式碼風格,只要能縮成一行的,就會盡量縮

ch8 物件資料型態
ps. 物件載入時,預設會呼叫create()或reset()
物件無法使用在運算子+-*/,主要作為Efun的參數
舉例不好,看完還是不知道is_player()是在哪一個檔案實作的?
而且living.c的set_level()為什麼要管繼承它的物件能不能使用?
如果只有user.c衍生的player物件可以使用,那set_level()根本就不應該放在living.c裡面
我們要寫一個實作,然後預期那個從你衍生出去的instance包含is_player(),超爛的例子

只知道this_object()是一個很便利指向自己的函式,跟this, self的意思一樣

物件->函數(參數)
call_other(物件, "函數", 參數)

8.5 區域函數 init()
活物碰到新物件時,會呼叫新物件裡的init()
//活物的定義是???未說明清楚

情境(進入新房間或是物件進入同一間房)

可以在物件的init()內增加可以跟它互動的動作

add_action(cmd_stnc, verb_str)
int cmd_stnc(s)
if s=="flower":
...
return 1
else:
return 0

write() 輸出訊息到玩家的螢幕
say() 輸出動作文字,周圍玩家會看到吧
player->query_cap_name() 玩家的名字(駱駝式)
player->add_hp(x) 幫玩家回血

8.6 幫房間加東西
範例是在小鎮中央廣場加一個警衛,警衛是怪物的一種(???)
注意:不同mublib的生成怪物的方式都不盡相同
生成物件需要使用指令搬移物件

原始模式:怪物物件->move(this_object())
精簡模式:move_object(物件, 場景)

8.7 總結
可以開始創建小區域,並且創造一些可以互動的物件
room.c裡面有很多可以用的函數,盡量使用它
熟悉之後,就可以開始學中階課程了。


上一篇
Day7 基礎LPC學習筆記 ch1-2
下一篇
Day8 中階LPC學習筆記 ch1-7
系列文
30天遊戲原型開發31

尚未有邦友留言

立即登入留言