Android游戏高分实现

问题描述:

我正在为我的最后一年项目制作太空射击游戏,并认为包含本地比分/高分屏幕将会很酷。我不知道该怎么做,如果有人能指出我的方向正确,我会非常感激,我在网上找到的所有例子都非常复杂。另外我希望将分数显示在用opengl渲染的游戏屏幕上。 谢谢。Android游戏高分实现

我刚刚完成为我目前正在开发的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

那么,用你想要的任何格式(比如姓名,分数,日期等)写出一个高分的文件,以便以后解析起来更容易。然后,每当你想写一个新的分数,继续编辑它。盲目地阅读并显示它。

我alerady做同样的项目,我做一个对象列表。此对象代表一个高分。如果我需要存储High Scoren的列表,我会序列化列表,如果需要显示它,我将这个文件反序列化。