//*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* /* Zelda RPG - Versão Flash 8/MX2004Prof por Luciano Augusto.: Este é um game exclusivo para a campanha que estou fazendo de marketing-viral com o objetivo de divulgar os cursos on-line que ministro na minha escola virtual em: http://www.lucianoaugusto.com.br/ead Estou começando o desenvolvimento em: 16/11/2005 as 10 horas Terminado em: 16/11/2005 as 15h30. Game Design e Programação: Luciano Augusto da Silva.: | contato@lucianoaugusto.com.br Desenhos: Copyright da equipe Zelda Open Source Quero deixar claro que o código que você está recebendo é exclusivo, eu mesmo escrevi, não copiei ou clonei qualquer parte do código do Zelda Open Source, além das suas imagens. Objetivo: Andar pelo ambiente e falar com um NPC. Para acompanhar a personagem iremos criar uma simulação de câmera que vai abrindo o cenário a medida que ele vai andando. Este game faz parte de um módulo que estou terminando do curso de jogos avançado onde você irá programar um RPG on-line para até 400 usuários, o curso avançado estará no ar até o final de 2005 É importante você fazer o curso de preparação antes do avançado. O Link do curso de preparação é (O curso é todo em FLASH 8): http://www.lucianoaugusto.com.br/ead/mod/resource/view.php?id=34 Mais informações: www.lucianoaugusto.com.br/ead | contato@lucianoaugusto.com.br | (41) 9193-4528 */ //*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* stop(); // Sumindo com o objeto de colisão e o balão do npc limites_mc._visible = 0; terreno_mc.balao_npc_mc._visible = 0; //Definição de todas as variáveis usadas no game. var velocidade_personagem:Number = 5; var estado_personagem:String = ""; // Controle do personagem. Aqui iremos controlar todas as açõe // do personagem, seja andando, correndo, lutando etc. personagem_mc.onEnterFrame = function() { // O objeto Key é usado para testar as teclas, ia usar Listner, mas como é um Tutorial básico // resolvi fazer o controle de forma mais legível. // Então: Key.DOWN é tecla para baixo e assim respectivamente. if (Key.isDown(Key.DOWN)) { this.gotoAndStop("walk_down"); // Estou fazendo um teste para ver se a personagem está na posição Y que quero testar, caso esteja // faço o terreno se mover, criando assim o efeito de câmera. Na verdade usamos este macete em RPG // para fazer o terreno se mover quando a personagem vai chegando perto dos limites da tela, isto evita if (this._y>180 && terreno_mc._y>-275) { // Caso a personagem esteja no limite indicado, o terreno se move e não ele, este efeito é muito utilizado // em RPGs, pois simula a personagem andando normalmente e também, uma câmera acompanhando. E a grande verdade // é que neste caso quem se move é o terreno. terreno_mc._y -= velocidade_personagem; limites_mc._y -= velocidade_personagem; } else { // Caso esteja fora dos limites, quem se move é a personagem. Vocês precisam entender que esta é a grande sacada // para fazer um RPG, o jogo de personagem e cenário cria a ilusão de câmera no mundo 2D. personagem_mc._y += velocidade_personagem; } } if (Key.isDown(Key.UP)) { this.gotoAndStop("walk_up"); // Aqui também testo os limites antes de mover o terreno. if (this._y<50 && terreno_mc._y<-3) { terreno_mc._y += velocidade_personagem; limites_mc._y += velocidade_personagem; } else { personagem_mc._y -= velocidade_personagem; } } if (Key.isDown(Key.LEFT)) { this.gotoAndStop("walk_left"); // Aqui também testo os limites antes de mover o terreno. if (this._x<90 && terreno_mc._x<-3.5) { terreno_mc._x += velocidade_personagem; limites_mc._x += velocidade_personagem; } else { personagem_mc._x -= velocidade_personagem; } } if (Key.isDown(Key.RIGHT)) { this.gotoAndStop("walk_right"); // Aqui também testo os limites antes de mover o terreno. if (this._x>190 && terreno_mc._x>-253.3) { terreno_mc._x -= velocidade_personagem; limites_mc._x -= velocidade_personagem; } else { personagem_mc._x += velocidade_personagem; } } // Chamando a função para detectar a colisão e passando os 2 objetos // como parâmetro. O primeiro objeto é a personagem, repsresentado por this // o segundo objeto é a mascará de colisão. A grande sacada de usar função é que // você testa muitas colisões com pouco código testaColisao(this, limites_mc); // Estou usando o mesma função para testar colisão, mas esperando um retorno de verdadeiro // ou falso, por isto uso o IF(...) Retornando verdadeiro posso tratar o objeto. if (testaColisao(this, terreno_mc.npc_01_mc)) { terreno_mc.npc_01_mc._xscale = -60; terreno_mc.sombra_npc_01_mc._xscale = -60; //Estou abrindo o balão e passando os parâmetros, o último, 3000 é em milisegundos, ou seja 3 segundos ele fica aberto. abreBalaoNpc(403, 323, "Olá sou o npc deste game! Muito prazer, meu nome é Lula!", 3000); } // Controle de ATAQUE usando a tecla SPACE e dependendo do estado do personagem, ativa uma animação // A variável estado_personagem é setada no arquivo principal dentro do Movie do personagem // Por falta de tempo não vou colocar um inimigo aqui, mas pode ser um tutorial futuro if (Key.isDown(Key.SPACE)) { if (estado_personagem == "down") { this.gotoAndStop("attack_down"); } else if (estado_personagem == "up") { this.gotoAndStop("attack_up"); } else if (estado_personagem == "left") { this.gotoAndStop("attack_left"); } else if (estado_personagem == "right") { this.gotoAndStop("attack_right"); } } }; // Função criada para testar a colisão do personagem com os elementos // do cenário que não podem ser ultrapassados ou que devam fazer alguma coisa // Esta função é vital para o RPG. Ela além de segurar a persoangem para não passar // por cima das coisas que há uma colisão, ela também retorna verdadeiro (true) quando // uma colisão acontece, com isto podemos tratar a colisão e iniciar outra ação, se for // o caso function testaColisao(objeto:Object, objeto2:Object) { with (eval(objeto)) { // Esta sequência de Ifs aninhados testam os vértives (limites) de colisão // do objeto passado como parâmetro que vai impedir que sua personagem ande // onde não possa. // Usar o getBounds retorna as coordenadas X e Y máximas em comparação a um objeto // e o Stage. Com isto sabemos exatamente onde tem um objeto desenhado para fazer // um teste de colisão mais preciso. if (eval(objeto2).hitTest(getBounds(_root).xMax, _y, true)) { // Caso eu encontre um limite eu volto meu personagem e não o deixo ultrapassar // É exatamente isto que está acontecendo na expressão abaixo. // Esta colisão testa o lado direito da personagem _x = _x-velocidade_personagem; return true; } if (eval(objeto2).hitTest(getBounds(_root).xMin, _y, true)) { // Esta colisão testa o lado equerdo da personagem _x = _x+velocidade_personagem; return true; } if (eval(objeto2).hitTest(_x, getBounds(_root).yMax, true)) { // Esta colisão testa a parte inferior da personagem _y = _y-velocidade_personagem; return true; } if (eval(objeto2).hitTest(_x, getBounds(_root).yMin, true)) { // Esta colisão testa a parte superior da personagem _y = _y+velocidade_personagem; return true; } } } // Esta função apenas abre o balão do npc na posição que estiver, isto facilita ter mais npcs // se com output. function abreBalaoNpc(posX:Number, posY:Number, txt:String, tempo:Number) { terreno_mc.balao_npc_mc._visible = 1; terreno_mc.balao_npc_mc._x = posX; terreno_mc.balao_npc_mc._y = posY; terreno_mc.balao_npc_mc.texto_npc = txt; // esta variável que recebe setInterval é importante, pois ela chama a função // que tira o balão na tela dentro do tempo determinado, neste exemplo, 5 segundos. fecharBalao = setInterval(fecharBalaoNpc, tempo); } // O objetivo desta função é fechar o balão após aberto. function fecharBalaoNpc() { clearInterval(fecharBalao); terreno_mc.balao_npc_mc._visible = 0; terreno_mc.npc_01_mc._xscale = +60; terreno_mc.sombra_npc_01_mc._xscale = +60; } // O código original do game para fazer algo mais simples que este nosso tem // mais de 200 linhas, este código que escrevi está otimizado, e não passa de 100 linhas sem // os comentários. Não otimizei mais para facilitar a leitura aos leigos em programação AS. // No curso que vou lançar avançado, mostrarei como criar um RPG multiplayer com Flash e AMFPHP // O servidor será preparado para suportar 400 usuários no mínimo, mas para fazer o avançado é // pré-requisito fazer este: http://www.lucianoaugusto.com.br/ead/mod/resource/view.php?id=34 // Este código no curso sofrerá uma pequena adaptação para Flash 8.