Soeks 0 Denunciar post Postado Maio 18, 2012 Bem, eu sou iniciante na programação, e comecei com o ActionScrip 3.0. Estou fazendo um curso sobre ele e o professor me explicou como fazer a questão (postarei abaixo), porém, restou algumas dúvidas e a próxima aula é para entregar um trabalho, que não estou conseguindo fazer. Eu estou criando um joguinho onde você controla uma nave que dispara lasers e destrói os inimigos. Um jogo bem simples, só para testar o que eu aprendi. Fiz alguns comandos básicos para a nave e tal, funcionou tudo corretamente, porém, o comando para ela dar um tiro e ela destruir uma nave inimiga, está bugando. Eu já tentei programar de diversas maneiras mas não consegui, e é necessário eu usar o "for" para realizar essa tarefa (dito pelo professor). Vou postar a programação que eu estou fazendo (apenas o necessário): Legenda:+ ---> Significa que eu dei espaço da borda, apertando a tecla TAB. Tiro ---> É um AS Linkage que eu determinei. Inimigo ---> É um AS Linkage que eu determinei. import flash.events.KeyboardEvent; import flash.events.Event; stage.addEventListener(KeyboardEvent.KEY_DOWN, TeclaPressionada); stage.addEventListener(Event.ENTER_FRAME, Atualizar); var TiroDisparado : Boolean = false; var ContagemTiro : int = 0; var ContagemInimigo : int = 0; var NavesDestruidas : int = 0; var NaveTiro : Tiro; var NaveInimiga : Inimigo; function TeclaPressionada (e : KeyboardEvent) : void { +if((e.keyCode == Keyboard.Z) && (TiroDisparado == false)) { ++TiroDisparado = true; ++ContagemTiro = 0; ++NaveTiro = new Tiro(); ++NaveTiro.x = Aviao.x + 80; ++NaveTiro.y = Aviao.y + 40; ++addChild(NaveTiro); } } function Atualizar (e : Event) : void { +TotalNavesDestruidas.text = "" + NavesDestruidas; +ContagemTiro += 1; +if(ContagemTiro >= 12) ++TiroDisparado = false; +ContagemInimigo += 1; +if(ContagemInimigo == 24) { ++ContagemInimigo = 0; ++NaveInimiga = new Inimigo() ++NaveInimiga.x = 800; ++NaveInimiga.y = Math.round(Math.random() * 375) + 100; ++addChild(NaveInimiga); } Meu problema é nesse "for" daqui... +for(var verificacao : int = 0; verificacao < numChildren; verificacao++) ++if(getChildAt(verificacao) is Tiro) { +++getChildAt(verificacao).x += 10; +++for(var verificacao2 : int = 0; verificacao2 < numChildren; verificacao2++) ++++if(getChildAt(verificacao).hitTestObject(getChildAt(verificacao2))) +++++if(getChildAt(verificacao2) is Inimigo) { ++++++NavesDestruidas++; ++++++removeChildAt(verificacao); ++++++removeChildAt(verificacao2); ++++++verificacao--; ++++++verificacao2--; } } ... até aqui. ++else if(getChildAt(verificacao) is Inimigo) +++getChildAt(verificacao).x -= 10; } Estou com três problemas: 1º - As vezes, quando eu acerto uma nave inimiga, todas que estão na tela, são destruidas. 2º - As vezes, quando eu dou 2 tiros, e o segundo tiro pega primeiro que o primeiro tiro, o primeiro tiro some ao atingir uma nave inimiga (sem destruí-la). 3º - Enquanto o jogo está em execução, aparece a seguinte mensagem de erro: RangeError: Error #2006: O índice fornecido está fora dos limites. +at flash.display::DisplayObjectContainer/removeChildAt() +at JogodoAvi_fla::MainTimeline/Atualizar() Espero que alguém saiba resolver esse problema... obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Daniel o rei 14 Denunciar post Postado Maio 18, 2012 Poderia explicar pra que esse for? Uma forma de detectar colisão de um "tiro" é fazer uma linha e detectar a colisão dessa linha com os inimigos. Compartilhar este post Link para o post Compartilhar em outros sites
Soeks 0 Denunciar post Postado Maio 18, 2012 Poderia explicar pra que esse for? Uma forma de detectar colisão de um "tiro" é fazer uma linha e detectar a colisão dessa linha com os inimigos. E como eu faria o código dessa colisão? Compartilhar este post Link para o post Compartilhar em outros sites
Daniel o rei 14 Denunciar post Postado Maio 19, 2012 E como eu faria o código dessa colisão? Nesse link tem uma formula para detectar a interceção: http://en.wikipedia.org/wiki/Line-line_intersection Agora para detectar a colisão com o inimigo: Se o inimigo for um retângulo, seja em qualquer angulo ele tem quatro linhas. Uma reta é infinita. Duas linhas sempre vão se interceder, a não ser que sejam paralelas.(para verificar se são paralelas tem a formula no mesmo link.) Então para conseguir detectar a colisão: 1. Verificar se a interceção está na frente do personagem, se não ao atirar pode acertar até quem está atraz. vamos primeiro pegar o seno e cosseno. seno = Math.sin((personagem.rotation * 180)/Math.PI ); cosseno = Math.cos((personagem.rotation * 180)/Math.PI ); depois vamos montar a primeira espressão. Verificar só a cordenada Y (personagem.Y > intersecaoY && cosseno >= 0) || (personagem.Y < intersecaoY && cosseno <= 0) Agora verificar X. (personagem.x > intersecaoX && seno <= 0) || (personagem.x < intersecaoX && seno >= 0) Agora juntar tudo e colocar num if. (personagem.Y > intersecaoY && cosseno >= 0) || (personagem.Y < intersecaoY && cosseno <= 0) && (personagem.x > intersecaoX && seno <= 0) || (personagem.x < intersecaoX && seno >= 0) Não sei se está totalmente certo. mas tem logica 2. Você quer calcular a interceção de duas linhas, certo? A do tiro e a do "retangulo". A interseção pode ser em qualquer ponto da linha reta do tiro, exceto a parte que está atraz do personagem certo? A interseção da linha do retangulo deve ser apenas num segmento de reta. então você precisa saber se a cordenada X da interceção está entre as duas cordenadas X dos dois pontos segmento de reta. O mesmo você deve fazer com a cordenada Y, verificar se Y da interseção está entre as duas cordenadas Y dos dois pontos do segmento de reta. Da para fazer uma função para descobrir se um número está entre os dois function en(a:Number , b :Number,c:Number):Boolean{ var maior:Number ; var menor:Number ; if(a<B){ maior = b; menor = a; }else { maior = a; menor = b; } if(c >= menor && maior >= c){ return true; }else return false } Agora é só usar a função. Considerando que AB seja o segmento de reta. if(en(A_x,B_x, intersecaoX) && en(A_y, B_y, intersecaoY)) Dê uma olhada: http://forum.imasters.com.br/topic/461106-calculando-colisoes-entre-duas-linhas-e-dois-circulos/ Eu tenho uma função de 256 linhas que serve para decobrir colisão de um tiro com "tiles", não sei se vai querer, só ta meio difícil de entender. Compartilhar este post Link para o post Compartilhar em outros sites