C .
ODE
G
AMELET
# CG.Base Provide tool kits that helps you fast build an app on Code.Gamelet. Key features include: 1. initialize [pixi.js](#pixi.init) or [three.js](#three.init) environment 1. load and access resources that are imported via Code.Gamelet IDE 1. manage update functions that are called every frame 1. provide debug utilities ## Getting Started Follow the steps below to fast start an app with [PixiJS](#pixi.init) or [three.js](#three.init). We will implement a box2d environment to demo the usage of Base. <a name="pixi.init"></a> ## Start with Pixi.js<a name="pixi.init"></a> ```typescript class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); CG.Base.pixi.physicsDebugDraw.setActive(true); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', {type: 'static'}); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', {type: 'dynamic'}); ball.addCircle(0, 0, 10, {friction: 0.1, density: 0.1, restitution: 0.3}); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_PIXI) <a name="three.init"></a> ## Start with three.js ```typescript class App { constructor() { CG.Base.three.initialize(600, 400); CG.Base.three.physicsDebugDraw.setActive(true); CG.Base.three.camera.position.z = -50; CG.Base.three.camera.up.set(0, -1, 0); CG.Base.three.camera.lookAt(new THREE.Vector3()); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', { type: 'static' }); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', { type: 'dynamic' }); ball.addCircle(0, 0, 10, { friction: 0.1, density: 0.1, restitution: 0.3 }); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_THREE) ## Load and play with Resources To load resources that are imported from IDE: ```typescript // tell resources what resources to load (using the alias names) CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.addAppResource('Game1.music'); // start loading CG.Base.resourceManager.load(() => { // all loaded callback // create button with the image "Game1.button" alias name var button = new CG.Base.pixis.interactive.Button(CG.Base.resourceManager.createPixiSprite('Game1.button', 20, 20)); // set the position of the button button.displayObject.position.set(100, 100); // add the button to pixi.root, so pixi can render the button CG.Base.pixi.root.addChild(button.displayObject); // add a click event listener button.on(CG.Base.pixis.interactive.Button.EVENT.CLICK, () => { // when the button is clicked, play sound with "Game1.music" alias name CG.Base.resourceManager.playSound('Game1.music') }); }); ``` @see [Demo](/edit/Base_Load_Resources) ## Manage update functions Take advantage of CG.Base.addUpdateFunction to make a function called every frame ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); CG.Base.addUpdateFunction(this, this.update); } // this function will be called every frame(called 60 times per second normally) private update(deltaTime:number):void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) You can call a function in the future by CG.Base.addDelayFunction ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); // call this.delayAction in 1000 milliseconds(= one second) CG.Base.addDelayFunction(this, this.delayAction, 1000); } private delayAction():void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) ## Interact with Keyboard Use PIXI.keyboard package to interact with keyboard events. ```typescript export class App { constructor() { // make the window focused, so we can receive keyboard events. window.focus(); // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); // load resources, and wait callback when resources are all loaded CG.Base.resourceManager.load(() => { // add keyboard event listener, when a key is pressed PIXI.keyboardManager.on('pressed', key => { // if the pressed key is space, we call this.createSprite() if (key == PIXI.keyboard.Key.SPACE) { this.createSprite(); } }); }); } private createSprite(): void { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); } } new App(); ``` @see [Demo](/edit/Base_PIXI_Keyboard) ## Debugging The best debug tool on browser is the [developer tools](https://developer.chrome.com/devtools) in Chrome (F12). To find your source code in developer tools, first open developer tools(F12), click "Sources" tab, and search the Network tree as below: > top => {projectCode} => gameFrame => code.gamelet.com => gassets => file/{projectCode}/src for example, if the projectCode is 'Game1', source code is located at > top => Game1 => gameFrame => code.gamelet.com => gassets => file/Game1/src ![Source Network Tree](https://code.gamelet.com/gassets/asset/Base/Base.networktree/networktree.png "Source Network Tree") ### Add Watch In addition to browser's debugging tools, CG.Base provides other useful tools. CG.Base.addWatch() adds objects or objects' properties to Watch panel in CG IDE. ```typescript export class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.load(() => { // add the created sprite into Watch panel, the alias name in Watch panel is 'sprite' CG.Base.addWatch('sprite', this.createSprite()); }); // add this(App)'s 'time' property into Watch panel. The alias name for this property is 'now' CG.Base.addWatch('now', this, 'time'); } private createSprite(): PIXI.Sprite { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); return sprite; } // a getter function, that works like a property of App object. get time(): number { return CG.Base.time(); } } new App(); ``` @see [Demo](/edit/Base_Add_Watch) ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Links and Resources This library is running with the libraries below. * [Pixi.js](http://www.pixijs.com/) - 2D rendering engine * [API reference](http://pixijs.download/release/docs/index.html) * [Examples](http://pixijs.io/examples/) * [Three.js](https://threejs.org/) - 3D rendering engine * [API & Docs](https://threejs.org/docs/index.html#manual/introduction/Creating-a-scene) * [Examples](https://threejs.org/examples/) * [Pixi keyboard](https://github.com/Nazariglez/pixi-keyboard) - Keyboard utility * [Pixi sound](https://github.com/pixijs/pixi-sound) - Sound utility * [Pixi filters](https://github.com/pixijs/pixi-filters) - Filters Collections * [Pixi GafPlayer](https://github.com/mathieuanthoine/PixiGAFPlayer) - [GafMedia](https://gafmedia.com/) Player * [Liquidfun](http://google.github.io/liquidfun/) - Box2D based physics engine * [MD5](http://www.myersdaily.org/joseph/javascript/md5-text.html) - MD5 implementation by Joseph Myers ## Authors **Haska Su** - *Initial work*
# 無差別五子棋 五子棋是中國古老的棋藝之一,發展至今天有日本的連珠(Renju)、歐洲的五目(Gomoku)、以及Gamelet的無差別五子棋。棋友們不打不相識,歡迎大家進來互相切磋棋藝吧。 這款使用Code.Gamelet.com平台製作的多人連線遊戲除了Online對弈模式可在線上找棋友單挑之外,還有單人模式,讓玩家可以輕鬆讓站長設計的人工智慧培養你的實力。 單人模式可以選擇下「篤姬五子棋」、「德川家定將軍五子棋」、還有可愛的「女僕五子棋」,每個人都有不同的個性,若是新手請選擇女僕五子棋喔! ## 規則 遊戲中和玩家對弈的部分有六種規則可以選擇: 1. **無差別**:沒有職業棋賽的各種繁複規則,只要玩家能湊出五個子連成一線就算贏。後手贏得比賽所得到的分數是先手贏得到分數的1.5倍喔。 1. **三手交換**:黑白雙方輪流落子,盤上第三手棋後,後手白子有權選擇交換,或不交換直接下第四手。若後手白子於第三手選擇交換,則棋盤上黑白子交換,並由黑子繼續下子。長連不禁也不判勝。 1. **黑子禁手**:先手黑子不能下禁手棋,包括雙活三、雙四和長連。 1. **山口規則**:(Yamaguchi Rule) 2009世界盃開始採用的職業規則。 1. **索索夫規則**: (Soosõrv Rule) 2017世界盃開始採用的職業規則。 1. **六子棋**: 雙方輪流各下兩子,連成六子(或以上)者獲勝。 開局的玩家一定是持白子後手,遊戲結束後,如果兩人選擇再玩一次,那麼先手和後手就會交換順序,讓贏的人變後手! 自認是高手的朋友們,快進來開局等人來挑戰吧! ## 作者 **[小哈片刻](/profile/113321052805704333314@google)**
# GLT One Paragraph of the game description goes here ## Getting Started ### Auth (Login) ```typescript // All action must wait until auth system is ready. CG.GLT.auth.onReady(user => { if(user.isLocalGuest()) { // not login yet } else { // logged in user } }); // auth event listener, triggered when auth user changed let authListener = CG.GLT.auth.onAuth(user => { if(user.isLocalGuest()) { // logged out } else { // logged in user } }); // auth event listener, triggered when validating a new auth action // a following onAuth event is expected. this.validatingListener = onAuthValidating(() => { // show loading animation }); ``` ### API The CG.GLT.api is responsible to communicate with glt.gamelet.online. CG.GLT.commands includes all comments to query/submit data from glt.gamelet.online. The commands has a function submit() that uses CG.GLT.api.submitCommand(), so most of the time, you don't need to call the api to submit. ```typescript CG.GLT.commands.scoreService.submitScore( 'challenge', // the name of the score to submit 10, // the score SubmitType.KEEP_HIGHEST, // submit only when the new score is greater than the one on server TimeRange.ALL // submit to all time-ranges (history and weekly) ) .submit(); // to receive the weekly high score list CG.GLT.commands.scoreService.listScores( 'challenge', // the name of the scores to get TimeRange.WEEKLY, // in which time range OrderType.HIGH_TO_LOW, // how to order the scores CG.GLT.api.lastUpdatedServerTimestamp, // tell the server which week to see 0, // start index 10, // how many to get (list: UserScoreList) => { // do something with the scorelist }, (error) => { // deal with error } ) ``` ## Authors **[Haskasu](/profile/113321052805704333314@google)**
# CgEventsLib The engine of CgEvents. CgEvents is a great way to build your own games with with a CG.built-in editor. ## Attention 請注意 This project is not released and still in actively development. Expect breaking changes before official release. 這個專案目前仍在測試階段,在正式推出之前,所有功能隨時都有可能大改,請謹慎試用。 ## Live Demo <a href="cg://source/test/physics.events" class="mat-raised-button mat-primary">Open Demo Events Sheet</a> ## Concept The engine takes a *.events file to run. The .events file is an encoded json which contains a config field and a events field. ```json { config: { stage: { width: "number", height: "number", resolutionPolicy: "showAll" | "exactFit" | "fixedWidth" | "fixedHeight" | "origin", alignHorizontal: "left" | "center" | "right", alignVertical: "top" | "middle" | "bottom" } }, events: [ { id: "string", triggers: [], checks: [], actions: [] }, ... ] } ``` Yon can edit the json with CG.built-in editor to control all your game events. ## How Events Work Each event contains a TRIGGER, some CHECKS, and some ACTION. The event flow works like this: 1. The TRIGGER of the event is triggered by the engine (keyboard pressed, event over, or maybe the hero collides with an enemy) 1. Once the trigger is triggered, the engine then goes check the CHECKS. 1. If all CHECKS pass, the engine executes all the ACTIONS in the event. ## Getting Started ```typescript let manager = new CgEventManager(); manager.importFromSource('CG.YourProject/yourGame.events') .then(() => manager.preload()) .then(() => manager.start()) ; ``` ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Authors * **[Haskasu](/profile/Haskasu)**
# 無差別五子棋 五子棋是中國古老的棋藝之一,發展至今天有日本的連珠(Renju)、歐洲的五目(Gomoku)、以及Gamelet的無差別五子棋。棋友們不打不相識,歡迎大家進來互相切磋棋藝吧。 這款使用Code.Gamelet.com平台製作的多人連線遊戲除了Online對弈模式可在線上找棋友單挑之外,還有單人模式,讓玩家可以輕鬆讓站長設計的人工智慧培養你的實力。 單人模式可以選擇下「篤姬五子棋」、「德川家定將軍五子棋」、還有可愛的「女僕五子棋」,每個人都有不同的個性,若是新手請選擇女僕五子棋喔! ## 規則 遊戲中和玩家對弈的部分有六種規則可以選擇: 1. **無差別**:沒有職業棋賽的各種繁複規則,只要玩家能湊出五個子連成一線就算贏。後手贏得比賽所得到的分數是先手贏得到分數的1.5倍喔。 1. **三手交換**:黑白雙方輪流落子,盤上第三手棋後,後手白子有權選擇交換,或不交換直接下第四手。若後手白子於第三手選擇交換,則棋盤上黑白子交換,並由黑子繼續下子。長連不禁也不判勝。 1. **黑子禁手**:先手黑子不能下禁手棋,包括雙活三、雙四和長連。 1. **山口規則**:(Yamaguchi Rule) 2009世界盃開始採用的職業規則。 1. **索索夫規則**: (Soosõrv Rule) 2017世界盃開始採用的職業規則。 1. **六子棋**: 雙方輪流各下兩子,連成六子(或以上)者獲勝。 開局的玩家一定是持白子後手,遊戲結束後,如果兩人選擇再玩一次,那麼先手和後手就會交換順序,讓贏的人變後手! 自認是高手的朋友們,快進來開局等人來挑戰吧! ## 作者 **[小哈片刻](/profile/113321052805704333314@google)**
# CG.Base Provide tool kits that helps you fast build an app on Code.Gamelet. Key features include: 1. initialize [pixi.js](#pixi.init) or [three.js](#three.init) environment 1. load and access resources that are imported via Code.Gamelet IDE 1. manage update functions that are called every frame 1. provide debug utilities ## Getting Started Follow the steps below to fast start an app with [PixiJS](#pixi.init) or [three.js](#three.init). We will implement a box2d environment to demo the usage of Base. <a name="pixi.init"></a> ## Start with Pixi.js<a name="pixi.init"></a> ```typescript class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); CG.Base.pixi.physicsDebugDraw.setActive(true); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', {type: 'static'}); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', {type: 'dynamic'}); ball.addCircle(0, 0, 10, {friction: 0.1, density: 0.1, restitution: 0.3}); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_PIXI) <a name="three.init"></a> ## Start with three.js ```typescript class App { constructor() { CG.Base.three.initialize(600, 400); CG.Base.three.physicsDebugDraw.setActive(true); CG.Base.three.camera.position.z = -50; CG.Base.three.camera.up.set(0, -1, 0); CG.Base.three.camera.lookAt(new THREE.Vector3()); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', { type: 'static' }); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', { type: 'dynamic' }); ball.addCircle(0, 0, 10, { friction: 0.1, density: 0.1, restitution: 0.3 }); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_THREE) ## Load and play with Resources To load resources that are imported from IDE: ```typescript // tell resources what resources to load (using the alias names) CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.addAppResource('Game1.music'); // start loading CG.Base.resourceManager.load(() => { // all loaded callback // create button with the image "Game1.button" alias name var button = new CG.Base.pixis.interactive.Button(CG.Base.resourceManager.createPixiSprite('Game1.button', 20, 20)); // set the position of the button button.displayObject.position.set(100, 100); // add the button to pixi.root, so pixi can render the button CG.Base.pixi.root.addChild(button.displayObject); // add a click event listener button.on(CG.Base.pixis.interactive.Button.EVENT.CLICK, () => { // when the button is clicked, play sound with "Game1.music" alias name CG.Base.resourceManager.playSound('Game1.music') }); }); ``` @see [Demo](/edit/Base_Load_Resources) ## Manage update functions Take advantage of CG.Base.addUpdateFunction to make a function called every frame ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); CG.Base.addUpdateFunction(this, this.update); } // this function will be called every frame(called 60 times per second normally) private update(deltaTime:number):void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) You can call a function in the future by CG.Base.addDelayFunction ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); // call this.delayAction in 1000 milliseconds(= one second) CG.Base.addDelayFunction(this, this.delayAction, 1000); } private delayAction():void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) ## Interact with Keyboard Use PIXI.keyboard package to interact with keyboard events. ```typescript export class App { constructor() { // make the window focused, so we can receive keyboard events. window.focus(); // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); // load resources, and wait callback when resources are all loaded CG.Base.resourceManager.load(() => { // add keyboard event listener, when a key is pressed PIXI.keyboardManager.on('pressed', key => { // if the pressed key is space, we call this.createSprite() if (key == PIXI.keyboard.Key.SPACE) { this.createSprite(); } }); }); } private createSprite(): void { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); } } new App(); ``` @see [Demo](/edit/Base_PIXI_Keyboard) ## Debugging The best debug tool on browser is the [developer tools](https://developer.chrome.com/devtools) in Chrome (F12). To find your source code in developer tools, first open developer tools(F12), click "Sources" tab, and search the Network tree as below: > top => {projectCode} => gameFrame => code.gamelet.com => gassets => file/{projectCode}/src for example, if the projectCode is 'Game1', source code is located at > top => Game1 => gameFrame => code.gamelet.com => gassets => file/Game1/src ![Source Network Tree](https://code.gamelet.com/gassets/asset/Base/Base.networktree/networktree.png "Source Network Tree") ### Add Watch In addition to browser's debugging tools, CG.Base provides other useful tools. CG.Base.addWatch() adds objects or objects' properties to Watch panel in CG IDE. ```typescript export class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.load(() => { // add the created sprite into Watch panel, the alias name in Watch panel is 'sprite' CG.Base.addWatch('sprite', this.createSprite()); }); // add this(App)'s 'time' property into Watch panel. The alias name for this property is 'now' CG.Base.addWatch('now', this, 'time'); } private createSprite(): PIXI.Sprite { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); return sprite; } // a getter function, that works like a property of App object. get time(): number { return CG.Base.time(); } } new App(); ``` @see [Demo](/edit/Base_Add_Watch) ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Links and Resources This library is running with the libraries below. * [Pixi.js](http://www.pixijs.com/) - 2D rendering engine * [API reference](http://pixijs.download/release/docs/index.html) * [Examples](http://pixijs.io/examples/) * [Three.js](https://threejs.org/) - 3D rendering engine * [API & Docs](https://threejs.org/docs/index.html#manual/introduction/Creating-a-scene) * [Examples](https://threejs.org/examples/) * [Pixi keyboard](https://github.com/Nazariglez/pixi-keyboard) - Keyboard utility * [Pixi sound](https://github.com/pixijs/pixi-sound) - Sound utility * [Pixi filters](https://github.com/pixijs/pixi-filters) - Filters Collections * [Pixi GafPlayer](https://github.com/mathieuanthoine/PixiGAFPlayer) - [GafMedia](https://gafmedia.com/) Player * [Liquidfun](http://google.github.io/liquidfun/) - Box2D based physics engine * [MD5](http://www.myersdaily.org/joseph/javascript/md5-text.html) - MD5 implementation by Joseph Myers ## Authors **Haska Su** - *Initial work*
# 無差別五子棋 五子棋是中國古老的棋藝之一,發展至今天有日本的連珠(Renju)、歐洲的五目(Gomoku)、以及Gamelet的無差別五子棋。棋友們不打不相識,歡迎大家進來互相切磋棋藝吧。 這款使用Code.Gamelet.com平台製作的多人連線遊戲除了Online對弈模式可在線上找棋友單挑之外,還有單人模式,讓玩家可以輕鬆讓站長設計的人工智慧培養你的實力。 單人模式可以選擇下「篤姬五子棋」、「德川家定將軍五子棋」、還有可愛的「女僕五子棋」,每個人都有不同的個性,若是新手請選擇女僕五子棋喔! ## 規則 遊戲中和玩家對弈的部分有六種規則可以選擇: 1. **無差別**:沒有職業棋賽的各種繁複規則,只要玩家能湊出五個子連成一線就算贏。後手贏得比賽所得到的分數是先手贏得到分數的1.5倍喔。 1. **三手交換**:黑白雙方輪流落子,盤上第三手棋後,後手白子有權選擇交換,或不交換直接下第四手。若後手白子於第三手選擇交換,則棋盤上黑白子交換,並由黑子繼續下子。長連不禁也不判勝。 1. **黑子禁手**:先手黑子不能下禁手棋,包括雙活三、雙四和長連。 1. **山口規則**:(Yamaguchi Rule) 2009世界盃開始採用的職業規則。 1. **索索夫規則**: (Soosõrv Rule) 2017世界盃開始採用的職業規則。 1. **六子棋**: 雙方輪流各下兩子,連成六子(或以上)者獲勝。 開局的玩家一定是持白子後手,遊戲結束後,如果兩人選擇再玩一次,那麼先手和後手就會交換順序,讓贏的人變後手! 自認是高手的朋友們,快進來開局等人來挑戰吧! ## 作者 **[小哈片刻](/profile/113321052805704333314@google)**
# GLT One Paragraph of the game description goes here ## Getting Started ### Auth (Login) ```typescript // All action must wait until auth system is ready. CG.GLT.auth.onReady(user => { if(user.isLocalGuest()) { // not login yet } else { // logged in user } }); // auth event listener, triggered when auth user changed let authListener = CG.GLT.auth.onAuth(user => { if(user.isLocalGuest()) { // logged out } else { // logged in user } }); // auth event listener, triggered when validating a new auth action // a following onAuth event is expected. this.validatingListener = onAuthValidating(() => { // show loading animation }); ``` ### API The CG.GLT.api is responsible to communicate with glt.gamelet.online. CG.GLT.commands includes all comments to query/submit data from glt.gamelet.online. The commands has a function submit() that uses CG.GLT.api.submitCommand(), so most of the time, you don't need to call the api to submit. ```typescript CG.GLT.commands.scoreService.submitScore( 'challenge', // the name of the score to submit 10, // the score SubmitType.KEEP_HIGHEST, // submit only when the new score is greater than the one on server TimeRange.ALL // submit to all time-ranges (history and weekly) ) .submit(); // to receive the weekly high score list CG.GLT.commands.scoreService.listScores( 'challenge', // the name of the scores to get TimeRange.WEEKLY, // in which time range OrderType.HIGH_TO_LOW, // how to order the scores CG.GLT.api.lastUpdatedServerTimestamp, // tell the server which week to see 0, // start index 10, // how many to get (list: UserScoreList) => { // do something with the scorelist }, (error) => { // deal with error } ) ``` ## Authors **[Haskasu](/profile/113321052805704333314@google)**
# GLT One Paragraph of the game description goes here ## Getting Started ### Auth (Login) ```typescript // All action must wait until auth system is ready. CG.GLT.auth.onReady(user => { if(user.isLocalGuest()) { // not login yet } else { // logged in user } }); // auth event listener, triggered when auth user changed let authListener = CG.GLT.auth.onAuth(user => { if(user.isLocalGuest()) { // logged out } else { // logged in user } }); // auth event listener, triggered when validating a new auth action // a following onAuth event is expected. this.validatingListener = onAuthValidating(() => { // show loading animation }); ``` ### API The CG.GLT.api is responsible to communicate with glt.gamelet.online. CG.GLT.commands includes all comments to query/submit data from glt.gamelet.online. The commands has a function submit() that uses CG.GLT.api.submitCommand(), so most of the time, you don't need to call the api to submit. ```typescript CG.GLT.commands.scoreService.submitScore( 'challenge', // the name of the score to submit 10, // the score SubmitType.KEEP_HIGHEST, // submit only when the new score is greater than the one on server TimeRange.ALL // submit to all time-ranges (history and weekly) ) .submit(); // to receive the weekly high score list CG.GLT.commands.scoreService.listScores( 'challenge', // the name of the scores to get TimeRange.WEEKLY, // in which time range OrderType.HIGH_TO_LOW, // how to order the scores CG.GLT.api.lastUpdatedServerTimestamp, // tell the server which week to see 0, // start index 10, // how many to get (list: UserScoreList) => { // do something with the scorelist }, (error) => { // deal with error } ) ``` ## Authors **[Haskasu](/profile/113321052805704333314@google)**
# CG.Base Provide tool kits that helps you fast build an app on Code.Gamelet. Key features include: 1. initialize [pixi.js](#pixi.init) or [three.js](#three.init) environment 1. load and access resources that are imported via Code.Gamelet IDE 1. manage update functions that are called every frame 1. provide debug utilities ## Getting Started Follow the steps below to fast start an app with [PixiJS](#pixi.init) or [three.js](#three.init). We will implement a box2d environment to demo the usage of Base. <a name="pixi.init"></a> ## Start with Pixi.js<a name="pixi.init"></a> ```typescript class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); CG.Base.pixi.physicsDebugDraw.setActive(true); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', {type: 'static'}); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', {type: 'dynamic'}); ball.addCircle(0, 0, 10, {friction: 0.1, density: 0.1, restitution: 0.3}); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_PIXI) <a name="three.init"></a> ## Start with three.js ```typescript class App { constructor() { CG.Base.three.initialize(600, 400); CG.Base.three.physicsDebugDraw.setActive(true); CG.Base.three.camera.position.z = -50; CG.Base.three.camera.up.set(0, -1, 0); CG.Base.three.camera.lookAt(new THREE.Vector3()); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', { type: 'static' }); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', { type: 'dynamic' }); ball.addCircle(0, 0, 10, { friction: 0.1, density: 0.1, restitution: 0.3 }); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_THREE) ## Load and play with Resources To load resources that are imported from IDE: ```typescript // tell resources what resources to load (using the alias names) CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.addAppResource('Game1.music'); // start loading CG.Base.resourceManager.load(() => { // all loaded callback // create button with the image "Game1.button" alias name var button = new CG.Base.pixis.interactive.Button(CG.Base.resourceManager.createPixiSprite('Game1.button', 20, 20)); // set the position of the button button.displayObject.position.set(100, 100); // add the button to pixi.root, so pixi can render the button CG.Base.pixi.root.addChild(button.displayObject); // add a click event listener button.on(CG.Base.pixis.interactive.Button.EVENT.CLICK, () => { // when the button is clicked, play sound with "Game1.music" alias name CG.Base.resourceManager.playSound('Game1.music') }); }); ``` @see [Demo](/edit/Base_Load_Resources) ## Manage update functions Take advantage of CG.Base.addUpdateFunction to make a function called every frame ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); CG.Base.addUpdateFunction(this, this.update); } // this function will be called every frame(called 60 times per second normally) private update(deltaTime:number):void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) You can call a function in the future by CG.Base.addDelayFunction ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); // call this.delayAction in 1000 milliseconds(= one second) CG.Base.addDelayFunction(this, this.delayAction, 1000); } private delayAction():void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) ## Interact with Keyboard Use PIXI.keyboard package to interact with keyboard events. ```typescript export class App { constructor() { // make the window focused, so we can receive keyboard events. window.focus(); // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); // load resources, and wait callback when resources are all loaded CG.Base.resourceManager.load(() => { // add keyboard event listener, when a key is pressed PIXI.keyboardManager.on('pressed', key => { // if the pressed key is space, we call this.createSprite() if (key == PIXI.keyboard.Key.SPACE) { this.createSprite(); } }); }); } private createSprite(): void { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); } } new App(); ``` @see [Demo](/edit/Base_PIXI_Keyboard) ## Debugging The best debug tool on browser is the [developer tools](https://developer.chrome.com/devtools) in Chrome (F12). To find your source code in developer tools, first open developer tools(F12), click "Sources" tab, and search the Network tree as below: > top => {projectCode} => gameFrame => code.gamelet.com => gassets => file/{projectCode}/src for example, if the projectCode is 'Game1', source code is located at > top => Game1 => gameFrame => code.gamelet.com => gassets => file/Game1/src ![Source Network Tree](https://code.gamelet.com/gassets/asset/Base/Base.networktree/networktree.png "Source Network Tree") ### Add Watch In addition to browser's debugging tools, CG.Base provides other useful tools. CG.Base.addWatch() adds objects or objects' properties to Watch panel in CG IDE. ```typescript export class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.load(() => { // add the created sprite into Watch panel, the alias name in Watch panel is 'sprite' CG.Base.addWatch('sprite', this.createSprite()); }); // add this(App)'s 'time' property into Watch panel. The alias name for this property is 'now' CG.Base.addWatch('now', this, 'time'); } private createSprite(): PIXI.Sprite { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); return sprite; } // a getter function, that works like a property of App object. get time(): number { return CG.Base.time(); } } new App(); ``` @see [Demo](/edit/Base_Add_Watch) ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Links and Resources This library is running with the libraries below. * [Pixi.js](http://www.pixijs.com/) - 2D rendering engine * [API reference](http://pixijs.download/release/docs/index.html) * [Examples](http://pixijs.io/examples/) * [Three.js](https://threejs.org/) - 3D rendering engine * [API & Docs](https://threejs.org/docs/index.html#manual/introduction/Creating-a-scene) * [Examples](https://threejs.org/examples/) * [Pixi keyboard](https://github.com/Nazariglez/pixi-keyboard) - Keyboard utility * [Pixi sound](https://github.com/pixijs/pixi-sound) - Sound utility * [Pixi filters](https://github.com/pixijs/pixi-filters) - Filters Collections * [Pixi GafPlayer](https://github.com/mathieuanthoine/PixiGAFPlayer) - [GafMedia](https://gafmedia.com/) Player * [Liquidfun](http://google.github.io/liquidfun/) - Box2D based physics engine * [MD5](http://www.myersdaily.org/joseph/javascript/md5-text.html) - MD5 implementation by Joseph Myers ## Authors **Haska Su** - *Initial work*
# 無差別五子棋 五子棋是中國古老的棋藝之一,發展至今天有日本的連珠(Renju)、歐洲的五目(Gomoku)、以及Gamelet的無差別五子棋。棋友們不打不相識,歡迎大家進來互相切磋棋藝吧。 這款使用Code.Gamelet.com平台製作的多人連線遊戲除了Online對弈模式可在線上找棋友單挑之外,還有單人模式,讓玩家可以輕鬆讓站長設計的人工智慧培養你的實力。 單人模式可以選擇下「篤姬五子棋」、「德川家定將軍五子棋」、還有可愛的「女僕五子棋」,每個人都有不同的個性,若是新手請選擇女僕五子棋喔! ## 規則 遊戲中和玩家對弈的部分有六種規則可以選擇: 1. **無差別**:沒有職業棋賽的各種繁複規則,只要玩家能湊出五個子連成一線就算贏。後手贏得比賽所得到的分數是先手贏得到分數的1.5倍喔。 1. **三手交換**:黑白雙方輪流落子,盤上第三手棋後,後手白子有權選擇交換,或不交換直接下第四手。若後手白子於第三手選擇交換,則棋盤上黑白子交換,並由黑子繼續下子。長連不禁也不判勝。 1. **黑子禁手**:先手黑子不能下禁手棋,包括雙活三、雙四和長連。 1. **山口規則**:(Yamaguchi Rule) 2009世界盃開始採用的職業規則。 1. **索索夫規則**: (Soosõrv Rule) 2017世界盃開始採用的職業規則。 1. **六子棋**: 雙方輪流各下兩子,連成六子(或以上)者獲勝。 開局的玩家一定是持白子後手,遊戲結束後,如果兩人選擇再玩一次,那麼先手和後手就會交換順序,讓贏的人變後手! 自認是高手的朋友們,快進來開局等人來挑戰吧! ## 作者 **[小哈片刻](/profile/113321052805704333314@google)**
# CG.Base Provide tool kits that helps you fast build an app on Code.Gamelet. Key features include: 1. initialize [pixi.js](#pixi.init) or [three.js](#three.init) environment 1. load and access resources that are imported via Code.Gamelet IDE 1. manage update functions that are called every frame 1. provide debug utilities ## Getting Started Follow the steps below to fast start an app with [PixiJS](#pixi.init) or [three.js](#three.init). We will implement a box2d environment to demo the usage of Base. <a name="pixi.init"></a> ## Start with Pixi.js<a name="pixi.init"></a> ```typescript class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); CG.Base.pixi.physicsDebugDraw.setActive(true); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', {type: 'static'}); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', {type: 'dynamic'}); ball.addCircle(0, 0, 10, {friction: 0.1, density: 0.1, restitution: 0.3}); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_PIXI) <a name="three.init"></a> ## Start with three.js ```typescript class App { constructor() { CG.Base.three.initialize(600, 400); CG.Base.three.physicsDebugDraw.setActive(true); CG.Base.three.camera.position.z = -50; CG.Base.three.camera.up.set(0, -1, 0); CG.Base.three.camera.lookAt(new THREE.Vector3()); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', { type: 'static' }); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', { type: 'dynamic' }); ball.addCircle(0, 0, 10, { friction: 0.1, density: 0.1, restitution: 0.3 }); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_THREE) ## Load and play with Resources To load resources that are imported from IDE: ```typescript // tell resources what resources to load (using the alias names) CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.addAppResource('Game1.music'); // start loading CG.Base.resourceManager.load(() => { // all loaded callback // create button with the image "Game1.button" alias name var button = new CG.Base.pixis.interactive.Button(CG.Base.resourceManager.createPixiSprite('Game1.button', 20, 20)); // set the position of the button button.displayObject.position.set(100, 100); // add the button to pixi.root, so pixi can render the button CG.Base.pixi.root.addChild(button.displayObject); // add a click event listener button.on(CG.Base.pixis.interactive.Button.EVENT.CLICK, () => { // when the button is clicked, play sound with "Game1.music" alias name CG.Base.resourceManager.playSound('Game1.music') }); }); ``` @see [Demo](/edit/Base_Load_Resources) ## Manage update functions Take advantage of CG.Base.addUpdateFunction to make a function called every frame ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); CG.Base.addUpdateFunction(this, this.update); } // this function will be called every frame(called 60 times per second normally) private update(deltaTime:number):void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) You can call a function in the future by CG.Base.addDelayFunction ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); // call this.delayAction in 1000 milliseconds(= one second) CG.Base.addDelayFunction(this, this.delayAction, 1000); } private delayAction():void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) ## Interact with Keyboard Use PIXI.keyboard package to interact with keyboard events. ```typescript export class App { constructor() { // make the window focused, so we can receive keyboard events. window.focus(); // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); // load resources, and wait callback when resources are all loaded CG.Base.resourceManager.load(() => { // add keyboard event listener, when a key is pressed PIXI.keyboardManager.on('pressed', key => { // if the pressed key is space, we call this.createSprite() if (key == PIXI.keyboard.Key.SPACE) { this.createSprite(); } }); }); } private createSprite(): void { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); } } new App(); ``` @see [Demo](/edit/Base_PIXI_Keyboard) ## Debugging The best debug tool on browser is the [developer tools](https://developer.chrome.com/devtools) in Chrome (F12). To find your source code in developer tools, first open developer tools(F12), click "Sources" tab, and search the Network tree as below: > top => {projectCode} => gameFrame => code.gamelet.com => gassets => file/{projectCode}/src for example, if the projectCode is 'Game1', source code is located at > top => Game1 => gameFrame => code.gamelet.com => gassets => file/Game1/src ![Source Network Tree](https://code.gamelet.com/gassets/asset/Base/Base.networktree/networktree.png "Source Network Tree") ### Add Watch In addition to browser's debugging tools, CG.Base provides other useful tools. CG.Base.addWatch() adds objects or objects' properties to Watch panel in CG IDE. ```typescript export class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.load(() => { // add the created sprite into Watch panel, the alias name in Watch panel is 'sprite' CG.Base.addWatch('sprite', this.createSprite()); }); // add this(App)'s 'time' property into Watch panel. The alias name for this property is 'now' CG.Base.addWatch('now', this, 'time'); } private createSprite(): PIXI.Sprite { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); return sprite; } // a getter function, that works like a property of App object. get time(): number { return CG.Base.time(); } } new App(); ``` @see [Demo](/edit/Base_Add_Watch) ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Links and Resources This library is running with the libraries below. * [Pixi.js](http://www.pixijs.com/) - 2D rendering engine * [API reference](http://pixijs.download/release/docs/index.html) * [Examples](http://pixijs.io/examples/) * [Three.js](https://threejs.org/) - 3D rendering engine * [API & Docs](https://threejs.org/docs/index.html#manual/introduction/Creating-a-scene) * [Examples](https://threejs.org/examples/) * [Pixi keyboard](https://github.com/Nazariglez/pixi-keyboard) - Keyboard utility * [Pixi sound](https://github.com/pixijs/pixi-sound) - Sound utility * [Pixi filters](https://github.com/pixijs/pixi-filters) - Filters Collections * [Pixi GafPlayer](https://github.com/mathieuanthoine/PixiGAFPlayer) - [GafMedia](https://gafmedia.com/) Player * [Liquidfun](http://google.github.io/liquidfun/) - Box2D based physics engine * [MD5](http://www.myersdaily.org/joseph/javascript/md5-text.html) - MD5 implementation by Joseph Myers ## Authors **Haska Su** - *Initial work*
# 無差別五子棋 五子棋是中國古老的棋藝之一,發展至今天有日本的連珠(Renju)、歐洲的五目(Gomoku)、以及Gamelet的無差別五子棋。棋友們不打不相識,歡迎大家進來互相切磋棋藝吧。 這款使用Code.Gamelet.com平台製作的多人連線遊戲除了Online對弈模式可在線上找棋友單挑之外,還有單人模式,讓玩家可以輕鬆讓站長設計的人工智慧培養你的實力。 單人模式可以選擇下「篤姬五子棋」、「德川家定將軍五子棋」、還有可愛的「女僕五子棋」,每個人都有不同的個性,若是新手請選擇女僕五子棋喔! ## 規則 遊戲中和玩家對弈的部分有六種規則可以選擇: 1. **無差別**:沒有職業棋賽的各種繁複規則,只要玩家能湊出五個子連成一線就算贏。後手贏得比賽所得到的分數是先手贏得到分數的1.5倍喔。 1. **三手交換**:黑白雙方輪流落子,盤上第三手棋後,後手白子有權選擇交換,或不交換直接下第四手。若後手白子於第三手選擇交換,則棋盤上黑白子交換,並由黑子繼續下子。長連不禁也不判勝。 1. **黑子禁手**:先手黑子不能下禁手棋,包括雙活三、雙四和長連。 1. **山口規則**:(Yamaguchi Rule) 2009世界盃開始採用的職業規則。 1. **索索夫規則**: (Soosõrv Rule) 2017世界盃開始採用的職業規則。 1. **六子棋**: 雙方輪流各下兩子,連成六子(或以上)者獲勝。 開局的玩家一定是持白子後手,遊戲結束後,如果兩人選擇再玩一次,那麼先手和後手就會交換順序,讓贏的人變後手! 自認是高手的朋友們,快進來開局等人來挑戰吧! ## 作者 **[小哈片刻](/profile/113321052805704333314@google)**
# 無差別五子棋 五子棋是中國古老的棋藝之一,發展至今天有日本的連珠(Renju)、歐洲的五目(Gomoku)、以及Gamelet的無差別五子棋。棋友們不打不相識,歡迎大家進來互相切磋棋藝吧。 這款使用Code.Gamelet.com平台製作的多人連線遊戲除了Online對弈模式可在線上找棋友單挑之外,還有單人模式,讓玩家可以輕鬆讓站長設計的人工智慧培養你的實力。 單人模式可以選擇下「篤姬五子棋」、「德川家定將軍五子棋」、還有可愛的「女僕五子棋」,每個人都有不同的個性,若是新手請選擇女僕五子棋喔! ## 規則 遊戲中和玩家對弈的部分有六種規則可以選擇: 1. **無差別**:沒有職業棋賽的各種繁複規則,只要玩家能湊出五個子連成一線就算贏。後手贏得比賽所得到的分數是先手贏得到分數的1.5倍喔。 1. **三手交換**:黑白雙方輪流落子,盤上第三手棋後,後手白子有權選擇交換,或不交換直接下第四手。若後手白子於第三手選擇交換,則棋盤上黑白子交換,並由黑子繼續下子。長連不禁也不判勝。 1. **黑子禁手**:先手黑子不能下禁手棋,包括雙活三、雙四和長連。 1. **山口規則**:(Yamaguchi Rule) 2009世界盃開始採用的職業規則。 1. **索索夫規則**: (Soosõrv Rule) 2017世界盃開始採用的職業規則。 1. **六子棋**: 雙方輪流各下兩子,連成六子(或以上)者獲勝。 開局的玩家一定是持白子後手,遊戲結束後,如果兩人選擇再玩一次,那麼先手和後手就會交換順序,讓贏的人變後手! 自認是高手的朋友們,快進來開局等人來挑戰吧! ## 作者 **[小哈片刻](/profile/113321052805704333314@google)**
ⒸCode.Gamelet.com | Privacy Policy | Terms of Service