[Script] Colisão com Ratos (nova fórmula) |
Jp_darkuss « Citoyen » 1603582440000
| 2 | ||
Então como vou explicar. Estávamos lá no Servidor do Fifty Shades of Lua, tudo normal, nada de mais acontecendo, e as pessoas fazendo suas coisas... Aí de repente veio o Fofinhoppp correndo e explodiu a cabeça de todo mundo com uma ideia genial: Fofinhoppp a dit : Simplesmente genial. Então fiz uma tabela com funções que podem detectar a colisão de um rato numa determinada região de forma mais fácil em vez de usar o eventLoop: Script Original: Collision.lua -- Versão linha-única Code Lua 1 2 3 4 5 6 7 8 --[[ É bem pequenininho, já que o bônus faz a parte difícil pra nós hehe Primeiramente vamos preparar o script. Dentro de um evento playerBonusGrabbed você deverá chamar a função collision.update, e passar como parâmetro o player que pegou o bonus e o id do bônus: Code Lua 1 2 3 eventPlayerBonusGrabbed= function(player, id) Agora vamos veja as funções abaixo! Cria uma ponto de colisão Parâmetros: - id (int): o id do ponto - x (number): a posição do ponto no eixo Horizontal - y (number): a posição do ponto no eixo Vertical - player (string): o player que colidirá (nil para todos os players) - callback (function): a função que deverá ser chamada quando a colisão for detectada - - - parâmetros: (self, player) - - - - - - self (table): contém informações do próprio ponto (x, y, respawn, callback) - - - - - - player (table): as informações do player que colidiu, contendo a propriedade name (nome do jogador) e todas as informações do tfm.get.room.playerList - respawn (boolean): se o ponto de colisão deverá ser restaurado após ser disparado (valor padrão: true) Remove um ponto de colisão Parâmetros: - id (int): o id do ponto - player (string): o player cujo colisão não será mais detectada (nil para todos os players) Adiciona uma área de colisões retangular Parâmetros: - class (int/string): a identificação da classe - id (int): o id inicial da classe (referente aos bônus), ao ser invocada, serão gerados vários ids até que a área se complete - x (number): a posição da área no eixo horizontal - y (number): a posição da área no eixo vertical - width (int): a largura da área - height (int): a altura da área - player (int): o player que colidirá (nil para todos) - callback (function): a função que deverá ser chamada quando a colisão for detectada - - - parâmetros: (self, player) - - - - - - self (table): contém informações do próprio ponto (x, y) - - - - - - player (table): as informações do player que colidiu, contendo a propriedade name (nome do jogador) e todas as informações do tfm.get.room.playerList - respawn (boolean): se a área deverá ser restaurada após a colisão (somente um ponto desaparece na colisão) (valor padrão: true) Retorna: o id do último ponto Remove uma área de colisões Parâmetros: - class (int/string): a classe da área - player (int/string): à quem a área será removida (nil para todos) Use para obter uma lista com todos os ids da certa área Parâmetros: - class (int/class): a classe da tal área Retorna: uma tabela com todos os ids Move um ponto para o local indicado Parâmetros: - id (int): o id do ponto - x (number): a nova coordenada do ponto no eixo horizontal - y (number): a nova coordenada do ponto no eixo vertical - add (boolean): se os valores indicados em x e y devem ser somadas as originais (valor padrão: false) Move uma área para o local indicado Parâmetros: - class (int/string): a classe da área - x (number): a nova coordenada da área no eixo horizontal - y (number): a nova coordenada da área no eixo vertical - add (boolean): se os valores indicados em x e y devem ser somadas as originais (valor padrão: false) Funções internas (você pode usar) - (method) collision.getClass(id) => string || number Use para obter o nome de uma classe referente a um determinado id de um ponto Parâmetros: - id (int): um id qualquer vinculado à classe Retorna: o nome da classe. Caso não seja encontrada, retorna -1 - (Method) collision.getPoint(class, id) => table Use para obter as informações de um ponto vinculado a uma área Parâmetros: - class (int/string): a referida classe - id (int): o id do ponto Retorna: uma tabela com as informações do ponto Quando estiver editando, você pode alterar o valor de collision.debugging para true, assim verá os pontos de colisão! Lembre-se de tirar quando terminar o projeto! Teste os seguintes exemplos: -- Uma parede (teste depois com o collision.debugging = false) (obs: use /module stop antes de testar novamente) Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 collision.debugging= true -- O chão é lava!! Code Lua 1 2 3 4 5 6 7 eventPlayerBonusGrabbed= function(player, id) Espero que tenham gostado! Obs: coisas podem não funcionar, já que as funções utilizadas são novas e ainda estão em desenvolvimento. Quaisquer bug me notifiquem. Créditos: Fofinhoppp#0000 Dernière modification le 1603758000000 |
Gamedroit « Citoyen » 1603598760000
| 2 | ||
Nice, amei a ideia, boa Chris, eu nem tinha visto os argumentos das novas funções, pensei que não tinha como tornar-los invisíveis. O problema em questão agora é fazer área, você precisa calcular a diferença entre o tamanho do bônus e do jogador para poder aumentar o tamanho da área de colisão, isto seria ótimo para algumas ocasiões. |
Fofinhoppp « Consul » 1603600380000
| 1 | ||
Adorei o tópico! Obrigado kkkkkkkk foi um pensamento que veio do nada mesmo... Contistente3 a dit : Uma boa solução seria você adicionar mais boosts por toda a área que você deseja detectar e usar o mesmo id para todos eles. |
Gamedroit « Citoyen » 1603615620000
| 1 | ||
Fofinhoppp a dit : Mas o jogador ficaria sem entender de onde veio a velocidade acrescentada ao colidir com determinada área, na minha perspectiva eu tinha pensando em criar uma rede de bônus, um exemplo básico: Quero detectar a colisão com uma área retangular de 80x80. Isso seria facilmente feito determinando 4 epicentros na coordenada central onde seriam adicionados os bônus separados pela distância de 40px (testei hoje e 40px é uma ótima distância). Então ficaria: X = 200 Y = 150 1° bônus: X - 40 = 160, Y - 40 = 110 2° bônus: X - 40 = 160, Y + 40 = 190 3° bônus: X + 40 = 240, Y - 40 = 110 4° bônus: X + 40 = 240, Y + 40 = 190 Bom, não passa de teoria pois ainda não testei mas fica aí para caso alguém queira testar e divulgar os resultados, também não sei se afetaria a performance. Acho que a quantidade de epicentros pode ser determinada dividindo o tamanho da área por 20. PS: 40 não é um número constante/fixo, ele poderia ser alterado para por exemplo sobrepor um piso retangular de 56 de altura e 140 de largura. Dernière modification le 1603615920000 |
Jp_darkuss « Citoyen » 1603625340000
| 0 | ||
Contistente3 a dit : Boa idéia. Tem como adicionar vários com mesmo id sim, é só não remover os primeiros, então dá pra fazer isso. Ah. E também tem o token de pontuação (aquele com +1 no centro), é o que invoca no script, então não causa nenhum efeito, senão detectar a colisão. |
Jp_darkuss « Citoyen » 1603640280000
| 0 | ||
Já atualizei o script, já dá para por áreas. Só que cada ponto da área tem seu id, porque se adicionar vários pontos com o mesmo id, os antecedentes perdiam a identificação (no próprio tfm) e bugava o script. Hoje ainda faço a versão linha única! :) |
Gamedroit « Citoyen » 1603662720000
| 0 | ||
Jp_darkuss a dit : Boa, também estou fazendo minha versão do script, mas como você já postou e a funcionalidade é a mesma, somente muda a maneira como estou calculando a área e as coordenadas, eu vou guardar para talvez utilizar em projetos futuros. Dernière modification le 1603662840000 |
Jp_darkuss « Citoyen » 1603686840000
| 0 | ||
Contistente3 a dit : Vlw. Qualquer coisa (melhoria, bug) me avisa que conserto ;) Dernière modification le 1603713360000 |
Jp_darkuss « Citoyen » 1603758060000
| 0 | ||
Script concluído com sucesso. Nada mais a adicionar. Versão linha-única pronta também. |