Леонид Лебедев
Мы продаём ж/д, авиа и автобусные билеты, туры, бронируем отели, рассказываем о расписании.
Самый посещаемый сервис туристических услуг в России (по версии comScore).
1 млн. | 15 млн. | 2003 г. | 316 |
посетителей в день | посетителей в месяц | год основания | сотрудников |
Делаем только для современных браузеров
Сходу тяжело придумать, отложим на потом
Можно повесить свою картинку на курсор
cursor: url('cursor.png'), default;
default
— вид курсора по умолчанию для текущего элемента
Ограничения: не более 128×128
Создаём препятствия для машины
Оказывается, что курсор — это точка
cursor: url('cursor.png') X Y, default;
X, Y
по умолчанию в верхней левой точке
Оказывается, что курсор — это точка
cursor: url('cursor.png') X Y, default;
X, Y
по умолчанию в верхней левой точке
Решение:
Объект имеет прямоугольную область, а визуально — сложную
@keyframes game-car {
0% {
transform: translateY(0);
}
100% {
transform: translateY(calc(100vh + 200px));
/* 200px — высота объекта */
}
}
body:hover .car-1 {
animation: game-car 5s linear infinite;
}
game-car
— название (animation-name
)
5s
— продолжительность (animation-duration
)
linear
— функция времени (animation-timing-function
)
infinite
— количество (animation-iteration-count
)
body:hover .car-1 {
animation: game-car 5s linear infinite;
}
body:hover .car-2 {
animation: game-car 4s infinite linear;
}
Изначально экран не видно, показывается только при наведении на машину
Изначально экран не видно, показывается только при наведении на машину
.car:hover ~ .screen-lose {
display: block;
}
Можно скрыть только убрав с него курсор
.screen-lose {
display: none;
z-index: 999999;
}
.screen-lose:hover {
display: block;
}
При поражении пользователь уводит курсор и начинает играть сначала
При поражении пользователь уводит курсор и начинает играть сначала
Как сделать рандомность?
body:hover .car-1 {
animation: game-car 4s 1s infinite linear;
}
body:hover .car-1 {
animation-play-state: running;
}
.car-1 {
animation: game-car 4s infinite linear;
animation-play-state: paused;
}
Необходимо оторваться от полиции и заехать в грузовик
Как усложнить или упростить игру?
Как усложнить или упростить игру?
Изначально делаем игру на относительных величинах!
Как усложнить или упростить игру?
Изначально делаем игру на относительных величинах!
Способы:
* — криво будут вычисляться столкновения
Люди всё реже пользуются компьютером, и всё чаще чаще мобильным телефоном
Люди всё реже пользуются компьютером, и всё чаще чаще мобильным телефоном
Как быть?
Люди всё реже пользуются компьютером, и всё чаще чаще мобильным телефоном
Как быть?
:hover
уже не работает
Выхода нет! (с)
Будем использовать label
, input
, :checked
Цель игры: словить всех кротов за отведённое время
По клику крот исчезает
<div class="hole">
<div class="hole__up"></div>
<input type="radio" name="mole1">
<label class="mole mole--1" for="mole1"></label>
<div class="hole__down"></div>
</div>
Отсчитываем время до конца игры
Клик по экрану запускает анимации
<body>
<input type="checkbox" id="start">
<div class="screen screen--start">
<label for="start">Click!</label>
</div>
</body>
.start:checked ~ .timer {
animation-name: timer;
}
.start:checked ~ .screen--finish {
animation-name: finish;
}
Как начать снова, если уже сыграли и поймали несколько кротов?
Как начать снова, если уже сыграли и поймали несколько кротов?
Перезапускаем страницу!
<a href=""></a>
Как усложнить или упростить игру?
Как усложнить или упростить игру?
При старте выбирать сложность!
<body>
<input type="checkbox" id="start-easy">
<input type="checkbox" id="start-hard">
<div class="screen screen--start">
<label for="start-easy">Easy</label>
<label for="start-hard">Hard</label>
</div>
</body>
.start--easy:checked ~ .timer,
.start--easy:checked ~ .screen--finish {
animation-duration: 15s;
}
.start--hard:checked ~ .timer,
.start--hard:checked ~ .screen--finish {
animation-duration: 7s;
}
Сейчас пользователь знает последовательность появления кротов, т.к. анимация запускает при выборе уровня
Сейчас пользователь знает последовательность появления кротов, т.к. анимация запускает при выборе уровня
Как решить проблему?
Сейчас пользователь знает последовательность появления кротов, т.к. анимация запускает при выборе уровня
Как решить проблему?
Запускаем анимации кротов при загрузке страницы!
Цель игры ловить кротов
Цель игры ловить кротов, но как посчитать количество пойманных?
Цель игры ловить кротов, но как посчитать количество пойманных?
Будем использовать input
!
Как работает input
с типом radio
?
<input type="radio" name="name" checked>
<input type="radio" name="name">
Как работает input
с типом radio
?
<input type="radio" name="name">
<input type="radio" name="name" checked>
<div>
<input type="radio" name="name" checked>
</div>
<div>
<input type="radio" name="name">
</div>
<div>
<input type="radio" name="name">
</div>
<div>
<input type="radio" name="name" checked>
</div>
Вспоминаем, как у нас устроен крот
<input type="radio" name="mole1">
<label class="mole mole--1" for="mole1"></label>
Вспоминаем, как у нас устроен крот
<input type="radio" name="mole1">
<label class="mole mole--1" for="mole1"></label>
Значит можно сделать такой инпут
<input type="radio" name="mole1" checked>
Когда будет пойман крот, то у этого инпута пропадёт состояние checked
<input type="radio" name="mole1" checked>
<input type="radio" name="mole2" checked>
<input type="radio" name="mole3" checked>
...
<img src="scores.png" alt="scores">
<input type="radio" name="mole1">
<input type="radio" name="mole2" checked>
<input type="radio" name="mole3" checked>
...
<img src="scores.png" alt="scores">
<input type="radio" name="mole1">
<input type="radio" name="mole2">
<input type="radio" name="mole3" checked>
...
<img src="scores.png" alt="scores">
github: leonidlebedev
telegram: @leonidlebedev
twitter: @leonid_lebedev
Игры: leonidlebedev/css-games
Презентация: leonidlebedev/presentations