iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Modern Web

拾起 Canvas,人人都是大藝術家!系列 第 23

第 23 幅 - 用 Canvas 復刻 Pokemon ,做個 RPG 小遊戲吧!(下)

  • 分享至 

  • xImage
  •  

今天的目標是把素材都替換成自己繪製的,並讓角色玩家可以跑去吃香蕉!吃了香蕉就會得分。素材的部分一開始努力想要把角色也畫出來後但最後還是放棄了...不好意思就讓我先用小智本人,這裡場景都是我重新繪製,給場景加了幾顆櫻花樹,大家如果也想畫一些八位元圖像的話可以下載這一款 APP —— 八位元畫家,香蕉也是 App 內提供的素材唷!

自己做素材真的很療癒,當然前提是時間很充足QQ
以下就是今天完成的樣子(已盡力...)

復古八位元遊戲

接著來分享今天新增的幾個功能的程式碼

  1. 新增道具-香蕉
window.onload = () => {
    ...

    // 新增道具影像載入狀態
    let ItemImageLoaded = false;
    const itemImage = new Image();
    itemImage.onload = () => {
        ItemImageLoaded = true;
        if (ItemImageLoaded) assetsLoaded();
    };
    itemImage.src = "images/item.png";

    // 新增香蕉道具位置 
    const bananaItem = {
        x: 0,
        y: 0,
        spritePosition: 0,
        spriteItemDistance: 33
    };
    bananaItem.generatePosition = () => {
        bananaItem.x = Math.floor(Math.random() * 20);
        bananaItem.y = Math.floor(Math.random() * 20);
        bananaItem.spritePosition = Math.floor(Math.random() * 1) + 0;
    };

    // 新增 Canvas 繪製香蕉道具
    function assetsLoaded() {
        ...
        ctx.drawImage(
            itemImage, 
            bananaItem.spritePosition*bananaItem.spriteItemDistance, 
            0, 
            zoom, 
            zoom, 
            bananaItem.x * zoom, 
            bananaItem.y * zoom, 
            zoom, 
            zoom
        );
    }
    
    ...
}
  1. 新增人物與道具的互動關係
window.onload = () => {
    ...
    
    // 新增分數記錄
    let score = 0;    

    // 新增角色移動位置與道具重疊時,表示人物成功吃到道具
    player.move = (direction) => {
        ...
        if(player.x === bananaItem.x && player.y === bananaItem.y) { 
            score += 1;
            bananaItem.generatePosition();
        }
    }
}

  1. 新增分數板
window.onload = () => {
    ...
    
    // 繪製分數儀表板
    function assetsLoaded() {
        ...
        board();
    }
    
    // 設定分數板內容
    function board() {
        ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
        ctx.fillRect(CanvasWidth-120, CanvasHeight-50, 120, 50);

        ctx.font = "16px Arial";
        ctx.fillStyle = "rgba(255, 255, 255, 1)";
        ctx.fillText("Current Score",CanvasWidth-110, CanvasHeight-30);

        ctx.font = "18px Arial";
        ctx.fillStyle = "rgba(255, 255, 255, 1)";
        ctx.fillText(score,CanvasWidth-65, CanvasHeight-7);
    }
}

希望大家喜歡今天的小遊戲,也歡迎大家為這個遊戲繼續擴充,之前很紅的 gather town 也是用類似的世界觀來完成的,八位元的世界真是復古又可愛!


上一篇
第 22 幅 - 用 Canvas 復刻 Pokemon ,做個 RPG 小遊戲吧!(上)
下一篇
第 24 幅 - 以 Matter.js 實作地心引力效果,讓你的動畫完美落地
系列文
拾起 Canvas,人人都是大藝術家!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Rson Wilson
iT邦新手 4 級 ‧ 2022-10-09 00:03:42

可以許願用 Canvas 復刻 薩爾達傳說嗎~

https://ithelp.ithome.com.tw/upload/images/20221009/20105528JVPEpD9zpP.png

我要留言

立即登入留言