简体   繁体   中英

How to use Google Play Game Services with LibGdx

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

  • public class DogeJump extends Game
  • public class MainActivity extends AndroidApplication implements IActivityRequestHandler
  • public class BaseScreen implements Screen
  • public class GameScreen extends BaseScreen //which is responsible for the gameplay

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);
    }

在我的头脑中, Game类应该实现ApplicationListener ,所以你缺少遵循教程的类应该是DogeJump

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);

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM