【问题标题】:How to use Google Play Game Services with LibGdx如何通过 LibGdx 使用 Google Play 游戏服务
【发布时间】:2013-10-05 08:26:26
【问题描述】:

我想在我的 LibGDX And​​roid 游戏中使用来自 Google Play 游戏服务 API 的成就和排行榜。我唯一取得的成就是从运行的游戏服务开发者网站上获取示例。我已经尝试在我的项目中使用这个代码很多天了,但我仍然一无所获。我也尝试遵循本教程http://helios.hud.ac.uk/u1070589/blog/?p=202,但我没有第 7 步所需的“主游戏类(从 ApplicationListener 扩展的类)”。我只有

  • 公共类 DogeJump 扩展游戏
  • 公共类 MainActivity 扩展 AndroidApplication 实现 IActivityRequestHandler
  • 公共类 BaseScreen 实现 Screen
  • public class GameScreen extends BaseScreen //负责游戏玩法

这是来自 MainActivity.java 的 onCreate 方法

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

【问题讨论】:

    标签: java android libgdx google-play-games


    【解决方案1】:

    在我的脑海中,Game 类应该实现 ApplicationListener,所以你缺少的类应该是 DogeJump

    【讨论】:

      【解决方案2】:

      对我来说,我有一个像这样的名为 LDGame 的类:

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

      }

      这是我处理设置接口的基础知识的地方。 (和你的 dogejump 一样)

      然后我的 MainActivity 为 Android 端执行此操作

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

      这是为了让我能够与 Game Servives 和 Google Cloud 的东西交互...

      对于我的屏幕(从 LDGame 类中可以看到)我只是这样做

      game.getPlatformInterface().anycallinYourInterface();
      

      将我的电话发送到房子的 libgdx 一侧..(不要忘记处理程序)

      无论屏幕处于活动状态,都会将一个新接口调用到 libGDX 端,如下所示:

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

      所以在我的 Android 中我可以这样做:

      @Override
      public void onSignInFailed() {
          mConfirmInterface.loginFailed(false, 0);
      
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 2018-06-15
        • 2016-01-04
        • 2014-02-02
        相关资源
        最近更新 更多