Construindo um Jogo para a Web - Tetris



Documentos relacionados
Construindo um Jogo para a Web Pac-man

Construindo um Jogo para a Web River Raid

Construindo um Jogo para a Web Flappy Bird

Construindo um Jogo para a Web - Snake

Web Design. Prof. Felippe

Roteiro 2: Conceitos de Tags HTML

HTML / JAVASCRIPT. A versão atual é o HTML5 (seus predecessores imediatos são HTML 4.01, XHTML 1.1, etc.).

JavaScript. JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos.

Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção

O código JavaScript deve ser colocado entre tags de comentário para ficar escondido no caso de navegadores antigos que não reconhecem a linguagem.

SIMULADO Windows 7 Parte V

Webdesign HTML. Introdução a HTML e as principais tags da linguagem. Thiago Miranda dos Santos Souza

PROJETO INFORMÁTICA NA ESCOLA

mkdir /srv/www/default/html/calculadora/imagens mkdir /srv/www/default/html/calculadora/blocos

Lista de Revisão. 3. Analise a afirmativa a seguir como verdadeira ou falsa e justifique.

Programação para web JavaScript

App - Paint Pot (Lata de tinta)

Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT. Power Point. Básico

Introdução. História. Como funciona

HTML5. André Tavares da Silva.

Microsoft Office PowerPoint 2007

Diazo. Módulo 7 Tema Diazo

Posicionamento e Layout com CSS

Programação de Computadores

PROGRAMAÇÃO MANUAL DE INSTRUÇÕES SEJA BEM VINDO VERSÃO /01/2013 UDS SOLUÇÕES DIGITAIS

Scriptlets e Formulários

Diferentes modos para visualizar gravações no Software HMS Client

Professor Paulo Lorini Najar

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

C D. C) Coleções: é usada para organizar o conteúdo de áudio, vídeo e imagens em pastas, buscando facilitar a montagem do storyboard.

Pesquisa e organização de informação

O que há de novo. Audaces Idea

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

<link rel="stylesheet" type="text/css" href="imagens.css" />

Aula 5 Microsoft PowerPoint 2003: Criando uma Apresentação

Fluxo de trabalho do Capture Pro Software: Indexação de código de barras e separação de documentos

Oficina de Construção de Páginas Web

Programação WEB. Prof. André Gustavo Duarte de Almeida docente.ifrn.edu.br/andrealmeida. Aula III Introdução PHP

Programação para Internet I

WEBDESIGN. Professor: Paulo Marcos Trentin - paulo@paulotrentin.com.br Escola CDI de Videira

Manual do Spectacle. Boudhayan Gupta Boudhayan Gupta Tradução: André Marcelo Alvarenga

Desvendando Jogos 2D. Por Marcos Romero Setembro / Cyborg Arena - RHGames

Tutorial Plone 4. Manutenção de Sites. Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados

Apostila de PowerPoint 2013

Clique no menu Iniciar > Todos os Programas> Microsoft Office > Publisher 2010.

Trabalhando com arquivos de som. Prof. César Bastos Fevereiro 2008

Primeiro contato com JavaScript

Manual do Publicador. Wordpress FATEA Sistema de Gerenciamento de Conteúdo Web

Layouts de páginas com HTML e CSS

ÍNDICE... 2 POWER POINT Abas... 7 Salvando Arquivos... 8 Abrindo um arquivo LAYOUT E DESIGN... 13

Workshop Construct 2. Gutenberg Neto

Voltado para novos usuários, este capítulo fornece uma instrução para edição de Leiaute do SILAS e suas funções.

Programando Jogos em Delphi Animação, Lógica e Controle versão orientada à objetos

Applets no Geogebra. Acesse os endereços dados a seguir e conheça exemplos de Applets.

Introdução à Informática Professor: Juliano Dornelles

Manual de Integração Via Gadget. Passo a passo para realizar a integração entre websites e a plataforma Virtual Target.

CSS é a abreviatura para Cascading Style Sheets Folhas de Estilo em Cascata

WebDesign. Professor: Paulo Trentin Escola CDI de Videira

Lista de operadores de comparação - > Maior que - < Menor que - <= Menor ou igual a - >= Maior ou igual a - === Igual a -!

Repeater no GASweb. Regiões

O Windows 7 é um sistema operacional desenvolvido pela Microsoft.

MATERIAL DE APRESENTAÇÃO DO SCRATCH

Desenvolvedor Web Docente André Luiz Silva de Moraes

PDI 1 - Projeto e Design de Interfaces Web

Microsoft Office Outlook Web Access ABYARAIMOVEIS.COM.BR

Guia de Início Rápido

Construindo um Jogo para a Web Pinball

ANDRÉ APARECIDO DA SILVA APOSTILA BÁSICA SOBRE O POWERPOINT 2007

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ARMAZENAMENTO EM BD NO DM. Prof. Angelo Augusto Frozza, M.Sc.

Apostila para o 7º ano Profª Yandra

Tutorial Audacity. Índice

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna

Módulo 6: Linguagem de Programação IV 6.1. Introdução 6.2. Bases de Dados Visão Estrutural SGBD: Sistema de Gestão de Bases de Dados

Universidade Federal da Fronteira Sul Campus Chapecó Sistema Operacional

Desenvolvendo Websites com PHP

MICROSOFT POWER POINT

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ARMAZENAMENTO EM BD NO DM. Prof. Angelo Augusto Frozza, M.Sc.

Criando um script simples

Aula 03 PowerPoint 2007

Desenvolvimento de Sites com PHP e Mysql Docente André Luiz Silva de Moraes

QUEM FEZ O TRABALHO?

APOSTILA DE EXEMPLO. (Esta é só uma reprodução parcial do conteúdo)


Clique no botão novo

Passa a passo para construir uma página pessoal - Parte 1

TABLELESS E PROJETO ESTRUTURAL

AMBIENTE. FORMULÁRIO: é a janela do aplicativo apresentada ao usuário. Considere o formulário como a sua prancheta de trabalho.

Orientação a Objetos

Como incluir artigos:

SIMULADOS & TUTORIAIS

Universidade Federal do Espírito Santo CCA UFES. Centro de Ciências Agrárias CCA UFES Departamento de Computação. JavaScript

Informática I. Aula 6. Aula 6-12/09/2007 1

WEBDESIGN. Professor: Paulo Trentin Escola CDI de Videira

Responsive Web Design

Para criar uma animação precisamos de uma imagem e que ela contenha alguns frames. O número de frames é uma escolha sua.

MiniPENTV ISDB-T USB TV Dongle. Manual do Usuário

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Transcrição:

Construindo um Jogo para a Web - Tetris Programação para a Internet Prof. Vilson Heck Junior

Tecnologias Necessárias Tecnologias já Estudadas: HTML; CSS; JavaScript; Tecnologias Novas: Computação Gráfica Básica; Noções de Geometria; Noções de Física; Reprodução de Sons; Enredo;

Computação Gráfica É um campo da Ciência da Computação que estuda métodos para sintetizar e manipular digitalmente conteúdo visual: Geração de imagens 2D; Geração de imagens 3D (renderização); Com ou sem animação;

Noções de Geometria Gráficos 2D ou 3D são na verdade a composição de pequenas peças geométricas: A relação espacial dada entre diferentes objetos existentes em uma cena deve ser respeitada: Dois corpos não podem ocupar um mesmo lugar no espaço!

Noções de Física Objetos podem possuir algum tipo de movimento ou interação com outros objetos; Para isto, geralmente respeitam alguma(s) regras físicas: Próximas a real: Simulação; Diferenciadas: Arcade;

Reprodução de Sons O som é o elemento responsável por estimular o sentido da audição; Não tanto quanto os gráficos, mas os sons são responsáveis por completar uma boa sensação de imersão em jogos e entretenimento; Geralmente os sons (músicas ou barulhos) serão escolhidos conforme um determinado contexto ou acontecimento.

Enredo O enredo irá explicar ao usuário o que deverá ser feito e deve ser o principal responsável por atrair a atenção do jogador: História; Diversão; Desafios; Passatempo;...

Tetris: Enredo Jogo de encaixe de formas pelo Russo Alexey Pajitnov; Primeira versão foi para o computador soviético DVK-2;

Smartphones (2013) DVK-2 (1984) IBM PC (1986) NES (1989)

Nosso Conceito

Tetris LISTA DE RECURSOS INICIAIS

Recursos Iniciais Pasta: Tetris : index.html Construiremos de um documento web, inserindo todos os demais elementos necessários; estilo.css Definiremos algumas configurações de cores, bordas e outros para nossa interface; tetris.js Faremos todo o processamento do jogo, ou seja, daremos vida aos elementos existentes no documento web. Bloco.js Implementaremos uma Classe Bloco para definir o comportamento das peças utilizadas no jogo Tetris;

index.html Crie o arquivo como doctype para html 5; Crie as tags para: <html>, <head>, <body> e <title>; Estipule um <link> com arquivo de estilo; Adicione o arquivo de <script> Bloco.js dentro do <head>; Adicione o arquivo de <script> tetris.js ao fim do <body>; Importante: adicionar Bloco.js antes de tetris.js, pois o último precisa do primeiro.

index.html Adicione os seguintes Tags com seus atributos dentro do <body>: <p> <canvas>navegador não suportado!</canvas> <br> id = tela width=340 height=500 <button>iniciar</button> type= button onclick= pausar() id= btpausar <button>novo Jogo</button> </p> type= button onclick= novojogo() id= btnovo

estilo.css body { background-color: black; p { text-align: center; #tela { background-color: #000000; background-image: url('img/bg.png'); border: solid #FF0000 2px; button { background-color: #9dce2c; border: none; color: white; padding: 10px; cursor: pointer; button:hover { background-color: #7bac0a; button:disabled { background-color: #DDDDDD; cursor: not-allowed;

Tetris DESENHANDO NO CANVAS

<canvas> Canvas é um termo inglês dado a alguns tipos de tela para pintura; No nosso caso, será uma área dentro do documento HTML onde poderemos pintar o que precisarmos; Nosso pincel e paleta de cores estão disponíveis através de código JavaScript.

<canvas> O Canvas é feito para oferecer suporte a rápido desenho de cenas bidimensionais ou tridimensionais: Geralmente acelerado por Hardware; 0 X width 0 y height

tetris.js //Recuperando referência dos objetos no documento var canvas = document.getelementbyid("tela"); var ctx = canvas.getcontext("2d"); var btpausar = document.getelementbyid("btpausar"); var btnovo = document.getelementbyid("btnovo"); //Um pequeno teste (remover depois de testar) ctx.fillstyle = #FF0000 ; //Usar cor vermelha ctx.fillrect(20, 30, 50, 100); //x=20, y=30, w=50 e h=100

Desenhando Temos uma tela para desenho; Conhecemos uma primeira ferramenta para pintar algo; Temos que utilizar esta ferramenta de forma a construir o cenário inicial do nosso jogo;

Relembrando

Formas Encontramos: Diversas peças formadas por pequenos quadrados; Iremos criar matrizes de valores booleanos para armazenar o formato das peças utilizadas. Ex. da peça L : F V F F V F F V V

pedras.js //Atalhos para facilitar escrita das matrizes var X = true; var l = false; var Lesq = [ //Posição 1 [[l,x,l], [l,x,l], [l,x,x]], //Posição 2 [[X,X,X], [X,l,l]], //Posição 3 [[l,x,x], [l,l,x], [l,l,x]], //Posição 4 [[l,l,x], ]; [X,X,X]] //... Baixar arquivo... //Cria um array para indexar de forma aleatória uma peça var todaspedras = [quadrado, linha, Lesq, Ldir, Te, S1, S2]; Baixar arquivo e adicionar script dentro da seção head

Grade Lado Largura Total

Bloco conjunto de pedras Bloco.largura Bloco.corFundo this.cor Bloco.espaco

Bloco.js var Bloco = function(xi, yi, cori) { ; //Fim parte dinâmica de Bloco //Atributos estáticos Bloco.corFundo = "#FFFFFF"; Bloco.espaco = 1; Bloco.largura = 20; //Método estático Bloco.desenhar = function(context, x, y, corfrente) { context.fillstyle = Bloco.corFundo; var x1 = x * Bloco.largura; var y1 = y * Bloco.largura; context.fillrect(x1, y1, Bloco.largura, Bloco.largura); context.fillstyle = corfrente; x1 = x1 + Bloco.espaco; y1 = y1 + Bloco.espaco; context.fillrect(x1, y1, Bloco.largura - Bloco.espaco*2, Bloco.largura - Bloco.espaco*2); ;

tetris.js //Recuperando referência dos objetos no documento var canvas = document.getelementbyid("tela"); var ctx = canvas.getcontext("2d"); var btpausar = document.getelementbyid("btpausar"); var btnovo = document.getelementbyid("btnovo"); //Variáveis e Configurações do jogo var nx = Math.floor(canvas.width / Bloco.largura); var ny = Math.floor(canvas.height / Bloco.largura); var tabuleiro = null; var peca; var pausa = true;

tetris.js function novojogo() { if (!pausa) { //pausar(); //Criar o tabuleiro vazio tabuleiro = new Array(nx); for (x = 0; x < nx; x++) { tabuleiro[x] = new Array(ny); for (y = 0; y < ny; y++) { tabuleiro[x][y] = null; //novapeca(); //criarif(); //desenhartudo(); btnovo.disabled = false; btpausar.disabled = false; btpausar.innerhtml = "Iniciar";

tetris.js function novojogo() {... function criarif() { tabuleiro[0][ny-4] = "#FF0000"; tabuleiro[0][ny-3] = "#00FF00"; tabuleiro[0][ny-2] = "#00FF00"; tabuleiro[0][ny-1] = "#00FF00"; tabuleiro[1][ny-4] = "#00FF00"; tabuleiro[1][ny-3] = "#00FF00"; tabuleiro[1][ny-2] = "#00FF00"; tabuleiro[1][ny-1] = "#00FF00"; tabuleiro[2][ny-4] = "#00FF00"; tabuleiro[2][ny-2] = "#00FF00"; novojogo(); //Fora do método

tetris.js function criarif() { function desenhartudo() { ctx.clearrect(0, 0, canvas.width, canvas.height); for (x = 0; x < nx; x++) { for (y = 0; y < ny; y++) { //peca.desenharbloco(ctx); novojogo(); //Fora do método if (tabuleiro[x][y]!= null) { Bloco.desenhar(ctx, x, y, tabuleiro[x][y]);

Bloco.js var Bloco = function(xi, yi, cori) { //Atributos dinâmicos this.x = xi; this.y = yi; this.estadoatual = 0; this.mapa = todaspedras[math.round(math.random() * (todaspedras.length-1))]; this.maxestados = this.mapa.length; this.cor = cori; ; //Fim parte dinâmica de Bloco //Atributos estáticos...

Bloco.js (métodos dinâmicos) //Atributos dinâmicos... //Métodos dinâmicos this.desenharbloco = function(context) { ; for (i = 0; i < this.mapa[this.estadoatual].length; i++) { for (j = 0; j < this.mapa[this.estadoatual][i].length; j++) { if (this.mapa[this.estadoatual][i][j] == true) { Bloco.desenhar(context, this.x + i, this.y + j, this.cor); ; //Fim parte dinâmica de Bloco

tetris.js function criarif() {... function novapeca() { peca = new Bloco(Math.floor(nx/2-1), 0, novacor() ); novojogo(); //Fora do método

tetris.js function novapeca() {... function novacor() { var r,g,b,dif; do { r = Math.round(255 * Math.random()); g = Math.round(255 * Math.random()); b = Math.round(255 * Math.random()); dif = Math.abs(r - g) + Math.abs(g - b) + Math.abs(r - b); while (dif < 60); var sr = r.tostring(16); if (sr.length < 2) { sr = "0" + sr; var sg = g.tostring(16); if (sg.length < 2) { sg = "0" + sg; var sb = b.tostring(16); if (sb.length < 2) { sb = "0" + sb; return ("#" + sr + sg + sb); novojogo(); //Fora do método

O que mais falta? Movimentos? Sons? O que mais?

Tetris COLOCANDO VIDA

O que precisamos? Fazer as pedras se movimentar: Com qual intervalo de tempo? Para qual direção? E quando a pedra bater em uma Parede? E quando a pedra bater em outras pedras? E quando uma linha for preenchida? E quando o usuário pressionar alguma Seta?

Movimentação das Pedras As pedras poderão ser movidas por dois motivos: Pressionar de uma tecla pelo jogador; Avanço natural associado ao tempo;

Tetris INTERAGINDO COM O USUÁRIO

Eventos! A interação é dada por uma troca entre a máquina e o usuário; A máquina fornece principalmente imagens que descrevem uma situação, onde pode ser necessária a intervenção do usuário; O usuário irá intervir basicamente através de comandos! Comandos são captados através de eventos.

Eventos! Nosso document possui propriedades de eventos que podem ser associadas à funções quaisquer; Estas funções determinam algo a ser feito quando aquele evento ocorrer: document.onkeydown Ao descer uma tecla qualquer; document.onkeyup Ao soltar uma tecla qualquer;

tetris.js //Variáveis e Configurações do jogo //Eventos de tecla para método onkd document.onkeydown = onkd; function onkd(evt) { if (evt.keycode == 38) { //peca.giraresquerda(tabuleiro); //var tq = peca.encostado(tabuleiro); //var aa = tq & 2; //var bb = tq & 4; //if (evt.keycode == 39 && bb == 0) peca.x++; //if (evt.keycode == 37 && aa == 0) peca.x--; //if (evt.keycode == 40) avancarjogo(); desenhartudo(); novojogo();

Bloco.js //Métodos dinâmicos... this.giraresquerda = function(tabul) { do { this.estadoatual--; if (this.estadoatual < 0) { this.estadoatual = this.maxestados - 1; while (this.detectarcolisao(tabul) == true); ;

Bloco.js //Métodos dinâmicos... this.detectarcolisao = function(tabul) { for (i = 0; i < this.mapa[this.estadoatual].length; i++) { for (j = 0; j < this.mapa[this.estadoatual][i].length; j++) { if (this.mapa[this.estadoatual][i][j] == true) { if (!this.posicaovalida(this.x+i, this.y+j, tabul)) { return true; if (tabul[this.x + i][this.y + j]!= null) { return true; return false; ;

Bloco.js //Métodos dinâmicos... this.posicaovalida = function(x, y, tabul) { var xv = (x >= 0) && (x < tabul.length); var yv = false; if (xv) { yv = (y >= 0) && (y < tabul[x].length); return yv; ;

tetris.js //Variáveis e Configurações do jogo //Eventos de tecla para método onkd document.onkeydown = onkd; function onkd(evt) { if (evt.keycode == 38) { peca.giraresquerda(tabuleiro); //var tq = peca.encostado(tabuleiro); //var aa = tq & 2; //var bb = tq & 4; //if (evt.keycode == 39 && bb == 0) peca.x++; //if (evt.keycode == 37 && aa == 0) peca.x--; //if (evt.keycode == 40) avancarjogo(); desenhartudo(); novojogo();

Bloco.js (1/3) //RETORNOS para encostado: //Sem encosto 0; Abaixo = 1; Esquerda = 2; Direita = 4; this.encostado = function(tabul) { var toque = 0; for (i = 0; i < this.mapa[this.estadoatual].length; i++) { for (j = this.mapa[this.estadoatual][i].length - 1; j >= 0; j--) { if (this.mapa[this.estadoatual][i][j] == true) { //Encostado no fundo if (this.y + j == tabul[0].length - 1) { toque = toque 1; else { //Encostado em outro bloco if (this.posicaovalida(this.x + i, this.y + i, tabul)) { if (tabul[this.x + i][this.y + j + 1]!= null) { toque = toque 1;...

Bloco.js (2/3)... //Encostado a esquerda if (this.x + i - 1 < 0) { toque = toque 2; else { //Encostado em outro bloco if (tabul[this.x + i - 1][this.y + j]!= null) { toque = toque 2;...

Bloco.js (3/3)... ; //Encostado a direita if (this.x + i + 1 >= tabul.length) { toque = toque 4; else { //Encostado em outro bloco if (tabul[this.x + i + 1][this.y + j]!= null) { toque = toque 4; //Fim do if (this.mapa //Fim do for (j //Fim do for (i return toque;

tetris.js //Variáveis e Configurações do jogo //Eventos de tecla para método onkd document.onkeydown = onkd; function onkd(evt) { if (evt.keycode == 38) { peca.giraresquerda(tabuleiro); var tq = peca.encostado(tabuleiro); var aa = tq & 2; var bb = tq & 4; if (evt.keycode == 39 && bb == 0) peca.x++; if (evt.keycode == 37 && aa == 0) peca.x--; //if (evt.keycode == 40) avancarjogo(); desenhartudo(); novojogo();

tetris.js... function avancarjogo() { var encostadofundo = peca.encostado(tabuleiro) & 1; if (encostadofundo == 1) { peca.finalizar(tabuleiro); novapeca(); else { peca.y++; novojogo();

Bloco.js //Métodos dinâmicos... this.finalizar = function(tabul) { for (i = 0; i < this.mapa[this.estadoatual].length; i++) { for (j = 0; j < this.mapa[this.estadoatual][i].length; j++) { if (this.mapa[this.estadoatual][i][j] == true) { tabul[this.x + i][this.y + j] = this.cor; ;

Testar!

Tetris MOVIMENTAÇÃO DAS PEDRAS

Movendo com Tempo Todo tipo de movimento tem uma velocidade; Como determinamos a velocidade de algum objeto? Medida Espacial / Tempo! KM/h m/s...

Controlando o Tempo Como já definimos, a unidade de espaço de cada movimento da pedra será uma linha; Agora precisamos determinar o intervalo de tempo que nosso jogo ira usar para fazer cada movimento das pedras; Como nosso jogo gira em torno principalmente das pedras, este tempo será como um guia para todo o jogo.

Controlando o Tempo Função JavaScript: relogio = setinterval( NomeFuncao(), intervalo); relogio é uma referência ao timer/clock que foi criado; NomeFuncao() é a função que será executada a cada intervalo; intervalo é um número inteiro representando a quantidade em milissegundos de intervalo entre uma execução e outra da função NomeFuncao(). clearinterval(relogio); Para o relógio de repetição;

tetris.js... var relogio = null; function pausar() { pausa =!pausa; if (pausa == false) { relogio = setinterval("loopprincipal()", 400); btpausar.innerhtml = "Pausar"; else { btpausar.innerhtml = "Continuar"; clearinterval(relogio); novojogo();

tetris.js... function loopprincipal() { avancarjogo(); desenhartudo(); novojogo();

Testar

Alterações Restantes O que falta alterar? Detecção de linha completa? Fim de jogo? Sons?

tetris.js... function loopprincipal() { avancarjogo(); desenhartudo(); detectagameover(); function detectagameover() { if( peca.detectarcolisao(tabuleiro) == true) { btpausar.disabled = true; clearinterval(relogio); alert('game Over!'); novojogo();

Tetris DETECTANDO LINHAS COMPLETAS

Detectando Linhas O principal objetivo do usuário e preencher linhas totalmente, de forma a eliminá-la: Detectar quais linhas estão completas; Eliminar as linhas completas: Mover as demais linhas para baixo!

tetris.js... function loopprincipal() { avancarjogo(); verificalinhas(tabuleiro); desenhartudo(); detectagameover();...

tetris.js function verificalinhas(tabul) { for (j = tabul[i].length - 1; j > 0; j--) { var completa = true; for (i = 0; i < tabul.length; i++) { if (tabul[i][j] == null) { completa = false; break; if (completa) { for (j2 = j; j2 > 0; j2--) { for (i = 0; i < tabul.length; i++) { tabul[i][j2] = tabul[i][j2-1];

Tetris ESTÍMULOS SONOROS

Estímulos Sonoros Conforme comentado anteriormente, quanto mais estimularmos, de forma positiva, os sentidos dos jogadores, maior a probabilidade dele se sentir como parte do jogo; Para isto, iremos adicionar alguns pequenos sons associados a eventos como colisões; Baixe os arquivos e salve na subpasta snd: snd_gameover.mp_ e snd_gameover.ogg; snd_gira.mp_ e snd_gira.ogg; e snd_linha.mp_ e snd_linha.ogg. snd_toque.mp_ e snd_toque.ogg.

<audio> e <source> HTML 5! MIME Types: MP3 audio/mpeg Ogg audio/ogg Wav audio/wav Suporte: Ps.: Múltiplos <source> fornecem redundância! Browser MP3 Wav Ogg IE 9+ Sim Não Não Chrome 6+ Sim Sim Sim Firefox 3.6+ Não Sim Sim Safari 5+ Sim Sim Não Opera 10+ Não Sim Sim

index.html <audio controls id= "sndtoque"> <source src= "snd/snd_toque.mp_" type="audio/mpeg"> <source src= "snd/snd_toque.ogg" type="audio/ogg"> </audio> <audio controls id= "sndlinha"> <source src= "snd/snd_linha.mp_" type="audio/mpeg"> <source src= "snd/snd_linha.ogg" type="audio/ogg"> </audio> <audio controls id="sndgameover"> <source src= "snd/snd_gameover.mp_" type="audio/mpeg"> <source src= "snd/snd_gameover.ogg" type="audio/ogg"> </audio> <audio controls id="sndgira"> <source src= "snd/snd_gira.mp_" type="audio/mpeg"> <source src= "snd/snd_gira.ogg" type="audio/ogg"> </audio> <script src="tetris.js"></script>

tetris.js //Recuperando referência dos objetos no documento var canvas = document.getelementbyid("tela"); var ctx = canvas.getcontext("2d"); var btpausar = document.getelementbyid("btpausar"); var btnovo = document.getelementbyid("btnovo"); var sndtoque = document.getelementbyid("sndtoque"); var sndlinha = document.getelementbyid("sndlinha"); var sndgameover = document.getelementbyid("sndgameover"); var sndgira = document.getelementbyid("sndgira"); Prática: Insira os comandos de reprodução nos locais apropriados: Ex.: sndtoque.play();

Trabalho 1. Customize cores e outras configurações do arquivo de estilo; 2. Customize cores, tamanhos e disposição dos objetos do jogo (dentro do Javascript). Utilize gradientes e/ou imagens; 3. Complete o HTML informando o nome da disciplina, o nome do instituto e o seu nome, dispondo os elementos com layouts CSS; 4. Existe um bug: quando o jogo não esta em execução, teclas pressionadas são processadas. Corrija este bug. 5. Adicione novas características e funcionalidades: 1. Crie um placar com pontuação; 2. Crie uma indicação visual dentro do Canvas de fim de jogo; 3. Crie uma exibição da próxima peça que irá entrar no jogo; 4. Adicione teclas de atalho para Pausa e para Novo Jogo ; 5. Substitua as setas por outras teclas de atalho (problema de rolagem); 6. Ao passar do tempo, aumente velocidade gradualmente; 6. Adicione outros elementos a seu critério; 7. Entregue os arquivos por e-mail ao Professor.