修改成一行一行可執行的程式碼
- 本節要將 land.scm 修改成在 Console 內可一行一行執行的 Scheme 程式碼。
- land.scm 完整的程式碼可參考 26.5 節。
- 也可到 GIMP 系統的 scripts 目錄下找到該檔案。
- 最主要修改的部份是,將「對話框接收輸入變數值」修改成「直接指定輸入變數值」。
- 先要瞭解,land.scm 程式碼的執行流程。
最主要修改的部份
- 不使用 let* 改用 define
- 原本的程式使用 let* 定義與指定區域變數值。
- (let* (()()()...) ()() ...) 這樣的語法括號太多。
- 若要一行一行分析程式碼的意義,let* 語法,括號有好幾層,分析時,會造成一些干擾。
- 現在不使用 let* 改用 define 來定義與指定變數值。
捨棄函數 script-fu-land,直接指定輸入變數值
- 修改成最多的地方就是下列這兩段部份。
- (while (condition) (expr1) (expr2) .......),要注意此區塊括號的對齊。
- 記得要刪除多餘的右括號 ) ,不然會出現錯誤訊息。
- 修改後的程式碼,不再需要預先定義函數 script-fu-land ,但是要預先設定變數名稱、變數值 。
(define (script-fu-land width height seed detail landheight seadepth xscale yscale gradient)
(let* (
(img (car (gimp-image-new width height RGB)))
(layer-one (car (gimp-layer-new img width height
RGB-IMAGE "Bottom" 100 NORMAL-MODE)))
(layer-two 0)
)
從下列的程式碼得知變數值的型態與大小
SF-ADJUSTMENT _"Image width" '(256 10 1000 1 10 0 1)
SF-ADJUSTMENT _"Image height" '(256 10 1000 1 10 0 1)
SF-ADJUSTMENT _"Random seed" '(32 0 15000000 1 10 0 1)
SF-ADJUSTMENT _"Detail level" '(4 1 15 1 5 0 0)
SF-ADJUSTMENT _"Land height" '(60 1 65 1 10 0 1)
SF-ADJUSTMENT _"Sea depth" '(4 1 65 1 10 0 1)
SF-ADJUSTMENT _"Scale X" '(4 0.1 16 1 5 0.1 0)
SF-ADJUSTMENT _"Scale Y" '(4 0.1 16 1 5 0.1 0)
SF-GRADIENT _"Gradient" "Land 1"
修改後的程式碼,與測試的結果圖
(define width 256 )
(define height 256 )
(define seed 32 )
(define detail 4 )
(define landheight 60 )
(define seadepth 4 )
(define xscale 4 )
(define yscale 4 )
(define gradient "Land 1")
(define img (car (gimp-image-new width height RGB)))
(define layer-one (car (gimp-layer-new img width height RGB-IMAGE "Bottom" 100 NORMAL-MODE)))
(define layer-two 0)
(gimp-context-set-gradient gradient)
(gimp-image-undo-disable img)
(gimp-image-add-layer img layer-one 0)
(plug-in-solid-noise RUN-NONINTERACTIVE img layer-one TRUE FALSE seed detail xscale yscale)
(plug-in-c-astretch RUN-NONINTERACTIVE img layer-one)
(set! layer-two (car (gimp-layer-copy layer-one TRUE)))
(gimp-image-add-layer img layer-two -1)
(gimp-image-set-active-layer img layer-two)
(plug-in-gradmap RUN-NONINTERACTIVE img layer-two)
(gimp-by-color-select layer-one '(190 190 190) 55 CHANNEL-OP-REPLACE FALSE FALSE 0 FALSE)
(plug-in-bump-map RUN-NONINTERACTIVE img layer-two layer-one 135.0 35 landheight 0 0 0 0 TRUE FALSE 0)
;(plug-in-c-astretch RUN-NONINTERACTIVE img layer-two)
(gimp-selection-invert img)
(plug-in-bump-map RUN-NONINTERACTIVE img layer-two layer-one 135.0 35 seadepth 0 0 0 0 TRUE FALSE 0)
;(plug-in-c-astretch RUN-NONINTERACTIVE img layer-two)
; uncomment the next line if you want to keep a selection of the "land"
(gimp-selection-none img)
(gimp-display-new img)
(gimp-image-undo-enable img)