В данном уроке мы сделаем очень простую игру со стрельбой с использованием jQuery. Правила у игры очень простые - нужно стрелять в злодеев, а полицейского не трогать. Целиться надо с помощью мышки, а стрелять - левой кнопкой.
HTML
Код HTML содержит 3 основных элемента div: панель кнопок и статистики, основное поле игры и финальное сообщение, которое выводится по завершению игры.
Панель кнопок и статистики
Здесь выводится информация о количестве промахов и удачных выстрелов, а также кнопка для запуска игры.
<div id="stat">
<span id="hit">0 Hit</span>
<span id="miss">0 Miss</span>
<a id="btnstart" href="javascript://">Play ↓</a>
</div>
Основное поле игры
Здесь размещаются персонажи игры - три плохиша и один кибальчиш.
<div id="container">
<div id="char1" class="character enemy1"></div>
<div id="char2" class="character enemy2"></div>
<div id="char3" class="character enemy3"></div>
<div id="char4" class="character ally"></div>
</div>
Финальное сообщение
Выводится только по завершению игры, в остальное время - скрыто.
<div id="message">
Спасибо за игру. Нажмите "Играть", чтобы запустить игру снова.
</div>
JQuery
Логика игры предельно проста. В начале игры все персонажи скрыты и размещаются в случайном порядке в внутри контейнера. Из всех персонажей только один будет показан в случайном порядке.
Когда игра запускается, она будет длиться 30 секунд. Все состояния переводятся в значения по умолчанию. Когда игрок попадает в плохиша, запускается эффект взрыва. Если попасть в кибальчиша, то будет запущен эффект горизонтального отскока. Все используемые эффекты реализованы в библиотеке jQuery UI.
var miss = 0;
var hit = 0;
$(document).ready(function() {
var play;
$("#btnstart").click(function(){
startplay();
});
function startplay() {
$("#message").fadeOut('slow');
$(".character").fadeOut('slow');
$("#miss").html("0 мимо");
$("#hit").html("0 в цель");
miss = 0;
hit = 0;
$("#btnstart").css("color", "#e3e3e3");
$("#btnstart").unbind("click");
play = setInterval(scramble, 1800);
setTimeout(function() {
clearInterval(play);
$("#btnstart").css("color", "#333333");
$("#btnstart").bind("click", startplay);
// Выводим финальное сообщение
var containerPos = $('#container').offset();
$("#message").animate({
top: containerPos.top,
left: containerPos.left
}, 'fast', function() {
setTimeout(function() {
$("#message").fadeIn('slow');
$(".character").fadeIn('slow');
}, 500);
});
}, 30000);
}
$(".character").click(function() {
if ($(this).hasClass("ally")) {
$(this).effect("bounce", {
times: 2,
direction: 'left'
}, 300);
$(this).slideUp("fast");
miss++;
$("#miss").html(miss + " мимо");
} else {
$(this).effect("explode", 500);
hit++;
$("#hit").html(hit + " в цель");
}
});
});
function randomFromTo(from, to){
return Math.floor(Math.random() * (to - from + 1) + from);
}
function scramble() {
var children = $('#container').children();
var randomId = randomFromTo(1, children.length);
moveRandom('char'+randomId);
setTimeout(function(){
$("#char"+randomId).slideDown('fast');
}, 500);
setTimeout(function() {
$("#char"+randomId).slideUp('fast');
}, 1500);
}
function moveRandom(id) {
/* Получаем положение контейнера и размер
* -- метод доступа: cPos.top и cPos.left */
var cPos = $('#container').offset();
var cHeight = $('#container').height();
var cWidth = $('#container').width();
// Получаем отступы прямоугольника (предполагаем, что все отступы равны)
var pad = parseInt($('#container').css('padding-top').replace('px', ''));
// Получаем размер перемещаемого прямоугольника
var bHeight = $('#'+id).height();
var bWidth = $('#'+id).width();
// Устанавливаем максимум для положения
maxY = cPos.top + cHeight - bHeight - pad;
maxX = cPos.left + cWidth - bWidth - pad;
// Устанавливаем минимум для положение
minY = cPos.top + pad;
minX = cPos.left + pad;
// Устанавливаем новое положение
newY = randomFromTo(minY, maxY);
newX = randomFromTo(minX, maxX);
$('#'+id).animate({
top: newY,
left: newX
}, 'slow', function() {
});
}
CSS
Используемый для игры код CSS. Для фона задействован шаблон, для каждого из четырёх персонажей используется свое изображение, а курсор мыши устанавливается в виде прицела.
body {
cursor: url('img/target.gif');
background: #ffffff url("img/trentanove.gif") repeat top right;
}
#container {
background: #ffffff url("img/trentaquattro.gif") repeat top right;
margin: 0 auto;
border: 5px solid #999999;
width: 600px;
height: 350px;
padding: 20px 50px;
cursor: url("img/target.gif"), pointer;
-webkit-border-radius: .5em;
-moz-border-radius: .5em;
border-radius: .5em;
}
#message {
background: #999999;
margin: 0 auto;
border: 5px solid #999999;
width: 600px;
height: 350px;
padding: 20px 50px;
-webkit-border-radius: .5em;
-moz-border-radius: .5em;
border-radius: .5em;
position: absolute;
opacity: 0.8;
filter:alpha(opacity=80);
text-align: center;
font-size: 28px;
color: #000000;
display: none;
}
.character {
border: 2px solid #f3f3f3;
width: 95px;
height: 95px;
position: absolute;
display: none;
-webkit-border-radius: .5em;
-moz-border-radius: .5em;
border-radius: .5em;
cursor: url('img/target.gif'), pointer;
}
.character:hover {
opacity: 0.6;
filter:alpha(opacity=60);
}
.enemy1 {
background: url("img/enemy1.jpg");
}
.enemy2 {
background: url("img/enemy2.jpg");
}
.enemy3 {
background: url("img/enemy3.jpg");
}
.ally {
background: url("img/ally.jpg");
}