Download - JavaScript再入門

Transcript
Page 1: JavaScript再入門

JavaScript再入門

@sambaiz

NDS40初心者Day (2015/2/21)

Page 2: JavaScript再入門

自己紹介

@sambaiz

• 大学卒業できるかもしれない

• 春から東京で働くかもしれない

• はじめてのNDSは多分

NDS26: IPv6 Hackathon (2012/5/26)でした

• ありがとうNDS!また会う日まで!

Page 3: JavaScript再入門

あなたとJavaScript

前編

Page 4: JavaScript再入門

万能言語JavaScript

• JavaScriptは

– クライアントサイドで使えます

–サーバサイドでも使えます(node.js)

–アプリが作れます(Cordova)

–ゲームが作れます(cocos2d-js, Unity)

Page 5: JavaScript再入門

あなたとJavaとJavaScript

あなたは混同してもいいし、しなくてもいい

みんなちがって、みんないい

Page 6: JavaScript再入門

あなたとJavaとJavaScript

開発当初はLiveScriptと呼ばれていたが、1995

年にサン・マイクロシステムズ(現・オラクル)が開発したプログラミング言語Javaが当時大きな

注目を浴びており、ネットスケープとサン・マイクロシステムズが業務提携していた事もあったため、JavaScriptという名前に変更された

(Wikipedia)

Page 7: JavaScript再入門

あなたとJavaとJavaScript

1997年、通信に関する標準を策定する国際団体EcmaインターナショナルによってJavaScriptの中核的な仕様がECMAScriptとして標準化され多くのウェブブラウザで利用できるようになった。

(Wikipedia)

Page 8: JavaScript再入門

あなたとJavaとJavaScript

var javascript = "JavaScript";

var java = "Java";

console.log(javascript === java);

// => false

console.log(javascript == java);

// => false

Page 9: JavaScript再入門

How to run

• Webブラウザ上でJavaScriptが実行できるサービスがいくつかあります

• コードは

https://gist.github.com/sambaiz/3981579efd5b9c5bf636

に貼ってあります(“sambaiz gist” で検索)

Page 10: JavaScript再入門

http://jsbin.com/ とか

Page 11: JavaScript再入門

変数宣言

var a = “v_a";

console.log(a) // => “v_a”

Page 12: JavaScript再入門

var

• 宣言時にvarを省略するとグローバルになる

function forget_var(){

f_v = "v_f_v"; // varなし

}

forget_var();

console.log(f_v); // => “v_f_v”

Page 13: JavaScript再入門

var

function not_forget_var(){

var n_f_v = "v_n_f_v";

}

not_forget_var();

console.log(n_f_v); // error

Page 14: JavaScript再入門

スコープ

• varで関数スコープはあるが、ブロックスコープはない(ECMAScript6のletがその役割)

for(var i=0; i<10; i++){

var ff_v = "v_ff_v";

}

console.log(ff_v); // => "v_ff_v"

console.log(i); // => 10

Page 15: JavaScript再入門

ホイスティング(巻き上げ)

• 関数で宣言された変数は関数全体からアクセスできる

• 宣言の前でもアクセスできる(ただし宣言時の代入は巻き上げない)

Page 16: JavaScript再入門

ホイスティング(巻き上げ)

var h = "v_gh"

function hoisting(){

console.log(h); // => "v_gh"

h = "v_h";

console.log(h); // => "v_h"

};

hoisting();

Page 17: JavaScript再入門

ホイスティング(巻き上げ)

var h2 = "v_gh2"

function hoisting2(){

console.log(h2); // => undefined

var h2 = "v_h2";

console.log(h2); // => “v_h2”

};

hoisting2();

Page 18: JavaScript再入門

ホイスティング(巻き上げ)

var h3 = "v_gh3"

function hoisting3(){

var h3;

console.log(h3); // => undefined

h3 = "v_h3"

console.log(h3); // => “v_h3”

};

hoisting3();

関数の先頭で宣言された場合と同じ

Page 19: JavaScript再入門

== (!=) / === (!==)

• === は型も一致する場合にtrueを返す

• ==は型変換してから比較する

console.log(1 == "1");

// => true

console.log(1 === "1”)

// => false

Page 20: JavaScript再入門

基本型

console.log(typeof(undefined));

// => “undefined”

console.log(typeof(1));

// => “number”

console.log(typeof("1"));

// => “string”

console.log(typeof(true));

// => “boolean”

Page 21: JavaScript再入門

参照型(オブジェクト)

console.log(typeof(null)); // => "object"

console.log(typeof([])); // => “object”

console.log(typeof(new Date())); // => “object”

console.log(typeof(function(){return 1}));

// => “function”

Page 22: JavaScript再入門

参照型

var fa = function(){return 1};

var fb = fa;

console.log(fa === fb); // => true

console.log(function(){return 1} === function(){return 1});

// => false

Page 23: JavaScript再入門

関数

• functionで定義する• 入れ子にできる

function ff1(a){b = "fuga"function ff2(){

return a + b; //入れ子にしている関数の引数や変数にアクセスできる

}return ff2();

}

console.log(ff1("hoge")); // => "hogefuga"

Page 24: JavaScript再入門

クロージャ

function counter(){var c = 0;return function (){

c += 1;return c;

};}

count = counter();count2 = count; // 参照渡しcount3 = counter();console.log(count()); // => 1console.log(count2()); // => 2console.log(count3()); // => 1

Page 25: JavaScript再入門

セミコロン

Always use semicolons.(Google JavaScript Style Guide)

function operation(){console.log("operation")return -1;

}

var THINGS_TO_EAT = ["AAAA"] // ;なし-1 == operation() || console.log("fail"); // => fail //(["AAAA"] - 1がNaNになるため)

var THINGS_TO_EAT = ["AAAA"]; // ;あり-1 == operation() || console.log("fail");

Page 26: JavaScript再入門

オブジェクト

• 順序付けされていないプロパティの集合

• 動的にプロパティを追加したり削除することができる

• プロパティの他に3つのオブジェクト属性を持つ

–オブジェクトのプロトタイプ

–オブジェクトのクラス(オブジェクトの型を表す文字列)

–オブジェクトの拡張可フラグ(ECMAScript5)

Page 27: JavaScript再入門

オブジェクト

var obj = {a: "aaa", b: 100, c: {d: true}};

console.log(obj.a); // => "aaa"

obj.e = false;

console.log(obj.e); // => false

console.log(obj[“e”]); // => false

delete obj.a;

console.log(obj.a); // => undefined

Page 28: JavaScript再入門

プロトタイプ

• オブジェクトはプロトタイプのプロパティを継承する

Page 29: JavaScript再入門

継承

• ECMAScript5で定義されたObject.create()は

最初の引数をプロトタイプとするオブジェクトを生成する

Page 30: JavaScript再入門

継承

function inherit(p){if (p == null) throw TypeError(); if (Object.create) // Object.create()が使えれば使うreturn Object.create(p);

var t = typeof p;if (t !== "object" && t !== "function") throw TypeError();

function f() {}; // ダミーのコンストラクタf.prototype = p; return new f();

}

Page 31: JavaScript再入門

継承

var o = {};

o.x = 1;

o.y = 3;

var p = inherit(o);

//{x: 1, y: 3}が継承される

console.log(p.x); // => 1

Page 32: JavaScript再入門

継承

p.x = 2;// 継承プロパティに代入すると継承プロパティの値を変えるのではなく、// 新たに独自プロパティを作成する(継承プロパティは見えなくなる)console.log(o.x); // => 1 o.y = 4;// プロトタイプのプロパティと、継承プロパティは繋がっているconsole.log(p.y); // => 4o.x = 5;// 独自プロパティは繋がっていないconsole.log(p.x); // => 2

Page 33: JavaScript再入門

継承

var q = inherit(p);

console.log(q.x); // => 2

o.y = 10;

// p.yは独自プロパティではないので、q.yはo.yまで繋がっている

console.log(q.y); // => 10

Page 34: JavaScript再入門

in / hasOwnProperty()

• inはプロパティを持つかを調べる• hasOwnProperty()は独自プロパティを持つかを調べる

var o = {};o.x = "a";var p = inherit(o);console.log("x" in p); // => trueconsole.log(o.hasOwnProperty("x")); // => trueconsole.log(p.hasOwnProperty("x")); // => false

Page 35: JavaScript再入門

コンストラクタ

• newはコンストラクタ関数のprototypeフ ゚ロパティの値をプロトタイプとするオブジェクトを生成する

function Person(name){this.name = name;

}

Person.prototype = {introduce: function(){ return "My name is " + this.name }

}

var p = new Person("Tom");console.log(p.introduce()); // => “My name is Tom”

Page 36: JavaScript再入門

call(), apply()

• あるオブジェクトのメソッドかのように関数を呼び出せる

• 最初の引数は対象となるオブジェクト

• call()は第二引数以降が関数の引数になる

• apply()は第二引数に配列の形で関数の引数を指定する

Page 37: JavaScript再入門

call(), apply()

var tom = {name: "Tom",introduce: function(fp, be) {

console.log([fp,be,this.name].join(" "));}

};var sam = {

name: "Sam"};

tom.introduce("I", "am"); // => "I am Tom"tom.introduce.call(sam, "We", "are"); // => "We are Sam"tom.introduce.apply(sam, ["We", "are"]); // => "We are Sam"

Page 38: JavaScript再入門

後編

フロッピーってなんですか

Page 39: JavaScript再入門

cocos2d-js

ゲームを作るよ!

Page 40: JavaScript再入門

cocos2d-js

Page 41: JavaScript再入門

作るゲーム

Page 42: JavaScript再入門

プロジェクトの作成

$ cocos new floppybird -l js

Page 43: JavaScript再入門

.gitignore(例)

.DS_Store

.ideaframeworks/runtime-src/proj.android/assetsframeworks/js-bindings/cocos2d-x/cocos/platform/android/java/assetsframeworks/runtime-src/proj.android/binframeworks/js-bindings/cocos2d-x/cocos/platform/android/java/binframeworks/runtime-src/proj.android/genframeworks/js-bindings/cocos2d-x/cocos/platform/android/java/genframeworks/runtime-src/proj.android/libs/armeabiframeworks/runtime-src/proj.android/objframeworks/runtime-src/proj.android/outframeworks/runtime-src/proj.android/local.propertiesframeworks/js-bindings/cocos2d-x/cocos/platform/android/java/local.propertiesframeworks/runtime-src/proj.ios/*.xcodeproj/project.xcworkspace/xcuserdataframeworks/runtime-src/proj.ios/*.xcodeproj/xcuserdataframeworks/runtime-src/proj.ios/cocos2dx-store-example.xcodeproj/project.xcworkspace/xcshareddata/cocos2dx-store-example.xccheckout

Page 44: JavaScript再入門

ブラウザで実行

cocos run –p web

// 127.0.0.1:8000

Page 45: JavaScript再入門

ブラウザで実行

Page 46: JavaScript再入門

基本形

// src/title.jsvar TitleLayer = cc.Layer.extend({

ctor:function () {this._super();this.init();

},init:function () {

/* いろいろ */}

});

var TitleScene = cc.Scene.extend({onEnter:function () {

this._super();var layer = new TitleLayer();this.addChild(layer);

}});

Page 47: JavaScript再入門

素材

// src/resource.js

var res = {

title_png : "res/title.png",

start_png : "res/start.png",

end_png : "res/end.png"

};

var title_resources = [res.title_png, res.start_png, res.end_png];

Page 48: JavaScript再入門

プリロード

// main.js

cc.LoaderScene.preload(title_resources, function () {

cc.director.runScene(new TitleScene());

}, this);

Page 49: JavaScript再入門

表示

// src/title.jsthis.sprite = new cc.Sprite(res.title_png);this.sprite.attr({

x: size.width / 2,y: size.height / 2,scale: 0.5,rotation: 180

});this.addChild(this.sprite, 0);

Page 50: JavaScript再入門

project.json

{"project_type": "javascript",

"debugMode" : 1,"showFPS" : true,"frameRate" : 60,"id" : "gameCanvas","renderMode" : 0,"engineDir":"frameworks/cocos2d-html5",

"modules" : ["cocos2d"],

"jsList" : ["src/resource.js",“src/title.js”

]}

追加

Page 51: JavaScript再入門

ボタン

素材

押してないとき

押したとき

押せないとき

Page 52: JavaScript再入門

ボタン

var startGameNormal = new cc.Sprite(res.start_button_png, cc.rect(0, 0, 126, 33));var startGameSelected = new cc.Sprite(res.start_button_png, cc.rect(0, 33, 126, 33));var startGameDisabled = new cc.Sprite(res.start_button_png, cc.rect(0, 33 * 2, 126, 33));

var startGame = new cc.MenuItemSprite(startGameNormal, startGameSelected, startGameDisabled, this.onStartGame, this);

Page 53: JavaScript再入門

タイトル画面ができました

Page 54: JavaScript再入門

物理エンジン

• Box2Dを使いたかった

• moduleに追加すれば動くはず

• 動かなかった(また後でがんばる)

// project.json

"modules" : ["cocos2d", "box2d”]

Page 55: JavaScript再入門

とりあえず横に動かす

Page 56: JavaScript再入門

マウスイベント

if ('mouse' in cc.sys.capabilities){cc.eventManager.addListener({

event: cc.EventListener.MOUSE,onMouseDown: function(event){

if(event.getButton() == cc.EventMouse.BUTTON_LEFT){/* 右クリック押したとき */

}},onMouseUp: function(event){

if(event.getButton() == cc.EventMouse.BUTTON_LEFT){/* 右クリック離したとき */

}}

}, this);}

Page 57: JavaScript再入門

押してる間だけ横に動く

Page 58: JavaScript再入門

壁の描画(上から降りてくる)

Page 59: JavaScript再入門

壁の描画(静止)

var draw = cc.DrawNode.create();

draw.position = cc.p(100,100);

draw.drawSegment(cc.p(0, 200), cc.p(400,200), 10, cc.color(200,200,200,255))

draw.drawSegment(cc.p(600, 200), cc.p(cc.winSize.width,200), 10,cc.color(200,200,200,255))

Page 60: JavaScript再入門

当たるとゲームオーバー

Page 61: JavaScript再入門

Androidとか

ANDROID_SDK_ROOT

NDK_ROOT

ANT_ROOT

あたりを通して

cocos compile –p androidするとapkができる

Page 62: JavaScript再入門

終わりに

• 終わりです

• ありがとうございました


Top Related