Joshua Moerman
12 years ago
3 changed files with 217 additions and 217 deletions
@ -0,0 +1,49 @@ |
|||||
|
body { |
||||
|
color: #888; |
||||
|
background: #000; |
||||
|
font-size: 16pt; |
||||
|
margin: 0px; |
||||
|
overflow: hidden; |
||||
|
height: 100%; |
||||
|
} |
||||
|
a { |
||||
|
color: #fff; |
||||
|
text-shadow: 0px 1px 1px #f80; |
||||
|
} |
||||
|
#text { |
||||
|
position: relative; |
||||
|
text-align: center; |
||||
|
} |
||||
|
#ballscreen { |
||||
|
position: absolute; |
||||
|
background-color: rgba(0.0, 0.0, 0.0, 0.0); |
||||
|
width: 1000px; |
||||
|
height: 600px; |
||||
|
border: 1px solid black; |
||||
|
} |
||||
|
.ball { |
||||
|
-webkit-transition: left 0.1s linear, top 0.1s linear; |
||||
|
position: absolute; |
||||
|
} |
||||
|
.ball .bullet { |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
position: absolute; |
||||
|
left: -5px; |
||||
|
top: -5px; |
||||
|
border-radius: 5px; |
||||
|
background-color: #f00; |
||||
|
} |
||||
|
#svgscreen { |
||||
|
position: absolute; |
||||
|
width: 1000px; |
||||
|
height: 600px; |
||||
|
} |
||||
|
#svgscreen line.guitar { |
||||
|
stroke: rgb(255,127,0); |
||||
|
stroke-width: 2; |
||||
|
} |
||||
|
#svgscreen line.solid { |
||||
|
stroke: rgb(0,127,255); |
||||
|
stroke-width: 2; |
||||
|
} |
@ -0,0 +1,164 @@ |
|||||
|
var myName; |
||||
|
var websocket; |
||||
|
var ballscreen; |
||||
|
var svgscreen; |
||||
|
var current_svgline; |
||||
|
var balls_online = new Array(); |
||||
|
var svglines_online = new Array(); |
||||
|
var speed = 100; |
||||
|
var line_kind = 1; |
||||
|
|
||||
|
function init() { |
||||
|
myName = document.getElementById('loginname').value; |
||||
|
console.log(myName); |
||||
|
var login = document.getElementById('login'); |
||||
|
login.parentNode.removeChild(login); |
||||
|
|
||||
|
var statusbar = document.getElementById('status'); |
||||
|
ballscreen = document.getElementById("ballscreen"); |
||||
|
svgscreen = document.getElementById("svgscreen"); |
||||
|
|
||||
|
statusbar.innerHTML = "connecting..." |
||||
|
|
||||
|
if ("WebSocket" in window){ |
||||
|
init_drawing(ballscreen, drawStart, drawMove, drawEnd, drawRemove); |
||||
|
websocket = init_websocket(statusbar, onOpen, onMessage); |
||||
|
} else { |
||||
|
statusbar.innerHTML = 'No websockets :(. This means that you either use <em>Internet Explorer</em> or <em>Android</em>. In both cases, I suggest that you use <a href="http://www.google.com/chrome/">Chrome</a> or <a href="http://www.getfirefox.net/">Firefox</a>!'; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
function onOpen(evt) { |
||||
|
updateUser(); |
||||
|
} |
||||
|
|
||||
|
function onMessage(evt) { |
||||
|
var ret = JSON.parse(evt.data); |
||||
|
var balls = ret.balls; |
||||
|
var lines = ret.lines; |
||||
|
|
||||
|
if(balls){ |
||||
|
console.log('updating balls'); |
||||
|
updateBalls(balls); |
||||
|
} |
||||
|
if(lines){ |
||||
|
console.log('updating lines'); |
||||
|
updateLines(lines); |
||||
|
} |
||||
|
|
||||
|
setTimeout(function(){ |
||||
|
poll(); |
||||
|
}, speed); |
||||
|
} |
||||
|
|
||||
|
function updateBalls(balls){ |
||||
|
// Because we use transitions for the balls
|
||||
|
// we really update them, and only delete the ones which are absent
|
||||
|
for(i in balls_online){ |
||||
|
balls_online[i].should_remove = true; |
||||
|
} |
||||
|
for (var i = balls.length - 1; i >= 0; i--) { |
||||
|
var ball = document.getElementById(balls[i].information); |
||||
|
if(ball){ |
||||
|
ball.style.left = balls[i].position.x + "px"; |
||||
|
ball.style.top = balls[i].position.y + "px"; |
||||
|
ball.should_remove = false; |
||||
|
} else { |
||||
|
var ball = document.createElement('div'); |
||||
|
ball.should_remove = false; |
||||
|
ball.id = balls[i].information; |
||||
|
ball.className = 'ball'; |
||||
|
ball.innerHTML = '<div class="bullet"></div>'; |
||||
|
ball.style.left = balls[i].position.x + "px"; |
||||
|
ball.style.top = balls[i].position.y + "px"; |
||||
|
|
||||
|
ballscreen.appendChild(ball); |
||||
|
balls_online.push(ball); |
||||
|
} |
||||
|
} |
||||
|
for (var i = balls_online.length - 1; i >= 0; i--) { |
||||
|
if(balls_online[i].should_remove){ |
||||
|
ballscreen.removeChild(balls_online[i]); |
||||
|
balls_online.splice(i, 1); |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
function updateLines(lines){ |
||||
|
// Simply delete and redraw them :)
|
||||
|
for (var i = svglines_online.length - 1; i >= 0; i--) { |
||||
|
svgscreen.removeChild(svglines_online[i]); |
||||
|
}; |
||||
|
svglines_online = new Array(); |
||||
|
for (var i = lines.length - 1; i >= 0; i--) { |
||||
|
var current = addLine(lines[i], svgscreen); |
||||
|
if(lines[i].line_kind == 0){ |
||||
|
current.setAttribute('class', "guitar"); |
||||
|
} else { |
||||
|
current.setAttribute('class', "solid"); |
||||
|
} |
||||
|
svglines_online.push(current); |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
function drawStart(line){ |
||||
|
current_svgline = addLine(line, svgscreen); |
||||
|
if(line_kind == 0){ |
||||
|
current_svgline.setAttribute('class', "guitar"); |
||||
|
} else { |
||||
|
current_svgline.setAttribute('class', "solid"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function drawMove(line){ |
||||
|
updateLine(current_svgline, line); |
||||
|
} |
||||
|
|
||||
|
function drawEnd(line){ |
||||
|
drawRemove(line); |
||||
|
line.line_kind = line_kind; |
||||
|
var packet = { |
||||
|
command: 'add line', |
||||
|
data: line |
||||
|
}; |
||||
|
websocket.send(JSON.stringify(packet)); |
||||
|
} |
||||
|
|
||||
|
function drawRemove(line){ |
||||
|
if(current_svgline){ |
||||
|
svgscreen.removeChild(current_svgline); |
||||
|
current_svgline = null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function updateUser() { |
||||
|
var myself = { |
||||
|
name: myName, |
||||
|
size: {width: window.innerWidth, height: window.innerHeight} |
||||
|
}; |
||||
|
var packet = { |
||||
|
command: 'update user', |
||||
|
data: myself |
||||
|
}; |
||||
|
websocket.send(JSON.stringify(packet)); |
||||
|
} |
||||
|
|
||||
|
function poll(){ |
||||
|
var packet = { |
||||
|
command: 'poll' |
||||
|
}; |
||||
|
websocket.send(JSON.stringify(packet)); |
||||
|
} |
||||
|
|
||||
|
function changeKind() { |
||||
|
line_kind = line_kind + 1; |
||||
|
line_kind = line_kind % 2; |
||||
|
var kind_str = "solid"; |
||||
|
if(line_kind == 1) kind_str = "guitar" |
||||
|
document.getElementById("line_kind").innerHTML = kind_str; |
||||
|
} |
||||
|
|
||||
|
setTimeout(function (){ |
||||
|
window.scrollTo(0, 1); |
||||
|
}, 0); |
Reference in new issue