Detectar tiro ao objeto -
ipsBruno - 03.07.2012
O que й?
Й um simples detector de tiros e um determinado objeto
Deixei a configuraзгo da posiзгo de forma fбcil e rбpido.
Cуdigo - http://pastebin.com/t19Ci2g1
pawn Код:
#include a_samp// ============ [ Posiзгo do Objeto ] =========new Float:X_OBJETO
= 128.7418;
new Float:Y_OBJETO
= -85.9495;
#define TAMANHO_OBJETO 0.4// =========== [ Criar Objeto para teste ] ========main
(){ CreateObject
(2587,
128.7418,
-85.9495,
1.4297,
0.0,
0.0,
96.0);
return true;
}// =========== [ Dar Arma para Teste ] ========public OnPlayerSpawn
(playerid
){ GivePlayerWeapon
(playerid,
32,
400);
return true;
}// =========== [ Detectar Tiro ] ================public OnPlayerKeyStateChange
(playerid, newkeys, oldkeys
){ if((newkeys
& KEY_FIRE || oldkeys
& KEY_FIRE
) && IsPlayerInRangeOfPoint
(playerid,
200.0 , X_OBJETO , Y_OBJETO ,
0.0)) { static Float:xPos,
Float:yPos,
Float:zPos,
Float:distancia,
Float:aPos;
GetPlayerPos
(playerid, xPos, yPos, zPos
);
GetPlayerFacingAngle
(playerid, aPos
);
distancia
= floatsqroot(floatpower(floatabs(xPos
-X_OBJETO
),
2) + floatpower(floatabs(yPos
-Y_OBJETO
),
2));
if(distancia
< 100.0) { xPos
+= (distancia
* floatsin(-aPos, degrees
)),
yPos
+= (distancia
* floatcos(-aPos, degrees
));
distancia
= floatsqroot(floatpower(floatabs(xPos
-X_OBJETO
),
2) + floatpower(floatabs(yPos
-Y_OBJETO
),
2));
} if(TAMANHO_OBJETO
> distancia
) { printf("Jogador %d acertou em um objeto (Pontuaзгo: %f)", playerid, distancia
);
} } return true;
}// Criado por Bruno da Silva// http://www.ips-team.blogspot.com// http://www.ips-team.forumeiros.com
O Valor da variбvel distancia ali no printf serб conforme o erro do player, se der 0.0 ele acertou perfeitamente caso dar 0.4 ele errou o tiro por pouco, depende bastante do tamanho do objeto
Por exemplo se vocк quer fazer um sistema de precisгo coloque isto:
pawn Код:
printf("Precisгo do Tiro: %d%", floatround(distancia * (100 / TAMANHO_OBJETO)) );
Vнdeo de Demonstraзгo
[ame]http://www.youtube.com/watch?v=8t3SZwa8YF4[/ame]
Criado por Bruno da Silva
- Data da criaзгo do projeto foi a praticamente 1 ano atrбs
Re: Detectar tiro ao objeto -
ipsBruno - 03.07.2012
Penso bastante em criar uma include sobre isto. Mas antes pretendo finalizar alguns projetos em aberto
Quote:
Bini 4
Sistema de Semбforos
Anti-Hacking com Paulor
Foreach 1
|
@ Desculpe o double-post. Pode juntar com o tуpico esta parte.
Re: Detectar tiro ao objeto -
Ades - 03.07.2012
Adorei musica amiga :$
Bom tive varias ideia com este FS , caso eu tive-se algum servidor eu ate fazia mas so so adm
Re: Detectar tiro ao objeto -
ipsBruno - 03.07.2012
Aos 21 segundos ele envia 2 mensagens adicionais, mas aquilo nгo й culpa do script. Acontece que as mensagens jб estavam em espera para ser enviadas, isto ocorre devido ao possнvel lag que isto pode dar.
Re: Detectar tiro ao objeto -
leonardo1434 - 03.07.2012
2 semanas atrбs tinha feito algo bem similar (cбlculos um pouco errados) e entгo parei o projeto.
Muito bom drakins :]
Re: Detectar tiro ao objeto -
ipsBruno - 03.07.2012
Quote:
Originally Posted by leonardo1434
2 semanas atrбs tinha feito algo bem similar (cбlculos um pouco errados) e entгo parei o projeto.
Muito bom drakins :]
|
Valeu .. Estes cбlculos aн nгo sгo dнficeis, sу tem que estudar um pouco de angulaзгo ou trigometria e plano cartesiano.
O que acontece й que na verdade eu fiz um cуdigo pensando em algo extramente estranho que acabou por dar certo.
Basicamente se resume nestes passos:
1 -> Pego a distancia do objeto ao jogador. Exemplo = 10
2 -> Adiciono a distancia do jogador a distancia do jogador ao objeto. Ex: 5 + 10 = 15 que serб a distancia do objeto e adiciono o cosseno e seno da angulaзгo a x,y
3 -> Checo se X,Y й prуximo a N. Caso for, o objeto foi acertado
Especificadamente:
Agora simples adiciono o seno cosseno a direita esquerda das posiзхes. No centro disto vai me retornar a N que fica entre ambos, caso o valor da N for maior que o tamanho do objeto, o cara errou, caso contrбrio, acertou
Pesquisei uma imagem na internet para te demonstrar:
N = distancia do jogador ao objeto + distancia do objeto
Y = cosseno do angulo do jogador multiplicado pela distancia antiga (porque apenas o seno daria valores pequenso)
X = seno do angulo do jogador multiplicado pela distancia
Basicamente o SENO irб controlar o ponto X. Que serб DIREITA ou ESQUERDA e Y irб controlar o ponto EMBAIXO ENCIMA. Em um plano 2D. O plano 3D com profundidade jб foi resolvido pela DISTANCIA.
Agora sу novamente pegar a distancia, sу que desta vez й a distancia do objeto б distancia de onde a bala foi (calculada por x,y,angle). Caso estб distancia for menor que o tamanho do objeto, PIMBA, o objeto levou um tiro
Quote:
Se o seu tуpico nгo tem um portuguкs legнvel , eu ignoro.
|
Boa iniciativa
Re: Detectar tiro ao objeto -
leonardo1434 - 03.07.2012
Valeu pela "dica", tentarei usar em algum novo projeto, mas eu ainda nгo entendi como funciona : floatsqroot e floatpower, vocк poderia explicar como que funcionar? :/
parece que nгo me entra a cabeзa ._."
ty :]
Re: Detectar tiro ao objeto -
ipsBruno - 03.07.2012
floatsqroot й o inverso de floatpower.
floatpower й potenciaзгo
floatsqroot й raiz quadrada
Exemplo:
floatpower (floatsqroot (2), 2) vai ser 2
floatpower(2, 3) й o mesmo que 2 vezes 2 vezes 2
floatpower(2, 4) й o mesmo que 2 vezes 2 vezes 2 vezes 2
floatsqroot(49) = 7 pois 7 x 7 = 49
floatsqroot(25) = 5 pois 5x5 = 25
Re: Detectar tiro ao objeto -
leonardo1434 - 03.07.2012
Um.. acho que entendi mais ou menos. й isso que fiz abaixo?
pawn Код:
floatsqroot(floatpower(floatabs(xPos-X_OBJETO), 2) + floatpower(floatabs(yPos-Y_OBJETO), 2));
//raiz de float absolutaІ + float absoluta І certo ?
xPos += (distancia * floatsin(-aPos, degrees)),
yPos += (distancia * floatcos(-aPos, degrees));
// xpos mais distancia vezes seno( pos negativa e вngulo)
//ypos mais distancia vezes cosseno(pos negativa e вngulo)
Obrigado pelo mini tuto.
Re: Detectar tiro ao objeto -
ipsBruno - 03.07.2012
Sim. Porque eu fiz isto? Porque estб й a fуrmula para pegar a distancia de dois pontos x.y
http://pt.wikipedia.org/wiki/Vetor_(...rma_do_vetor_-
Deduзгo a partir do sistema de pitбgoras. O problema й que isto nгo й totalmente vбlido, tem alguns erros de leitura que tornam uma margem de erro impercebido, devido a raiz quadrada dos nъmeros.
x = 2
y = 2
2 * 2 = 4
raiz(4+4) = raiz( 8 )
raiz( 8 ) = 2.8 distancia entre x (que й 2) ,y (que й 2)
....
....
.
...
.
...
.. Notou?
Explicaзгo feita as pressas, indo pra escola .. Fui !!
Agora quero ver se vocк entendeu, sabe como pegar a distancia de 2 jogadores? Sem o uso de funзхes da sa:mp, exceto GetPlayerPos e Floatqroot ou Floatpower ..
Sу com cбlculos com a formula que mostrei acima, sabendo x .. y do jogador, й fбcil. Lembrando que quando se й 2 coordenadas tem que diminuir uma das outras
y = y player 1 - yplayer 2
x = x player 1 - x player 2
agora sу fazer a formula
raiz(yІ, yІ)
Criando Include de Object Shoot ..