SlideShare uma empresa Scribd logo
1 de 111
Baixar para ler offline
Edição 2018
#mvpconf
Fernanda Bernardo
Visual Studio and Development Technologies
Jogos: indo além do simples CSS
#mvpconf
Patrocínio:
#mvpconf
Beneficiários do Evento:
APAE-Associação de Pais e Amigos
dos Excepcionais
Lar da Criança Ninho de Paz
Para quem quiser doar outros valores além das inscrições:
CAIXA ECONÔMICA FEDERAL
AG: 0504
CC: 01823-0
CNPJ: 89.078.059/0001-06
ITAU UNIBANCO AS
Agência: 467
CC: 611109
CNPJ 53.372.454/0001-50
#mvpconf
@Feh_Bernardo
http://fernandabernardo.com.br
Biografia
Engenheira de Software @Elo7
Mentora @Training Center
@Help4Papers
GIFS ❤❤❤
Repositório:
http://bit.ly/2c2RsV1
Palestra:
http://bit.ly/2cbNs6h
Repositório:
http://bit.ly/2eLXyeP
Palestra:
http://bit.ly/2xDU5qq
Porque só CSS?
Divertido
Desafio
Aprendizado
We
CSS
Como representar
os elementos
básicos do jogo?
cursor: url('images/bob.png'), default;
.container {
}
<div class=“container”>
</div>
width: 100vw;
height: 100vh;
.container {
width: 100vw;
height: 100vh;
cursor: url('images/bob.png'), default;
}
.container {
width: 100vw;
height: 100vh;
cursor: url('images/bob.png'), default;
}
VW
VH
.container {
width: 100vw;
height: 100vh;
cursor: url('images/bob.png'), default;
}
Viewport Width
Viewport Height
.container {
width: 100vw;
height: 100vh;
cursor: url('images/bob.png'), default;
}
vmax
vmin
.container {
width: 100vw;
height: 100vh;
cursor: url('images/bob.png'), default;
}
cursor: default;pointer;url('images/bob.png'),
default;
.container {
width: 100vw;
height: 100vh;
cursor: url('images/bob.png'), default;
box-sizing: border-box;
}
vw, vh, vmin, vmax
cursor
box-sizing
vw, vh, vmin, vmax
cursor
box-sizing
<div class=“container”>
</div>
<div class=“container”>
<main class=“game">
</main>
</div> .container {
position: relative;
}
.game {
background: url('images/fundo.jpg');
position: absolute;
}
Porque um bob esponja
no espaço?
?
E os inimigos?
<main class=“game”>
</main>
<div class="inimigo"></div>
.inimigo {
}
width: 20px;
height: 20px;
border-radius: 50%;
background-color: white;
position: absolute;
left: 9%;
animation-name: moving;
animation-duration: 6s;
@keyframes moving {
0% {
top: 0;
}
100% {
top: calc(100% - 25px);
}
}
vw, vh, vmin, vmax
cursor
box-sizing
animation
vw, vh, vmin, vmax
cursor
box-sizing
animation
<main class=“game”>
</main>
<div class="inimigo"></div>
<div class="inimigo"></div>
<div class="inimigo"></div>
<div class="inimigo"></div>
<div class="inimigo"></div>
<main class=“game”>
</main>
<div class="inimigo" id="i1"></div>
<div class="inimigo" id="i2"></div>
<div class="inimigo" id="i3"></div>
<div class="inimigo" id="i4"></div>
<div class="inimigo" id="i5"></div>
#i1 {
left: 9%;
}
#i2 {
left: 23%;
}
#i3 {
left: 37%;
}
#i4 {
left: 65%;
}
#i5 {
left: 90%;
}
E como deixar os
inimigos mais dinâmicos?
#i1 { animation-duration: 6s;
animation-iteration-count: 2;}
#i2 { animation-duration: 5s;
animation-iteration-count: 2;}
#i3 { animation-duration: 7s;
animation-iteration-count: 2;}
#i4 { animation-duration: 12s;
animation-iteration-count: 1;}
#i5 { animation-duration: 10s;
animation-iteration-count: 1;}
E se tiver mais inimigos?
#i6, #i7, #i8, #i9, #i10 {
animation-delay: 10s;
background-color: red;
}
Como esconder?
.inimigo {
z-index: -1;
animation-fill-mode: backwards;
}
Como esconder?
.inimigo {
z-index: -1;
animation-fill-mode: backwards;
}
@keyframes moving {
0% { z-index: -1; }
1% { z-index: 2; }
100% { z-index: 2; }
}
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
<main class=“game”>
</main>
[...]
<div class=“oops">
Game Over :(
</div>
.oops {
display: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: red;
z-index: 10;
}
.oops {
display: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: red;
z-index: 10;
}
.inimigo:hover ~ .oops {
display: block;
}
.oops {
display: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: red;
z-index: 10;
}
.inimigo:hover ~ .oops {
display: block;
}
.oops:hover {
display: block;
}
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
seletores
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
seletores
O que vamos
conquistar?
<main class=“game”>
</main>
<div class="inimigo" id="i1"></div>
[...]
<div class="inimigo" id="i5"></div>
<main class=“game”>
</main>
<div class="inimigo" id="i1"></div>
[...]
<div class="inimigo" id="i5"></div>
<input class=“coin” type="checkbox" id="c1">
</input>
.coin {
width: 20px;
height: 20px;
background-color: yellow;
border-radius: 50%;
position: absolute;
left: 9%;
-webkit-appearance: none;
animation-name: moving;
animation-duration: 6s;
}
.coin:checked {
visibility: hidden;
}
<main class=“game”>
<div class="inimigo" id="i1"></div>
<div class="inimigo" id="i2"></div>
<div class="inimigo" id="i3"></div>
<input class="coin" type="checkbox" id=“c1">
</input>
<div class="inimigo" id="i4"></div>
<input class=“coin" type="checkbox" id=“c2">
</input>
<div class="inimigo" id="i5"></div>
</main>
Como contar
os pontos?
.game {
counter-reset: pontos;
}
.game:after {
content: counter(pontos) ‘/2';
}
.coin:checked {
counter-increment: pontos;
}
.game {
counter-reset: pontos;
}
.game:after {
content: counter(pontos) ‘/2';
}
.coin:checked {
counter-increment: pontos;
}
.game {
counter-reset: blah;
}
.game:after {
content: counter(blah) ‘/2';
}
.coin:checked {
counter-increment: blah;
}
.coin:checked {
counter-increment: pontos;
}
.coin:checked {
counter-increment: pontos;
visibility: hidden;
}
display: none; ???Visibility
hidden X
Display
none
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
seletores
counter
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
seletores
counter
Como vence?
<main class=“game”>
[...]
<div class="venceu">
Venceu! :)
</div>
</main>
.venceu {
display: none;
position: absolute;
width: 100%;
height: 100%;
background-color: green;
top: 0;
left: 0;
}
#c1:checked ~ #c2:checked
~ .venceu {
display: block;
}
#c1:checked ~ #c2:checked
~ .venceu {
display: block;
}
Mais moedas?
~ #c3:checked
~ #c4:checked ~ #c5:checked
<main class=“game”>
[...]
<input class="coin"
type="checkbox" id="c1"></input>
[...]
<input class="coin"
type="checkbox" id=“c2"></input>
[...]
</main>
<main class=“game”>
[...]
<input class="coin" tabindex="-1"
type="checkbox" id=“c1"></input>
[...]
<input class="coin” tabindex="-1"
type="checkbox" id=“c2"></input>
[...]
</main>
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
seletores
counter
tabindex
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
seletores
counter
tabindex
<main class=“game”>
<input type="checkbox" id="pause-button"></input>
<label for="pause-button"></label>
[...]
</main>
<main class=“game”>
<input type="checkbox" id="pause-button"></input>
<label for="pause-button"></label>
[...]
</main>
#pause-button + label {
background-image: url('images/pause.png');
}
#pause-button:checked + label {
background-image: url('images/play.png');
}
#pause-button ~ .inimigo,
#pause-button ~ .coin {
animation-play-state: running;
}
<main class=“game”>
<input type="checkbox" id="pause-button"></input>
<label for="pause-button"></label>
[...]
</main>
#pause-button:checked ~ .inimigo,
#pause-button:checked ~ .coin {
animation-play-state: paused;
}
<main class=“game”>
<input type="checkbox" id="pause-button"></input>
<label for="pause-button"></label>
[...]
<div class="pause-container"></div>
</main>
.pause-container {
display: none;
background-color: black;
opacity: 0.7;
}
#pause-button:checked ~ .pause-container {
display: block;
}
.pause-container
.pause-container:before
Como colocar
instruções?
<div class="container">
<input id="intro" type="checkbox">
<section class="intro">
<h2>Space Game</h2>
<p>Jogo só com CSS, sem Javascript ;D</p>
<label for=“intro">Play!</label>
</section>
[… .game]
</div>
div .container
input #intro
section .intro
h2
p
label for=intro
.intro {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 15;
}
label[for=“intro"] {
padding: 1em;
font-size: 1.2em;
background-color: purple;
border-radius: 5px;
margin: 1em 25%;
display: inline-block;
border: 1px solid purple;
}
#intro:checked ~ .intro {
display: none;
}
<section class="rules">
<div>
<h3>Regras</h3>
<ul>
<li>Mova seu personagem com o mouse</li>
<li>Clique nas moedas para coletá-las</li>
<li>Fuja dos tiros</li>
</ul>
<label for="rules">Entendi :)</label>
</div>
</section>
#intro:checked + #rules:checked ~ .rules {
display: none;
}
http://fernandabernardo.com.br/space-game/
vw, vh, vmin, vmax
cursor
box-sizing
animation
z-index
seletores
counter
tabindex
• http://minocernota.com/articles/pure_css_game/
• http://codepen.io/vaielab/full/yoKEF/
• http://dabblet.com/gist/2076449
• http://ryan-kahn.com/static/onlyCSS/
• http://fernandabernardo.com.br/piano-tiles/
• https://github.com/FernandaBernardo/timberman-css
Biografia
http://fernandabernardo.com.br
@Feh_Bernardo
#mvpconf

Mais conteúdo relacionado

Mais de Fernanda Bernardo

Mais de Fernanda Bernardo (11)

Jogos com css 2.0
Jogos com css 2.0Jogos com css 2.0
Jogos com css 2.0
 
Jogos com css
Jogos com cssJogos com css
Jogos com css
 
Isomorfismo pra quê?
Isomorfismo pra quê?Isomorfismo pra quê?
Isomorfismo pra quê?
 
A influência dos usuários no desenvolvimento do Talk7
A influência dos usuários no desenvolvimento do Talk7A influência dos usuários no desenvolvimento do Talk7
A influência dos usuários no desenvolvimento do Talk7
 
Front end ++: seo e flexbox
Front end ++: seo e flexboxFront end ++: seo e flexbox
Front end ++: seo e flexbox
 
Workshop android
Workshop androidWorkshop android
Workshop android
 
Transformando barreiras para ajudar comunidades
Transformando barreiras para ajudar comunidadesTransformando barreiras para ajudar comunidades
Transformando barreiras para ajudar comunidades
 
Heroku
HerokuHeroku
Heroku
 
UX para aumentar a liberdade de diabéticos
UX para aumentar a liberdade de diabéticosUX para aumentar a liberdade de diabéticos
UX para aumentar a liberdade de diabéticos
 
Diabetes Mais Doce - Versão 1.0
Diabetes Mais Doce - Versão 1.0Diabetes Mais Doce - Versão 1.0
Diabetes Mais Doce - Versão 1.0
 
Coding Dojo
Coding DojoCoding Dojo
Coding Dojo
 

Jogos 3.0 - MVP Conf