2012年2月28日 星期二

StencylWorks--一款強大的"Scratch-like"遊戲App開發工具

自從MIT Scratch釋出以來,有許多開發團體都試圖將"Scratch-like"程式積木工具,整合到自家產品的IDE環境,讓圖形化程式碼積木的親和力,能吸引更多有滿滿創意卻沒什麼高深技術能力的初學者,這次要介紹的StencylWorks是一套蠻不錯的2D遊戲開發工具,Jimmy's papa因為教小Jimmy寫Scratch程式的關係,當我看過StencylWorks所提供的功能,會覺得簡直是Scratch的超級進化版,StencylWorks採納了一些Scratch社群期待已久的新特色,更重要的是StencylWorks是免費的,你可以將開發完成的小遊戲轉成flash檔案後,發佈到社群或自己個人的網頁上與大家分享

如果你想要精心製作的小遊戲發佈到App Store賺賺錢,那麼可以購買專業版,它能夠在非Mac平台(因為它是由號稱最能跨平台的java語言開發而成),產生Object C程式碼並編譯成iOS App,Jimmy's papa認為,或許哪天就能到星巴克點杯咖啡,然後拿起我的Android平板,使用StencylWorks寫寫小遊戲後,然後發佈到Apple的App Store賺賺iPhone或iPad玩家的錢,哈哈

據Stencyl官網說,StencylWorks未來版本將能發佈Android App及Html5 App,超期待!!!

StencylWorks輔助教材中心 : http://www.stencyl.com/help/istencyl/
http://www.stencyl.com//help/
StencylWorks在維基百科 : http://en.wikipedia.org/wiki/Stencyl


場景編輯器

寄件者 scratchlab01
可以將作品轉換為手機平台的檔案格式
寄件者 scratchlab01
圖形化程式碼積木編輯器
寄件者 scratchlab01
這裡可以看到Object-C原始碼
寄件者 scratchlab01

2012年2月23日 星期四

如何改裝MIT Scratch-新增程式積木

當玩過一陣子Scratch後,有寫過其他程式語言經驗的人,會覺得Scratch這個小玩具有點綁手綁腳,看到官網論壇發表的一堆改裝版(Scratch Mod),一定有衝動想擴充程式積木或其他功能,但是看到陌生的Smalltalk語法後卻又不知從何著手,Jimmy's papa在這裡教大家改裝Scratch也順便幫自己備忘

這是Jimmy's papa打算新增的程式積木,功能是讓程式等待十秒

寄件者 scratchlab01
目標是加到Control分類底下
寄件者 scratchlab01

首先打開SystemBrowser,依下列順序點選各項
>NScratch-Objects>ScriptableScratchMorph>block specs>blockSpecks
寄件者 scratchlab01
可以看到ScriptableScratchMorph類別在blockSpecs這裡定義所屬的每個程式積木的詳細規格,blockSpecs將會回傳一個多維陣列,內含多個分類命名字串(category name)及各分類所屬的程式積木規格說明陣列(Block specificaton Arrays)

程式積木規格說明格式如下
<block spec string> <block type> <selector> [optional initial argument values]
以下是各細項說明
block spec string : 程式積木規格描述字串
block type : 程式積木型態,如K代表鍵盤事件帽, c代表C型包夾命令等等...
selector : 程式積木所對應的選擇子/函數
optional initial argument values:參數預設值

我們可以到下列的程式碼找到('wait %n secs' t wait:elapsed:from: 1)這一行,複製並且插入下一行
寄件者 scratchlab01
將它改成('wait 10 secs' t wait:elapsed:from: 10)
寄件者 scratchlab01

將分類切換一下,可發現屬於Control分類的黃色程式積木多了一個
寄件者 scratchlab01

底下貼出blockSpecs程式碼供大家參考,並附上程式積木型態(block type)的中文說明,試著改改看,可以看到積木外觀型態的改變
blockSpecs
    "Answer a collection of block specifications for the blocks that are common to all objects.  are interspersed with category names (Strings). A block  is an Array of the form: (<block spec string> <block type> <selector> [optional initial argument values]).

    Explanation of flags:
        -    no flags 無
        b    boolean reporter 布林值回報
        c    c-shaped block containing a sequence of commands (always special form) C形包夾命令
        r    reporter 回報
        s    special form command with its own evaluation rule 特殊格式命令
        t    timed command, like wait or glide 定時命令
        E    message event hat 訊息事件帽
        K    key event hat 鍵盤事件帽
        M    mouse-click event hat 滑鼠點擊事件帽
        S    start event hat 起始事件帽
        W    when <condition> hat (obsolete)"

    | blocks |
    blocks := #(
        'control'
            ('when %m clicked'                S    -)
            ('when %k key pressed'            K    -)
            ('when %m clicked'                M    -)
            -
            ('wait %n secs'                    t    wait:elapsed:from: 1)
            -
            ('forever'                        c    doForever)
            ('repeat %n'                        c    doRepeat 10)
            -
            ('broadcast %e'                    -    broadcast:)
            ('broadcast %e and wait'            s    doBroadcastAndWait)
            ('when I receive %e'            E    -)
            -
            ('forever if %b'                    c    doForeverIf)
            ('if %b'                            c    doIf)
            ('if %b'                            c    doIfElse)
            ('wait until %b'                    s    doWaitUntil)
            ('repeat until %b'                c    doUntil)
            -
            ('stop script'                    s    doReturn)
            ('stop all'                        -    stopAll)
        'operators'
            ('%n + %n'                        r    + - -)
            ('%n - %n'                        r    - - -)
            ('%n * %n'                        r    * - -)
            ('%n / %n'                        r    / - -)
            -
            ('pick random %n to %n'        r    randomFrom:to: 1 10)
            -
            ('%s < %s'                        b    < '' '')
            ('%s = %s'                        b    = '' '')
            ('%s > %s'                        b    > '' '')
            -
            ('%b and %b'                    b    &)
            ('%b or %b'                        b    |)
            ('not %b'                        b    not)
            -
            ('join %s %s'                    r    concatenate:with: 'hello ' 'world')
            ('letter %n of %s'                r    letter:of: 1 'world')
            ('length of %s'                    r    stringLength: 'world')
            -
            ('%n mod %n'                    r    \\ - -)
            ('round %n'                        r    rounded -)
            -
            ('%f of %n'                        r    computeFunction:of: 'sqrt' 10)
        'sound'
            ('play sound %S'                -    playSound:)
            ('play sound %S until done'        s    doPlaySoundAndWait)
            ('stop all sounds'                -    stopAllSounds)
            -
            ('play drum %D for %n beats'    t     drum:duration:elapsed:from: 48 0.2)
            ('rest for %n beats'                t     rest:elapsed:from: 0.2)
            -
            ('play note %N for %n beats'    t    noteOn:duration:elapsed:from: 60 0.5)
            ('set instrument to %I'            -     midiInstrument: 1)
            -
            ('change volume by %n'        -     changeVolumeBy: -10)
            ('set volume to %n%'            -     setVolumeTo: 100)
            ('volume'                        r     volume)
            -
            ('change tempo by %n'            -     changeTempoBy: 20)
            ('set tempo to %n bpm'            -     setTempoTo: 60)
            ('tempo'                            r     tempo)
        'motor'
            ('motor on for %n secs'            t    motorOnFor:elapsed:from: 1)
            ('motor on'                        -    allMotorsOn)
            ('motor off'                        -    allMotorsOff)
            ('motor power %n'                -    startMotorPower: 100)
            ('motor direction %W'            -    setMotorDirection: 'this way')
        'variables'
            ('show variable %v'                -    showVariable:)
            ('hide variable %v'                -    hideVariable:)
        'list'
            ('add %s to %L'                    -    append:toList: 'thing')
            -
            ('delete %y of %L'                -    deleteLine:ofList: 1)
            ('insert %s at %i of %L'            -    insert:at:ofList: 'thing' 1)
            ('replace item %i of %L with %s'        -    setLine:ofList:to: 1 'list' 'thing')
            -
            ('item %i of %L'                    r    getLine:ofList: 1)
            ('length of %L'                    r    lineCountOfList:)
            ('%L contains %s'                b    list:contains: 'list' 'thing')
    ).

    ^ blocks, self obsoleteBlockSpecs

2012年2月21日 星期二

遊戲攻略--時間線雲霄飛車(Timelines Roller coaster)

最近Jimmy's papa在論壇上看網友在討論一款OpenSource的遊戲,遊戲名稱好像是"時間線雲霄飛車",是一套基於Google Map地形資料的小遊戲,玩家們可從其他線上遊戲系統攜帶虛擬寶物來參加

遊戲的設計者選定的是一塊方圓長達一萬二千公里有平原有大狹谷的壯麗遼闊地形,玩家們可以盡情的搭建的名為時間線的軌道(Timelines Track),可借用他人的軌道或耗用自己的虛擬貨幣預先建造前方百公尺的軌道,享受心跳加速衝刺的快感 只是軌道架設必須受限於地形高度及重力等物理限制,進入遊戲後隨處皆有遺落的虛擬寶物可得, 亦可奪其他玩家的寶物,遊戲後半段會進入漏斗地形盆地,漏斗地形的尾端收縮到僅容一兩個軌道通行,大部分的玩家在平原區過完癮後,就會想挑戰著個地方

有網友提到,就在谷地2012站及谷地2013站間竟然暗藏有一道短短地0.5公里寬兩邊有高度差距的縱谷(Rift valley)天險,許多已經掠奪滿滿地虛擬寶物,準備滿載而歸的資深玩家們就栽在這道天險,不管如何想方設法架設軌道就是無法衝過對岸,有些人謠傳底下有強大的不明重力場,有些人懷疑是遊戲的設計者設下的圈套,也有些網友建議或許丟掉滿車的虛擬寶物就能衝過去,但是目前沒人能敢掛保證這一定會闖關成功,也沒有人膽敢去嘗試,所以原本一望無際的平原地區現正充斥著許多軌道,因為絕望的資深玩家們只能重複的架設軌道直到現有的空間塞爆為止,而不敢越過天險一步,只能期待有救星現身解救他們了

Jimmy's papa在想,是否有哪個軟體技術高強的好心人,趕快寫個外掛程式,解救這群可憐的玩家,讓他們能"飛"過那道天險呢?

2012年2月17日 星期五

Jimmy終於組好了變形(MORPH)機器人

寄件者 scratchlab01

這個變形(MORPH)機器人,是過完農曆年派給Jimmy小朋友的寒假作業,讓他挑戰這個複雜度蠻高的機器人作品,是因為他最近很喜歡看變形金剛卡通, 想藉此給他足夠的動力完成,而且小孩子難免會弄丟一些小零件,若不趁早組裝以後可能就沒法子組裝了,原本預期Jimmy開學前能完成,不過Jimmy覺得組這個機器人很難,要求每天只組一兩個部位 ,所以大概花了兩個星期多才完成,組裝到最後階段,哈哈,跟我先前預料的一樣短少了幾個零件,Jimmy向我求救問我是不是沒辦法組裝了,我跟他說"我們可以一起動腦筋想辦法以其他零件代替啊!!!" 於是我看他開心的摸著頭,努力地用他的小腦袋想著.....

寄件者 scratchlab01

寄件者 scratchlab01

寄件者 scratchlab01

變形(MORPH)機器人原始出處
http://mindstorms.lego.com/en-us/News/ReadMore/Default.aspx?id=136782

2012年2月14日 星期二

Qt for Android

Qt是一個跨平台的C++應用程式開發框架。廣泛用於開發GUI程式,現在Android平台上也能以Qt開發APP,原先在Linux/Mac/Windowsg上利用Qt開發的程式據說可以快速移植到Android,而不需要修改原始碼,底下是Jimmy's papa安裝的步驟

安裝Necessitas Qt Creator
最簡單的方式,就是到以下連結下載安裝程式,執行安裝時根據你的需求勾取選項,然後就是等.......
http://sourceforge.net/projects/necessitas/files/

啟動Necessitas Qt Creator
Jimmy's papa選擇Mandelbrot碎形當範例,並將Desktop及Android選項都勾起來
寄件者 scratchlab01

這是Jimmy's papa在PC上執行的結果
寄件者 scratchlab01


要安裝自己的Qt APP程式之前,別急,得先安裝這兩個apk(Ministro II.apk,MinistroConfigurationTool II.apk),請到以下連結安裝
http://sourceforge.net/projects/ministro.necessitas.p/files/

要啟動你的Qt APP程式之前,它會要求下載一些必要的共享函式庫,如果幸運地網路沒塞車的話,很快就好啦,否則就是等.......

這是安裝好的Qt APP
寄件者 scratchlab01

一些相關的教學影片
http://blip.tv/bogdan-vatra

2012年2月6日 星期一

永恆的終結(The End of Eternity)與Smalltalk AOP(Phantom for Pharo)

Jimmy's papa前陣子讀過美國科幻大師艾西莫夫Isaac Asimov)的小說--永恆的終結(The End of Eternity),內容是描述在27世紀時地球出現一個掌握時空工程學的太上機構,藉由汲取當地球成為太陽超新星時的超級能源,撐開時間力場(Temporal Field)讓垂直性的時間--永恆時空(Eternity)覆蓋到一般的水平時間(Time),試圖操控每個時空分區(Section)人類文明的現實變革(Reality Change),成為超穩定結構狀態,整體人類命運被永恆時空(Eternity)的全時理事會(Allwhen Concil)一小撮病態獨裁的計算師(Commputer)擺佈著......

先不管小說裡頭提到的時空工程學是否可能存在,Jimmy's papa倒是對全時理事會(Allwhen Concil)的電腦所用的軟體科技有興趣,雖然小說中沒提到軟體技術,但我猜AOP(Aspect-Oriented Programming)或許是選項之一, 因為觀察現實變革(Reality Change)對各世紀的社經體系的影響是這個組織的工作之一,也就是所謂的Cross-cutting concerns,或許他們需要建立各種Aspect,透過綿密的時空切入點(Pointcuts),以Advice擷取資訊或導入物件,如果這項軟體開發專案外包給Jimmy's papa的話,或可採用PHANtom (PHaro Aspect laNguage),前提是他們的MIS也是採用Smalltalk,不過在時空的無限可能的現實中,這樣的Reality總會存在的啦!!!

寄件者 scratchlab01