Tuesday, March 31, 2015

Game canvas

EaselJS
http://www.createjs.com/Docs/EaselJS/modules/EaselJS.html
var stage;

        function init() {
  stage = new createjs.Stage(document.getElementById("mycanvas"));

  var spriteSheet = new createjs.SpriteSheet({
   // số lượng frame hiện ra trong mỗi giây
   framerate: 8,
   // hình ảnh
   "images": ["img/runningcat.png"],
   // width: chiều rộng của 1 sprite, height: chiều cao của 1 sprite
   // count: số lượng sprite sẽ được duyệt
   // có thể có thêm regX: 0, regY:0 : là canh tọa độ hiển thị (không bắt buộc)
   "frames": {width:512, height:256, count: 8, regX: 0, regY:0},
   "animations": {
    // 0 - 7 sẽ hiện sprite từ 0 đến 7
    "run": [0, 7, "run", 1],
    // 5 - 7 là sẽ hiện sprite từ 5 - 7 rồi quay lại "run"
    "jump": [5, 7, "run"]
   }
  });

  var grant = new createjs.Sprite(spriteSheet, "run");
  grant.x = 0;
  grant.y = 0;

  stage.addChild(grant);
  createjs.Ticker.timingMode = createjs.Ticker.RAF;
  createjs.Ticker.addEventListener("tick", stage);
 }

Trang html: 
Thẻ body: thêm vào onload = init();
Trong body, thêm thẻ canvas:

TẠO ÂM THANH CHO CANVAS


        sounds = [
  {src: "R-Damage.ogg", id: 1}
 ];
 createjs.Sound.alternateExtensions = ["mp3"];
        // nếu cho hàm này chạy sẽ gọi function soundLoaded khi âm thanh hoàn tất
 //createjs.Sound.addEventListener("fileload", createjs.proxy(soundLoaded, this));
 createjs.Sound.registerSounds(sounds, "audio/");
// gọi hàm này playSound(); ở nơi mà ta cần phát âm thanh, truyền vào id của âm thanh đó
// ví dụ : playSound(1);
function playSound(target) {
 var soundInstance = createjs.Sound.play(target, createjs.Sound.INTERRUPT_NONE, 0, 0, false, 1);
}
  • Note : Âm thanh gồm 2 file mp3 và ogg

CÁCH LƯU HÌNH ẢNH TRONG 1 LIST

/**
* Khai bao vùng trời, mặt đất
*/
function createMain() {
 manifest = [
  {src: "ground.png", id: "ground"},
  {src: "sky.png", id: "sky"},
  {src: "BlockA0.png", id: "BlockA0"}
 ];

 loader = new createjs.LoadQueue(false);
 loader.addEventListener("complete", handleComplete);
 loader.loadManifest(manifest, true, "img/");
}
​
- chức năng của hàm này là lưu lại những hình ảnh ta cần sử dụng sau này, được lấy từ thư mục /img

Cách sử dụng : 

//khai báo bầu trời
var skyImg = loader.getResult("sky");
sky = new createjs.Shape();
sky.graphics.beginBitmapFill(skyImg).drawRect(0, 0, wCanvas, hCanvas - 79);

stage.addChild(sky);
  • Note : Khi cần viết 1 hàm nào đê thực hiện chức năng sau này thì hãy viết trong function handleComplete();

CÁCH TẠO BẢN ĐỒ (GAME MÊ CUNG)


ví dụ sử dụng 1 mảng ma trận : 

23224252562826272290
31.2..............23
7.2..24.2.2323.24.25
4.5.2...2.2....2..26
2.9.2.3.0.2.22.2.227
3.6.3.2.9...22....28
4.2.2.8.2825762.2..6
4...2.6.22......22.6
02.2..9.22.2.2.2...9
9..2.22...23.2.2.220
8.22.29.2.3..2.2.223
5.22..0.0.27.2.2...4
6...2.206.40.02922.5
6...5............8.5
232942529628262722.x

'1': nơi hiện ra của nhân vật
'x': exit (hoàn thành vòng chơi)

'.': nơi nhân vật có thể di chuyển được

2 -> 9, 0: là các bức tường
//Loop over every tile position,
function parseLevelLines(levelLine) {
    for (var i = 0; i < 15; i++) {
        for (var j = 0; j < 20; j++) {
            loadTile(levelLine.charAt((i * 20) + j), j, i);
        }
    }
}
// levelLine là toàn bộ dữ liệu của ma trận

function loadTile(tileType, x, y) {
 switch (tileType) {
  case '.':
   break;
  case '2':
   createTile("BlockA0", x, y);
   break;
                ...
}

function createTile(blockTile, x, y) {
 var blockImg = loader.getResult(blockTile);
 var block = new createjs.Shape();
 block.graphics.beginBitmapFill(blockImg).drawRect(x * 40, y * 32, 40, 32);
 stage.addChild(block);
}

vậy là được 1 bản đồ

ĐỌC BẢN ĐỒ TỪ FILE TXT


/**
* lấy file levels
* 0.txt, 1.txt,...
* mặc định levelIndex = -1
*/
function loadNextLevel() {
 this.levelIndex = (this.levelIndex + 1) % numberOfLevels;

    // Searching where we are currently hosted
    var nextLevelUrl = window.location.href.replace('index.html', '') + "levels/" + this.levelIndex + ".txt";
    try {
        var request = new XMLHttpRequest();
        request.open('GET', nextLevelUrl, true);

        // Little closure
        request.onreadystatechange = function () {
            onLevelReady(this);
        };
        request.send(null);
    }
    catch (e) {
        // Probably an access denied if you try to run from the file:// context
        // Loading the hard coded error level to have at least something to play with
        parseLevelLines(textLevelError);
    }
}

/**
* kiểm tra xem có lấy được file từ server k
* nếu không lây được sẽ tạo maps tỉnh từ code textLevelError
*/
function onLevelReady(eventResult) {
 var newTextLevel = "";

    if (eventResult.readyState == 4) {
        // If everything was OK
        if (eventResult.status == 200)
            newTextLevel = eventResult.responseText.replace(/[\n\r\t]/g, '');
        else {
            console.log('Error', eventResult.statusText);
            // Loading a hard coded level in case of error
            newTextLevel = textLevelError;
        }

        parseLevelLines(newTextLevel);
    }
}

No comments:

Post a Comment