Reputation: 233
I would like to use achievement and leaderboards from Google Play Game Services API in my LibGDX Android Game. The only thing I've achieved is getting examples from Game Services developer website running. I've been trying to use this code in my project for many days and I still got nothing. I've also tried to follow this tutorial http://helios.hud.ac.uk/u1070589/blog/?p=202 but I don't have "main game class (the one that extends from ApplicationListener)" which is required in step 7. I've got only
This is onCreate method from MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
thingy=this;
RelativeLayout layout=new RelativeLayout(this);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
View gameView=initializeForView(new DogeJump(this),false);
adView=new AdView(this,AdSize.IAB_MRECT,"ca-app-pub-XXXXXXX363095/9011689567");
adView.loadAd(new AdRequest());
layout.addView(gameView);
RelativeLayout.LayoutParams adParams=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
adParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
layout.addView(adView,adParams);
setContentView(layout);
//initialize(new DogeJump(this),false);
}
Upvotes: 5
Views: 3598
Reputation: 1912
For me, I have a class called LDGame like this:
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
public class LDGame extends Game implements ApplicationListener {
private static RequestHandler requestHandler;
private static GoogleInterface platformInterface;
public LDGame(RequestHandler requestHandler, GoogleInterface anInterface) {
this.requestHandler = requestHandler;
this.platformInterface = anInterface;
}
@Override
public void create() {
Assets.loadAll();
//platformInterface.LogOut();
setScreen(new MainLogin(this, false));
}
@Override
public void resume() {
super.resume();
// Relase static resources
Assets.loadAll();
}
public GoogleInterface getPlatformInterface() {
return platformInterface;
}
public RequestHandler getRequestHandler(){
return requestHandler;
}
}
This is where I handle the basics of getting the interfaces set. (same as your dogejump)
Then my MainActivity does this for Android side
public class MainActivity extends AndroidApplication implements RequestHandler, GameHelperListener,
GoogleInterface, RealTimeMessageReceivedListener, RoomStatusUpdateListener, RoomUpdateListener,
OnInvitationReceivedListener, RealTimeReliableMessageSentListener, OnImageLoadedListener, OnStateLoadedListener, ConnectionCallbacks{
private View gameView;
private GameHelper mHelper;
private GameHelperInterface mGHInterface = null;
private LoginInterface mLoginInterface = null;
private ConfirmInterface mConfirmInterface = null;
private OnLeaderboardScoresLoadedListener theLeaderboardListener;
private RoomUpdateListener mRoomUpdateListener= this;
private Handler libGDXHandler;
// Debug tag
final static String TAG = "Liars Dice Multi";
// Request codes for the UIs that we show with startActivityForResult:
final static int RC_SELECT_PLAYERS = 10000;
final static int RC_INVITATION_INBOX = 10001;
final static int RC_WAITING_ROOM = 10002;
final static int RC_SETTINGS = 10004;
// Request Key for AppStateClient Slot
final static int ASC_SLOT_UNFINISHED_GAMES = 0;
static final int ASC_SLOT_SERVER_UNFINISHED_GAMES = 1;
// Room ID where the currently active game is taking place; null if we're
// not playing.
String mRoomId = null;
Room mRoomCurrent = null;
int mCurrentToken = 1;
// Are we playing in multiplayer mode?
boolean mMultiplayer = false;
// The participants in the currently active game
ArrayList<Participant> mParticipants = null;
ArrayList<String> listIgnoreTheseIDs = new ArrayList<String>();
// My participant ID in the currently active game
String mMyId = null;
//Token Trackers
ArrayList<Integer> readyToPlayTokens = new ArrayList<Integer>();
// If non-null, this is the id of the invitation we received via the
// invitation listener
String mIncomingInvitationId = null;
// Message buffer for sending messages
byte[] mMsgBuf = new byte[2];
ArrayList<String> messagesRecieved = new ArrayList<String>();
ArrayList<tokenInfo> listTokensSent = new ArrayList<MainActivity.tokenInfo>();
HashMap<Integer, tokenInfo> mapTokensSent = new HashMap<Integer, MainActivity.tokenInfo>();
// flag indicating whether we're dismissing the waiting room because the
// game is starting
boolean mWaitRoomDismissedFromCode = false;
Context activityContext;
MainActivity mA;
private AdHubView adView;
private boolean bCheckingTimes;
boolean bAnyRoomEvent = false;
private long oldCreationTime;
private Intent previousMatch;
private int iServerBadAttempts = -1;
public MainActivity(){
libGDXHandler = new Handler();
mHelper = new GameHelper(this);
mHelper.enableDebugLog(true, "Helper");
//create a listener for getting raw data back from leaderboard
theLeaderboardListener = new OnLeaderboardScoresLoadedListener() {
@Override
public void onLeaderboardScoresLoaded(int arg0, LeaderboardBuffer arg1,
LeaderboardScoreBuffer arg2) {
}
};
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SearchLayout layout = new SearchLayout(this);
SearchLayout.setSearchActivity(this);
// starts libGDX render thread
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
gameView = initializeForView(new LDGame(this, this), true);
adView = new AdHubView(this, "2011000001_001", AdSize.BANNER);
RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
adParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layout.addView(gameView);
layout.addView(adView, adParams);
setContentView(layout);
//mHelper.setup(this);
mHelper.setup(this, GameHelper.CLIENT_GAMES | GameHelper.CLIENT_APPSTATE | GameHelper.CLIENT_PLUS, null);
mHelper.getPlusClient().registerConnectionCallbacks(this);
activityContext = this;
mA = this;
}
This is to allow me to interface with Game Servives and the Google Cloud stuff...
For my Screens (as you can see from the LDGame class) I just do this
game.getPlatformInterface().anycallinYourInterface();
to send my calls to the libgdx side of the house..(don't forget a Handler)
and whatever Screen is active, calls a new Interface into the libGDX side like so:
//this will set the ConfirmInterface in the Android Activity
//and allow for future calls to call any implemented methods
//that are set inside the ConfirmInterface
private void setCallbackHandler(){
game.getRequestHandler().confirm(new ConfirmInterface() {
@Override
public void yes() {
Gdx.app.log("LDGame", "Clicked Yes");
dLog("have a direct invite, so waiting for it to process");
startNextScreen();
}
public void no() {
Gdx.app.log("LDGame", "Clicked No");
}
@Override
public void loginFailed(final boolean failedForPreviousNumberOfAttemtps, final long timeElapsed) {
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
setGoogleButtonImage(false);
if(failedForPreviousNumberOfAttemtps){
showFailedLoginForBadAttempts(timeElapsed);
}
}
});
}
@Override
public void loginSucceeded() {
//this means the login for both services is good, and the data returned meets
//whatever sign in criteria is set
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
setGoogleButtonImage(true);
game.getPlatformInterface().loadInvitations();
}
});
}
@Override
public void firstLogin() {
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
showFirstLogin();
}
});
}
@Override
public void googleSucceeded() {
//this means that google just returned a valid hit
game.getPlatformInterface().checkIfServerTimesAreValid();
showSignOutBar();
}
@Override
public void needToCheckTimesOnServer() {
//this means that there are three times or more on the server for incomplete games
//the only way to clear this is to try and do a quick check against a room login
Timer.schedule(new Timer.Task() {
@Override
public void run() {
game.getPlatformInterface().checkIfServerTimesAreValid();
}
}, 1f);
}
@Override
public void onInvitationReceived() {
game.getPlatformInterface().loadInvitations();
Assets.soundArrive.play();
}
@Override
public void haveInvitations(int count) {
// TODO Auto-generated method stub
}
});
}
so that in my Android I can do this:
@Override
public void onSignInFailed() {
mConfirmInterface.loginFailed(false, 0);
}
}
Upvotes: 0