Final project

Monster Slayer

<head>
  <title>Final Project</title>
  <meta charset="UTF-8" />
  <link href="https://cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.css" rel="stylesheet" />
  <link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.css" rel="stylesheet" />
  <link href="style.css" rel="stylesheet" />
</head>

Prepare - Head

<div class="bg"></div>
<div class="ui center aligned grid ready-to-start" id="intro">
  <div class="row" style="padding-bottom: 0;">
    <div id="game-title-box">
      <h1 class="ui header" id="game-title">
        <div class="ui image">
          <img
            src="https://fontmeme.com/permalink/181114/8525b852e5cdd8b351c05820b0e6cfb1.png"
            alt=""
            />
        </div>
      </h1>
      <div class="bottom-content">
        <button class="ui inverted brown button" id="btn-start">
        旅途開始
        </button>
      </div>
    </div>
  </div>
  <div class="row" style="padding-top: 0;">
    <div class="ui steps" id="progress-menu">
      <div class="active step">
        <i class="truck icon"></i>
        <div class="content">
          <div class="title">關卡 1</div>
          <div class="description">初生之犢 - 擊退小怪</div>
        </div>
      </div>
      <div class="step">
        <i class="payment icon"></i>
        <div class="content">
          <div class="title">關卡 2</div>
          <div class="description">小試身手 - 擊退小怪</div>
        </div>
      </div>
      <div class="step">
        <i class="payment icon"></i>
        <div class="content">
          <div class="title">關卡 3</div>
          <div class="description">躊躇滿志 - 擊退小怪</div>
        </div>
      </div>
      <div class="step">
        <i class="payment icon"></i>
        <div class="content">
          <div class="title">關卡 BOSS</div>
          <div class="description">勢如破竹 - 解決菁英</div>
        </div>
      </div>
    </div>
  </div>
</div>
<div class="game-dimmer"></div>
<div class="ui middle aligned centered grid" id="playground">
  <div class="row">
    <div class="five wide column">
      <div class="ui centered card" id="player-card">
        <div class="image">
          <img src="http://i63.tinypic.com/9ihd0p.jpg" />
        </div>
        <div class="content">
          <div class="header">
            <div class="name">冒險者</div>
            <span class="lives">
              <i class="red heart icon"></i>
              <i class="red heart icon"></i>
              <i class="red heart icon"></i>
              <i class="heart outline icon"></i>
              <i class="heart outline icon"></i>
            </span>
          </div>
          <div class="meta"style="margin-top: 6px;">
            等級 <span name="level">1</span>
          </div>
          <div class="description">「願勝利女神與我同在」</div>
        </div>
      </div>
    </div>
    <div class="five wide column">
      <div class="ui centered card" id="monster-card">
        <div class="image" id="monster-photo">
          <img src="http://i64.tinypic.com/svgjo6.jpg" alt="" />
        </div>
        <div class="content">
          <div class="header">
            <div class="name">飛行嘶嘶蛇</div>
            <span class="lives">
              <i class="red heart icon"></i>
              <i class="red heart icon"></i>
              <i class="red heart icon"></i>
              <i class="heart outline icon"></i>
              <i class="heart outline icon"></i>
            </span>
          </div>
          <div class="meta"><span class="date">等級 1</span></div>
          <div class="description">「嘶嘶嘶~」</div>
        </div>
      </div>
    </div>
  </div>
</div>
<div class="window-centered-box">
  <img
    src="https://www.pngarts.com/files/1/Battle-PNG-Download-Image.png"
    alt=""
    id="btn-battle"
    title="點此以攻擊怪物"
    />
</div>

Prepare - Body(1)

<div class="ui mini modal" id="name-modal">
  <div class="header">稍等,冒險者,還未請教您的大名...</div>
  <div class="content">
    <div class="ui form">
      <div class="fluid field">
        <input type="text" placeholder="Full Name" name="player-name">
      </div>
    </div>
  </div>
  <div class="actions">
    <div class="ui approve green button">開始</div>
  </div>
</div>

Prepare - Body(2) - Name Modal

<div class="ui basic tiny modal" id="action-modal">
  <div class="header" id="turn-title">第 1 回合</div>
  <div class="ui basic segment">
    <p>請選擇攻擊方式:</p>
    <div class="ui center aligned three column grid">
      <div class="column">
        <div class="attack">
          <img src="http://i66.tinypic.com/23r0f48.jpg" id="paper"/>
        </div>
      </div>
      <div class="column">
        <div class="attack">
          <img src="http://i64.tinypic.com/x0o9aq.jpg" id="scissors"/>
        </div>
      </div>
      <div class="column">
        <div class="attack">
          <img src="http://i67.tinypic.com/2hhkw7k.jpg" id="stone"/>
        </div>
      </div>
    </div>
  </div>
</div>

Prepare - Body(3) - Action Modal

<!-- scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.2/TweenMax.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.js"></script>
<script src="script.js"></script>

Prepare - Body(4) - Scripts

body {
  overflow: hidden;
  height: 100vh;
}

.bg {
  content: "";
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: url(https://dbkrblog.files.wordpress.com/2016/07/info1_11.png) 0 0 no-repeat / cover;
  filter: brightness(0.5);
}

#game-title-box {
  display: flex;
  align-items: flex-end;
  position: relative;
  width: 100%;
  height: 150px;
  border: 5px solid #540101;
  border-bottom: none;
  padding: 1rem;
}

#game-title-box .bottom-content {
  flex: 0 0 120px;
  margin-bottom: -32px;
  text-align: center;
}

#game-title {
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  top: 16px;
  right: 16px;
  left: 16px;
  bottom: 32px;
  margin: 0;
  padding: 1.5rem;
  text-align: center;
  background: linear-gradient(
    -10deg,
    rgba(187, 189, 52, 0.81) -21%,
    rgba(84, 1, 1, 0.88) 35%,
    rgba(62, 0, 0, 0.88) 67%,
    #cc1d1dbf 110%
  );
  box-shadow: 0 5px 12px 2px #2b0101, 0 2px 3px -1px #1d1d1d;
  z-index: 1;
  transition: all 0s;
}
#game-title .image {
  width: 386px;
  transform: scaleX(1.15);
}

#game-title-box:before,
#game-title-box:after {
  content: "";
  display: block;
  position: relative;
  bottom: -16px;
  flex: 2 0 0;
  height: 1px;
  border-radius: 3px 0 0 0;
  border-bottom: 5px solid #540101;
  z-index: 2;
}
#game-title-box:before {
  left: -19px;
}
#game-title-box:after {
  right: -19px;
}

#btn-start {
  position: relative;
  z-index: 999;
}

#intro {
  position: relative;
  transition: transform 0.6s;
  z-index: 2;
}

#progress-menu {
  width: 100%;
  z-index: 0;
  opacity: 1;
  transition: opacity 0.8s;
  transition-delay: 1.2s;
}

#intro.ready-to-start {
  transform: translateY(40vh);
  transition: transform 0s;
}
#intro.ready-to-start #progress-menu {
  opacity: 0;
  transition: opacity 0s;
}
#intro.ready-to-start #game-title-box {
  width: 600px;
  transition: width 0.6s 0.8s;
}

/* 開始遊戲後 */
#intro:not(.ready-to-start) {
  transform: translateY(0);
  transition-delay: 0.6s;
}
#intro:not(.ready-to-start) #game-title-box {
  height: 118px;
  transition: all 0.6s 0.6s;
}
#intro:not(.ready-to-start) #game-title-box:before,
#intro:not(.ready-to-start) #game-title-box:after {
  opacity: 0;
}

#intro:not(.ready-to-start) #game-title {
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  margin: 0;
  padding: 1.5rem;
  border-bottom: 5px solid #540101;
  transition: all 0.6s;
}

#intro:not(.ready-to-start) #btn-start {
  display: none;
}

/* 通用樣式 */
.ui.steps .step {
  background: linear-gradient(rgba(107, 73, 0, 0.84) 5%, rgba(1, 39, 11, 0.86));
  color: #adca42;
}
.ui.steps .step.active {
  background: linear-gradient(
    rgba(105, 28, 15, 0.87) 5%,
    rgba(148, 23, 98, 0.85)
  );
}
.ui.steps .step.active .title {
  color: #5dc2c7;
}
.ui.steps .step:after,
.ui.steps .step.active:after {
  background: #f9db3e;
}
.ui.steps .step .description {
  color: #adca42;
}

.ui.card {
  background: transparent;
  box-shadow: none;
}

/* 修改字體 */
.ui *,
.ui.header,
.ui.button,
.ui.steps .step .title {
  font-family: "微軟正黑體", "Microsoft Jen Hei";
}

.ui.card .image {
  background: transparent;
}
.ui.card > .content,
.ui.cards > .card > .content {
  background: rgba(255, 234, 172, 0.65);
}

#playground {
  height: calc(100vh - 200px);
  display: flex;
  align-items: center;
}

.game-dimmer {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: #181818;
  z-index: 1;
  opacity: 1;
  transition: all 1s;
}

.game-dimmer.disabled {
  z-index: -1;
  opacity: 0;
  transition-delay: 0.6s;
}

/* input[name=player-name] {
  width: 100 !important;
} */

.window-centered-box {
  position: fixed;
  top: calc(50% + 200px / 2);
  left: 50%;
  transform: translate3D(-50%, -50%, 0);
  width: 100px;
  height: 100px;
}

#btn-battle {
  width: 100%;
  cursor: pointer;
  transition: all .25s;
}

#btn-battle.active {
  filter: brightness(1.25);
  transform: scale(1.25);
}

.attack {
  position: relative;
  border: none;
}

.attack:before, .attack:after {
  content: "";
  position: absolute;
  top: -4px;
  right: 10px;
  bottom: -4px;
  left: 10px;
  opacity: 0;
  transition: opacity .4s;
}

.attack [class^=label] {
  position: absolute;
  padding: 4px 6px;
}

.attack.me:before {
  border: 1px solid rgb(40, 108, 253);
}

.attack .label-me {
  left: 11px;
  top: -3px;
  right: auto;
  bottom: auto;
  background: rgb(40, 108, 253);
}

.attack.monster:after {
  top: -2px;
  bottom: -2px;
  right: 8px;
  left: 8px;
  border: 1px solid rgb(255, 71, 71);
}

.attack .label-monster {
  right: 9px;
  bottom: -1px;
  top: auto;
  left: auto;
  background: rgb(255, 71, 71);
}

.attack.selected:before, .attack.selected:after {
  opacity: 1;
}

.attack.selected img {
  animation: blink 1s forwards;
}

@keyframes blink {
  0% {
    filter: brightness(1);
  }
  33% {
    filter: brightness(2);
  }
  67% {
    filter: brightness(1.2);
  }
  100% {
    filter: brightness(1.5);
  }
}

Prepare - CSS

Are you ready?

Let's collide with monsters!

var startGame = false; // 是否進入遊戲
var currentStage = 1; // 當前關卡
var currentRound = 1; // 當前回合
// 各關卡背景
var stageBg = [
  "https://dbkrblog.files.wordpress.com/2016/07/info1_11.png",
  "https://dbkrblog.files.wordpress.com/2016/07/info1_10.png",
  "https://dbkrblog.files.wordpress.com/2016/07/info1_22.png",
  "https://dbkrblog.files.wordpress.com/2016/07/20160706053006a0egagut4p0g3onr.jpg"
];
// 各關卡怪獸
var monsters = [
  {
    name: "飛行嘶嘶蛇",
    level: 1,
    lives: 3,
    photo: "http://i64.tinypic.com/svgjo6.jpg",
    comment: "嘶嘶嘶~"
  },
  {
    name: "戴奧辛大閘蟹",
    level: 2,
    lives: 3,
    photo: "http://skullstonegame.com/press/images/skullstone_flying_snake.png",
    comment: "猜猜我被賣到哪裡去?"
  },
  {
    name: "巨石強森怪",
    level: 3,
    lives: 4,
    photo: "http://skullstonegame.com/press/images/skullstone_golem.png",
    comment: "R.O.C.K!"
  },
  {
    name: "單身400年的繃帶怪",
    level: 5,
    lives: 5,
    photo: "https://dbkrblog.files.wordpress.com/2016/09/disgael.png",
    comment: "妹子妹子妹子妹子A_A"
  }
];
// 主角
var player = {
  name: "冒險者",
  level: 1,
  lives: 5,
}
// 一些遊戲UI flag
var attack_modal_show = false;
var disabled_select_weapon = false;
var is_battling = false;

Declare necessary variable

Get the name of your character 

$("#btn-start").click(function() {
  $("input[name=player-name]").val(player.name);
  $("#name-modal").modal({
    closable: false,
    onApprove : function() {
      // 1. 試著取得name-modal中輸入框的值,再改變player物件裡的名稱
      var name = $("輸入框").val();
      player.??? = name;
      
      // Don't move below
      $("#intro").removeClass("ready-to-start");
      $(".game-dimmer").addClass("disabled");
    }
  }).modal("show");
});

Render Characters Info

$("#btn-start").click(function() {
  $("input[name=player-name]").val(player.name);
  $("#name-modal").modal({
    closable: false,
    onApprove : function() {
      // 1. 試著取得name-modal中輸入框的值,再改變player物件裡的名稱
      /* 
         Answer of part 1...
      */
      
      /*
         2. 宣告一函式 renderInfo(name, character),其功能為顯示player及monster資訊;
      */
      renderInfo("player", player);
      renderInfo("monster", 「當前關卡的怪獸物件」);

      
      // Don't move below
      $("#intro").removeClass("ready-to-start");
      $(".game-dimmer").addClass("disabled");
    }
  }).modal("show");
});

function renderInfo(name, character) {
  var card = $(`#${name}-card`);
  card.find(".name").text(character.name);
  card.find(".level").text(character.level);
  card.find(".description").text(character.scripts);
  card.find(".lives").empty();
  var heart = "<i class='red heart icon'></i>";
  for (var i = 0; i < character.lives; i++) {
    card.find(".lives").append(heart);
  }
}

Make a hover effect of attack button

$("#btn-battle").mouseover(function() {
  // 滑鼠移上去,使用 $(selector).addClass(some_class) 為按鈕增加 active 這class
  $(this).addClass(???);
});

$("#btn-battle").mouseleave(function() {
  // 滑鼠移出,使用 $(selector).removeClass(some_class) 為按鈕移除 active 這class
  $(this).removeClass(???);
});

/*
  可合併寫成
  $("#btn-battle").mouseover(function() {
    $(this).addClass("active");
  }).mouseleave(function() {
    $(this).removeClass("active");
  });
*/

JQuery final project

By David Tsui

JQuery final project

  • 426