Slide 1

Slide 1 text

http://mokapp.com

Slide 2

Slide 2 text

Emanuele Palazzetti ( Python backend developer ) @ palazzetti.me :: @palazzem:: github.com/palazzem

Slide 3

Slide 3 text

Powerup! Send your Android game to the next level

Slide 4

Slide 4 text

Physics/Game Engine...too hard!

Slide 5

Slide 5 text

Step back: are we talking about....games?!

Slide 6

Slide 6 text

It's all about market

Slide 7

Slide 7 text

Sell millions of copies and you'll become millionaire! - Anonymous -

Slide 8

Slide 8 text

I don't think so... I think it's all about a story you want to tell

Slide 9

Slide 9 text

How much is valuable your story? This is the hard part When you've found your story, you'll surely need some tools... ...great tools!

Slide 10

Slide 10 text

Google Play Game Services

Slide 11

Slide 11 text

Google Play Game Service Some perks (using Google+ sign-in): Leaderboards Achievements management Progress storage Anti piracy

Slide 12

Slide 12 text

Multiplayer games! Turn-based Real-time

Slide 13

Slide 13 text

Challenge a player

Slide 14

Slide 14 text

Players room

Slide 15

Slide 15 text

In-game gifts

Slide 16

Slide 16 text

About our "game"

Slide 17

Slide 17 text

Needed features Update our leaderboards Unlock some achievements Count incremental achievements Have a leaderboards Activity Have an achievements Activity

Slide 18

Slide 18 text

Game Core @Override public void onEnteredScore(int requestedScore) { int finalScore = mHardMode ? requestedScore / 2 : requestedScore; mWinFragment.setFinalScore(finalScore); mWinFragment.setExplanation(mHardMode ? getString(R.string.hard_mode_explanation) : getString(R.string.easy_mode_explanation)); // check for achievements checkForAchievements(requestedScore, finalScore); // update leaderboards updateLeaderboards(finalScore); // push those accomplishments to the cloud, if signed in pushAccomplishments(); // switch to the exciting "you won" screen switchToFragment(mWinFragment); }

Slide 19

Slide 19 text

Accomplishment Outbox class AccomplishmentsOutbox { boolean mPrimeAchievement = false; boolean mHumbleAchievement = false; boolean mLeetAchievement = false; boolean mArrogantAchievement = false; int mBoredSteps = 0; int mEasyModeScore = -1; int mHardModeScore = -1; boolean isEmpty() { return !mPrimeAchievement && !mHumbleAchievement && !mLeetAchievement && !mArrogantAchievement && mBoredSteps == 0 && mEasyModeScore < 0 && mHardModeScore < 0; } }

Slide 20

Slide 20 text

Check for achievements void checkForAchievements(int requestedScore, int finalScore) { // Check if each condition is met; if so, unlock the corresponding // achievement. if (isPrime(finalScore)) { mOutbox.mPrimeAchievement = true; achievementToast("Prime score"); } if (requestedScore == 9999) { mOutbox.mArrogantAchievement = true; achievementToast("Arrogant! (requested maximum score)"); } if (requestedScore == 0) { mOutbox.mHumbleAchievement = true; achievementToast("Humble! (requested 0 score)"); } if (finalScore == 1337) { mOutbox.mLeetAchievement = true; achievementToast("Clairvoyant"); } // Accumulator for incremental achievements mOutbox.mBoredSteps++; }

Slide 21

Slide 21 text

Update leaderboards void updateLeaderboards(int finalScore) { if (mHardMode && mOutbox.mHardModeScore < finalScore) { mOutbox.mHardModeScore = finalScore; } else if (!mHardMode && mOutbox.mEasyModeScore < finalScore) { mOutbox.mEasyModeScore = finalScore; } }

Slide 22

Slide 22 text

Push game status void pushAccomplishments() { if (!isSignedIn()) { // can't push to the cloud, so save locally mOutbox.saveLocal(this); return; } if (mOutbox.mPrimeAchievement) { Games.Achievements.unlock(getApiClient(), API_KEY); mOutbox.mPrimeAchievement = false; } if (mOutbox.mArrogantAchievement) { Games.Achievements.unlock(getApiClient(), API_KEY); mOutbox.mArrogantAchievement = false; } if (mOutbox.mHumbleAchievement) { Games.Achievements.unlock(getApiClient(), API_KEY); mOutbox.mHumbleAchievement = false; } if (mOutbox.mLeetAchievement) { Games.Achievements.unlock(getApiClient(), API_KEY);

Slide 23

Slide 23 text

Really? // Unlock an achievement Games.Achievements.unlock(getApiClient(), API_KEY); // Update a leaderboard Games.Leaderboards.submitScore(getApiClient(), API_KEY, SCORE); // Incremental achievements Games.Achievements.increment(getApiClient(), API_KEY, STEPS);

Slide 24

Slide 24 text

Ask game status @Override public void onShowAchievementsRequested() { if (isSignedIn()) { startActivityForResult( Games.Achievements.getAchievementsIntent(getApiClient()), REQUEST_CODE); } else { showAlert("Please sign in to view achievements"); } } @Override public void onShowLeaderboardsRequested() { if (isSignedIn()) { startActivityForResult( Games.Leaderboards.getAllLeaderboardsIntent(getApiClient()), REQUEST_CODE); } else { showAlert("Please sign in to view leaderboards"); } } Note: REQUEST_CODE is an arbitrary number used in whole app

Slide 25

Slide 25 text

We must obtain app and achievements ID! ReplaceMe ReplaceMe ReplaceMe ReplaceMe ReplaceMe ReplaceMe ReplaceMe ReplaceMe ReplaceMe ids.xml

Slide 26

Slide 26 text

Stop talking...hands-on! https://github.com/palazzem/android-gaming

Slide 27

Slide 27 text

SHA1 fingerprint of your debug key keytool -v -list -keystore Where you can find your debug key: ~/.android/ [Drive]\Users\[Username]\.android\

Slide 28

Slide 28 text

After some work we have our "game" ...but before publishing...

Slide 29

Slide 29 text

Beta testers needed!

Slide 30

Slide 30 text

Simply add Google+ emails

Slide 31

Slide 31 text

Game Over!