30
Creating your own 3D Multiplayer Games Ashraf Samy Hegab Playir

Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Embed Size (px)

DESCRIPTION

More info and accompanying source code can be found here: http://blog.softwareispoetry.com/2013/09/campus-party-europe-getting-into-3d-and.html

Citation preview

Page 1: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Creating your own 3D

Multiplayer Games

Ashraf Samy Hegab

Playir

Page 2: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Hello

@playinrealtime

• 7 years games industry

• 3 years mobile r&d

• Playir

@ashcairo

Page 3: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

3D Multiplayer Multi-Platform Games

@playinrealtime

Page 4: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

@playinrealtime

Page 5: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

• Going 3D

• WebGL?

• How to draw a cube (source code dive)

• Movement

• Collision Detection

• Going Multiplayer

• WebSockets?

• How to move

• Going Forwards

Agenda

Page 6: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

WebGL?

Page 7: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

WebGL?

Tizen

Safari

Android

Internet

Explorer

Blackberry Firefox

Ubuntu

Chrome

Page 8: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Everything is a triangle

0, 1, 0

1, 1, 0-1, -1, 0

• Vertices

• UVs

• Indices

• Normals

Page 9: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

How to draw a cube

learningwebgl.com

Page 10: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

function drawScene()

{

gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);

gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);

mat4.identity(mvMatrix);

mat4.translate(mvMatrix, [x, y, z]);

mat4.rotate(mvMatrix, degToRad(xRot), [1, 0, 0]);

mat4.rotate(mvMatrix, degToRad(yRot), [0, 1, 0]);

gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);

gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,

cubeVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexTextureCoordBuffer);

gl.vertexAttribPointer(shaderProgram.textureCoordAttribute,

cubeVertexTextureCoordBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

setMatrixUniforms();

gl.activeTexture(gl.TEXTURE0);

gl.bindTexture(gl.TEXTURE_2D, crateTexture);

gl.uniform1i(shaderProgram.samplerUniform, 0);

gl.drawElements(gl.TRIANGLES, cubeVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);

}

Page 11: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

function drawScene()

{

gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);

gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);

mat4.identity(mvMatrix);

mat4.translate(mvMatrix, [x, y, z]);

mat4.rotate(mvMatrix, degToRad(xRot), [1, 0, 0]);

mat4.rotate(mvMatrix, degToRad(yRot), [0, 1, 0]);

gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);

gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,

cubeVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexTextureCoordBuffer);

gl.vertexAttribPointer(shaderProgram.textureCoordAttribute,

cubeVertexTextureCoordBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

setMatrixUniforms();

gl.activeTexture(gl.TEXTURE0);

gl.bindTexture(gl.TEXTURE_2D, crateTexture);

gl.uniform1i(shaderProgram.samplerUniform, 0);

gl.drawElements(gl.TRIANGLES, cubeVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);

}

•Setup view

•Position and rotate

•Set buffers

•Set texture

•Draw

Page 12: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

http://playir.com/x/phonewars

Phone Wars WebGL Demo

Page 13: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Movement

Page 14: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

TODO://

• Collisions

• Loading obj, fbx, 3ds…

• Helper libraries (three.js)

Var BasicBoxCollisionCheck = function(sourceMin, sourceMax, targetMin, targetMax)

{

if( sourceMax[2] >= targetMin[2] && sourceMin[2] <= targetMax[2] )

{

if( sourceMax[0] >= targetMin[0] && sourceMin[0] <= targetMax[0] )

{

if( sourceMax[1] >= targetMin[1] && sourceMin[1] <= targetMax[1] )

{

return true;

}

}

}

};

return false;

};

Page 15: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Going

Multiplayer

Page 16: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

WebSockets?

• TCP

• Persistent

• Bi-directional

• Not UDPvar exampleSocket = new WebSocket("ws://www.example.com/socketserver",

"protocol");

// On connect

exampleSocket.onopen = function (event) {

exampleSocket.send(“Send a message to the server");

};

// Receive message from server

exampleSocket.onmessage = function (event) {

console.log(event.data);

}

Page 17: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

SocketIO

NodeJS

WebGL

App

Popular Web Multiplayer Stack

MongoDB

Page 18: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

var socket = io.connect( serverURL );

socket.on( 'connected', function (userID)

{

socket.userID = userID;

});

function shootAt(thatDamnUserID)

{

socket.emit( 'shoot', thatDamnUserID );

}

How do I shoot? - Client

Page 19: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

var sockets = [];

var io = socketio.listen( port );

io.sockets.on( 'connection', function (socket)

{

sockets.push( socket );

var userID = nextUserID++;

socket.emit( 'connected', userID );

socket.on( 'shoot', function (atUserID) )

{

for( var i=0; i<sockets.length; ++i )

{

sockets[i].emit( 'shoot', userID, atUserID );

}

};

});

How do I shoot? - Server

Page 20: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Phone Wars

http://playir.com/x/phonewars

Page 21: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

TODO://

• Server side validation

• Load balancing

• Latency hacks

Page 22: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

HTML5 - IndexedDB

• 50mb+

• Is Slow

• Use a priority queue for your requests

• Timestamps lets you know which files to delete

var transaction = db.transaction( "cache", 'readwrite' );

var objectStore = transaction.objectStore( "cache" );

// Get an item via it's key

var index = objectStore.index( "key" );

var request = index.get( key );

request.onsuccess = function(event)

{

var item = event.target.result;

};

Page 23: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

HTML5 - WebWorkers

• Is Awesome!

• json.async (https://github.com/ashcairo/json.async)

• Separate file, use inline webworker

var blob = new Blob([

"self.addEventListener( 'message', function (e) { \

var json = JSON.parse( e.data ); \

self.postMessage( json ); \

self.close(); \

}, false );"]);

// Obtain a blob URL reference to our worker 'file'.

var blobURL = window.URL.createObjectURL( blob );

var worker = new Worker( blobURL );

Page 24: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Supporting HTML5 Platforms

• WebGL

• mediump precision most compatible

• IndexedDB

• Some devices require use of setVersion

• Some devices fail on use of setVersion

• Be ready to fallback to localStorage (~5mb)

Page 25: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Going Awesome

Page 26: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Going Awesome

Page 27: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Framework .js AppDevice

Supporting Hybrid Platforms

Renderer

Android

Renderer

iOS

Renderer

Engine

App

.js Proxy

WebView

Proxy

Renderer

WP8

Renderer

@playinrealtime

Page 28: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Live demo of Playir

http://playir.com

Page 29: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

Workshop 1 at 2-4pm

HamiltonKidd.co.uk

3der.co.uk

FoyzulHassan.com

APM-Designs.com

Me

Page 30: Campus Party Europe 2013 - Creating your own 3D Multiplayer Game

[email protected]

http://playir.com

@playinrealtime