Baixe o app para aproveitar ainda mais
Prévia do material em texto
Ciências da Computação “DESENVOLVIMENTO DE UM JOGO COM UTILIZAÇÃO DE INTERFACE GRÁFICA” Alunos: Oscar Luis Florencio Junior - RA:N342CE-3 Eliezer de Moraes Murca - RA: N2577H-3 João Vitor Alves Silva - RA: N368CB-8 2 APS SUMÁRIO OBJETIVO E MOTIVAÇÃO DO TRABALHO .............. 3 – 4. INTRODUÇÃO ............................................................... 5. REGRAS DO JOGO (CONCEITOS GERAIS) ............... 5 – 6. PLANO DE DESENVOLVIMENTO DO JOGO ............... 6 – 7. PROJETO DO PROGRAMA ......................................... 8. CÓDIGO FONTE DO JOGO ............................................ 9 – 21. FONTES/BIBLIOGRAFIA ................................................ 22 IMAGENS DO JOGO ..................................................... 23 – 24. FICHAS APS .................................................................. 25 – 27. 3 APS Objetivo do trabalho e Motivação do Trabalho Os jogos educativos são apresentados à humanidade desde que ela existe. O jogo esta presente na natureza humana, seja ela na infância ou na fase adulta. Brincar é do cotidiano de todas as crianças e adultos, e não tem uma data de início. Antigamente os jogos eram apresentados como forma de divertimento, mas algum tempo os jogos foram introduzidos para ajudar em abordagens como melhorar a concentração, habilidade motora e percepções de todos os sentidos, que são os jogos sensoriais, e porque não falarmos dos jogos que são ligados diretamente à educação, ou seja os jogos educativos. Os jogos educativos começaram a crescer dentro das escolas e também entre as famílias. Atualmente os jogos são divididos em varias categorias, dependendo da proposta do jogo. É importante que o jogo educativo chegue às crianças como uma proposta de brincadeira. A brincadeira com os jogos educativos precisa ser prazerosa; proposta e nunca imposta. Muitos jogos estão sendo deixado de lado com o advento da internet, porem é de extrema importância que a criança trabalhe o movimento e pensamento, através de jogos corporais, eletrônicos e sensoriais. O jogo é um instrumento de aprendizagem. A criança e o adulto aprende por aquilo que ela vive e não pelo que ela escuta. Porque voltado para o meio ambiente? No Brasil, para Dias (2004), a década de 1990 é a década das maiores transformações dessa temática. A nova mentalidade do Ministério da Educação, os surgimentos de centros de educação ambiental e encontros regionais e nacionais foram importantes para aproximar as discussões mundiais a respeito dos fundamentos de uma comprometida Educação 4 APS Ambiental. A ECO-92 reforça as ideias da Conferência de Tbilisi e propõe a capacitação de educadores e a mobilização social acerca da problemática ambiental. Na Educação a maior contribuição se deu com a reforma curricular no ensino fundamental prevista nos Parâmetros Curriculares Nacionais (PCNs), o qual estabelece a Educação Ambiental como um tema transversal que preza pela interdisciplinaridade. A importância da educação ambiental A Educação Ambiental é necessária para indivíduos que ainda estão em processo de formação de valores, , pois pode contribuir para uma mudança ou o direcionamento dos valores, e consequentemente, dinamizar a reprodução de valores integrativos. A prática da necessita de projetos complementares e atividades didáticas de campo para atingir seus objetivos. Somente com estas atividades práticas serão valorizados conceitos importantes para uma cidadania ambientalmente responsável. O referido jogo tem por objetivo geral, ensinar de forma divertida o assunto reciclagem. Vemos no nosso cotidiano vários problemas neste sentido, papel que poderia ser reaproveitado, plástico que poderia retornar novamente a nós, e assim por diante, contudo, este reaproveitamento não acontece por falta de um descarte consciente. Ah, sem falar no descarte incorreto de eletrônicos, o que acaba então por poluir de forma inevitável o habitat natural do homem e dos animais, comprometendo assim o futuro da Terra. Jogo simples, fácil de ser jogado, mas quando colocado na prática no dia a dia, trás a certeza de uma missão, e porque não falar de uma responsabilidade comprida. 5 APS INTRODUÇÃO Partindo do proposto pela Instituição, desenvolvemos um programa em JAVA com o intuito de demonstrar a vida em uma grande metrópole visando os parâmetros ambientais envolvidos. Desenvolvido em caráter educacional visando aumentar a percepção das pessoas aos problemas que são causados pelos cidadãos de grandes cidades pela negligencia e falta de informação em soluções inteligentes como coleta seletiva e reciclagem do lixo. Sentimos a responsabilidade social de provocar a mudança no pensamento e na cultura do nosso publico alvo, que é as pessoas compreendidas nas metrópoles e circunvizinhanças. Através da inclusão digital proporcionada pelo avanço da tecnologia, esperamos atingir um publico vasto e variado, com todas as idades e níveis sociais, uma vez que o problema atinge a todos. Como informação técnica, o software foi desenvolvido através da linguagem JAVA, como sugerido pela Instituição. Regras do jogo (conceitos gerais) - Acerta o número máximo de lixo exatamente na lixeira correta de acordo com o lixo que aparecer na tela no prazo de 1 (um) minuto. - O acerto do lixo corretamente na lixeira e o tipo do lixo ser correspondente ao tipo da lixeira soma 10 (dez) pontos à sua pontuação total. - O acerto do lixo corretamente na lixeira, mas e o tipo do lixo NÃO ser correspondente ao tipo da lixeira subtrai 15 (quinze) pontos à sua pontuação total. - O não acerto do lixo corretamente na boca da lixeira subtrai 15 (quinze) pontos à 6 APS sua pontuação total. - O resultado da pontuação total no termino de 1 minuto for positiva ( maior que zero ), você recebe os parabéns e cumpre o objetivo do jogo. - O resultado da pontuação total no termino de 1 minuto for negativa ( menor ou igual a zero ), você recebe uma mensagem de fracasso. - A quantidade de lixos exibidas são ilimitadas. - O aparecimento de tipos de lixo e definida de forma aleatória pelo sistema do jogo, podendo ocorrer repetições seguidas do mesmo tipo de lixo, elevando o nível de dificuldade. - Após o termino dos 60 segundos não é possível mais jogar lixos nas lixeiras sendo que o mesmo não é mais exibido. - Você pode jogar quantas vezes quiser, não há limites de jogada, também poderá abandonar a partida quantas vezes quiser, não há limitações para abandono de jogo. Plano de desenvolvimento do jogo O plano de jogo foi elaborado em 4 fases, tendo como base a gerencia de desenvolvimentos de grandes jogos do mercado atual. 1º Fase – Roteiro: Cada vez mais se assemelham a roteiros de filmes. Este é um item fundamental para o processo de criação e será o elemento crucial para convencer os investidores da potencialidade do nosso jogo. É nesse item que o jogo deve mostrar seu diferencial em relação aos outros. Chamam-se aos roteiros de jogos de roteiros interativos, pois diferentemente que os roteiros de filmes, devem ter espaço para interferência do usuário no desencadeamento da história. 7 APS 2º Fase - Game Design: Entende-se por game design a conceituação artística do jogo. Hoje em dia, dada a complexidade das histórias e dos cenários elaborados é importante que esta parte do documento seja escrita por um artista. Dentro deste item deverão ser expostos quais as principais características dos cenários, esboços de personagens, descrição das texturas fundamentais, mapas e descrições dos combates. (também denominado de level design). 3º Fase - Game Play: Nesta parte do documento deve descrever-se como será a jogabilidade. PRINCIPAL ETAPA DEUM JOGO, Por jogabilidade entendem-se as regras do jogo e o balanceamento das regras (game balancing). Nesta descrição deve ficar claro que o jogo é divertido e irá proporcionar desafios interessantes. Esta parte do documento é muito importante para guiar os programadores principalmente na etapa de scripting. Uma mal elaboração dessa etapa pode influência seriamente em um mal desenvolvimento (bugs) e atrasos em todo o projeto. 4º Fase - Interface Gráfica: Pode-se dividir a interface em in game e out game. A primeira consiste na instrumentação disponível durante o jogo e é responsável pela entrada de dados do jogador para a aplicação. A interface out game é a forma de apresentar a introdução do jogo, sua configuração, instruções, carregar o jogo, entre outras operações de suporte. Costuma-se dizer que a melhor interface é aquela que passa despercebida para o jogador, permitindo que o mesmo possa focar-se no desenrolar da história e das ações. Resumindo, o in game é a parte do jogo que se é jogável, a parte aonde você possui um tempo para atingir o objetivo que é fazer pontuação acertando corretamente o tipo de lixo em sua lixeira, já o out game é a nossa abertura do Marinho correndo e a tela onde você escolhe jogar ou sair do jogo. 8 APS Projeto do programa O projeto foi simples, e consistiu na sequência das fases citadas no plano de desenvolvimento do jogo, após reunir todas as informações necessárias e deixar tudo definido do jogo, partimos para o desenvolvimento aonde usamos a ferramenta de desenvolvimento em JAVA chamada NETBEANS para criar os algoritmos e gerar a aplicação do jogo. Baseado em nosso conhecimento adquirido em boa parte nas aulas de LPOO e ALPOO, e também em alguns tutoriais na internet, conseguimos concluir com sucesso o que estava previsto e planejado dentro dos prazos estipulados. Nas primeiras horas de desenvolvimento foi um pouco complexa, iniciamos a parte visual para facilitar é ter visão de como o jogo se sairia com o decorrer do desenvolvimento, aplicando métodos e classe necessários de acordo com o caminhar da programação. Passamos por algumas dificuldades que devemos citar, esta no qual se refere ao manipulamento de áudio do jogo, inicialmente tentamos trabalhar com o formato de áudio em .MP3, foi um fracasso pois ainda não existem bibliotecas satisfatórias que possa trabalhar em conjunto com algoritmos de Buffer, que no caso os sistemas de Buffer são a peça chave para o funcionamento de todo o jogo. Passamos a fazer testes com o formato. OGG e também não obtemos sucesso, até então irmos direto ao formato. MIDI do qual o Java possui uma biblioteca nativa de suporte a esse formato, e também é o formato mais recomendado para pequenos jogos. Quanto ao resto foi bem produtivo o tempo, sem complicações, uso de cálculos simples, a maioria métodos nativos do próprio Java e claro um bom uso de belos gráficos para chamar a atenção do jogador. 9 APS CÓDIGO FONTE DO JOGO 10 APS Classe COISA: package meioambiente; public class Coisa { private int id; private int tipo; public Coisa(){ } public Coisa(int id, int tipo){ this.id = id; this.tipo = tipo; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getTipo() { return tipo; } public void setTipo(int tipo) { this.tipo = tipo; } } 11 APS Classe CRIAR COISAS: package meioambiente; import java.util.Random; public class CriarCoisas { int id; int tipo; public int CriarId(){ Random random = new Random(); id = random.nextInt(12); return id; } public int CriarTipo(int id){ if (id ==0 | id == 1 | id == 2) { this.tipo = 2; } else if(id == 3 | id == 4 | id == 5) { this.tipo = 0; } else if(id == 6 | id == 7 | id == 8) { this.tipo = 3; } else if(id == 9 | id == 10 | id == 11) { this.tipo = 1; } return tipo; } } 12 APS Classe MEIO AMBIENTE: package meioambiente; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.util.Duration; public class MeioAmbiente extends Application { private final Label score = new Label(); private final Label scoreFinal = new Label(); private final Label temporizador = new Label(); private final Label labelAjuda = new Label(); private final Button lixo = new Button(); private final Button item1 = new Button(); private final Button item2 = new Button(); private final Button item3 = new Button(); private final Button item4 = new Button(); private final Button item5 = new Button(); private final Button botaoSom = new Button(); private final Button botaoAjuda = new Button(); int tipo = 8; int j; private int pontos = 0; int segundos = 60; CriarCoisas criar = new CriarCoisas(); Sons som = new Sons(); public void myCountdown() { final Timeline timeline = new Timeline(new 13 APS KeyFrame(Duration.millis(1000), event -> { temporizador.setText(segundos + ""); segundos--; } )); timeline.setCycleCount(segundos + 1); timeline.setOnFinished(e -> {scoreFinal.setText(score.getText()); pontos = 0; score.setText(pontos + ""); segundos = 60; lixo.setId("inicio"); tipo = 8; lixo.setText(" Clique em\n uma lata\npara iniciar"); }); timeline.play(); } @Override public void start(Stage primaryStage) { BorderPane bpTop = new BorderPane(); HBox hbSom = new HBox(botaoSom); BorderPane bpScores = new BorderPane(); bpScores.setCenter(score); bpScores.setRight(scoreFinal); HBox latas = new HBox(5,item1,item2,item3,item4 ); VBox vbCenter = new VBox(25, temporizador, bpScores, lixo); vbCenter.setAlignment(Pos.CENTER); hbSom.setAlignment(Pos.CENTER_RIGHT); bpTop.setTop(hbSom); bpTop.setCenter(vbCenter); VBox root = new VBox(150, bpTop, latas); root.setPadding(new Insets(50)); Scene scene = new Scene(root, 442,668); primaryStage.setTitle("LixoCerto!"); primaryStage.setScene(scene); primaryStage.setResizable(false); primaryStage.show(); scene.getStylesheets().addAll(this.getClass().getResource("Style.css" 14 APS ).toExternalForm()); temporizador.setId("labelScore"); scoreFinal.setId("labelScoreFinal"); if (segundos == 1) { scoreFinal.setText(score.getText()); segundos = 60; lixo.setId("inicio"); tipo = 8; } temporizador.setText("60"); botaoSom.setId("botaoSomOn"); som.BacktrackOn(false); botaoSom.setPrefSize(25,25); botaoSom.setOnAction(event ->{ if ("botaoSomOn".equals(botaoSom.getId())) { som.BacktrackOn(true);botaoSom.setId("botaoSomOff"); }else{ som.BacktrackOn(false); botaoSom.setId("botaoSomOn"); } }); lixo.setText(" Clique em\n uma lata\npara iniciar"); lixo.setPrefSize(150,100); lixo.setId("inicio"); score.setId("labelScore"); root.setId("root"); //Botao item1 item1.setPrefSize(100,80); item1.setId("botaoItem1"); item1.setOnAction(event ->{ if (tipo == 8) { tipo = 0; pontos = pontos - 10; lixo.setText(""); myCountdown(); } if (tipo == 0) { 15 APS pontos = pontos + 10; score.setText(""+pontos); som.BippCerto(); } else{ pontos = pontos-15; score.setText(""+pontos); som.BippErrado(); } int j = criar.CriarId(); lixo.setId(""+j); tipo = criar.CriarTipo(j); }); //Botao item2 item2.setPrefSize(100,80); item2.setId("botaoItem2"); item2.setOnAction(event ->{ if (tipo == 8) { tipo = 1; pontos = pontos - 10; lixo.setText(""); myCountdown(); } if (tipo == 1) { pontos = pontos + 10; score.setText(""+pontos); som.BippCerto(); } else{ pontos = pontos-15; score.setText(""+pontos); som.BippErrado(); } j = criar.CriarId(); lixo.setId(""+j); tipo = criar.CriarTipo(j); }); //Botao item3 item3.setPrefSize(100,80); item3.setId("botaoItem3"); item3.setOnAction(event ->{ if (tipo == 8) { tipo = 2; 16 APS pontos = pontos - 10; lixo.setText(""); myCountdown(); } if (tipo == 2) { pontos = pontos + 10; score.setText(""+pontos); som.BippCerto(); } else{ pontos = pontos-15; score.setText(""+pontos); som.BippErrado(); } j = criar.CriarId(); lixo.setId(""+j); tipo = criar.CriarTipo(j); }); //Botao item4 item4.setPrefSize(100,80); item4.setId("botaoItem4"); item4.setOnAction(event ->{ if (tipo == 8) { tipo = 3; pontos = pontos - 10; lixo.setText(""); myCountdown(); } if (tipo == 3) { pontos = pontos + 10; score.setText(""+pontos); som.BippCerto(); } else{ pontos = pontos-15; score.setText(""+pontos); som.BippErrado(); } j = criar.CriarId(); lixo.setId(""+j); tipo = criar.CriarTipo(j); }); } public static void main(String[] args) { 17 APS launch(args); } } Classe SONS: package meioambiente; import java.io.File; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; public class Sons { String fileBT = new File("src/sons/backtrack.mp3").getAbsolutePath(); String fileBE = new File("src/sons/beep- 10.mp3").getAbsolutePath(); String fileBC = new File("src/sons/beep- 07.mp3").getAbsolutePath(); private Media somBacktrack = new Media(new File(fileBT).toURI().toString()); private Media somBippErrado = new Media(new File(fileBE).toURI().toString()); private Media somBippCerto = new Media(new File(fileBC).toURI().toString()); MediaPlayer mediaPlayer = new MediaPlayer(somBacktrack); public void BippCerto(){ MediaPlayer mediaPlayer1 = new MediaPlayer(somBippCerto); mediaPlayer1.play(); } public void BippErrado(){ MediaPlayer mediaPlayer2 = new MediaPlayer(somBippErrado); mediaPlayer2.play(); } public void BacktrackOn(boolean onOff){ if (onOff == false) { mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); mediaPlayer.play(); } 18 APS else mediaPlayer.pause(); } } CSS STYLE: #botaoItem1{ -fx-background-image: url(../imgs/Thrash-can1.png); -fx-background-size: 100%; -fx-background-repeat: no-repeat; -fx-background-color: transparent; } #botaoItem2{ -fx-background-image: url(../imgs/Thrash-can2.png); -fx-background-size: 100%; -fx-background-repeat: no-repeat; -fx-background-color: transparent; } #botaoItem3{ -fx-background-image: url(../imgs/Thrash-can3.png); -fx-background-size: 100%; -fx-background-repeat: no-repeat; -fx-background-color: transparent; } #botaoItem4{ -fx-background-image: url(../imgs/Thrash-can4.png); -fx-background-size: 100%; -fx-background-repeat: no-repeat; -fx-background-color: transparent; } 19 APS #root{ -fx-background-image: url(../imgs/images.png); -fx-background-size: 452,678; -fx-background-repeat: no-repeat; } #labelScore{ -fx-font-size: 32px; -fx-font-family: "Arial Black"; -fx-fill: #818181; -fx-effect: innershadow( three-pass-box , red , 9, 0.0 , 0 , 2 ); } #labelScoreFinal{ -fx-font-size: 45px; -fx-font-family: "Arial Black"; -fx-fill: #818181; -fx-effect: innershadow( three-pass-box , green , 9, 0.0 , 0 , 2 ); } #botaoSomOn{ -fx-background-image: url(../imgs/objetos/somOn.png); -fx-background-size: 100%; -fx-background-repeat: no-repeat; -fx-background-color: transparent; } #botaoSomOff{ -fx-background-image: url(../imgs/objetos/somOff.png); -fx-background-size: 100%; -fx-background-repeat: no-repeat; -fx-background-color: transparent; } #inicio{ -fx-background-color: transparent; -fx-font-size: 12px; -fx-font-family: "Arial Black"; -fx-fill: #818181; -fx-effect: innershadow( three-pass-box , red , 9, 0.0 , 0 , 2 20 APS ); } #0{ -fx-background-image: url(../imgs/objetos/0.png); -fx-background-size: 75%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #1{ -fx-background-image: url(../imgs/objetos/1.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #2{ -fx-background-image: url(../imgs/objetos/2.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #3{ -fx-background-image: url(../imgs/objetos/3.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #4{ -fx-background-image: url(../imgs/objetos/4.png); -fx-background-size: 75%; -fx-background-repeat:no-repeat; -fx-background-color: white; -fx-background-position: center; } #5{ -fx-background-image: url(../imgs/objetos/5.png); 21 APS -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #6{ -fx-background-image: url(../imgs/objetos/6.png); -fx-background-size: 70%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #7{ -fx-background-image: url(../imgs/objetos/7.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #8{ -fx-background-image: url(../imgs/objetos/8.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #9{ -fx-background-image: url(../imgs/objetos/9.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } #10{ -fx-background-image: url(../imgs/objetos/10.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; 22 APS } #11{ -fx-background-image: url(../imgs/objetos/11.png); -fx-background-size: 50%; -fx-background-repeat: no-repeat; -fx-background-color: white; -fx-background-position: center; } FONTES/BIBLIOGRAFIA Game: http://www.lwjgl.org/ http://docs.oracle.com/javase/7/docs/api/index-files/index- 1.html http://seumestredaweb.blogspot.com.br/2012/06/java-games-2d- tutor-1.html http://desenvolvimentodejogos.wikidot.com/ http://beatnupproject.nostaljia.eng.br/como-criar-um-enredo/ http://www.selectgame.com.br/iniciando-em-desenvolvimento-de-jogos-parte-1/ Áudio: http://soundimage.org/wp-content/uploads/2017/10/Monkey-Island-Puzzler.mp3 - Som de Fundo (Background) https://www.soundjay.com/beep- sounds-3.html - Som dos botões (Beeps) http://www.lwjgl.org/ http://www.lwjgl.org/ http://docs.oracle.com/javase/7/docs/api/index-files/index-1.html http://docs.oracle.com/javase/7/docs/api/index-files/index-1.html http://seumestredaweb.blogspot.com.br/2012/06/java-games-2d-tutor-1.html http://seumestredaweb.blogspot.com.br/2012/06/java-games-2d-tutor-1.html http://desenvolvimentodejogos.wikidot.com/ http://beatnupproject.nostaljia.eng.br/como-criar-um-enredo/ http://www.selectgame.com.br/iniciando-em-desenvolvimento-de-jogos-parte-1/ 23 APS Imagens do Jogo 24 APS 25 APS FICHAS APS 26 APS 27 APS Objetivo do trabalho e Motivação do Trabalho
Compartilhar