
Imagine poder controlar um jogo em seu computador usando seu smartphone como gamepad?
Eventos no DOM para obter informações sobre a orientação e movimentação física do dispositivo móvel.
Eventos:
deviceorientation
devicemotion
✓compassneedscalibration
NodeJS usa um modelo orientado a eventos, com E/S não bloqueante que o torna leve e eficiente.
Como o Javascript é restrito ao browser foi necessário criar outros módulos como:
Node é projetado para construir aplicações escaláveis de rede. A seguir um exemplo de servidor que pode atender a várias conexões concorrentemente:
const http = require('http') const hostname = '127.0.0.1' const port = 3000 const server = http.createServer((req, res) => { res.statusCode = 200 res.setHeader('Content-Type', 'text/plain') res.end('Hello World\n') }) server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`) })
$ pm2 start index.js
$ locust --host=http://localhost:3003
Visualizing the javascript runtime at runtime
var robot = require('robotjs') // Press enter. robot.keyTap('enter') // hold the shift key robot.keyToggle('shift', 'down')
Usa node-gyp
ou Node.js native addon build tool
Ferramenta de linha de comando multi plataforma escrita em NodeJS para compilação de módulos nativos (C/C++) para NodeJS
Requisição de teclas do teclado é escrita em C/C++ e há um binding para NodeJS
É um protocolo de mensagens baseado em publish/subscribe, extremamente simples e leve, projetado para redes com pouca banda, alta latência ou não confiáveis.
Princípios: minimizar o uso da banda de rede e recursos do dispositivo enquanto tenta maximinizar a confiabilidade e oferecer algum grau de garantia de entrega das mensagens.
Também usado nos chamados M2M (Machine-to-machine) ou Internet of Things
var mosca = require('mosca') var settings = { port: 1883 } var server = new mosca.Server(settings) server.on('published', function(packet, client) { console.log('Published', packet.topic, packet.payload) }) server.on('ready', function setup() { console.log('Mosca server is up and running') })
var mqtt = require('mqtt') var client = mqtt.connect('mqtt://localhost:1883') client.on('connect', function() { client.subscribe('presence') client.publish('presence', 'Hello mqtt') }) client.on('message', function(topic, message) { // message is Buffer console.log(message.toString()) client.end() })
Utiliza WebSockets para a conexão
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API
var btnSend = document.getElementById('mqtt_send') var message = document.getElementById('mqtt_message') var result = document.getElementById('mqtt_result') var client = mqtt.connect('ws://test.mosquitto.org:8080/mqtt') client.subscribe('mqtt/demo') client.on('message', function(topic, payload) { result.innerHTML = [topic, payload].join(': ') }) btnSend.onclick = function (e) { e.preventDefault() client.publish('mqtt/demo', message.value) }
Progressive Framework para construção de interfaces de usuário
Trecho para inicialização da variável que indica mudanças no eixo Y:
export default { data () { acceleration: { y: 0 } }, mounted () { if (window.DeviceMotionEvent !== undefined) { window.ondevicemotion = (e) => { this.acceleration.y = e.accelerationIncludingGravity.y || 0 } } } }
Trecho para indicar que o usuário está virando para a esquerda ou direita:
export default { computed: { isTurningLeft () { const { accelerationSensibility } = this.$store.state this.keypress.left = this.acceleration.y < accelerationSensibility * -1 return this.keypress.left }, isTurningRight () { const { accelerationSensibility } = this.$store.state this.keypress.right = this.acceleration.y > accelerationSensibility return this.keypress.right } } }
Cliente: https://github.com/comsolid/remote-pad
Servidor: https://github.com/comsolid/remote-pad-server
GUI (Interface Gráfica): https://github.com/comsolid/remote-pad-gui
Todos os jogadores
{ "keypress": { "Y": false, "X": false, "B": false, "A": false, "left": false, "right": false, "up": false, "down": false } }
Jogador 1
{ "left": "left", "right": "right", "up": "up", "down": "down", "B": "shift", "A": "z", "Y": "control", "X": "space" }
Jogador 2
{ "left": "a", "right": "d", "up": "w", "down": "s", "B": "e", "A": "x", "Y": "q", "X": "r" }
const topics = ['alice', 'bob', 'carol', 'david'] server.on('published', function(packet, client) { const [ type, player ] = packet.topic.split('/') if (type.lastIndexOf('pad', 0) == 0) { const commands = JSON.parse(packet.payload.toString()) pad(commands, clients[player]) } })
var robot = require('robotjs') module.exports = function (commands, player) { for (let prop in commands) { let key = player.keys[prop] if (key) { let toggle = (commands[prop] ? 'down' : 'up') robot.keyToggle(player.keys[prop], toggle) } } }
Mario Party
Qualquer dúvida entre em contato.