Upload
chris-schalk
View
4.641
Download
0
Tags:
Embed Size (px)
DESCRIPTION
This is a presentation given by Googlers Chris Schalk and Johan Euphrosine (Proppy) at GDD Sydney 2011 on how to build multi-platform video games using PlayN.
Citation preview
How to Build Kick Ass Games in the Cloud
Christian SchalkGoogle Developer Advocate
With special guest speaker, Proppy!
About the Speaker
Christian Schalk
Day Job● Developer Advocate for Google's Cloud Technology
○ App Engine, Google Storage, Prediction API, BigQuery ...
● Mostly Server-Side Java Background○ "JavaServer Faces: The Complete Reference" Co-Author
● Haven't developed video games since the Commodore-64!
Yes, I'm old school ;-)
Agenda
● PlayN Technology● Hands on with PlayN
○ Getting Started○ Building a game from scratch w/ Proppy
● Deploying your game to the cloud● Setting up an RPC mechanism● Integrating w/ Google Plus ● Summary
First, Some Questions...
● Thinking of building a game for the Web?○ Would you use Flash?○ or HTML5?
● What if you wanted to port your game to Mobile?○ Do you need an entirely separate code base?
?
● Thinking of building a game for the Web?○ Would you use Flash?○ or HTML5?○ Answer: Doesn't Matter!! Can do both!
● What if you wanted to port your game to Mobile?○ Do you need an entirely separate code base?○ Answer: NO!
First, Some Questions... ?
● Thinking of building a game for the Web?○ Would you use Flash?○ or HTML5?○ Answer: Doesn't Matter!! Can do both!
● What if you wanted to port your game to Mobile?○ Do you need an entirely separate code base?○ Answer: NO!
First, Some Questions... ?
How is this Possible!??
Introducing PlayN!!
One Game.Many Platforms.
Formerly known as "ForPlay"
What is PlayN?
● An open source technology for building cross-platform games
● Core game code is platform agnostic
● Develop games in Java○ Familiar language/toolset
● Leverages Google Web Toolkit○ Compiles to JS/HTML5, (among other platforms)
● Free and Open Source (alpha)○ http://code.google.com/p/playn
PlayN API Structure
Implementations for Java, HTML5(GWT/JS), Android, Flash
PlayN API
Flash impl.
Components of PlayN
Fully generic gaming components. Core game logic is fully platform independent!
Extend PlayN.Game PlayN.*
PlayN Cross Platform Magic
● Game uses core PlayN abstractions, is unaware of which platform is running
● The only platform-specific code is in the entry point for each platform:
PlayN.run(new MyGame()); PlayN.run(new MyGame());
Other PlayN Benefits
● Built-in physics engine based on proven OpenSource technologies
● Box2D○ C++ 2D Physics engine by Erin Catto
● JBox2D○ A port of Box2D from C++ to Java
● GWTBox2D○ A port of JBox2D from Java to JavaScript
Benefits of GWT Abstraction
● GWT Compiler optimizes code for size○ Removes unused code○ Evaluates when possible at compile time○ Heavily obfuscated result code
● Smaller compiled code - faster load time
● Optimized caching, avoids unnecessary network IO
The PlayN Game Loop
public class MyGame implements Game { public void init() { // initialize game. } public void update(float delta) { // update world. } public void paint(float alpha) { // render world. } }
Similar to other gaming platforms
PlayN Rendering
// Resize to the available resolution on the current device.graphics().setSize( graphics().screenWidth(), graphics().screenHeight());// Keep the same aspect ratio.float sx = graphics().screenWidth() / (float) WIDTH;float sy = graphics().screenHeight() / (float) HEIGHT;
// Fit to the available screen without stretching.graphics().rootLayer().setScale(Math.min(sx, sy));
Can easily with different screen parameters
PlayN Drawing API
PlayN Layer System
Layer Types
● Layers have distinct sizes and transforms● Used to optimize
IO System: Platform Abstractions
● Pointer○ Most general screen event○ Works everywhere
● Mouse○ Left, right, mid buttons & wheel
● Touch○ Pressure, size, multitouch
IO System: Input Devices
pointer().setListener(new Pointer.Adapter() { public void onPointerStart(Pointer.Event event) { // Handle mouse down event. } // ...Same pattern for onPointerEnd, onPointerDrag});
keyboard().setListener(new Keyboard.Adapter() { public void onKeyDown(Event event) { // Handle key down event. } // ... Same pattern for onKeyUp});
Asset Management
public interface AssetManager {
Image getImage(String path); Sound getSound(String path); void getText(String path, ResourceCallback callback); boolean isDone(); int getPendingRequestCount();}
Agenda
● PlayN Technology● Hands on with PlayN
○ Getting Started○ Building a game from scratch w/ Proppy
● Deploying your game to the cloud● Setting up an RPC mechanism● Integrating w/ Google Plus ● Summary
Requirements for getting started with PlayN
● Core Requirements○ Java 6 SDK○ Apache Ant○ Maven○ App Engine SDK○ Android SDK
● Requirements with Eclipse○ Eclipse IDE Indigo 3.7 (Or earlier version w/
Maven)○ Google Plugin for Eclipse○ Android Plugin for Eclipse
Building/Installing PlayN
● PlayN 1.0 is now available in Maven Central!○ Wiki will be updated soon, but can simply create a Maven project
● Or can clone a copy of PlayN○ git clone https://code.google.com/p/playn
● Then...○ cd playn (directory where your copy is location)○ mvn install (or 'ant install')
● Running 'showcase' sample app with Mvn○ cd playn/sample/showcase/core○ mvn compile exec:java
● Running 'showcase' sample app with Ant○ cd playn/sample/showcase○ ant run-java
Building a new project in PlayN
● From the command line:○ mvn archetype:generate -DarchetypeGroupId=com.googlecode.playn
-DarchetypeArtifactId=playn-archetype○ ...
● From Eclipse○ Select File → New → Project..., then select Maven →
Maven Project in the dialog that pops up, then click Next.
■ Click Next again unless you wish to specify a custom workspace location.■ Check Include snapshot archetypes in the dialog and then double click
on the playn-archetype in the list of archetypes○ ...
Demo: Building a new Game in PlayN
Agenda
● PlayN Technology● Hands on with PlayN
○ Getting Started○ Building a game from scratch w/ Proppy
■ http://proppy-playn101.appspot.com/● Deploying your game to the cloud● Setting up an RPC mechanism● Integrating w/ Google Plus ● Summary
Agenda
● PlayN Technology● Hands on with PlayN
○ Getting Started○ Building a game from scratch w/ Proppy
● Deploying your game to the cloud● Setting up an RPC mechanism● Integrating w/ Google Plus ● Summary
Deploy your HTML project to the Cloud
● For Google App Engine Deployment, you can easily convert the project to an App Engine Project
Deploy your HTML project to the Cloud
● After converting your HTML project to an App Engine project you will have to do...
● Add a 'WEB-INF/lib/appengine-web.xml' file○ Note: Click 'Quick Fix' in the Errors console of
Eclipse
● Before deployment make sure your 'WEB-INF/lib' has the necessary runtime App Engine jar files.
Agenda
● PlayN Technology● Hands on with PlayN
○ Getting Started○ Building a game from scratch w/ Proppy
● Deploying your game to the cloud● Setting up an RPC mechanism● Integrating w/ Google Plus ● Summary
Setting up an RPC mechanism
● Building your client code○ You can use PlayN's Net().Post() call to send data to
a server
● Building Your Server○ PlayN comes with a preliminary Server example
code that uses Jetty■ Is not needed if deploying to App Engine■ Instead, you can implement your own server by
adding an HttpServlet to your project■ Have it implement the doPost() method■ Can map it to url: '/rpc' in web.xml
Setting up an RPC mechanism● Example: A client method to persist a score
private void postScore(String payload) { net().post("/rpc", payload, new Callback<String>() { @Override public void onSuccess(String response) { // TODO } @Override public void onFailure(Throwable error) { // TODO } }); }
Setting up an RPC mechanism● Example: Server method to persist score sent from client
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String payload = readFully(req.getReader()); Json.Object data = json().parse(payload); String score = data.getString("score"); if (score != null){ persistScore(score, id); } }private void persistScore(String score) {...}
Agenda
● PlayN Technology● Hands on with PlayN
○ Getting Started○ Building a game from scratch w/ Proppy
● Deploying your game to the cloud● Setting up an RPC mechanism● Integrating w/ Google Plus ● Summary
Integrating your game with Google+
Visit http://developers.google.com/+
Download the Java Starter App
Integrating your game with GooglePlus
Sample Starter App contains...
● README.txt with steps on:○ Visiting https://code.google.com/apis/console to
enable Google Plus API access for your app ■ To generate your
■ oauth_client_id, ■ oauth_client_secret,■ google_api_key
● Sample Java classes to redirect game users for OAuth authentication
Integrating your game with GooglePlus
To access GooglePlus profile data..
Person profile;
try { profile = plus.people.get("me").execute(); } catch (HttpResponseException e) { log.severe(Util.extractError(e)); return; }
Integrating your game with GooglePlus
Accessing GooglePlus profile data in a JSP page...
<a href="<%= profile.getUrl() %>">
<img src="<%= profile.getImage().getUrl() %>?sz=100"/></a>Welcome, <%= profile.getDisplayName() %>
Demo: Introducing 'Cloud Warrior'
Google Storage
Game Assets(images/sounds)
Game ScoresProfile Data
App Engine
http://ae-cloudwarrior.appspot.com
PlayN Summary
● Open source, cross-platform game abstraction layer○ Core game logic is platform agnostic
● ForPlay abstracts away the core components of a game○ The game loop, I/O system, and asset management
● Write in familiar Java, get performance on multiple platforms
○ Superior Java development/debug○ GWT allows compilation to fast JavaScript/HTML5
● Your assignment:○ Install PlayN and build a game! ○ http://code.google.com/p/playn/
Announcing the New PlayN Developer Site!
http://developers.google.com/playn/
Q&A
profiles.google.com/proppyprofiles.google.com/cschalk
Thank You!