2019年6月28日 星期五

[啥Web]Adobe Animate CC 2018輸出HTML5後結合個人網頁的方式[含結合Swiper外掛做出動畫切換Slider效果]

 

   一直以來都有想把自自己學過的技術留下記錄,但因為很花時間所以有些記錄其實都沒來得及寫,比如過去的Game Maker教學還有After Effect光流教學(這個在宅學習有但其實那個是暫存,因為事實上還沒打完)。

  這次想記錄的是個人研究HTML5的動畫部分。在Adobe Animate CC 2018內做好的HTML5動畫或互動輸出後,我是如何將那些結合網頁的。基本上算是我個人研究出來的,實際上有沒有人也這樣做我不是很清楚,我是覺得反正只要懂一點html與js基本上應該差不多。當然這邊會這樣提只是想說可能會有更好的方式就是,我可能不清楚,畢竟這裡只是個人筆記,建議有人對這有興趣可以多找其他資源(當然如果有人有找到也希望能回覆分享一下)。

  在開始貼上我筆記前,我先放上我這邊的發佈設定

 
 
 

   這邊大概說明一下,在基本的標籤有個作出回應的選項,那個的意思就是做RWD,因為RWD的是Responsive Web Design的縮寫。所以Adobe就將make responsive翻成作出回應...也不能說翻錯啦,但我第一次看到時完全看不懂= =",好歹也翻成製作成響應性式或直接寫RWD...

  總之那是為了做RWD用的。不過Adobe Animate的RWD很單純,他就只是將輸出的網頁做等比例縮放,不像實際上在做rwd不是只是單純做等比例縮放這件事,有些是要因應不同視窗做出不同排版。這點Adobe Animate是無法做到的。Google出的Google Web Designer其實就是往這方向設計的,但我個人不太會用就是。而只有等比例縮放,我個人是認為這就已經很夠用了。畢竟做動畫你若要考慮到不同排版,除了累以外還很不直覺。如果不同平台的等比例縮放實在太怪或不方便閱讀的話,我會乾脆就另外做一個動畫取代顯示就是。

  然後就是大概說明一下我為何選擇依寬度做RWD,主要是在圖片做RWD縮放的網頁我還沒遇過以高度做等比例縮放的就是。我想應該是現在排版大多都是由左而右從上至下的關係,我們圖片的排版通常都是和文字做並排,像是Bootstrap在使用col時也都是以寬度為基準,也因此在針對縮放這邊以寬度做等比例縮放會比較好。

  而圖片輸出這邊的資料夾位置會和你之後主檔html(不是指輸出的html)一樣的相對位置的資料夾檔名一樣,所以輸出完檔案後記得把圖檔位置搬一下。

  再來是這邊要注意js要分開輸出,雖然我記得預設就是。只是這邊要稍微提醒一下, 要分開js他竟然不是用勾選的而是用按鈕顯示目前打包狀態的方式。所以當你想把js包在html裡面,看到按鈕狀態是寫將javascript包在HTML中就代表你是分開輸出的了

  輸出完後基本上就是打開你要放入的網頁,這邊我稱為mergeAdobeAnimate.html。而我因為之後會修改輸出後的原始碼,去針對我放的區域做等比例縮放,所以html檔我不用輸出的而是用自己寫的。Adobe Animate輸出是以整個視窗大小去做縮放的,沒那麼好心還為你寫你想顯示的局塊縮放。所以這邊我必須得自行判斷放入位置的寬度去做RWD。而這一塊因為我本身對js原始的呼叫方式沒那麼熟,我是用JQuery的方法。因此其實如果有看懂我在做什麼的,是不必一定要引入JQuery就是。

撰寫html


  因為fla檔名就叫html5Example1,所以他會輸出html5Example1.html與html5Example1.js。這邊要把html5Example1.html裡的canvas tag貼在自己的mergeAdobeAnimate.html,並改名,避免之後有機會和其他canvas衝突。更改方式如下:

    <div id="id_html5Example1"><!--注意這邊要有寬高才會顯示-->
        <div id="id_html5Example1_animation_container">
            <canvas id="id_html5Example1_canvas" width="512" height="384" style="position: absolute; display: block; background-color:rgba(255, 255, 255, 1.00);"></canvas><!--注意這邊要有寬高只是參考用,RWD會自動修改,所以其實刪掉也行-->
            <div id="html5Example1_dom_overlay_container" style="pointer-events:none; overflow:hidden; width:512px; height:384px; position: absolute; left: 0px; top: 0px; display: block;"><!--注意這邊要有寬高只是參考用,RWD會自動修改,所以其實刪掉也行-->
            </div>
        </div>
    </div>

   注意到我改了3個地方的id,這代表之後js也有地方得動到。做這個的目的是為了避免之後若要引用其他地方的canvas會有衝突。

 完整獨立js


  再來看html5Example1.html檔。你會看到裡面還是有部分的js,我為了要做到在我們自己的html只要引入一個js檔並且使用一個函式乎叫,也為了避免之後引入其他檔案會有變數衝突,所以這邊要把那些js做合併全都放入html5Example1.js。這邊開始複製html5Example1.html裡從var canvas開始的語法。然後再打開html5Example1.js檔,拉到最底下寫一個呼叫的初始函式,比如html5Example1Init。把剛剛從html裡複製的語法通通貼到這個函式內。並更改剛剛改過的canvas、animation_container與dom_overlay_container。最後在var iw = window.innerWidth, ih=window.innerHeight這段改為取得的id_html5Example1的寬與高,不過這邊要注意,因為我們在發佈設定是以寬度為基準做RWD,所以其實高度的地方不會被用到就是。只要而改好後還有一個地方要改,就是要記得呼叫初始方法init();。總之整個要貼在html5Example1.js底端的原始碼如下:

function html5Example1Init()
{
    var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation;
    init();
    function init() {
        canvas = document.getElementById("id_html5Example1_canvas");
        anim_container = document.getElementById("id_html5Example1_animation_container");
        dom_overlay_container = document.getElementById("id_html5Example1_dom_overlay_container");

        var comp=AdobeAn.getComposition("B1C74C98C1ED9C40A39A92EED8EFD7E6");
        var lib=comp.getLibrary();
        var loader = new createjs.LoadQueue(false);
        loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
        loader.addEventListener("complete", function(evt){handleComplete(evt,comp)});
        var lib=comp.getLibrary();
        loader.loadManifest(lib.properties.manifest);
    }
    function handleFileLoad(evt, comp) {
        var images=comp.getImages();   
        if (evt && (evt.item.type == "image")) { images[evt.item.id] = evt.result; }   
    }
    function handleComplete(evt,comp) {
        //This function is always called, irrespective of the content. You can use the variable "stage" after it is created in token create_stage.
        var lib=comp.getLibrary();
        var ss=comp.getSpriteSheet();
        var queue = evt.target;
        var ssMetadata = lib.ssMetadata;
        for(i=0; i<ssMetadata.length; i++) {
            ss[ssMetadata[i].name] = new createjs.SpriteSheet( {"images": [queue.getResult(ssMetadata[i].name)], "frames": ssMetadata[i].frames} )
        }
        exportRoot = new lib.html5Example1();
        stage = new lib.Stage(canvas);   
        //Registers the "tick" event listener.
        fnStartAnimation = function() {
            stage.addChild(exportRoot);
            createjs.Ticker.setFPS(lib.properties.fps);
            createjs.Ticker.addEventListener("tick", stage);
        }       
        //Code to support hidpi screens and responsive scaling.
        function makeResponsive(isResp, respDim, isScale, scaleType) {       
            var lastW, lastH, lastS=1;       
            window.addEventListener('resize', resizeCanvas);       
            resizeCanvas();       
            function resizeCanvas() {           
                var w = lib.properties.width, h = lib.properties.height;           
                var iw = $('#id_html5Example1').width(), ih=$('#id_html5Example1').height();           
                var pRatio = window.devicePixelRatio || 1, xRatio=iw/w, yRatio=ih/h, sRatio=1;           
                if(isResp) {               
                    if((respDim=='width'&&lastW==iw) || (respDim=='height'&&lastH==ih)) {                   
                        sRatio = lastS;               
                    }               
                    else if(!isScale) {                   
                        if(iw<w || ih<h)                       
                            sRatio = Math.min(xRatio, yRatio);               
                    }               
                    else if(scaleType==1) {                   
                        sRatio = Math.min(xRatio, yRatio);               
                    }               
                    else if(scaleType==2) {                   
                        sRatio = Math.max(xRatio, yRatio);               
                    }           
                }           
                canvas.width = w*pRatio*sRatio;           
                canvas.height = h*pRatio*sRatio;
                canvas.style.width = dom_overlay_container.style.width = anim_container.style.width =  w*sRatio+'px';               
                canvas.style.height = anim_container.style.height = dom_overlay_container.style.height = h*sRatio+'px';
                stage.scaleX = pRatio*sRatio;           
                stage.scaleY = pRatio*sRatio;           
                lastW = iw; lastH = ih; lastS = sRatio;           
                stage.tickOnUpdate = false;           
                stage.update();           
                stage.tickOnUpdate = true;       
            }
        }
        makeResponsive(true,'width',true,1);   
        AdobeAn.compositionLoaded(lib.properties.id);
        fnStartAnimation();
    }
}

  上面藍色的地方要注意的是那個地方如果日後不小心更動到,要注意他那序號是否和an.compositions['這邊']序號一模一樣,不然他會出不來。寫好後就可以丟入自己的js資料夾了。還有一點就是如果有兩個以上canvas,這個序號必須要不一樣,不然不會顯示。所以如果發生一樣的狀況(可能是同一檔案複製),請記得去改,那個序號可以拿其他檔案的,但建議重新開檔輸出會比較好。

  只是說,我在使用這個的過程常常會出現經過縮放視窗後回不去原來大小的狀況。而我不是很清楚原來Adobe的RWD縮放方式到底如何調整,所以我後來的改法是,當視窗大小小於本身動畫預設的大小才要改就好,也不會像Adobe的好像還有記憶一些我不是很清楚的參數。所以一開始如果id_html5Example1的大小若大於本身在Animate做的動畫大小時他絕對不會經過縮放。這雖然聽起來有點問題,但對我來說是最單純的設計。我只要一開始做動畫時給他大一點就好。所以我這邊就開始改了蠻大的了,然後我又再寫了一個參數讓他們統一乘以該數字,方便我之後覺得那樣的大小不理想還可以去調整。因此我的改法還多了一個參數canvasSizeModified。 這是我比較常用的改法:

function html5Example1Init()
{
    var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation;
    var canvasSizeModified=1;
    init();
    function init() {
        canvas = document.getElementById("id_html5Example1_canvas");
        anim_container = document.getElementById("id_html5Example1_animation_container");
        dom_overlay_container = document.getElementById("id_html5Example1_dom_overlay_container");
        var comp=AdobeAn.getComposition("B1C74C98C1ED9C40A39A92EED8EFD7E6");
        var lib=comp.getLibrary();
        var loader = new createjs.LoadQueue(false);
        loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
        loader.addEventListener("complete", function(evt){handleComplete(evt,comp)});
        var lib=comp.getLibrary();
        loader.loadManifest(lib.properties.manifest);
    }
    function handleFileLoad(evt, comp) {
        var images=comp.getImages();   
        if (evt && (evt.item.type == "image")) { images[evt.item.id] = evt.result; }   
    }
    function handleComplete(evt,comp) {
        //This function is always called, irrespective of the content. You can use the variable "stage" after it is created in token create_stage.
        var lib=comp.getLibrary();
        var ss=comp.getSpriteSheet();
        var queue = evt.target;
        var ssMetadata = lib.ssMetadata;
        for(i=0; i<ssMetadata.length; i++) {
            ss[ssMetadata[i].name] = new createjs.SpriteSheet( {"images": [queue.getResult(ssMetadata[i].name)], "frames": ssMetadata[i].frames} )
        }
        exportRoot = new lib.html5Example1();
        stage = new lib.Stage(canvas);   
        //Registers the "tick" event listener.
        fnStartAnimation = function() {
            stage.addChild(exportRoot);
            createjs.Ticker.setFPS(lib.properties.fps);
            createjs.Ticker.addEventListener("tick", stage);
        }       
        //Code to support hidpi screens and responsive scaling.
        function makeResponsive(isResp, respDim, isScale, scaleType) {       
            var lastW, lastH, lastS=1;       
            window.addEventListener('resize', resizeCanvas);       
            resizeCanvas();       
            function resizeCanvas() {           
                var w = lib.properties.width, h = lib.properties.height;           
                var iw = $('#id_html5Example1').width();           
                var pRatio = window.devicePixelRatio || 1, xRatio=iw/w, sRatio=1;         
                 var pRatio = window.devicePixelRatio || 1, xRatio=iw/w,sRatio=1;         
                 if(isResp)
                 {             

/*
(如果你不在意失真,希望他完全隨著設定寬度做縮放的話,那你可能就得把判斷拿掉,直接讓sRatio=xRatio      
*/               
                     if(w>iw)
                    
                     {              
                        sRatio = xRatio;            
                     }
                 }          
                 canvas.width = w*pRatio*sRatio*canvasSizeModified;        
                 canvas.height = h*pRatio*sRatio*canvasSizeModified;
                 canvas.style.width = dom_overlay_container.style.width = anim_container.style.width =  w*sRatio*canvasSizeModified+'px';              
                 canvas.style.height = anim_container.style.height = dom_overlay_container.style.height = h*sRatio*canvasSizeModified+'px';
                 stage.scaleX = pRatio*sRatio*canvasSizeModified;          
                 stage.scaleY = pRatio*sRatio*canvasSizeModified;     
     

                stage.tickOnUpdate = false;           
                stage.update();           
                stage.tickOnUpdate = true;     
           
            }
        }
        makeResponsive(true,'width',true,1);   
        AdobeAn.compositionLoaded(lib.properties.id);
        fnStartAnimation();
    }
}

引入createjs和合併後的js


  接下來要開始回到mergeAdobeAnimate.html檔, 要引入createjs和合併後的js,他和剛剛提的jquery順序如下:
    <script src="js/createjs-2015.11.26.min.js"></script>
    <script src="js/jquery-3.1.1.min.js"></script>  
    <script src="js/html5Example1.js"></script> 

  然後再寫入自定義的呼叫函式:
    <script>
        function animeInit()
        {
            html5Example1Init();
        }
    </script>

  最後再在body輸入初始化函式:
<body onload="animeInit();">

  這樣就差不多了,記得在css裡要給id_html5Example1寬與高,這樣整個canvas才會顯示出來。而我為了讓這樣的寫法更能顯示RWD,我的範例還加上了Bootstrap.將canvas與80pt大的文字放在一起分別給文字col-5與id_html5Example1這動畫col-7。差不多長這樣:

  <div class="container-fluid">
        <div class="row">
            <p style="font-size:80pt" class="col-5">This is Test</p>
            <div id="id_html5Example1" class="col-7"><!-這邊因為bootstrap已經給定RWD會有的長寬了,所以才會顯示-->
                <div id="id_html5Example1_animation_container">
                    <canvas id="id_html5Example1_canvas" width="512" height="384" style="position: absolute; display: block; background-color:rgba(255, 255, 255, 1.00);"></canvas><!--注意這邊要有寬高只是參考用,RWD會自動修改,所以其實刪掉也行-->
                    <div id="id_html5Example1_dom_overlay_container" style="pointer-events:none; overflow:hidden; width:512px; height:384px; position: absolute; left: 0px; top: 0px; display: block;"><!--注意這邊要有寬高只是參考用,RWD會自動修改,所以其實刪掉也行-->
                    </div>
                </div>
            </div>
        </div>
    </div>

  縮放視窗就會看到如下的縮放:

 


 放入另一個HTML5動畫


  因此我相信會寫網頁的大概就知道要怎麼應用了 ,我這邊再做一個利用Swiper這個知名效果外卦去做兩個動畫的Slider切換(不過可能要注意我因為是拿以前寫的範例來改,所以用的Swiper是舊版語法,新版語法應該也是沒問題的就是)。基本上是另外做一個js,照上面步驟另外命名所有id與初始函式名稱(我是把所有html5Example1都改為html5Example2,然後記得在html5Example1Init();下再多執行一行 html5Example2Init();),還有要注意顯示序號必須不一樣就可以了。詳細寫法可以直接看我demo2的檔案或載我放的打包檔看mergeAdobeAnimateWithSwiper.html檔了。以下是用該外掛的coverflow效果:



最後補充

  • 如果有寫互動建議把stage變數提取出來變全域變數。因為如果你是寫互動式的網頁,你有機會想用到stage.gotoAndPlay之類的指令,我個人認為這是蠻方便的就是。而這邊還有一點要注意就是請改名字比如html5Example1Stage,然後在我們修改的js全部取代,避免和另外一個canvas衝突。
     
  • 還有如果想做loading進度讀取%數,可在js裡的loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});上方加入loader.addEventListener("progress", handlePreload);  並新增一個function handlePreload:
    function handlePreload(v)
    {
    myProgress=v.loaded; 
    } 

    myProgress這邊是全域變數,總之建議可以寫個timer一直去讀取他就是,只是Animate的進度其實都很完整,我記得都是25%為倍數,所以我也不清楚是不是有更好的讀取進度的地方。
     
  • 有個要注意的是,有的模糊或濾鏡效果在Adobe Animate內看都有,但其實輸出是沒有出現效果的。目前只有alpha才可以使用(像我個人DEMO1全都是透明度變化),其他似乎都有問題。
     
  • 後來我在前端社群討論得知放出以下教學影片的大大:
     

    他在他的底下回應有提到要把makeResponsive這個函式註解掉,我才驚覺之前有點被這函式給限制住了。雖然我透過js去做等比例縮放也是一種方式,但我之所以採取這個的原因是因為我一開始對canvas不熟,然後css怎麼修改他的長和寬都不會改變,所以就只好另找方法。聽到他的回應我才想到改不了的原因就是那個makeResponsive在搞的鬼啊....所以要是有不怎麼熟js的朋友或許在css改是比較好的,且記得把makeResponsive註解掉。

2019年6月24日 星期一

[啥記錄]被遺忘的物語封面小遊戲《Braver Choice》

音樂音效來源: PANICPUMPKIN

  目前為了要整合一包方便訂制之後做新遊戲的流程,所以馬上將一些一定會用到的元件給打包並建立Default資料夾,讓之後做新遊戲時做過的地方不必再做一次,而打包完後必須要確定這流程有沒有錯,因此馬上就做了另一款遊戲-Braver Choice。

假冒勇者的鬪羅柏!

  基本上這款遊戲是我曾在Akaibaito製作的夯魚!喵3的玩法,就是簡單地選擇左邊與右邊。而因為這款小遊戲我亦曾經為了幫一家工作室測APP,所以其實也可以在Google Play找到一模一樣的玩法和外觀的遊戲。也由於已經做過,所以這款遊戲就被我拿來當做驗證我訂制的Default資料夾有沒有需要改進的地方的測試用小遊戲。

 
在寶箱內的史萊姆-史邁爾!

  然後,儘管這只是測試用小遊戲,但其實我有將《被遺忘的物語》第1話Children Treasure的背景給設計進去。雖然原本的封面設計是類似把物品藏在杯子裡,移動杯子位置,記住過程去猜史邁爾會在哪個寶箱的簡易小遊戲。

 
原本的小遊戲方式

  雖然這勇者看起來像是雷蒙丸的養父—鬪羅柏。但其實被我設定是16年前與魔王追根大戰的勇者-剛達。所以其實也代表著,勇者剛達和史萊姆-史邁爾是有關聯的。只是這個設定我暫時不在這描述太多,但我在google play的商品描述裡有提到那是勇者的抉擇。雖然遊戲方式是選擇金錢才是正確的方式,但事實上,他最後選擇的是Game Ovum,也就是甘姆之卵。

 
60年前開始,勇者與魔王持續了長達44年的戰爭。

  這邊就放上目前的遊玩影片:

 

2019年6月16日 星期日

[啥記錄]被遺忘的物語封面小遊戲《Sugar Tower》

  基本上這篇文章算是一樣留給自己記錄用的,雖然我想應該不會有什麼人看我漫畫以及玩我做的遊戲,但至少想留點自己奮鬥過的記錄。


  過去這一個月來我把《被遺忘的物語》第7話的Sugar Tower封面遊戲化了。這算是滿足自己一直以來的規劃—「不只將甘姆(被遺忘的物語世界觀)漫畫化還想將甘姆遊戲化」的方式就是。當然我希望未來有時間的話繼續把還沒遊戲化的封面小遊戲進行製作。


漫畫裡疊得高高的方糖動物們!

  這款的遊戲方式其實和我以前曾在Akaibaito擔任程式時開發的一款小遊戲《上吧棉花糖》幾乎一樣,就是一直保持在中間疊著塊狀動物。程式製作上因為有寫過,即便是要將unity script轉C#,還有一些長度判定得修正,但基本上原理不會差太多,方便從之前寫的程式修改也是我選擇這款的原因之一。先聲明雖然我在Akaibatio有完全個人製作(企劃程式和美術)過一款名叫《衝啊爆炸頭》的小遊戲,但在《上吧棉花糖》這款遊戲裡,我個人只是擔任程式而已,並未提供任何點子以及美術製作。會特別挑他除了剛提的理由外,還有這是我個人參與製作的遊戲中,目前給我成就感最大的小遊戲,除了下載量最高(2019至今累積47.85K)的原因以外,就是因為我曾經在2016台北電玩展獨立遊戲區裡看到有玩家玩得很開心。特此紀念所以才想先製作,才沒有選擇從第0話開始。畢竟之後還是得花時間畫漫畫,我沒辦法保證之後真的完全可以邊做小遊戲邊畫漫畫……所以先行製作了這款讓我值得紀念的遊戲。

 
2016年台北電玩展當時Akaibaito有參加獨立遊戲區

  當然我個人還是加入了自己的點子,那就是在方糖搖籃往左或右時你可以按相反的方向鍵讓他改變方向,以及只要接觸旁邊正在爬方糖動物的法門和巴克瑟爾就會讓他們掉落,兩個都掉落後就會Game Over。

法門掉下來了(被炸到右下)

  基本上這算是為了符合Game & Watch的設計,但卻是為設計而設計的遊戲方式就是。有點不應該, 畢竟這種小遊戲其實越單純越好,原本的單一點擊就可以玩的方式其實比較親民。但想想自己是個複雜的創作者,所以就不管那麼多了。加上我又是老遊戲玩家,小時候玩的都是這種不體諒玩家的遊戲,所以就這樣自我催眠了。不過最一開始的設計其實更容易操縱混亂,我是打算讓左右兩邊的法門與巴克瑟爾像漫畫一樣會互相競爭,所以打算讓他們互丟他們到達神族時會吃到的像素方糖,法門丟他吃的黑糖,巴克瑟爾丟他吃的白糖。但因為他們中間有他們沒看到的方糖搖籃與玩家疊的方糖塔,所以其實會打到搖籃中的方糖動物並讓他自動掉落。而左右鍵的設計是為了讓搖籃生出左右防禦塔(會以動畫方式生長出來並下降)。但在打算要開始做的開始時,一直想到有個問題,就是因為遙籃會左右位移,我很難設計出法門或巴克瑟爾的攻擊時機,怎麼想都覺得玩家鐵定很快Game Over。後來一直思考有什麼可以改進,就因為想到現在的玩法而放棄了原來的設計。

  這邊因為覺得應該不會有玩家玩到或發現我設計的巧思所以打算一一列出就是。基本上目前疊高會看到三個明顯分界,也就是四個領域。第一個領域一開始的樹林到天空看到日分界以及日之塔,要注意一下這款遊戲的目的是保持讓方糖動物在正間一直疊高,所以日之塔的輔助很重要,一直往斜的方向疊是會Game Over的,雖然因為這是寫程式的判斷問題,但我個人自以為這是代表遊戲裡不能太偏魔物與人類角度,要糖糖正正的意思XD...嗯,一開始的彩蛋差不多是這樣,還有一個比較有趣的大概是那個一直哭的地鐵霍格會以低機率出現唷(被遺忘的物語第6話初登場)。

 
 
霍格爺爺終於飛出來了!但我忘了畫讓他載魔物了XD

  而天空分黑白的用意其實也是象徵著人類與魔物的比喻就是。

  然後接下來是神族界,在看到月亮後會再看到站在雲上的邱妮和邱緹(被遺忘的物語第8話有兩人一起登場),在這個地方有麼四個地方比較有趣一點,就是第8話邱緹使用的萬用型坦克,還有成為神族的人類和魔物(史萊姆)在為工作而奔波著。

月亮(所以其實底下的森林應該要有部分塗黑代表月之林,但我忘了) 


 左邱緹右邱妮

 萬用型坦克

人類天使

魔物天使

  第四個有趣的是有天屎(?),這個在後面兩個領域都會出現。就是第8話裡有畫面帶到的,從上級降下的任務訊息。所以就是屎缺的意思。

在巴克瑟爾旁邊的天屎

  天神界往上會看到左邊的白天已經不在,全都是黑暗,代表進入宇宙,可以看到各種行星。這邊比較有趣的是大概會看到從上面不知道從哪降落的天屎。剩下其實都還好,勉強講比較有趣的是那個XO酒瓶。這邊稍微解釋一下為何有那東西,因為在我小學四年級的時候,老師徵求一名學生參加畫圖比賽,我當時竟然會舉手。我已經忘記我當時的想法了,只記得我是主動說我要參加的,這對一直很閉俗的我來說是很難想像的,因為我記得我小時候也是很不愛說話然後不喜歡舉手。總之當時接下這個比賽時,我畫了一幅畫,是底下是地球有很多人在做不各自不同的事,上方中間是大太陽(接近遊戲中的畫法,除了中間那個點),旁邊一堆星球,其中有個星球就是畫那樣的XO瓶子。現在我已經找不到那些畫了,只記得我畫很多張,因為被老師打掉重練。其中一個被打掉的第一個概念就是那個XO瓶子,老師說既然這作品叫我的世界那小孩子的世界怎麼會有XO酒瓶?其實我會畫只是單純地想到什麼畫什麼就是,我根本不愛喝酒更別提小時候。只是XO這名字讓我當時莫名地容易記住就是。總之因為那是我畫那張圖第一次被打槍打掉重畫的圖,所以印象深刻就是。這裡不能說是老師的問題,當年那個老師我是很喜歡的,我還留著她送給我的卡片。總之那畫雖然參加比賽了,但平常沒啥在畫圖,畫圖也不是很厲害的我明顯不會得獎。這段往事我一直很難忘記,那大概是我人生裡第一次主動想參加畫圖比賽了。

從上方降落的天屎 (右邊)

XO酒瓶

  嗯,扯太多,總之宇宙區的最上面,會看到日之塔已經到頂了,日之塔的設計其實是第一代人類-獨眼巨人為了監視太陽而建造的,所以日之塔再往上會看到太陽

  
日之塔到頂了

太陽

   因為想做出第0話提到的,世界外還有世界的領域,所以看到大鷗歐爾上就是更高的領域了。這個領域在我甘姆的設計就是GOS(Game Operating System),GOS領域不是一般人可以到達的,所以會有干擾現象(glitch)。因此其實也代表著法門與巴克瑟爾之後會來到這個領域,只是我目前設計他們將來會透過卡巴拉之樹上去,所以到那邊的方糖塔應該要換成樹,但是是打這篇文章才想到的,製作時沒想到。

刁著鷗陸亞大陸的鷗爾

 干擾現象

  而這邊除了干擾現象,會出現兩個較有趣的設計。一個是前面提的,在三個領域都有出現的天屎,被我稱為屎達一號的星星手上拿著的就是天屎,所以代表那些屎缺就是他丟的。也可以說神族的那些工作全都是GOS指派的。

屎達一號

  還有另一個是被我稱為飛天義大利烏龍麵的奇怪飛行物就是,單純是致敬飛天義大利麵,也代表GOS的領域就像是宗教裡神的領域。

飛天義大利烏龍麵

  然後這款遊戲大概提一下最後的設計,和《上吧棉花糖》一樣最後會有讓方糖動物都亂飛的按鈕。也就是按下那個像炸彈的選項就可以讓包括掉下來的法門與巴克瑟爾飛高高再掉下來,使用手機還可以擺動手機讓他們掉往你要的方向。算是單純好玩的設計就是。還有網頁版因為不是google play,所以沒有獎勵式影片廣告,只要等20秒就可以接關。也因為沒有google所以點了排行榜的圖示(炸彈右邊)也不會有反應。

  最後放上三段遊戲影片,都是在我Unity引擎編輯器玩的,我都是用直接到達高度程式去跑,不是我個人玩到的記錄就是。


遊戲影片1

遊戲影片2

遊戲影片3

2019年5月28日 星期二

【筆記】2D動畫成本計算

 

  由於前陣子看到台灣一部2D動畫因為一集三分鐘要燒百萬被批評得很慘,讓我真的覺得台灣鄉民對於2D動畫的製作流程以及會花費的成本實在是很沒有概念。因此我決定打一下這篇筆記。

  先聲明我不是相關業界人士,只是個會去關注產業狀況的傢伙。所以,這邊要以門外漢的分式去推敲到底合不合理。

  建議在推敲前先看過這幾篇文章:
  日本動畫業界製作流程完全揭秘(一)
  日本動畫業界製作流程完全揭秘(二)
  日本動畫業界製作流程完全揭秘(三)
  日本動畫業界製作流程完全揭秘(四)
  日本動畫業界製作流程完全揭秘(五) 

  如果沒空看完,那我這邊大概講一個基本一定要知道的,但我後面不會提的,那就是原畫師和動畫師是分開的。你可以把原畫師想成是一家公司的小組組長,動畫師是最底層的基本員工。意思就是他領的薪水一定是比動畫師多的。

  這幾篇文章其實是大約於2007年在製作天地無用的動畫公司官網所看到的中文官網介紹。但很遺憾那網頁早就關了,只能看到有人備份的文字,沒有圖片。不過我在我以前製作的2D動畫教學有提供我保存的網頁下載就是。

  雖然已經過了十幾年(此篇筆記是2019)了,但其實有看過白箱的人應該都知道,那流程其實沒變化太大,雖然白箱也是2014年的作品了,但做2D動畫就是得一張一張畫,所以他的大至流程不會變化太多。而再加上,日本產業對動畫勞工的壓榨一直是有的,所以就算到了現在2019年,這樣的文章還是有出現:
  "日本動畫爛片頻出的真實原因,畫師工作時間長,工資低":
"現今日本動畫每一季都會有相當數量的爛片,導致一部動畫成為爛片的因素有很多,有客觀上的原因,也有主觀上的原因,其中有一個因素,那就是動畫業界的工作人員基本的工作環境以及薪資待遇保障都沒有,在連飯都吃不飽的前提上,就不要再奢求動畫製作人員們能夠將每一部動畫都做好了。並不是每一名在日本動畫業界工作的人,都可以一直只靠愛發電下去。"
  
  講這些是想讓人明白,我們平常看到的2D動畫,是非常地得來不易的。

  好!回正題,究竟一個大約三分鐘的動畫會不會燒到百萬?

  首先,我們要先知道日本2D動畫大多是以FPS24去製作,也就是每秒24張的意思。但要注意,日本動畫為了節省成本,其實不會真的畫那麼多。還有一件事就是,一個動畫要畫到好不是畫越多越好,其實節奏更重要,但這是題外話了,有興趣的人多到2D動畫交流社團問人或看仙人掌大這篇文章。我這邊為了方便計算,所以全以一拍三也就是每秒8張來去做計算。(不選擇一拍二的每秒12張是因為用現在普遍動畫要流暢的最低需求去看待)所以,3分鐘180秒的動畫就是180X8=1440張

  製作流程三可以看到以下這段文字:
"一個剛進動畫公司的新手一個月大概可完成400張左右的分格動畫(通常低於400張)"

  感覺得出來新人畫400張就是高手了,而我為了方便計算,一個人300張好了。1440張算1500張,所以1500/300=5,一個月要5個人手。(總覺得有人會認為不需要到千張,給個參考,我九年前做的專題動畫大概一分20秒,也就是80秒,我畫了495張。每天最多16張但是是最多,我總共花了3個月才把495張線稿完成。後來我去問了一個在業界的朋友,一個要成為原畫師的動畫師考試需要一個月能畫上500張,只是近幾年下修到200-300張..)

  而這只是動畫師的需求,還有後製,我就以一個人好了。


  然後要有導演,要會畫分鏡,一個人。

  然後背景,好,辛苦一點,也一個人。

  上色人員,也辛苦一點,一個人。


  音樂音效與配音,通常算外包,但我再當一個人。

  原畫師,也當一個人(其實老實說我有點懷疑台灣現在的小團隊有沒有這樣的角色,以前宏廣時期是一定有,因為在我還是學生時期有老師就是宏廣的原畫師,還提到那時候他們月薪有到四萬。但總覺得台灣小團隊現在還沒能做到像日本那樣的細節,有辦法騰出一個這樣的傢伙。感覺導演兼職或動畫師負責的地方看導演分鏡去想畫面的機率蠻高的。)

  所以製作這個3分鐘動畫需要11人。我還沒去算行銷費用,我就當導演為了夢想可能身兼數職好了。
  
  那,薪水怎麼算呢?我這邊打算用月薪的方式來計算。其實以日本業界來說動畫師很可能是以張數計價,台灣外包也可能以分鐘計費。但我不認為這是健全生態該有的方式,即便這在日本很普遍。 我認為薪水之所以要定最低薪資,就是希望至少要能養活一個人一個月的基本生活。用這樣的方式去建立業界才比較健全。

  目前2019年雖然基本薪資是23K,但有工作的其實大家都很清楚,至少要30K才比較能應付基本生活,所以才有人提要把基本薪資調到30K(雖然我相信做這一行的25K-28K甚至更低的應該很多)。因此以每個月3萬,11個人,一個月做這三分鐘動畫,可能最低需要33萬。

  好,所以有人會直接下結論說不需要百萬。

  但我是覺得,新聞雖然是說三分鐘燒百萬,但誰知道搞不好是以一季六集每集三分鐘這樣算的,如果是這樣的話,6X33=198,也就是198萬了。

  或許我這樣講有點偏心,那我今天來看看日本動畫產業好了。雖然我知道國情不同有時候不能比較,但認真講,其實更應該是公司文化不同,很難比較。今天我只是要計算,一個三分鐘動畫到底燒多少才合理。就算我確實一直在幫人說話,但其實我更希望是產業能建立在健全的薪資和人力制度上而去推敲到底要多少才合理(不過也要注意,我並非相關業界人士也沒有開過公司,這些計算只能當參考)
 
  總之從這篇文章可以知道日本的狀況:
       一集24分鐘的動畫,製作成本大概需要多少錢?:

"片長為24分鐘的日本動畫,平均單集製作費為1000~2000萬日元。其中「親子動畫」或者對作畫強度要求很低的動畫,製作費標準值為1100萬日元。面向青年的深夜動畫製作費基準為1400萬日元,相當於80萬人民幣。(數據來自增田弘道的《日本動漫產業的商業運作模式》)"

  而新聞的這部作品就是親子向作品,所以我們用1100萬日元來看待好了。也就是說,在日本製作24分鐘親子向作品需要大約300萬台幣。用直接將24分鐘換成3分鐘來計算,24/3=8,所以我300萬要/8,大約37萬。這樣的意思就是日本3分鐘的親子向動畫需要花上37萬台幣。

  或許有人會說,你看,一集3分鐘動畫費用根本不需要花那麼多。也有人會說,日本已經有很完善的動畫產業了,他們這樣的成本以台灣來說絕對算高,且物價也比我們高,薪資也比我們高。他們是要三十幾萬的話那我們台灣應該更低。

  但說實在的,你看一下日本產業被壓榨的狀況:
       [翻譯]美國動畫師:日本動畫界是個違法的惡劣產業:

"注:他在Reddit AMA也回答過薪資的問題,現在他在小丑社一個月約能拿到1000美金,在之前的奴隸公司只能拿到一個月300美金。"

  一個月1000美金是大約台幣三萬, 看起來好像差不多。但要知道日本20多歲的平均薪資大約是年薪346萬日元,也就是月薪28萬日元,也就是大約八萬台幣。
(來源:日本各行各業的平均年收和年齡分布於2016年的統計)差了兩倍多啊(別忘了他待過的奴隸公司更慘),所以可以知道到底有多壓榨了。

  另外我後來又找到了一份資料,這裡提的比我上面找的單一個人資料還可信:
   【閒聊】由動畫師的待遇討論日本動畫產業之現況
"根據日本文化廳的調查,一位日本的「動畫師」平均的年收為111.3萬日圓,而一天平均工作時數為11.3個小時,一個月的平均工作時間則是251.3小時;換算成時薪的話,平均每小時只有拿到370日圓,比起日本東京都法定的最低時薪888日圓還低的多。以當前的匯率來換算的話,年薪約27萬8千台幣,也就是只有23K~24K而已,更不用講說把工作時數考慮進去,也只有約90元台幣的時薪而已(台灣檯面上至少還有115元台幣)。此外,日本的動畫師是以「個人事業主(自僱)」的形式任用,接受動畫公司的委託,所以並沒有受到所謂的勞動基準法的保障。"
"以作畫的幾個職務的年收錄來做垂直比較,做出了一張金字塔圖。一般來說,從「動畫師」升到「原畫師」,最少需要一至兩年在動畫師的累積工作經驗,並且需要了解一些分鏡的攝影技巧,更不用說後面各話的作畫監督和整部作品的總作畫監督,要從那麼多的動畫師中脫穎而出,也不是那麼的容易。換算成台灣,大概要做到作畫監督才有辦法達成所謂年薪破百萬的里程碑。而按照日本文化廳的統計,20多歲平均的年收是110萬日圓,30多歲則也僅僅只有214萬日圓......。"

  感覺我再貼下去就是完全複製貼上了= ="建議有興趣的朋友點進連結看,裡面還有一家工作室流出的成本表。他列的工作項目與花費會比我這邊列的更加明確,雖然是日本公司就是。後面還有提到其實動畫公司在全部動畫的營利只站11%(所以要支持您喜歡的動畫請多買他們的BD和設定集),這也是為什麼他們薪資那麼低的原因。

  其實關於日本2D動畫產業的現實面,我在這篇:[筆記]一個日本動畫產業相關的募資計劃New Anime Making System Project 也還有一些進一步的資料分析就是。

  還有我這邊再提供一個角度,一個在日本工作,年薪110萬日元(月薪約
26466台幣)的日本動畫師,這種工作如果在台灣是份怎樣的工作?

  我查了一下,2012-2013年台灣20-29歲的平均月薪28368台幣(來源:here)。再加上我前面有提到,日本20歲年輕人的平均月薪大約是28.8萬日元,差不多是83078台幣。因此,在日本月薪領26466台幣的動畫師,他在台灣是相當於領28368*26466/83078=9037。也就是月領9千多塊錢的勞工。試想現在的公司如果說我9千塊月薪請一個人,你覺得他不會被譙到爆嗎?當然我相信可能還是有這樣慘的傢伙在的,因為我確實看過一個台灣的成人繪師在台灣只接外包,我個人認為他功力還挺不錯的,但他在別人的社群平台提到他年薪只有十二萬,也就是月薪一萬。我個人是頗好奇他是如何在台灣生活的就是。可能家裡的容忍度是高的。
   
  然後應該也有人好奇,那日本人呢?他們是如何在物價比我們台灣高的日本生活?我在2014年去過日本仙台,我感覺領台灣的薪水,其實勉強可能還是可以在那邊花費和住台灣差不多的錢(但注意,這是樂觀推斷)。因為我有注意到他們超市在過了一定時間是有賣日幣150-200的,也就是差不多台幣50-60塊的。大概如這裡講的:
  窮游日本!教你如何用一個500日圓硬幣吃到嗨(・∀・)ノ゙
"大家知道唐吉可德分店都有熟食區嗎?價錢與便利店超市差不多、份量卻多很多!甚至有低至200日圓的。"

  所以我相信那些靠愛生活的熱血動畫師還是能生活的,只是很血汗。看到這裡,所以如果有聰明的傢伙應該都知道為什麼日本這動畫產業那麼血汗還能活的原因了吧?因為這些數據都代表著一個事實,那就是他們可以發包給國外。想想他們動畫師的薪水差不多是我們國家的一個20-24歲年輕人平均薪資時,加上,還有其他國家更便宜。你是日本公司,你會不會選擇外包?所以看到這裡,連迪士尼動畫大多都以3D動畫為主的年代,你是不是得對於現在還看得到自己喜歡的2D手繪逐格動畫要心存一下感激?

  當然我們不能說一集用1100萬日幣當成本的一定用壓榨的方式去計算,畢竟我沒證據。但因為一直聽過這業界有多黑暗,所以我實在不太相信1100萬日幣就夠了。(指的是若能給基本底層員工薪資保障的狀況下)

  另外,就算一集3分鐘這樣的親子動畫實際成本是一個月花上三十萬台幣,和新聞講的不太一樣,但有沒有想過一個公司要維持,你會希望只維持一個月嗎?至少也希望能撐個一年以上吧?我還沒把水電費,每個月工作室房租租金算進去(要養11個人的工作室總得大一點吧)。還有電腦硬體設備,軟體費用支出算進去勒。先不說一集要百萬,但開個公司,只算人力費用,你撐個一年絕對得燒百萬好嗎?

  還有一點,台灣的2D動畫斷層太嚴重,環境也不夠好,一家新公司剛起步總是有可能花上不少學費,因此剛開始不小心花上百萬是真的有可能(測試作法、打掉重畫……etc等問題只要工作流程一拖個四個月就33x4=132萬了)。

  講了那麼多自圓其說的結論,好像沒幫到這部動畫。老實說我去看過一集:



  我感覺動畫張數方面至少是及格的作品。沒有到進擊的巨人那樣高分,但應該也有"天體戰士桑雷德"到"我們這一家"之間的分數(注意,我說的是動畫張數,如果你要說故事不行,我只能說這見仁見智,故事感觀本來就是很主觀的事)(還有一點要注意,前面其實提過,動態要做得好其實節奏會比張數更重要,我個人判定這部動畫的節奏可能出了點問題,但他的張數並不是那麼少的)。

  還有一點,如果這部動畫的張數沒有我說的那麼多,那確實我提的花費成本在動畫師方面需要五個人來製作會站不住腳。但我個人認為就算只有600張或800張,沒有到基本的1440張。我是覺得各位有在一般公司至少有基本薪資的公司工作的人能夠想一想,如果你的工作是可以輕易地這樣量化,在可以和他人一起比較的狀況下,那是否在薪資結構上就不會這樣輕易地取得你現在的薪水?我個人認為,其實很多的工作基本薪水不應該以量計價的,這點很違反數學邏輯,也違反了蠻多人的常識。但我想說的是,給予一個人基本的生活費用,這是一個要成立一家公司的人的基本。我當然知道這很天真,但其實那是因為美術這領域在台灣就是比較不被看好(可能整個亞洲都是如此),今天要是連程式員也是這樣,以程式案件計價,我相信薪水也會低得很多。而且我講的是基本薪水,並不是想刻意抬高價錢。還有,如果該員工做了幾個月不適任,當然就是把他裁掉啊。所以我覺得不該用一個人一天只畫兩張,另一個人畫了10張,這樣去說他們不該拿一樣的基本薪水。畢竟你又怎知道前面那個人後來不會迎頭趕上?人才對公司的貢獻其實是不該那麼簡單地量化的。當然我承認這是我較天真的看法,事實上業界就是很現實,只是說每個領域都這樣看待的話,我個人認為,那很可能很多人都不配拿他目前的薪水了。另外如果您是待在這個行業的苦行僧們,如果您所處的環境沒辦法達到這樣的理想我也希望您別急著指責他人破壞行情,如果覺得目前您的所得比您認為破壞行情的價碼低,若不能接受自己是這樣的價碼,就請急早抽身;若能接受,就當是在練功,希望能讓自己將來更強大到可以改變環境為目標。雖然我知道這有點強人所難,但我這邊也只是提供一點觀點就是。

   而關於成本計算這邊再補充一點,其實我直接用動畫師的張數去做計算,數字其實是一定比較低的,只要了解日本2D商業作畫流程都知道還有原畫師,原畫師也是以張數計費,雖然原畫師的張數較低,但是他的價錢較高,因為他必須要設計出確切的中間張構圖。

  然後有看到有人說這種風格沒有賣相,但要知道,這種親子向的風格本來就是要拿"我們這一家"和"櫻桃小丸子"這類動畫來去做比較的。親子的市場和大家平常在看的動畫市場可能是不一樣的。

  還有就是,有看到有人說學生作品屌打這部作品,問那些學生作品有需要到百萬?我必須要說是有可能的,因為學生是有家人在養,所以當然看不出需要花那麼多。

  總之我還是希望,覺得不好看,OK,但要批評別人不該燒到百萬,好歹也先了解一下動畫的製作流程(有看到說這動畫三分鐘只畫72張就明顯不理解)和成本計算(也看到有人說叫大學生做這作品只要5千的)以及市面上的親子向作品(一直拿來和進擊的巨人比較的..)。

  另外個人是希望大家可以想想,現在不是有很多電影、電視劇以及遊戲是高成本但卻被大家批得半死的作品?可是有沒有想過,很少人會去批評做出這樣的東西不該給團隊那麼多錢,大多都是覺得燒了就燒了,頂多就是對這團隊不再信任而已(像是冰與火之歌第八季的成本是本季最高但卻是評價最差的)。而娛樂產品本來就是該交給市場機制決定其生存。他背後燃燒的金錢,我們大多都認為是需要在合理的制度下就好(指的是足夠應付成員的生活),至於開發成本時間過長導致他成本提高也是那個團隊的問題。所以有人覺得新聞的那個團隊不該這樣叫,這點我覺得可以接受,但也不到需要批鬥的地步,畢竟也有可能是媒體訪問的狀況下,他據實以報。這樣的話也沒什麼不對。


2019年3月14日 星期四

電腦玩家評析-散碎的原色

  基本上這款我放最上方的原因是這是我在電腦玩家評析的五款遊戲中我個人認為評價最高的遊戲,雖然有些劇情忘得差不多,但我仍然無法忘記他以三原光為原理架構而成的故事,這讓我當年大開腦洞寫了一些靈感文就是:
   【三原色不停地交錯,揮灑出全彩的那一刻,你是否看得見紅燄的冰冷、老松的青澀、大海的饑渴?用黑暗畫出光茫的輪廓,將每一筆想像收進時間的珍藏。相同的角度見到不同的獨特,最後,面對這幅畫的狂熱讓笑容顯得特別清澈。】RGB…

以下為評析:


@遊戲資訊
遊戲類型:單機冒險
設計公司:KID
國內發行:英特衛多媒體
國內售價:680
系統需求:P4 1GHz CPU512MB RAM64MB顯示卡、1GB 硬碟空間

@前言
  日本知名遊戲公司KID旗下有非常多的戀愛AVG系列,如《秋之回憶》、《infinity》、《水之旋》,其中尤以《秋之回憶》最讓人津津樂道,而本款《散碎的原色》正是出自於KID遊戲公司之手。由於該款遊戲在日本知名遊戲雜誌《Fami通》獲得不錯的評價,所以被喻為KID有史評價最高,勝過《秋之回憶》的大作。《散碎的原色》其故事背景在敘述一名車禍後失去記憶的高中生星川純一回到校園後,發現自己完全沒有已失蹤的女友—日向光的相關記憶。偏偏在這個時候,陸續出現、密切來往的每個女孩身上,都感受到「光」的幻影……

@大標 三原色組成的故事


三原色是什麼?三原色指的就是紅、綠、藍三種光;而這三種光以不同的比例配合,就可以組成非常多的顏色光。如果將這三種顏色相疊,將會出現白光,當然,如果沒有這三種光,就會是黑暗。

  為什麼要提到這些呢?因為,筆者認為以上這些原理可以算是構成這款《散碎的原色》的要素。主角面對的五位女性角色分別為內斂卻熱情的澄香、天真活潑的雙葉、冷靜且好強的水瀨、行蹤成謎的日向、低調帶點任性的深月真。注意到了嗎?每個女主角的名字都有三原色代表的意義呢……筆者甚至以為,以上原理或許可以說算是本遊戲的攻略,因為在玩這款遊戲時,只要選項一偏離目前你正在攻略的女主角,就會一步一步地朝向黑暗的Game Over……喔不是,是走向與深月真夜這位女主角的結局……至於主角的前女朋友日向光呢?我想筆者的提示就已經非常清楚了……

  這款遊戲的介面非常單純,就是看故事劇情,適時地出現選項要玩家選擇,依據選擇來決定之後的對話。簡單來說,就是單純的戀愛AVG,重點在於享受劇情。其實,筆者在第一次破關時頗為錯愕的,因為筆者有上面三原色的想法,誤以為要腳踏多條船,這樣一來才能挖掘女主角日向光失蹤的真相,結果剛開始腳踏多條船的結果就是快速走向黑暗的結局……這個故事是告訴大家一定要專情(淚)。

是的,其實這款遊戲的流程還挺明確的,上手後就會很清楚要選擇什麼選項就會增加哪些女主角的好感度(也就是朱、碧、藍三位女主角),只要剛開始選擇堅定,最後會讓其他兩位女主角慢慢地消失,明確地帶著玩家走向單一女主角的攻略。這樣的設計雖然少了和其他兩位女角色的互動性,但是,當你整個遊戲玩透徹後,你就會了解到這樣的設計是必要的,甚至會認為是非常高招的故事手法。

@大標 細膩劇本、一流音樂

筆者給予這款《散碎的原色》的劇本有很高的評價,它不僅僅只是單純的戀愛遊戲,還很適當地加入懸疑的成分,這裡說的懸疑指的並不是什麼密室殺人案件,指的是主角撰寫的演劇劇本消失、男主角神秘的好友鏡見透身份成謎以及主角女朋友日向光失蹤等疑雲。由於男主角純一已經失憶,所以故事中埋下很多疑問等待玩家挖掘;在遊戲的過程中,這些疑問恰到好處地融入了戀愛的劇情裡,讓筆者一直都有源動力玩下去。不僅如此,遊戲中還會不停地穿插之前對話過的回憶,除了加強了戲劇的張力,也拉近了玩家與角色間的互動。

除了吸引人的劇本外,本遊戲的音樂還特別搭配其懸疑特性,當事件越來越可疑時,低沉的音樂是會讓人更加地融入故事之中的。還有女主角的配音加上淡淡的配樂,無疑是一種享受。

如果玩家像筆者一樣無聊的話,除了會注意到了三原色的道理,還會注意了主角名字間的關聯,像是男主角星川純一就是星星、女主角日向光就是太陽、大魔王() 深月真夜就是月亮,就跟格鬥天王的Terry Bogard、草薙京、八神庵背後的標誌象徵一樣……()其實會提到象徵,就代表著製作小組連名字都很用心,所以不難看出其劇本的深度是相當吸引人的。

@大標 畫風平凡、官網失聯

  雖然深度的劇本與一流的音樂是戀愛AVG的關鍵,但畫面也是非常重要的,這款遊戲的畫風筆者只能說不太合筆者味口,總覺得就是少了點什麼,感覺很平凡。當然,如果您非常喜歡這樣的風格,這款遊戲其實可以再加上個0.5分的,畢竟畫風這種事情本來就是青菜蘿蔔各有所好。

  而在玩遊戲的過程中,有時候畫面背景會不停閃爍,語音只念到一半,雖然前者的問題在切換下個畫面就解決,後者的問題只要重開也可以解決,但難免會希望在玩遊戲能夠一路順暢到底。所以,這個時候官網釋出的更新檔是非常重要的,不過英特衛官網掛掉,所以也不能確定會不會有更新檔。網路討論區雖然有看到網友提供,但筆者無法百分之百確定那是官網釋出的檔案,所以有一點小瑕疵,筆者是覺得挺可惜的。

  當然,儘管有以上的缺點,筆者認為這些都不足以影響這款遊戲該有的光茫,也就是說,筆者以為,瑕不掩瑜呀!

@大標 超越秋之回憶之作?

  由於Fami通不錯的評價,所以這款遊戲還帶著打敗《秋之回憶》的頭銜。筆者雖沒玩過《秋之回憶》系列,但在過去五年間都有聽聞這部大作的名聲,甚至其製作公司KID都略有所聞。雖然該家公司在2006年宣佈破產、2007年經由CyberFront公司接收、製作小組轉移5pb.後已經只是一個遊戲的品牌(詳細情形可見此網站:http://www.mowypan.com/KID/KID_His/003.htm),但其旗下每款遊戲的影響力還是不容忽視的,2008年的現在還會繼續出一系列的KID遊戲中文版

  由於筆者是個骨灰玩家,所以大部分玩過的戀愛AVG都是DOS時期的,但是筆者相信,每款遊戲都存在某些玩家們的內心深處,而這種感動,是不分高低的,無法比較的,不管你是不是KID迷,只要你是喜歡戀愛AVG的玩家,筆者相信這款《散碎的原色》是非常值得一玩的。

@偵查終結
評分:8.5
O:劇情感人、細膩,懸疑搭戀愛配地恰到好處。
X:畫面略嫌平凡、官網沒提供更新檔。


 
只要玩家意志不堅定,都會朝往和深月真夜在一起的結局,由於這樣的結局很容易又很常發生,所以筆者才認為這根本就是Game Over……




遊戲中只要按右鍵就可以看到這種類似於早期windows 9x遊戲的介面。




特別關心主角的鏡見透。



女主角日向光的失蹤線索就在這三人身上!?

 
 一提到戲劇就非常投入的澄香朱



 
 主角過去的回憶



 
 天真活潑的雙葉碧與她會說話的玩偶


戀愛AVG都會有的接吻畫面
 

以上文章在電腦玩家於2008年10月號VOL.207遊戲偵查庭專欄原稿

而遊玩過程圖片全都放在此:
https://www.facebook.com/media/set/?set=a.2319367241415211&type=1&l=9290e2ad55

以下則是實際刊登狀況: