Download - JavaScript再入門
![Page 1: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/1.jpg)
JavaScript再入門
@sambaiz
NDS40初心者Day (2015/2/21)
![Page 2: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/2.jpg)
自己紹介
@sambaiz
• 大学卒業できるかもしれない
• 春から東京で働くかもしれない
• はじめてのNDSは多分
NDS26: IPv6 Hackathon (2012/5/26)でした
• ありがとうNDS!また会う日まで!
![Page 3: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/3.jpg)
あなたとJavaScript
前編
![Page 4: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/4.jpg)
万能言語JavaScript
• JavaScriptは
– クライアントサイドで使えます
–サーバサイドでも使えます(node.js)
–アプリが作れます(Cordova)
–ゲームが作れます(cocos2d-js, Unity)
![Page 5: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/5.jpg)
あなたとJavaとJavaScript
あなたは混同してもいいし、しなくてもいい
みんなちがって、みんないい
![Page 6: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/6.jpg)
あなたとJavaとJavaScript
開発当初はLiveScriptと呼ばれていたが、1995
年にサン・マイクロシステムズ(現・オラクル)が開発したプログラミング言語Javaが当時大きな
注目を浴びており、ネットスケープとサン・マイクロシステムズが業務提携していた事もあったため、JavaScriptという名前に変更された
(Wikipedia)
![Page 7: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/7.jpg)
あなたとJavaとJavaScript
1997年、通信に関する標準を策定する国際団体EcmaインターナショナルによってJavaScriptの中核的な仕様がECMAScriptとして標準化され多くのウェブブラウザで利用できるようになった。
(Wikipedia)
![Page 8: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/8.jpg)
あなたとJavaとJavaScript
var javascript = "JavaScript";
var java = "Java";
console.log(javascript === java);
// => false
console.log(javascript == java);
// => false
![Page 9: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/9.jpg)
How to run
• Webブラウザ上でJavaScriptが実行できるサービスがいくつかあります
• コードは
https://gist.github.com/sambaiz/3981579efd5b9c5bf636
に貼ってあります(“sambaiz gist” で検索)
![Page 10: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/10.jpg)
http://jsbin.com/ とか
![Page 11: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/11.jpg)
変数宣言
var a = “v_a";
console.log(a) // => “v_a”
![Page 12: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/12.jpg)
var
• 宣言時にvarを省略するとグローバルになる
function forget_var(){
f_v = "v_f_v"; // varなし
}
forget_var();
console.log(f_v); // => “v_f_v”
![Page 13: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/13.jpg)
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/14.jpg)
スコープ
• 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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/15.jpg)
ホイスティング(巻き上げ)
• 関数で宣言された変数は関数全体からアクセスできる
• 宣言の前でもアクセスできる(ただし宣言時の代入は巻き上げない)
![Page 16: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/16.jpg)
ホイスティング(巻き上げ)
var h = "v_gh"
function hoisting(){
console.log(h); // => "v_gh"
h = "v_h";
console.log(h); // => "v_h"
};
hoisting();
![Page 17: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/17.jpg)
ホイスティング(巻き上げ)
var h2 = "v_gh2"
function hoisting2(){
console.log(h2); // => undefined
var h2 = "v_h2";
console.log(h2); // => “v_h2”
};
hoisting2();
![Page 18: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/18.jpg)
ホイスティング(巻き上げ)
var h3 = "v_gh3"
function hoisting3(){
var h3;
console.log(h3); // => undefined
h3 = "v_h3"
console.log(h3); // => “v_h3”
};
hoisting3();
関数の先頭で宣言された場合と同じ
![Page 19: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/19.jpg)
== (!=) / === (!==)
• === は型も一致する場合にtrueを返す
• ==は型変換してから比較する
console.log(1 == "1");
// => true
console.log(1 === "1”)
// => false
![Page 20: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/20.jpg)
基本型
console.log(typeof(undefined));
// => “undefined”
console.log(typeof(1));
// => “number”
console.log(typeof("1"));
// => “string”
console.log(typeof(true));
// => “boolean”
![Page 21: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/21.jpg)
参照型(オブジェクト)
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/22.jpg)
参照型
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/23.jpg)
関数
• functionで定義する• 入れ子にできる
function ff1(a){b = "fuga"function ff2(){
return a + b; //入れ子にしている関数の引数や変数にアクセスできる
}return ff2();
}
console.log(ff1("hoge")); // => "hogefuga"
![Page 24: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/24.jpg)
クロージャ
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/25.jpg)
セミコロン
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/26.jpg)
オブジェクト
• 順序付けされていないプロパティの集合
• 動的にプロパティを追加したり削除することができる
• プロパティの他に3つのオブジェクト属性を持つ
–オブジェクトのプロトタイプ
–オブジェクトのクラス(オブジェクトの型を表す文字列)
–オブジェクトの拡張可フラグ(ECMAScript5)
![Page 27: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/27.jpg)
オブジェクト
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/28.jpg)
プロトタイプ
• オブジェクトはプロトタイプのプロパティを継承する
![Page 29: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/29.jpg)
継承
• ECMAScript5で定義されたObject.create()は
最初の引数をプロトタイプとするオブジェクトを生成する
![Page 30: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/30.jpg)
継承
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/31.jpg)
継承
var o = {};
o.x = 1;
o.y = 3;
var p = inherit(o);
//{x: 1, y: 3}が継承される
console.log(p.x); // => 1
![Page 32: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/32.jpg)
継承
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/33.jpg)
継承
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/34.jpg)
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/35.jpg)
コンストラクタ
• 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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/36.jpg)
call(), apply()
• あるオブジェクトのメソッドかのように関数を呼び出せる
• 最初の引数は対象となるオブジェクト
• call()は第二引数以降が関数の引数になる
• apply()は第二引数に配列の形で関数の引数を指定する
![Page 37: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/37.jpg)
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/38.jpg)
後編
フロッピーってなんですか
![Page 39: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/39.jpg)
cocos2d-js
ゲームを作るよ!
![Page 40: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/40.jpg)
cocos2d-js
![Page 41: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/41.jpg)
作るゲーム
![Page 42: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/42.jpg)
プロジェクトの作成
$ cocos new floppybird -l js
![Page 43: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/43.jpg)
.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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/44.jpg)
ブラウザで実行
cocos run –p web
// 127.0.0.1:8000
![Page 45: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/45.jpg)
ブラウザで実行
![Page 46: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/46.jpg)
基本形
// 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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/47.jpg)
素材
// 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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/48.jpg)
プリロード
// main.js
cc.LoaderScene.preload(title_resources, function () {
cc.director.runScene(new TitleScene());
}, this);
![Page 49: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/49.jpg)
表示
// 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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/50.jpg)
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/51.jpg)
ボタン
素材
押してないとき
押したとき
押せないとき
![Page 52: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/52.jpg)
ボタン
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/53.jpg)
タイトル画面ができました
![Page 54: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/54.jpg)
物理エンジン
• Box2Dを使いたかった
• moduleに追加すれば動くはず
• 動かなかった(また後でがんばる)
// project.json
"modules" : ["cocos2d", "box2d”]
![Page 55: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/55.jpg)
とりあえず横に動かす
![Page 56: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/56.jpg)
マウスイベント
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/57.jpg)
押してる間だけ横に動く
![Page 58: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/58.jpg)
壁の描画(上から降りてくる)
![Page 59: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/59.jpg)
壁の描画(静止)
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再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/60.jpg)
当たるとゲームオーバー
![Page 61: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/61.jpg)
Androidとか
ANDROID_SDK_ROOT
NDK_ROOT
ANT_ROOT
あたりを通して
cocos compile –p androidするとapkができる
![Page 62: JavaScript再入門](https://reader031.vdocuments.pub/reader031/viewer/2022020307/55a676d31a28abb1758b45d5/html5/thumbnails/62.jpg)
終わりに
• 終わりです
• ありがとうございました