Handle all Physics serverside
This commit is contained in:
		
							parent
							
								
									0f344b7b63
								
							
						
					
					
						commit
						8cf7f9336c
					
				
					 2 changed files with 343 additions and 124 deletions
				
			
		
							
								
								
									
										213
									
								
								index.html
									
										
									
									
									
								
							
							
						
						
									
										213
									
								
								index.html
									
										
									
									
									
								
							|  | @ -17,13 +17,14 @@ | |||
|     <script> | ||||
|       var socket = io(); | ||||
|       var pid; | ||||
|       socket.on('handshake', function(id, state, c_width, c_height, sp, fn){ | ||||
|       socket.on('handshake', function(id, state, c_width, c_height, sp, score, fn){ | ||||
|         $('id').text(id); | ||||
|         pid = id; | ||||
|         gameState = state; | ||||
|         cube_width = c_width; | ||||
|         cube_height = c_height; | ||||
|         speed = sp; | ||||
|         cube_speed = sp; | ||||
|         score = score; | ||||
|         fn($(window).width(), $(window).height()); | ||||
|       }); | ||||
| 
 | ||||
|  | @ -39,12 +40,17 @@ | |||
|         gameState = state; | ||||
|       }); | ||||
| 
 | ||||
|       socket.on('shootball', function(y){ | ||||
|         if(ball_owner == 1) leftY = y; | ||||
|         if(ball_owner == 2) rightY = y; | ||||
|         shootBall(false); | ||||
|       socket.on('scoreChange', function(val){ | ||||
|         score = val; | ||||
|       }); | ||||
| 
 | ||||
| // Obsolete | ||||
|       // socket.on('shootball', function(y){ | ||||
|       //   if(ball_owner == 1) leftY = y; | ||||
|       //   if(ball_owner == 2) rightY = y; | ||||
|       //   shootBall(); | ||||
|       // }); | ||||
| 
 | ||||
|       /** Make Countdown serversided No cheating possible **/ | ||||
|       socket.on('countdown', function(i){ | ||||
|         text = 'Starting in ' + i; | ||||
|  | @ -74,11 +80,20 @@ | |||
|           rightV = val; | ||||
|           rightY = y; | ||||
|         } | ||||
|         console.log(leftY); | ||||
|         (leftY); | ||||
|       }); | ||||
| 
 | ||||
|       socket.on('ballpos', function(data){ | ||||
|         ballX = data['x']; | ||||
|         ballY = data['y']; | ||||
|         ball_VX = data['vx']; | ||||
|         ball_VY = data['vy']; | ||||
|         ball_speed = data['speed']; | ||||
|         ball_owner = data['owner']; | ||||
|       }); | ||||
| 
 | ||||
|       socket.on('test', function(arg){ | ||||
|         console.log(arg); | ||||
|         (arg); | ||||
|       }); | ||||
|       /** Initialize Canvas **/ | ||||
|       var c = document.getElementById("test"); | ||||
|  | @ -86,7 +101,6 @@ | |||
|       c.width = $(window).width(); | ||||
|       c.height = $(window).height(); | ||||
| 
 | ||||
| 
 | ||||
|       var leftY = 0; | ||||
|       var rightY = 0; | ||||
|       var leftV = 0; | ||||
|  | @ -94,6 +108,7 @@ | |||
|       var leftColor = 'red'; | ||||
|       var rightColor = 'blue'; | ||||
|       var gameState = 0; // 0 == Waiting for Players, 1 == Countdown, 2 == inGame, 3 == ??Win?? | ||||
|       var score = [0,0]; | ||||
| 
 | ||||
|       /** FPS Vars **/ | ||||
|       var lastCalledTime, | ||||
|  | @ -108,7 +123,7 @@ | |||
|       /** Prop-Config **/ | ||||
|       var cube_width = 50, | ||||
|           cube_height = 200, | ||||
|           speed = 7, | ||||
|           cube_speed = 7, | ||||
|           ball_size = 15, | ||||
|           ball_speed = 8, | ||||
|           ballX = cube_width+ball_size, | ||||
|  | @ -167,35 +182,38 @@ | |||
|         ctx.fillRect(0, 0, width, height); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         /** Points **/ | ||||
|         var scoretxt = score[0] + ' : ' + score[1]; | ||||
|         ctx.fillStyle = 'black'; | ||||
|         ctx.font = '40px monospace'; | ||||
|         ctx.textAlign = 'center'; | ||||
|         ctx.fillText(scoretxt, width/2, 70); | ||||
| 
 | ||||
| 
 | ||||
|         if(gameState < 2){ | ||||
|           ctx.fillStyle = 'black'; | ||||
|           ctx.font = '30px monospace'; | ||||
|           ctx.fillText(text, width/2-text.length*8, height/2-30); | ||||
|           ctx.textAlign = 'center'; | ||||
|           ctx.fillText(text, width/2, height/2-30); | ||||
|         } | ||||
| 
 | ||||
|         if(gameState == 2 && pid > 2){ | ||||
|           var specstr = "Spectator-Mode" | ||||
|           ctx.fillStyle = 'black'; | ||||
|           ctx.font = '15px monospace'; | ||||
|           ctx.fillText(specstr, width/2-specstr.length*8, 50); | ||||
|           ctx.textAlign = 'center'; | ||||
|           ctx.fillText(specstr, width/2, 25); | ||||
|         } | ||||
| 
 | ||||
|           if(leftY > height-cube_height || leftY < 0) | ||||
|             leftV = 0; | ||||
|           if(rightY > height-cube_height || rightY < 0) | ||||
|             rightV = 0; | ||||
|           if(leftY < 0 )  leftY = 0; | ||||
|           if(rightY < 0 ) rightY = 0; | ||||
|           if(leftY > height-cube_height)  leftY = height-cube_height; | ||||
|           if(rightY > height-cube_height) rightY = height-cube_height; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         /** Draw Cube **/ | ||||
|         /** Note: Get position by multiplying it with the "Render-Delta" - for same speed on every system **/ | ||||
| 
 | ||||
|           leftY -= leftV*Math.round((1*delta)*60*speed); | ||||
|           rightY -= rightV*Math.round((1*delta)*60*speed); | ||||
|           // console.log(leftV*delta*60*cube_speed); | ||||
|           // leftY -= leftV*delta*60*cube_speed; | ||||
|           // rightY -= rightV*delta*60*cube_speed; | ||||
|           // NOTE Server is calcualating Position -> Client is only drawing | ||||
| 
 | ||||
| 
 | ||||
|         ctx.fillStyle = leftColor; | ||||
|  | @ -203,61 +221,66 @@ | |||
|         ctx.fillStyle = rightColor; | ||||
|         ctx.fillRect(width-cube_width, rightY, cube_width, cube_height); | ||||
| 
 | ||||
|         /** Move Ball with Paddle if owned by owner (@roundstart) **/ | ||||
|         if(ball_owner == 1){ | ||||
|           ballX = cube_width+ball_size, | ||||
|           ballY = leftY+cube_height/2; | ||||
|         } | ||||
|         else if(ball_owner == 2){ | ||||
|           ballX = width-cube_width-ball_size, | ||||
|           ballY = rightY+cube_height/2; | ||||
|         } | ||||
| 
 | ||||
|         /** ############ **/ | ||||
|         /** Ball Physics **/ | ||||
|         /** ############ **/ | ||||
| 
 | ||||
|         /** Collide with right Paddle  or get point and respawn **/ | ||||
|         if(ballX > width - cube_width){ | ||||
|           if(ballY < rightY || ballY > rightY+cube_height){ | ||||
|             console.log('Point for Left'); | ||||
|             ball_VX = 0; | ||||
|             ball_VY = 0; | ||||
|             ball_owner = 1; | ||||
|           } else { | ||||
|               var intersect = ((rightY+cube_height/2)-ballY)/(cube_height/2); | ||||
|               console.log(intersect); | ||||
|               ball_VX = -ball_speed*Math.cos(intersect*ball_maxAngle); | ||||
|               ball_VY = -ball_speed*Math.sin(intersect*ball_maxAngle); | ||||
|           } | ||||
|         } | ||||
| 
 | ||||
|         /** Collide with left Paddle  or get point and respawn **/ | ||||
|         if(ballX < cube_width){ | ||||
|           if(ballY < leftY || ballY > leftY+cube_height){ | ||||
|             console.log('Point for Right'); | ||||
|             ball_VX = 0; | ||||
|             ball_VY = 0; | ||||
|             ball_owner = 2; | ||||
|           } else { | ||||
|               var intersect = ((leftY+cube_height/2)-ballY)/(cube_height/2); | ||||
|               console.log(intersect); | ||||
|               ball_VX = ball_speed*Math.cos(intersect*ball_maxAngle); | ||||
|               ball_VY = ball_speed*Math.sin(intersect*ball_maxAngle); | ||||
|           } | ||||
|         } | ||||
| 
 | ||||
|         /** TODO INCREASE SPEED ON PADDLE HIT (weiter außen = schneller) **/ | ||||
| 
 | ||||
|         /** Collide with walls **/ | ||||
|         if(ballY <= 0 || ballY >= height-ball_size){ | ||||
|           ball_VY = -ball_VY; | ||||
|         } | ||||
|         // /** Move Ball with Paddle if owned by owner (@roundstart) **/ | ||||
|         // if(ball_owner == 1){ | ||||
|         //   ballX = cube_width+ball_size, | ||||
|         //   ballY = leftY+cube_height/2; | ||||
|         // } | ||||
|         // else if(ball_owner == 2){ | ||||
|         //   ballX = width-cube_width-ball_size, | ||||
|         //   ballY = rightY+cube_height/2; | ||||
|         // } | ||||
|         // | ||||
|         // /** ############ **/ | ||||
|         // /** Ball Physics **/ | ||||
|         // /** ############ **/ | ||||
|         // | ||||
|         // /** Collide with right Paddle  or get point and respawn **/ | ||||
|         // if(ballX > width - cube_width){ | ||||
|         //   if(ballY < rightY || ballY > rightY+cube_height){ | ||||
|         //     console.log('Point for Left'); | ||||
|         //     ball_VX = 0; | ||||
|         //     ball_VY = 0; | ||||
|         //     ball_owner = 1; | ||||
|         //   } else { | ||||
|         //       var intersect = ((rightY+cube_height/2)-ballY)/(cube_height/2); | ||||
|         //       console.log('Intersect with right at:'); | ||||
|         //       console.log(intersect); | ||||
|         //       console.log('###########################'); | ||||
|         //       ball_VX = -ball_speed*Math.cos(intersect*ball_maxAngle); | ||||
|         //       ball_VY = -ball_speed*Math.sin(intersect*ball_maxAngle); | ||||
|         //   } | ||||
|         // } | ||||
|         // | ||||
|         // /** Collide with left Paddle  or get point and respawn **/ | ||||
|         // if(ballX < cube_width){ | ||||
|         //   if(ballY < leftY || ballY > leftY+cube_height){ | ||||
|         //     console.log('Point for Right'); | ||||
|         //     ball_VX = 0; | ||||
|         //     ball_VY = 0; | ||||
|         //     ball_owner = 2; | ||||
|         //   } else { | ||||
|         //       var intersect = ((leftY+cube_height/2)-ballY)/(cube_height/2); | ||||
|         //       console.log('Intersect with left at:'); | ||||
|         //       console.log(intersect); | ||||
|         //       console.log('###########################'); | ||||
|         //       ball_VX = ball_speed*Math.cos(intersect*ball_maxAngle); | ||||
|         //       ball_VY = ball_speed*Math.sin(intersect*ball_maxAngle); | ||||
|         //   } | ||||
|         // } | ||||
|         // | ||||
|         // /** TODO INCREASE SPEED ON PADDLE HIT (weiter außen = schneller) **/ | ||||
|         // | ||||
|         // /** Collide with walls **/ | ||||
|         // if(ballY <= 0 || ballY >= height-ball_size){ | ||||
|         //   ball_VY = -ball_VY; | ||||
|         //   console.log(ballX + ' : ' + ballY); | ||||
|         // } | ||||
| 
 | ||||
|         /** Draw Ball **/ | ||||
|         ctx.fillStyle = 'black'; | ||||
|         ballX += Math.round((1*delta)*60)*ball_VX; | ||||
|         ballY += Math.round((1*delta)*60)*ball_VY; | ||||
|         // ballX += Math.round((1*delta)*60)*ball_VX; | ||||
|         // ballY += Math.round((1*delta)*60)*ball_VY; | ||||
|         ctx.beginPath(); | ||||
|         ctx.arc(ballX, ballY, ball_size, 0, 2*Math.PI); | ||||
|         ctx.fill(); | ||||
|  | @ -299,7 +322,7 @@ | |||
|             case 37 : | ||||
|             case 39 : | ||||
|             case 65 : | ||||
|             case 68 : if(ball_owner != pid)break; shootBall(); break; | ||||
|             case 68 : if(ball_owner != pid)break; if(ball_owner == 1) socket.emit('ballshoot', leftY); else if(ball_owner == 2) socket.emit('ballshoot', rightY); break; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
|  | @ -343,32 +366,34 @@ | |||
| 
 | ||||
| 
 | ||||
|       function setV(pos, val){ | ||||
|         console.log(leftY); | ||||
|         var time = Date.now(); | ||||
|         if(pos == 1){ | ||||
|           leftV = val; | ||||
|           if(!localcoop) | ||||
|             socket.emit('vchange', pos, val, leftY); | ||||
|             socket.emit('vchange', pos, val, leftY, time); | ||||
|         } | ||||
|         if(pos == 2){ | ||||
|           rightV = val; | ||||
|           if(!localcoop) | ||||
|             socket.emit('vchange', pos, val, rightY); | ||||
|             socket.emit('vchange', pos, val, rightY, time); | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       function shootBall(sync = true) { | ||||
|         /** TODO Tewak and Add MAX_Speed **/ | ||||
|         if(ball_owner == 1){ | ||||
|           ball_VX = ball_speed; | ||||
|           if(!localcoop && sync) | ||||
|             socket.emit('ballshoot', leftY); | ||||
|         } | ||||
|         else if(ball_owner == 2){ | ||||
|           ball_VX = -ball_speed; | ||||
|           if(!localcoop && sync) | ||||
|             socket.emit('ballshoot', rightY); | ||||
|         } | ||||
|         ball_owner = 0; | ||||
|       function shootBall() { | ||||
|         // console.log('### Ball shoot event ###'); | ||||
|         // /** TODO Tewak and Add MAX_Speed **/ | ||||
|         // if(ball_owner == 1){ | ||||
|         //   ball_VX = ball_speed; | ||||
|         //   console.log('owner: left  - at:' + leftY); | ||||
|         // | ||||
|         // } | ||||
|         // else if(ball_owner == 2){ | ||||
|         //   ball_VX = -ball_speed; | ||||
|         //   console.log('owner: right  - at:' + rightY); | ||||
|         //   if(!localcoop) | ||||
|         //     socket.emit('ballshoot', rightY); | ||||
|         // } | ||||
|         // ball_owner = 0; | ||||
|       } | ||||
| 
 | ||||
|       function animloop() { | ||||
|  |  | |||
							
								
								
									
										254
									
								
								index.js
									
										
									
									
									
								
							
							
						
						
									
										254
									
								
								index.js
									
										
									
									
									
								
							|  | @ -6,33 +6,52 @@ app.get('/', function(req, res){ | |||
|   res.sendFile(__dirname + '/index.html'); | ||||
| }); | ||||
| 
 | ||||
| var sockets = []; | ||||
| var gameState = 0; | ||||
| var width, height; | ||||
| var startinterval; | ||||
| /** Parameters **/ | ||||
| var clients = [],  // List of all conected clients
 | ||||
|     players = [],  // Store Player 1 and Player 2 in Array {Player1 == players[0]}
 | ||||
|     gameState = 0, // Game-Controler Variable
 | ||||
|     width, height, // Final Width + Height of Game-Window
 | ||||
|     startinterval, // Interval for Counting down (cancelable)
 | ||||
|     calcPos, | ||||
|     score = [0,0]; | ||||
| 
 | ||||
| /** Game-Config **/ | ||||
| var cube_width = 50, | ||||
|     cube_height = 200, | ||||
|     speed = 7; | ||||
|     cube_speed = 7; // Depending on 'tickrate' [cube_speed*tickrate == acutal Speed]
 | ||||
| 
 | ||||
| /** Networking-Config **/ | ||||
| var tickrate = 20; | ||||
| 
 | ||||
| 
 | ||||
| /** Ball-Config **/ | ||||
| var ball_size = 15, | ||||
|     ball_speed = 15, | ||||
|     ballX = cube_width+ball_size, | ||||
|     ballY = cube_height/2, | ||||
|     ball_owner = 1, | ||||
|     ball_VX = 0, | ||||
|     ball_VY = 0, | ||||
|     ball_maxAngle = 5*Math.PI/12; | ||||
| 
 | ||||
| /** ########## **/ | ||||
| /** CONNECTION **/ | ||||
| /** ########## **/ | ||||
| io.on('connection', function(socket){ | ||||
|   var id = sockets.length + 1; | ||||
|   if(sockets.length == 1) | ||||
|     if(sockets[0].id == 2) id = 1; | ||||
|   var clientkey = sockets.push(new Client(id, socket)) - 1; | ||||
|   /** Set ID for User **/ | ||||
|   var id = clients.length + 1; | ||||
|   if(clients.length == 1) | ||||
|     if(clients[0].id == 2) id = 1; | ||||
|   var clientkey = clients.push(new Client(id, socket)) - 1; | ||||
|   console.log('Client connected. ID=' + id); | ||||
| 
 | ||||
|   /** ######### **/ | ||||
|   /** HANDSHAKE **/ | ||||
|   /** ######### **/ | ||||
|   socket.emit('handshake', id, gameState, cube_width, cube_height, speed, function(w, h){ // Callback function for 1st Client to set screen size //
 | ||||
|     sockets[clientkey].width = w; | ||||
|     sockets[clientkey].height = h; | ||||
|     if(sockets.length > 1 && gameState == 0) setUp(socket); | ||||
|   socket.emit('handshake', id, gameState, cube_width, cube_height, cube_speed, score, function(w, h){ // Callback function for 1st Client to set screen size //
 | ||||
|     clients[clientkey].width = w; | ||||
|     clients[clientkey].height = h; | ||||
|     if(clients.length > 1 && gameState == 0) setUp(socket); | ||||
|   }); | ||||
| 
 | ||||
| if(gameState > 0) socket.emit('size', width, height); | ||||
|  | @ -43,18 +62,60 @@ if(gameState > 0) socket.emit('size', width, height); | |||
|     fn(Date.now()); | ||||
|   }); | ||||
| 
 | ||||
|   /** #### **/ | ||||
|   /** ######### **/ | ||||
|   /** Ballshoot **/ | ||||
|   /** ### **/ | ||||
|   /** ######### **/ | ||||
|   socket.on('ballshoot', function(y){ | ||||
|     socket.broadcast.emit('shootball', y); | ||||
|     // shottball event obsolet
 | ||||
|     // socket.emit('shootball', y);
 | ||||
|     // socket.broadcast.emit('shootball', y);
 | ||||
| 
 | ||||
|     console.log('### Ball shoot event ###'); | ||||
|     if(ball_owner == 1){ | ||||
|       ball_VX = ball_speed; | ||||
|       console.log('owner: left  - at:' + players[0].y); | ||||
| 
 | ||||
|     } | ||||
|     else if(ball_owner == 2){ | ||||
|       ball_VX = -ball_speed; | ||||
|       console.log('owner: right  - at:' + players[1].y); | ||||
|     } | ||||
|     ball_owner = 0; | ||||
|   }); | ||||
| 
 | ||||
|   /** ################ **/ | ||||
|   /** Paddel V-Change **/ | ||||
|   /** ############## **/ | ||||
|   socket.on('vchange', function(pos, val, y){ | ||||
|     socket.broadcast.emit('changeV', pos, val, y); | ||||
|   socket.on('vchange', function(pos, val, y, timestamp){ | ||||
|     var timediff = Date.now()-timestamp; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     // console.log('INTERPOLATING...');
 | ||||
| 
 | ||||
|     // var diff = ((players[pos-1].speed/tickrate)*timediff);
 | ||||
|     // if(players[pos-1].vY == 0){ // Lag from Sender (accel)
 | ||||
|     //   if(val > 0)
 | ||||
|     //     players[pos-1].y -= diff;
 | ||||
|     //   if(val < 0)
 | ||||
|     //     players[pos-1].y += diff;
 | ||||
|     // }
 | ||||
|     // if(players[pos-1].vY == 1){
 | ||||
|     //   if(val == 0)
 | ||||
|     //     players[pos-1].y += diff;
 | ||||
|     // }
 | ||||
|     // if(players[pos-1].vY == -1){
 | ||||
|     //   if(val == 0)
 | ||||
|     //     players[pos-1].y -= diff;
 | ||||
|     // }
 | ||||
| 
 | ||||
|     players[pos-1].vY = val; | ||||
| 
 | ||||
|     // console.log('Diff:' + diff);
 | ||||
|     // console.log('Got: ' + y + ' @ ' + timestamp);
 | ||||
|     // console.log('Expected:' + players[pos-1].y + ' @ ' + Date.now());
 | ||||
|     socket.emit('changeV', pos, val, players[pos-1].y); | ||||
|     socket.broadcast.emit('changeV', pos, val, players[pos-1].y); | ||||
|   }); | ||||
| 
 | ||||
|   /** ########## **/ | ||||
|  | @ -62,17 +123,17 @@ if(gameState > 0) socket.emit('size', width, height); | |||
|   /** ########## **/ | ||||
|   socket.on('disconnect', function(){ | ||||
|     var index; | ||||
|     sockets.forEach(function(sock, ind){ | ||||
|     clients.forEach(function(sock, ind){ | ||||
|       if (sock.socket == socket){ | ||||
|           index = ind; | ||||
|           return; | ||||
|       } | ||||
|     }); | ||||
|     var oldid = sockets[index].id; | ||||
|     sockets.splice(index, 1); | ||||
|     var oldid = clients[index].id; | ||||
|     clients.splice(index, 1); | ||||
|     console.log('Client disconnected. ID=' + (oldid+1)); | ||||
|     if(sockets.length == 1){ | ||||
|       sockets[0].socket.emit('test', 'player_left'); //TODO win-event
 | ||||
|     if(clients.length == 1){ | ||||
|       clients[0].socket.emit('test', 'player_left'); //TODO win-event
 | ||||
|       console.log('Only one Player left. Sending win-event'); | ||||
|       // Debug Restart:
 | ||||
|       gameState = 0; | ||||
|  | @ -80,7 +141,7 @@ if(gameState > 0) socket.emit('size', width, height); | |||
|       broadcastGameState(socket); | ||||
|       return; | ||||
|     } | ||||
|     else if(sockets.length == 0){ | ||||
|     else if(clients.length == 0){ | ||||
|       console.log('All Players left. Reseting lobby...'); | ||||
|       gameState = 0; | ||||
|       id = 0; | ||||
|  | @ -88,10 +149,10 @@ if(gameState > 0) socket.emit('size', width, height); | |||
|     } | ||||
| 
 | ||||
|     var key = 0; | ||||
|     if(sockets[0].id == 1 || sockets[0].id == 2) key = 1; | ||||
|     if(clients[0].id == 1 || clients[0].id == 2) key = 1; | ||||
|     switch(oldid){ | ||||
|       case 1 : sockets[key].id = 1; sockets[key].socket.emit('handshake', 1); console.log('New Player 1 selected.'); setUp(); break; | ||||
|       case 2 : sockets[key].id = 2; sockets[key].socket.emit('handshake', 2); console.log('New Player 2 selected.'); setUp(); break; | ||||
|       case 1 : clients[key].id = 1; clients[key].socket.emit('handshake', 1); console.log('New Player 1 selected.'); setUp(); break; | ||||
|       case 2 : clients[key].id = 2; clients[key].socket.emit('handshake', 2); console.log('New Player 2 selected.'); setUp(); break; | ||||
|       default : console.log('Spectator left. Nothing need to select new Players.'); break; | ||||
| 
 | ||||
|     } | ||||
|  | @ -103,16 +164,20 @@ http.listen(3000, function(){ | |||
|   console.log('listening on *:3000'); | ||||
| }); | ||||
| 
 | ||||
| 
 | ||||
| /** Sync all settings to client and start the game **/ | ||||
| function setUp(socket){ | ||||
|   gameState = 1; | ||||
|   broadcastGameState(socket); | ||||
|   console.log('Starting SetUp...'); | ||||
|   /** Select smalest screensize and set for all clients **/ | ||||
|   sockets.forEach(function(sock){ | ||||
|   clients.forEach(function(sock){ | ||||
|     broadcastGameState(socket); | ||||
|     if(sock.id == 1) | ||||
|       sockets.forEach(function(sock2){ | ||||
|     if(sock.id == 1){ | ||||
|       players[0] = new Player(sock.id, sock.socket); | ||||
|       clients.forEach(function(sock2){ | ||||
|         if(sock2.id == 2){ | ||||
|           players[1] = new Player(sock2.id, sock2.socket); | ||||
|           if(sock.width < sock2.width) | ||||
|             width = sock.width; | ||||
|           else | ||||
|  | @ -123,7 +188,10 @@ function setUp(socket){ | |||
|             height = sock2.height; | ||||
|           } | ||||
|       }); | ||||
|     } | ||||
|   }); | ||||
|   if(calcPos == null) // Start tick Server only once
 | ||||
|     tickServer(); | ||||
|   socket.emit('size', width, height); | ||||
|   socket.broadcast.emit('size', width, height); | ||||
|   var i = 5; | ||||
|  | @ -132,6 +200,7 @@ function setUp(socket){ | |||
|     socket.emit('countdown', i); | ||||
|     socket.broadcast.emit('countdown', i); | ||||
|     if(i == 0){ | ||||
|       resetPlayers(); | ||||
|       clearInterval(startinterval); | ||||
|       gameState = 2; | ||||
|       broadcastGameState(socket); | ||||
|  | @ -141,14 +210,139 @@ function setUp(socket){ | |||
|   }, 1000); | ||||
| } | ||||
| 
 | ||||
| /** Broadcast GameState to all clients **/ | ||||
| function broadcastGameState(socket){ | ||||
|   socket.emit('gamestate', gameState); | ||||
|   socket.broadcast.emit('gamestate', gameState); | ||||
| } | ||||
| 
 | ||||
| function tickServer(){ | ||||
|   calcPos = setInterval(function(){ | ||||
|     calculatePlayerPosition(); | ||||
|     calculateBallPosition(); | ||||
|   }, tickrate); | ||||
| } | ||||
| 
 | ||||
| function calculatePlayerPosition(){ | ||||
|   players.forEach(function(player){ | ||||
|     player.y -= player.vY*player.speed; | ||||
|     if(player.y > height-player.height || player.y < 0) player.vY = 0; | ||||
|     if(player.y < 0) player.y = 0; | ||||
|     if(player.y > height-player.height) player.y = height-player.height; | ||||
|     player.socket.emit('changeV', player.id, player.vY, player.y); | ||||
|     player.socket.broadcast.emit('changeV', player.id, player.vY, player.y); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function calculateBallPosition(){ | ||||
| 
 | ||||
|   /** Move Ball with Paddle if owned by owner (@roundstart) **/ | ||||
|   if(ball_owner == 1){ | ||||
|     ballX = cube_width+ball_size, | ||||
|     ballY = players[0].y+cube_height/2; | ||||
|   } | ||||
|   else if(ball_owner == 2){ | ||||
|     ballX = width-cube_width-ball_size, | ||||
|     ballY = players[1].y+cube_height/2; | ||||
|   } | ||||
| 
 | ||||
|   /** ############ **/ | ||||
|   /** Ball Physics **/ | ||||
|   /** ############ **/ | ||||
| 
 | ||||
|   ballX += ball_VX; | ||||
|   ballY += ball_VY; | ||||
| 
 | ||||
|   /** Collide with right Paddle  or get point and respawn **/ | ||||
|   if(ballX > width - cube_width){ | ||||
|     if(ballY < players[1].y || ballY > players[1].y+cube_height){ | ||||
|       console.log('Point for Left'); | ||||
|       changeScore(1, score[0]+1); | ||||
|       ball_VX = 0; | ||||
|       ball_VY = 0; | ||||
|       ball_owner = 1; | ||||
|     } else { | ||||
|       var intersect = ((players[1].y+cube_height/2)-ballY)/(cube_height/2); | ||||
|       console.log('Intersect with right at:'); | ||||
|       console.log(intersect); | ||||
|       console.log('###########################'); | ||||
|       ball_VX = -ball_speed*Math.cos(intersect*ball_maxAngle); | ||||
|       ball_VY = -ball_speed*Math.sin(intersect*ball_maxAngle); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** Collide with left Paddle  or get point and respawn **/ | ||||
|   if(ballX < cube_width){ | ||||
|     if(ballY < players[0].y || ballY > players[0].y+cube_height){ | ||||
|       console.log('Point for Right'); | ||||
|       changeScore(2, score[1]+1); | ||||
|       ball_VX = 0; | ||||
|       ball_VY = 0; | ||||
|       ball_owner = 2; | ||||
|     } else { | ||||
|       var intersect = ((players[0].y+cube_height/2)-ballY)/(cube_height/2); | ||||
|       console.log('Intersect with left at:'); | ||||
|       console.log(intersect); | ||||
|       console.log('###########################'); | ||||
|       ball_VX = ball_speed*Math.cos(intersect*ball_maxAngle); | ||||
|       ball_VY = ball_speed*Math.sin(intersect*ball_maxAngle); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** TODO INCREASE SPEED ON PADDLE HIT (weiter außen = schneller) **/ | ||||
| 
 | ||||
|   /** Collide with walls **/ | ||||
|   if(ballY <= 0 || ballY >= height-ball_size){ | ||||
|     ball_VY = -ball_VY; | ||||
|     console.log(ballX + ' : ' + ballY); | ||||
|   } | ||||
| 
 | ||||
|   var data = { | ||||
|     x     : ballX, | ||||
|     y     : ballY, | ||||
|     vx    : ball_VX, | ||||
|     vy    : ball_VY, | ||||
|     speed : ball_speed, | ||||
|     owner : ball_owner | ||||
|   }; | ||||
|   players[0].socket.emit('ballpos', data); | ||||
|   players[0].socket.broadcast.emit('ballpos', data); | ||||
| } | ||||
| 
 | ||||
| function changeScore(id, val){ | ||||
|   score[id-1] = val; | ||||
|   players[0].socket.emit('scoreChange', score); | ||||
|   players[0].socket.broadcast.emit('scoreChange', score); | ||||
| } | ||||
| 
 | ||||
| function resetPlayers(){ | ||||
|   players.forEach(function(player){ | ||||
|     player.speed = cube_speed; | ||||
|     player.width = cube_width; | ||||
|     player.height = cube_height; | ||||
|     player.y = 0; | ||||
|     player.vY = 0; | ||||
|     changeScore(player.id-1, 0); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function resetServer(){ | ||||
|   // TODO
 | ||||
| } | ||||
| 
 | ||||
| function Client(id, socket){ | ||||
|   this.id = id; | ||||
|   this.socket = socket; | ||||
|   this.width = 0; | ||||
|   this.height = 0; | ||||
| } | ||||
| 
 | ||||
| function Player(id, socket){ | ||||
|   this.id = id; | ||||
|   this.socket = socket; | ||||
|   this.speed = cube_speed; | ||||
|   this.width = cube_width; | ||||
|   this.height = cube_height; | ||||
|   this.y = 0; | ||||
|   this.vY = 0; | ||||
| } | ||||
|  |  | |||
		Reference in a new issue