Skip to content

Instantly share code, notes, and snippets.

@vvakame
Created April 13, 2013 08:57
Show Gist options
  • Save vvakame/5377662 to your computer and use it in GitHub Desktop.
Save vvakame/5377662 to your computer and use it in GitHub Desktop.
結論:enchant.js を書くのに TypeScript を使うのは多大な労力(=非TypeScript的コードですべて書く)がかかるためやめたほうがいい。 sample.js を元に sample.ts を作成。 しかし enchant.Class.create を使ってクラスの定義をしているわけではないので必要な初期化処理が動いていないらしく動作しなかった。 enchant.jsをTypeScriptで書くための型定義を結構頑張って書いたんだけどね…。
/**
* Export the library classes globally. When no arguments are given, all classes defined in enchant.js as well as all classes defined in plugins will be exported. When more than one argument is given, by default only classes defined in enchant.js will be exported. When you wish to export plugin classes you must explicitly deliver the plugin identifiers as arguments.
*/
declare module enchant {
declare function ();
declare function (moduleName:string);
declare function (moduleNames:string[]);
declare class EventTarget {
// method
addEventListener(type:string, listener:(e:Event)=>any);
clearEventListener(type:string);
dispatchEvent(e:Event);
on(type:string, listener:(e:Event)=>any);
removeEventListener(type:string, listener:(e:Event)=>any);
}
declare class Core extends EventTarget {
constructor(weight:number, height:number);
// field
assets(key:string):Surface;
currentScene:Scene;
fps:number;
frame:any;
height:any;
input:any;
static instance:Core;
loadingScene:Scene;
ready:any;
rootScene:Scene;
running:any;
scale:any;
width:any;
// undocumented field
onload:Function;
// method
addManager(childManager, nextManager);
debug();
static findExt(path):any;
getDomElement():any;
getDomElementAsNext():any;
getElapsedTime():number;
getNextManager(manager):any;
initialize(node);
keybind(key:number, button:string);
keyunbind(key:number);
load(asset:string, callback?:Function);
pause();
popScene():enchant.Scene;
preload(asset:string):any;
preload(assets:string[]):any;
preload(...assets:string[]):any;
pushScene(scene):Scene;
remove();
removeManager(childManager);
removeScene(scene):enchant.Scene;
render(inheritMat);
replaceScene(scene):enchant.Scene;
resume();
setLayer(layer);
start();
stop();
}
declare class Node extends EventTarget {
// field
age:number;
parentNode:Node;
scene:Scene;
x:number;
y:number;
tl:Timeline;
// method
moveBy(x:number, y:number);
moveTo(x:number, y:number);
}
declare class Entity extends Node {
// field
backgroundColor:any;
buttonMode:any;
buttonPressed:bool;
compositeOperation:any;
height:number;
opacity:number;
originX:number;
originY:number;
rotation:number;
scaleX:number;
scaleY:number;
touchEnabled:bool;
visible:bool;
width:number;
// method
disableCollection();
enableCollection();
intersect(other:{x:number;y:number;width:number;height:number;}):bool;
rotate(deg:number);
scale(x:number, y:number);
within(other:{x:number;y:number;width:number;height:number;}, distance?:number):bool;
}
declare class Sprite extends Entity {
constructor(weight:number, height:number);
// field
frame:any; // number[] or number
height:number;
width:number;
image:Surface;
}
declare class Action {
// TODO
}
declare class ActionEventTarget extends EventTarget {
// TODO
}
declare class CanvasLayer {
// TODO
}
declare class Class {
// TODO
}
declare class DOMSound {
// TODO
}
declare class Easing {
// TODO
}
declare class ENV {
// TODO
}
declare class Event {
constructor(type:string);
// field
static A_BUTTON_DOWN:any;
static A_BUTTON_UP:any;
static ACTION_ADDED:any;
static ACTION_END:any;
static ACTION_REMOVED:any;
static ACTION_START:any;
static ACTION_TICK:any;
static ADDED:any;
static ADDED_TO_SCENE:any;
static ADDED_TO_TIMELINE:any;
static B_BUTTON_DOWN:any;
static B_BUTTON_UP:any;
static CHILD_ADDED:any;
static CHILD_REMOVED:any;
static DOWN_BUTTON_DOWN:any;
static DOWN_BUTTON_UP:any;
static ENTER:any;
static ENTER_FRAME:any;
static EXIT:any;
static EXIT_FRAME:any;
static INPUT_CHANGE:any;
static INPUT_END:any;
static INPUT_START:any;
static LEFT_BUTTON_DOWN:any;
static LEFT_BUTTON_UP:any;
static LOAD:any;
static PROGRESS:any;
static REMOVED:any;
static REMOVED_FROM_SCENE:any;
static REMOVED_FROM_TIMELINE:any;
static RENDER:any;
static RIGHT_BUTTON_DOWN:any;
static RIGHT_BUTTON_UP:any;
static TOUCH_END:any;
static TOUCH_MOVE:any;
static TOUCH_START:any;
static UP_BUTTON_DOWN:any;
static UP_BUTTON_UP:any;
localX:number;
localY:number;
target:any;
type:string;
x:number;
y:number;
}
declare class Group extends Node {
constructor();
// field
childNodes:any;
firstChild:any;
lastChild:any;
originX:any;
originY:any;
rotation:any;
scaleX:any;
scaleY:any;
// method
addChild(node:Node);
insertBefore(node:Node, reference:Node);
removeChild(node:Node);
}
declare class Label extends Entity {
// TODO
}
declare class Map extends Entity {
// TODO
}
declare class ParallelAction extends Action {
// TODO
}
declare class Scene extends Group {
constructor();
}
declare class Sound {
// TODO
}
declare class Surface {
// TODO
}
declare class Timeline {
constructor(node:Node, unitialized?:bool);
// method
action(params):Timeline;
and():Timeline;
clear():Timeline;
cue(cue:any):void;
delay(time:number):Timeline;
exec(func:Function):void;
fadeIn(time:number, easing?:Function):Timeline;
fadeOut(time:number, easing?:Function):Timeline;
fadeTo(opacity:number, time:number, easing?:Function):Timeline;
hide():Timeline;
loop():Timeline;
moveBy(x:number, y:number, time:number, easing?:Function):Timeline;
moveTo(x:number, y:number, time:number, easing?:Function):Timeline;
moveX(x:number, time:number, easing?:Function):Timeline;
moveY(y:number, time:number, easing?:Function):Timeline;
next(remainingTime:any):void;
pause():Timeline;
removeFromScene():Timeline;
repeat(func:Function, time:number):Timeline;
resume():Timeline;
rotateBy(deg:number, time:number, easing?:Function):Timeline;
rotateTo(deg:number, time:number, easing?:Function):Timeline;
scaleBy(scaleX:number, scaleY:number, time:number, easing?:Function):Timeline;
scaleTo(scaleX:number, scaleY:number, time:number, easing?:Function):Timeline;
setFrameBased():void;
setTimeBased():void;
show():Timeline;
skip(frames:number):Timeline;
then(func:Function):Timeline;
tick(enterFrameEvent):void;
tween(params):Timeline;
unloop():Timeline;
waitUntil(func:Function):Timeline;
}
declare class Tween {
// TODO
}
declare class WebAudioSound {
// TODO
}
}
enchant(); // initialize
var game = new Game(320, 320);
game.preload('images/chara1.png', 'images/icon0.png'); // preload image
game.fps = 20;
game.onload = function () {
// make new class for player
var Player = enchant.Class.create(enchant.Sprite, {
initialize: function () {
enchant.Sprite.call(this, 32, 32);
this.image = game.assets['images/chara1.png'];
this.frame = 5; // set image data
game.rootScene.addChild(this); // add to canvas
}
});
// make new class for apple
var Apple = enchant.Class.create(enchant.Sprite, {
initialize: function () {
enchant.Sprite.call(this, 16, 16);
this.image = game.assets['images/icon0.png']; // set image
this.moveTo(16, player.y + 8); // move to the position
this.tl.moveBy(320, 0, 30); // set movement
this.frame = 15; // set image data
game.rootScene.addChild(this); // add to canvas
}
});
// make new class for enemy
var Enemy = enchant.Class.create(enchant.Sprite, {
initialize: function () {
enchant.Sprite.call(this, 32, 32);
this.image = game.assets['images/chara1.png']; // set image
this.moveTo(320, Math.floor(Math.random() * 320)); // set position
this.scaleX = -1;
this.tl.moveBy(-360, 0, 160); // set movement
game.rootScene.addChild(this); // canvas
}
});
var player = new Player();
// generate enemy every 60 frames
game.rootScene.tl.then(function () {
var enemy = new Enemy();
}).delay(30).loop(); // wait 60 frames and loop it!
// add event listener (called when click/touch started)
game.rootScene.on('touchstart', function (evt) {
player.y = evt.localY; // set position to touch-y position
var apple = new Apple();
});
// add event listener (called when click/touch moved)
game.rootScene.on('touchmove', function (evt) {
player.y = evt.localY; // set position to touch-y position
});
};
game.start(); // start your game!
///<reference path='libs/enchant.js.d.ts' />
enchant(); // initialize
var game = new enchant.Core(320, 320);
game.preload('images/chara1.png', 'images/icon0.png'); // preload image
game.fps = 20;
// make new class for player
class Player extends enchant.Sprite {
constructor() {
super(32, 32);
this.image = game.assets['images/chara1.png'];
this.frame = 5; // set image data
game.rootScene.addChild(this); // add to canvas
}
}
// make new class for apple
class Apple extends enchant.Sprite {
constructor(player:Player) {
super(16, 16);
this.image = game.assets['images/icon0.png']; // set image
this.moveTo(16, player.y + 8); // move to the position
this.tl.moveBy(320, 0, 30); // set movement
this.frame = 15; // set image data
game.rootScene.addChild(this); // add to canvas
}
}
// make new class for enemy
class Enemy extends enchant.Sprite {
constructor() {
super(32, 32);
this.image = game.assets['images/chara1.png']; // set image
this.moveTo(320, Math.floor(Math.random() * 320)); // set position
this.scaleX = -1;
this.tl.moveBy(-360, 0, 160); // set movement
game.rootScene.addChild(this); // canvas
}
}
game.onload = function () {
var player = new Player();
// generate enemy every 60 frames
game.rootScene.tl.then(function () {
var enemy = new Enemy();
}).delay(30).loop(); // wait 60 frames and loop it!
// add event listener (called when click/touch started)
game.rootScene.on('touchstart', function (evt) {
player.y = evt.localY; // set position to touch-y position
var apple = new Apple(player);
});
// add event listener (called when click/touch moved)
game.rootScene.on('touchmove', function (evt) {
player.y = evt.localY; // set position to touch-y position
});
};
game.start(); // start your game!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment