Biblioteca em em Javascript para trabalhar com o mouse

Olá pessoal,

Estou vindo mais uma vez na comunidade pedir ajuda pois gosto daqui. O pessoal manja legal e são gente boa. Mas eu peço desculpas por uma dúvida tão vaga mas não estou conseguindo resolver.

Eu baixei uma biblioteca em Javascript pra trabalhar com o mouse chamada “track”: https://github.com/remy/track

Eu estou tentando capturar o mouse e mandar um alert se capturar o mouse. Mas não está funcionando…

Segue o código e desculpa por mais uma noobice minha…mas javascript está complexo pra caramba…

Código:

<html>

<head>
   <title>Site</title>
   <link rel="stylesheet" media="screen" href="css/normalise.css"></link>
   <link rel="stylesheet" media="screen" href="css/canvases.css"></link>
   
  <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
  <script type="text/javascript" src="js/lib/underscore-min-1.4.3.js"></script>
  <script type="text/javascript"  src="js/lib/toolbox.js"></script>
  <script data-main="js/main" src="js/lib/require.js"></script>
  <script type="text/javascript"  src="js/track.js"></script>

   <script type="text/javascript" >
   
   var track = new Track();
   document.addEventListener(track.up, function(){
      alert("Você pressinou");},false);
   
   </script>
  
</head>		

<body>

   <script type="text/javascript" >
   
   var track = new Track();
   document.addEventListener(track.down, function(){
      alert("Você pressinou");},true);
   
   </script>
   
</body>

</html>

Obrigado por qualquer ajuda. Qualquer ajuda é bem vinda.

Sem saber qual seu objetivo, fica mais complicado te ajudar.

Explica melhor o que você quer fazer e o motivo de querer usar essa biblioteca em específico.

Abraço.

2 curtidas

Pegar os eventos do mouse pra fazer um MMO.

O exemplo do que eu tenho está aqui funcionando: http://dan.nea.me/tile-based-games-demo/

É esse código-fonte que passei.

O que estou tentando fazer é trabalhar com o mouse. Só isso. Pois nesse demo tem um script que funciona somente o teclado.

O principal é pegar as posições x e y do mouse e quando e onde o usuário clica em algum local do mapa pra mim trabalhar emcima desses dados.

Meu objetivo é fazer um sistema de batalha pra um MMO(jogo web browser) estilo Travian, OGame etc…mas o sistema de batalha vai ser dinâmico com Javascript/HTML5.

Estou aprendendo HTML5 e Javascript e pra ser sincero nunca apanhei tanto quanto estou apanhando com o Javascript…rs

Eu tenho sprites de guerreiros, arqueiros,cavaleiros etc. Meu objetivo é criar um sistema de batalha dinamico e com IA. A idéia é o defensor posicionar as tropas nesse mapa(que sera diferente para cada cidade) com obstaculos diferentes e a o atacante posiciona as tropas dele tbm no mapa. Então a batalha ocorre com IA entre as unidades. E alguém ganha.

Minha intenção é trabalhar com o mouse pra posicionar as unidades. Ainda não sei como fazer isso mas estou aprendendo.

Esse código do javascript não está funcionando. a biblioteca “track.js” está aqui o código:

(function (global) {

function Track(context) {
  context || (context = document);

  var isDocument = context == document,
      track = this,
      contextPos = { x: 0, y: 0 };

  function addEvent(type, fn) {
    // context is scoped in Track object
    context.addEventListener(type, fn, false);
    return addEvent;
  }

  function updateContextXY() {
    var ctx = context;
    if (isDocument) ctx = context.body;

    var left = 0, top = 0;
    if (ctx.offsetParent) {
      do {
        left += ctx.offsetLeft;
        top  += ctx.offsetTop;
      } while (ctx = ctx.offsetParent);
    }

    contextPos = {
      x : left,
      y : top
    };
  };

  function getXY(event) {
    event = event.pageX ? event : event.touches.length ? event.touches[0] : { pageX: 0, pageY: 0 };
    return {
      x: event.pageX - document.body.scrollLeft - contextPos.x,
      y: event.pageY - document.body.scrollTop - contextPos.y,
    }
  }
  
  function down(event) {
    track.down = true;

    // reset the momentum until they release
    track.momentumX = track.momentumY = 0;

    updateContextXY();

    var coords = getXY(event);
    track.x = track.downX = coords.x;
    track.y = track.downY = coords.y;
    track.startTime = +new Date;
  }

  function up(event) {
    track.down = false;
    track.duration = +new Date - track.startTime;

    track.upX = track.x;
    track.upY = track.y;

    // work out the momentum
    var left = track.weight * (track.downX - track.x),
        adjustX = Math.round(left / (track.duration * 10)),
        top =  track.weight * (track.downY - track.y),
        adjustY = Math.round(top / (track.duration * 10));

    track.momentumX = adjustX;
    track.momentumY = adjustY;
  }

  function move(event) {
    var coords = getXY(event);
    track.x = coords.x;
    track.y = coords.y;
  }

  updateContextXY();

  // hook up event listeners
  addEvent(track.events.down, down)(track.events.up, up)(track.events.move, move)('keydown', function (event) {
    track.key[event.which] = true;
  })('keyup', function () {
    track.key[event.which] = false;
  });
}

var touch = 'createTouch' in document;

Track.prototype = {
  key: {}, // note that key tracking isn't perfect yet - probably won't be :(
  x: 0,
  y: 0,
  startTime: 0,
  duration: 0,
  downX: 0,
  downY: 0,
  upX: 0,
  upY: 0,
  momentumX: 0,
  momentumY: 0,
  down: false,
  touch: touch,
  events: {
    up: touch ? 'touchend' : 'mouseup',
    down: touch ? 'touchstart' : 'mousedown',
    move: touch ? 'touchmove' : 'mousemove',
  },
  weight: 120, // this is arbitrary, but simple to change
  toString: function () {
    return JSON.stringify(this);
  }
}

global.Track = Track;

})(this);

Mas achei um código que está funcionando. Segue o código:

 <script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>

    <script type="text/javascript">
        $(document).ready(function(){
            $('html').mousemove(function(event){
                console.log("mouse move X:"+event.pageX+" Y:"+event.pageY);
            });
            $('html').click(function(event){
                console.log("mouse click X:"+event.pageX+" Y:"+event.pageY);
            });
            $('html').keyup(function(event){
                console.log("keyboard event: key pressed "+event.keyCode);
            });
        });
    </script>

As unidades serão basicamente usadas de um game opensource:

https://units.wesnoth.org/1.14/mainline/en_US/Swordsman.html

A batalha ocorrerá nesse mapa.

Preciso aprender agora como selecionar as unidades que o usuário clicar pra posicionar estrategicamente no mapa.

Obrigado pela ajuda.

Eu não dei ênfase o suficiente nisso no seu outro tópico, mas acho que você precisa fazer coisas mais simples inicialmente, criar jogos menores (e offline) para entender como certas coisas funcionam.

Criar um MMO é um projeto enorme e difícil, e o jeito como você está abordando esse projeto (basicamente, tentativa e erro pra ver se acha algo que dá certo) vai te cansar muito antes de você ter algo concreto e funcional. Você já está preocupado com carregar e salvar mapa, como salvar dados no banco, se vai usar P2P, como mexer com triggers, criar contadores e etc, e tudo isso antes de ser capaz de fazer um jogo mais simples (ex: breakout, pong, etc).

Se você quer fazer um jogo em Javascript, recomendo pegar uma biblioteca ou framework que já tenha um pouco do essencial, como um game loop, input (via mouse, teclado e afins), carregamento de imagens e de sons e suporte à eventos (colisão, contadores, timers, etc). Assim, você evita um mar de pequenas funções javascript e jQuery, nas quais você pode facilmente se perder.

Uma recomendação seria a Phaser. Dê uma olhada nos exemplos, tente criar alguma coisa baseadas neles, crie jogos mais simples e veja como isso pode te ajudar.

Abraço.

1 curtida

Obrigado pela resposta @TerraSkilll.

Minha intenção é fazer um MMO. Já pesquisei muito a respeito e já fiz muitos projetos que me serviram de experiência.

Acho que encontrei o que procurava. Um exemplo bem prático de mapa em tiles com movimentação na tela e carregamento de mapas via matriz que é fácil salvar e carregar no banco de dados.

Esse sistema de exemplo apesar de “pequeno” tem até sistema de pathfinding com 4 algoritmos funcionando ali na prática…só estudar e modificar. Tem carregamento de imagens via matrizes, sistema de colisão…

É um baita conteúdo e achado que consegui. Dificilmente conseguirei algo mais prático, simples, funcional e direto ao ponto do que este exemplo que faz basicamente todo o pesado do que desejo.

Só preciso montar um sistema de combate emcima das coordenadas desse mapa com os sprites que já tem um “sistema de carregamento” nesse script.

Então está verdadeiramente uma mão na roda pra mim. Está complexo pra mim entender o Javascript. Mas nada melhor que mergulhar nesse conteúdo pra aprender, acredito eu.

Como eu disse, consegui um código simples e direto ao ponto pra trabalhar com o mouse e que funciona:

   <script type="text/javascript">
        $(document).ready(function(){
            $('html').mousemove(function(event){ 
                console.log("mouse move X:"+event.pageX+" Y:"+event.pageY);
            });
            $('html').click(function(event){
                console.log("mouse click X:"+event.pageX+" Y:"+event.pageY);
            });
            $('html').keyup(function(event){
                console.log("keyboard event: key pressed "+event.keyCode);
            });
        });
    </script>

Agora preciso aprender a usar isso. A posição do clique do botão com o a posição da unidade no mapa, por exemplo.

Tenho alguns scripts de movimentação funcionando. Preciso aprender como funciona pra saber como usar o mouse com ele…hehe.

Praticamente está resolvida a questão da biblioteca. Agora é debugar esse pequeno “framework” de tilemap.

O site com um tutorial pra quem quiser aprender está neste link:

E ele funcionando e o código-fonte completo estão aqui:
http://dan.nea.me/tile-based-games/

Obrigado pelas respostas e ajuda.

Qualquer ajuda é sempre Bem-Vinda!

Abraços.