2012-04-19 119 views
-1

我正在爲我的最後一年項目製作太空射擊遊戲,並認爲包含本地比分/高分屏幕將會很酷。我不知道該怎麼做,如果有人能指出我的方向正確,我會非常感激,我在網上找到的所有例子都非常複雜。另外我希望將分數顯示在用opengl渲染的遊戲屏幕上。 謝謝。Android遊戲高分實現

回答

10

我剛剛完成爲我目前正在開發的OpenGL ES遊戲創建高分板。因爲它的你的最後一年的項目我不會使用這個作爲一個pastebin,而是給你一些指針。在我的應用程序中,分數被髮送到我的PHP腳本,該腳本在MySQL中存儲值。

我用:

  • 新的類,它負責處理一切與高分
  • AlertDialog「警報名稱」 - 索要玩家的名字
  • EditText上「輸入」添加到與警報名稱對話框.setView(輸入);
  • 使用的AsyncTask
    • 這可能與其他Data Storage選項來代替提交得分到服務器,無論是內部的,外部的,或SQLlite分貝

當遊戲結束(所有的生命都消失了,計時器等等)我使用了一行代碼,並不是非常類似於此:

HighScore hs = new HighScore(context, score, level); 

需要上下文才能創建AlertDialogs和Toasts。構造函數調用函數submit(),它顯示AlertDialog詢問播放器名稱,然後將數據發送到服務器。

我的類包含此行代碼來讓玩家知道他們是否達到了前100名從服務器接收到響應後:

Toast.makeText(mContext, "You didn't make the score board", 
     Toast.LENGTH_SHORT).show(); 

高分列表存儲在一個ArrayList

private ArrayList<String> highscores = new ArrayList<String>(); 

並且使用字符串填充數據。格式以類似的方式,以這樣的:

highscore_headers = String.format("%7s","rank") + 
     String.format("%11s","name") + 
     String.format("%10s","score") + 
     String.format("%5s","lvl"); 

然後輸入:

您的渲染器onDrawFrame內你可以建立高分類,所以你可以把類似下面的一個襯墊,其中將包括您的譯文,秤pushMatrix和popMatrix調用將高分數據繪製到屏幕上。

hs.draw(gl); 

其中包含循環,不是太不相似的:

for(int i=0; i<highscores.size(); i++){ 
    text.drawText(gl, highscore.get(i).toString()); 
    gl.glTranslatef(0f, -0.8f, 0f); 
} 

注:文字是一類我寫的繪製根據每個字符值屏幕 上各種質地字符,然後將 翻譯成與我的 字符映射圖像文件相關的一組x,y座標。

希望這有助於推動你在正確的方向,好運與您的項目


我的Android應用程序的高分狀態的屏幕截圖使用OpenGL ES a screenshot of my android app's high score state rendered using OpenGL ES呈現


編輯:發送分數到PHP

這不會是我的源代碼的精確複製和粘貼,但希望這裏有足夠的信息來給你所有的一般想法。我的最終代碼還爲設備提供了一個uniqid,用戶可以跟蹤他們存儲在數據庫中的所有分數 - 但那是另一回事。

php文件: 我做更動簽名請求,散列分數,但我測試的目的,並獲得出版的遊戲更快,我選擇只是簡單的文本輸入。下面的代碼也沒有詳細說明玩家提交得分,或者根據時間獲得等級。

if(isset($_POST['name']) && isset($_POST['score'])){ 
    $sql = "INSERT INTO highscores(name, score) VALUES (:name, :score)"; 
    $data = array(":name"=>$_POST['name'], ":score"=>$_POST['score']); 
    $db->run($sql, $data); 
    echo display(); 
} 
function display(){ 
    $sql = "SELECT name, score FROM highscores ORDER BY score DESC"; 
    $result = $db->run($sql, array()); 
    return json_encode($result); 
} 

應該指出的是,$ db對象是我提出來包裝PDO方法準備和執行,其返回結果作爲關聯數組小班

高分的Android類別: 再次,我不會複製/粘貼,但這將說明如何將數據發佈到服務器,接收JSON字符串,然後填充字符串並將其添加到高分數組列表。下面的代碼是HighScore類的構造函數,它要求用戶輸入。

List<NameValuePair>nameValuePairs = new ArraList<NameValuePair>(2); 
AlertDialog alertName; 
DefaultHttpClient client = new DefaultHttpClient(); 
ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
String response = ""; 

HighScore(Context context, int score){ 
    nameValuePairs.add(new BasicNameValuePair("score", + score.toString())); 
    alertName = new AlertDialog(context).create(); 
    EditText input = new EditText(context); 
    alertName.setTitle('Enter Your Name'); 
    alertName.setButton(AlertDialog.BUTTON_POSITIVE, "OK", 
     new DialogInterface.OnClickListener(){ 
      @Override 
      public void onClick(DialogInterface dialog, int which){ 
       nameValuePairs.add(
       new BasicNameValuePair("name", input.getText().toString()) 
       ); 
       SubmitAsync sa = new SubmitAsync(); 
       sa.execute(); 
      } 
    }); 
    alertName.show(); 
} 

的SubmitAsync類是高分類的子類,它會設置HTTP客戶端發送數據,並添加接收到的數據。該數據被消化的JSON和前面提到的字符串填充,然後添加到高分的ArrayList

class SubmitAsync extends AsyncTask<String, Void, Void>{ 
    @Override 
    protected Void doInBackground(String... params){ 
     HttpPost postMethod = new HttpPost("http://address-of-script.php"); 
     postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     response = client.execute(postMethod, responseHandler); 
     JSONArray jsonArray = new JSONArray(response); 
     for(int i=0; i<jsonArray.length(); i++){ 
      JSONObject j = jsonArray.getJSONObject(i); 
      String name = String.format("%11s", j.get("name")); 
      String score = String.format("%10s", j.get("score")); 
      highscores.add(name + score); 
     } 
    } 
} 

這是非常基礎和很多更多的代碼比我本來希望在任何一個時間已經進入到這裏,並且絕對是我有史以來最長的職位。我會認真考慮@丹的意見,並研究了我的基於服務器的方法本地存儲高分板

如果複製和粘貼這些代碼片段將可能無法正常工作。所以,請試着去了解他們,並編寫自己:)

+0

感謝TerryProbert,這正是我想要的,但你怎麼比分發送到PHP腳本?我不介意看你的高分代碼作爲指導;我會相應地引用你。再次感謝。 – 2012-04-19 10:28:00

+1

@MichaelSeunAraromi如果您對PHP/MySQL沒有預先的知識,那麼它可能會損害您的項目以學習足夠的工作。另外,你也需要一個服務器端組件。這聽起來像你應該看看本地存儲選項,然後使用TerryProbert的指導來創建高分屏幕。 – Dan 2012-04-19 10:40:12

+0

即使我正在更新我的帖子,但我還是有一個非常簡潔的版本,我同意你的說法@Dan。使用JSONObjects和本地存儲/ SQLite的服務器響應的原理不一樣,這真是令人遺憾 – TerryProbert 2012-04-19 10:48:36

0

那麼,用你想要的任何格式(比如姓名,分數,日期等)寫出一個高分的文件,以便以後解析起來更容易。然後,每當你想寫一個新的分數,繼續編輯它。盲目地閱讀並顯示它。

0

我alerady做同樣的項目,我做一個對象列表。此對象代表一個高分。如果我需要存儲High Scoren的列表,我會序列化列表,如果需要顯示它,我將這個文件反序列化。