嗚嗚喔學習筆記

搜尋此網誌

2014年9月22日 星期一

Corona SDK - [ facebook API 開發流程 ]


Step1 : 上Facebook 開發者網站註冊 https://developers.facebook.com/
           Apps -> Add a New App 


Step2 : 拿取 App ID 和 App Secret ,App Secret 需要點 Show才能看到。
Step3 : settings -> Yconteact Email -> 輸入email
Step4 : Status & Review -> YES    選擇YES。
Step5 : 把 App ID 和 App Secret 覆蓋到 sample code 裡相對應的地方 大功告成~
          PS: appId 和 apiKey 都是"字串",不可用數字嘗試....

PS : 只能使用在一個app上,如果要用在別的app上 流程又會新增一些了~

2014年9月4日 星期四

Corona SDK - [ android push notification : client 端 (推播)]

Corona – Android - notification
Step1 : 進入google 開發者網站
step2 : create project 











step3 :
點選剛剛建立的project

















Step 4 : 點開Apls
Google Clound Messaging for android  :  OFF-> ON
















Step 5 :
點選 credentirals -> create serverkey


















Step 6 :
拿到api key














Step 7 : 拿到 Project Number









Step 8 :
修改samplecode
C:\................\SampleCode\Notifications\GooglePushNotifications
1.   Config.lua ->
projectNumber = “這裡輸入上面拿到projectNumber”
2.   搜尋main.lua -> event.token
這裡event.token 的值就是 devicetoken
3.   Main.lua -> apikey = “輸入上面拿到的apikey”

結論: 需要拿到三個值:
api key , projectNumber , devicetoken 交給server
Ps :
1.   devicetoken 的值在安裝app時需要傳給 server server就能依據devicetoken 推撥給手機。
2.   sample code 是透過GOOGLE SERVER做推撥
如果要利用其他SERVER做推撥需要另外傳devicetokenserver

3.   資料要以POST的方式傳送,資料格式須為Json,且Json格式如下:
{ "registration_ids":["registration_id_1","registration_id_2",...,,"registration_id_n"],
"data":{"attr_1":value_1,"attr_1":value_2,...,"attr_n":value_n},
}


2014年8月20日 星期三

Corona SDK[ require("sprite") not work]

因為Corona版本的關係 再 require "sprite" 會出現錯誤
Runtime errormodule 'sprite' not found:resource (sprite.lu) does not exist in archive    no field package.preload['sprite']
因為舊的已經不再用sprite.lua了,但又懶得換寫法 最簡單的方法就是
拿舊的 sprite.lua 複製一個再專案裡,把他當作一般 require  .lua 檔一樣就好了 ~



step1 : 新增一個"sprite.lua" 在專案裡面。
step2 : 然後複製下面程式碼貼上,儲存。完成~


程式碼 : local Library = require "CoronaLibrary"
local sprite = Library:new{ name='sprite', publisherId='com.' }
local function toImageSheet( spriteSet )
assert( spriteSet.spriteSheet, "toImageSheet(): Bad spriteSet parameter: spriteSet.spriteSheet is nil" )
local options
local spriteSheet = spriteSet.spriteSheet
if spriteSheet.format == "simple" then
local w = spriteSheet.width
local h = spriteSheet.height
options =
{
width = w,
height = h,
numFrames = spriteSet.numFrames,
}
elseif spriteSheet.format == "complex" then
assert( spriteSheet.spriteSheetFrames, "spriteSheet.spriteSheetFrames is nil")
options =
{
spriteSheetFrames = spriteSheet.spriteSheetFrames
}
end
local filename = spriteSheet.filename
local baseDir = spriteSheet.baseDir
if baseDir then
return graphics.newImageSheet( filename, baseDir, options )
else
return graphics.newImageSheet( filename, options )
end
end
local function toSequenceData( spriteSet )
assert( spriteSet.spriteSheet, "toSequenceData(): Bad spriteSet parameter: spriteSet.spriteSheet is nil" )
local spriteSheet = spriteSet.spriteSheet
local default =
{
name = "default",
start = spriteSet.startFrame,
count = spriteSet.numFrames,
}
local sequenceData = spriteSet.sequences or {}
table.insert( sequenceData, default )
return sequenceData
end
sprite.newSprite = function( spriteSet )
assert( spriteSet, "spriteSet is nil", "sprite.newSprite(): spriteSet is nil." )
local s
if spriteSet.type == "newSpriteArgs" then
assert( type( spriteSet.args ) == "table", "sprite.newSprite(): 'spriteSet.args' is nil." )
s = display.newSprite( unpack( spriteSet.args ) ) else
assert( spriteSet.type == "spriteSet" or spriteSet.type == "spriteMultiSet", "sprite.newSprite(): incorrect 'spriteSet.type'." )
local imageSheet = toImageSheet( spriteSet ) local sequenceData = toSequenceData( spriteSet )
assert( sequenceData, "sprite.newSprite(): failed to create sequenceData" )
s = display.newSprite( imageSheet, sequenceData )
end
function s:prepare( name )
s:setSequence( name )
end
return s
end
-- sprite.add( spriteSet, sequenceName, startFrame, frameCount, time, [loopParam] )
sprite.add = function( spriteSet, sequenceName, startFrame, frameCount, time, loopParam )
assert( spriteSet, "spriteSet is nil", "sprite.addSprite(): spriteSet is nil." )
assert( spriteSet.type == "spriteSet", "sprite.addSprite(): incorrect 'spriteSet.type'.")
local sequences = spriteSet.sequences
if not sequences then
sequences = {}
spriteSet.sequences = sequences
end
table.insert( sequences, item )
local loopCount = 0
local loopDirection
if loopParam and 0 ~= loopParam then
loopCount = 1
if -1 == loopParam then
loopDirection = "bounce"
elseif -2 == loopParam then
loopCount = 0
loopDirection = "bounce"
end
end
local item =
{
name = sequenceName,
start = startFrame,
count = frameCount,
time = time,
loopCount = loopCount,
loopDirection = loopDirection,
}
table.insert( sequences, item )
end
local function spriteSheetToImageSheet( spriteSheet )
assert( false, "spriteSheetToImageSheet() is not implemented." )
return nil
end
-- sprite.newSpriteMultiSet()
sprite.newSpriteMultiSet = function( sequences )
assert( #sequences > 0, "sprite.newSpriteMultiSet(): sequences array is empty." )
-- Assume first element defines default sheet
local defaultSheet = spriteSheetToImageSheet( sequences[1].sheet )
assert( defaultSheet, "sprite.newSpriteMultiSet(): no sheet param." )
local sequenceData = {}
for i=1,#sequences do
local seq = sequences[i]
local imageSheet = spriteSheetToImageSheet( seq.sheet )
local data =
{
sheet = imageSheet,
frames = seq.frames,
}
table.insert( sequenceData, data )
end
local result = 
{
type = "newSpriteArgs",
args = { defaultSheet, sequenceData, }
}
return sequences
end
-- sprite.newSpriteSet( spriteSheet, startFrame, frameCount )
sprite.newSpriteSet = function( spriteSheet, startFrame, frameCount )
assert( spriteSheet, "sprite.newSpriteSet(): spriteSheet is nil." )
assert( spriteSheet.type == "spriteSheet", "sprite.newSpriteSet(): spriteSheet is malformed." )
local result = 
{
type = "spriteSet",
spriteSheet = spriteSheet,
numFrames = frameCount,
startFrame=startFrame,
}
return result
end
-- sprite.newSpriteSheet( spriteSheetFile, [baseDir,]  frameWidth, frameHeight )
sprite.newSpriteSheet = function( ... )
local args = { ... }
local spriteSheetFile = args[1]
local nextArg = 2
local baseDir = args[nextArg]
if type(baseDir) ~= "userdata" then
baseDir = nil
else
nextArg = nextArg + 1
end
local frameWidth, frameHeight = args[nextArg], args[nextArg+1]
local result =
{
type = "spriteSheet",
format = "simple",
width = frameWidth, height = frameHeight,
filename = spriteSheetFile, baseDir = baseDir,
}
function result:dispose()
-- no-op
end
return result
end
-- sprite.newSpriteSheetFromData( spriteSheetFile, [baseDir,] coordinateData )
sprite.newSpriteSheetFromData = function( ... )
local args = { ... }
local spriteSheetFile = args[1]
local nextArg = 2
local baseDir = args[nextArg]
if type(baseDir) ~= "userdata" then
baseDir = nil
else
nextArg = nextArg + 1
end
local coordinateData = args[nextArg]
local result =
{
type = "spriteSheet",
format = "complex",
spriteSheetFrames = coordinateData.frames,
filename = spriteSheetFile, baseDir = baseDir,
}
function result:dispose()
-- no-op
end
return result
end
return sprite 


2014年7月10日 星期四

OPENCV[腐蝕][擴張]{cvErode() and cvDilate() }

一般這兩個函式主要用來消除雜訊。利用腐蝕+擴張達到效果

那這程式碼主要拿來把已經邊緣化的停車格圖片 
利用這兩個函式做停車格的前處理



實做 opencv 腐蝕 cvErode() 擴張 cvDilate() 函式的結果 :


程式碼 : 


// visual c++ express 2012  X  opencv2.4.6
#include <stdlib.h>  
#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace cv;
using namespace std ;

 int main()
{
          
   //宣告視窗
   cvNamedWindow("input");
   cvNamedWindow("output_Dilate");
   cvNamedWindow("output_Erode");
   cvNamedWindow("ED");

   char filename[] = {"D:/image/car/c_p200.png"} ;
   //路徑

   IplImage *in= cvLoadImage(filename,0);//cvLoadImage(路徑,圖片種類)
   //需設定為0 改成黑白圖像 才能辨識

   IplImage * erode = cvCloneImage(in); // 宣告等等要用來 腐蝕處理的圖片 並複製原圖給他
   IplImage * dilate = cvCloneImage(in); // 宣告等等要用來 擴張處理的圖片 並複製原圖給他
   IplImage * ED = cvCloneImage(in); // 宣告等等要用來 擴張+腐蝕處理的圖片 並複製原圖給他
   //cvCloneImage(IplImage *) 是用來複製IplImage*
  


   //Dilate 這張圖片 擴張5
   cvDilate(dilate,dilate,0,5);//擴張(IplImage*,IplImage*,0,擴張次數)


   //erode 這張圖片 腐蝕5  在這個結果裡 : 被腐蝕道都看不見了
   cvErode(erode,erode,0,5);//腐蝕(IplImage*,IplImage*,0,腐蝕次數)

   // 對圖片擴張5次在腐蝕5 達到所要的效果
   cvDilate(ED,ED,0,5);//擴張
   cvErode(ED,ED,0,5);//cvErode(輸入圖像,輸出圖像,element,腐蝕的次數);
  


   //輸出處理後的結果 並儲存
           cvShowImage("input",in);//輸出處理前的圖片
           cvShowImage("ED",ED);//輸出處理後的圖片
           cvShowImage("output_Erode",erode);//輸出處裡腐蝕後的圖片
           cvShowImage("output_Dilate",dilate);//輸出處裡擴張後的圖片
           cvSaveImage("D:/image/car/ED01.jpg", erode);//存檔 (路徑,IplImage*)


  //wait for the user to hit a key ,then clean up the window
           cvWaitKey(0);

  //釋放記憶體
           cvDestroyWindow("input");//釋放記憶體
           cvDestroyWindow("ED");//釋放記憶體
   
    return 0; 


}

結果 :

2014年6月23日 星期一

Corona SDK[開箱文-動畫 ]

這裡來試試 corona 動畫的製作~

如圖這是個張 208 x 156 的圖 
那我把圖總共分成12等份
從左上向右執行 一直到右下角

所以"實際上每格圖片的大小"為52 x 52 是吧~ 等等程式碼會做設定

結果 :




程式碼 :







Corona SDK[開箱文-lua-陣列-table ]

Lua 裡的 table 非常好用靈活 有點像建造一個盒子把東西都塞進去

我就試試執行一些屬於Lua比較好用的地方

程式碼 : 
結果 : 


再結果看到很明顯的"幾乎任何東西都能寫入Table" 相當方便 
1. 可以 x={ mon= "x.Monday"} 就能建立 x.mon 這個東西 
2. 在陣列之後寫入 x.z = 20 也能直接建立 x.z 不需事前宣告   
3. 當然也可以當一般的Array來使用 比如說 x[1]=1、x[2]=2....等等
4. 另外值得一提的是 function 名稱也能使用陣列寫 
    ex :  function x[100] ( ) end 



2014年6月18日 星期三

Corona SDK[開箱文-helloworld ]

上了學校的課程 初步開始認是 Corona SDK 這個開發APP遊戲的好物~ 在此分享一下~

先來介紹書 :

10天做好App:Corona SDK超直覺遊戲開發攻略! 跨平台、低成本、超快完成


因為沒有專屬的開發文件,總不能用TXT開發,就用萬用的軟體 sublime 來開發剛剛好~ 

好了回歸正題,這個SDK使用的語言是LUA語言,聽說是個簡單方便的語言,是該來做一些基本程式的學習~,比如變數、函式....等等,之後再來練習

第一先來執行 HELLOWORLD 試試


程式碼 :  

執行結果 :