我正在寻找一些建议,以保持游戏中玩家的长期得分。
当我加载游戏时,它会自动创建3个新的Player
对象,它们的名称分别为Danny
,Mark
,Steve
(最终,我会对其进行正确整理,以便它们在List<Player>
开始新游戏时,我从两个Spinner
中选择两个玩家名称,然后检查所选Spinner中的名称是否与Player
对象中任何名称的名称匹配。
这是我用于main_menu的代码,其中从两个Spinners中选择了玩家
Intent intent = new Intent(Main_Menu.this, MainActivity.class);
String p1Name = playerOnesName = p1Spinner.getSelectedItem().toString();
String p2Name = playerTwosName = p2Spinner.getSelectedItem().toString();
intent.putExtra("message_key", playerOnesName);
intent.putExtra("message_key2", playerTwosName);
startActivity(intent);
然后,如果playerOnesName的名称与保存在Players列表中的任何名称相匹配,则单击开始游戏时,我会签入主要活动。
p1Name = getIntent().getStringExtra("message_key");
p2Name = getIntent().getStringExtra("message_key2");
if (p1Name.equals(p3.getName())) {
p1.setTotalDarts(p3TotalDarts);
p1.setTotalScore(p3TotalScore);
p1.setHighout(p3HighOut);
if ((p1.getTotalScore()) != 0 || p1.getTotalDarts() != 0) {
p1.setAverage(p1.getTotalScore() / p1.getTotalDarts());
} else {
p1.setAverage(0.0f);
}
}
用于保存属性的代码,
public void save() {
SharedPreferences sharedPref = getSharedPreferences("mypref", 0);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("p4TotalScore", p4.getTotalScore());
editor.putInt("p5TotalScore", p5.getTotalScore());
editor.putInt("p3TotalScore", p3.getTotalScore());
editor.putInt("p4TotalDarts", p4.getTotalDarts());
editor.putInt("p5TotalDarts", p5.getTotalDarts());
editor.putInt("p3TotalDarts", p3.getTotalDarts());
editor.putInt("p4HighOut", p4.getHighout());
editor.putInt("p5HighOut", p5.getHighout());
editor.putInt("p3HighOut", p3.getHighout());
//OVERALL_HIGH_OUT is a class variable.
editor.putInt("highOut", OVERALL_HIGH_OUT);
editor.apply();
}
在所有情况下(例如p1 = p3,p4或p5和p2 = p3,p4或p5),我都有相同的想法。
我有一个加载按钮,它为共享的prefs加载数据,其中包含p3、4、5 totalDarts,totalScore和hightOut的int值。
我现在希望该应用为相关播放器加载上述长期值。例如p1代表p3,则p1将获得{3}的highOut
totalScore
和totalDarts
。
当我单击“保存”时,我希望这些值然后保存回p3,以便将来在加载p3时,它将具有新的更新值。
我可以想到实现此目的的方法,但是所有方法似乎都非常冗长且效率低下。
任何人都可以提供有关最佳方法的建议吗?
答案 0 :(得分:0)
因此,我首先修改了保存内容,以根据Player
本身保存这些播放器,而不是将p3
等中的硬编码存储到String
s中,并创建了一个辅助方法来保存单个名为Player
的{{1}}。
savePlayer
现在,由于public void save() {
SharedPreferences sharedPref = getSharedPreferences("mypref", 0);
SharedPreferences.Editor editor = sharedPref.edit();
savePlayer(editor, p3);
savePlayer(editor, p4);
savePlayer(editor, p5);
//OVERALL_HIGH_OUT is a class variable.
editor.putInt("highOut", OVERALL_HIGH_OUT);
editor.apply();
}
//Used to save a single Player based on the Player Object
public void savePlayer(SharedPreferences.Editor editor, Player p)
{
editor.putInt(p.getName() + "TotalScore", p.getTotalScore());
editor.putInt(p.getName() + "p4TotalDarts", p.getTotalDarts());
editor.putInt(p.getName() + "p4HighOut", p.getHighout());
}
中的密钥现在基于存储在每个editor
对象中的名称,您可以轻松地为Player
创建一个构造函数,该构造函数根据{{ 1}}和Player
会根据名称加载密钥:
SharedPreferences
这是您可能会根据发现的相同名称使用它从以前创建相同的playerName
对象的方法:
public Player(SharedPreferences sharedPref, String playerName)
{
this.name = playerName;
this.totalScore = sharedPref.getInt(playerName + "TotalScore", -1); // -1 is default to set if preference does not exist
this.totalDarts = sharedPref.getInt(playerName + "TotalDarts", -1);
this.highOut = sharedPref.getInt(playerName + "HighOut", -1);
}
Player
现在将具有与该特定名称相同的设置(如果以前使用过的话)。尽管这里只是专门检查Player p1 = new Player(); //Or however you start the declaration
if (p1Name.equals(p3.getName())) {
p1 = new Player(sharedPref, p1Name);
}
是什么。
注意:如果很适合您的要求,修改构造函数代码以将其转换为返回Player p1
的方法非常简单。