- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先我想说的是,我对于使用 Java 中的 swing 还比较陌生。我可以让 swing 做一些事情,比如玩游戏,但我不确定我是否真正理解幕后发生的事情。因此,我开始用 Java 开发一款游戏,类似于《文明》,并且已经取得了一些不错的进展。我想把注意力转向保存游戏并重新加载它。然而,我在这方面遇到了一些麻烦。所以我做了一些研究,发现了如何使对象可序列化并从那里保存/加载。效果很好,我可以保存我的游戏并加载它。问题是,所有内容都再次出现在屏幕上(地形图 block 、单位、HUD),但似乎存储在我的某些对象中的数据已设置回其初始化点。例如,我可以在 X 方向的图 block 41 上结束,但是当我加载游戏时,它会将其设置回 0。
关于我如何设置游戏的简要描述:我有一个创建新 Window 对象的 Main 类。 Window 对象本质上是一个 JFrame,其中包含按钮信息和一个 Panel 类,该类只是绘制游戏的 JPanel。游戏中发生的所有事情都在 JPanel 中创建。我对编程并不陌生,我是一名计算 Material 科学家,但我是用 Java 编写游戏的新手,我觉得我犯了一个非常简单的错误。我将在下面发布 JFrame 和 JPanel(其中一部分,相当长)。
框架
public class GameWindow extends JFrame implements ActionListener
{
//ints
private int fCounter = 0;
//timers
private Timer t;
//Panels
private GamePanel gamePanel;
//menu bars
private JMenuBar menuBar;
//menus
private JMenu fileMenu;
//menu items
private JMenuItem save;
private JMenuItem load;
private JMenuItem exit;
private JMenuItem newGame;
//menu panels
private JPanel menuPanel;
//File objects
private File file;
//File Chooser
private JFileChooser chooser;
//user objects
private Player humanPlayer;
private AI aIPlayer;
private FileActions fileActions;
//**************************************************************************constructor
public GameWindow()
{
//set specifications for frame
super("New Game v 0.00: pre-Alpha");
this.setResizable(false);
setFocusable(true);
setSize(1600, 800);
//creates a new menubar
menuBar = new JMenuBar();
//craetes a new file menu
fileMenu = new JMenu("File");
//creates the file options
save = new JMenuItem("Save");
save.addActionListener(this);
load = new JMenuItem("Load");
load.addActionListener(this);
newGame = new JMenuItem("New Game");
newGame.addActionListener(this);
exit = new JMenuItem("Exit");
exit.addActionListener(this);
//adds file options to the file menu
fileMenu.add(save);
fileMenu.add(load);
fileMenu.add(newGame);
fileMenu.add(exit);
//adds the file menu to the menubar
menuBar.add(fileMenu);
//establishes the menu panel as a new JPanel
menuPanel = new JPanel();
//adds the menu to the menubar
menuPanel.add(menuBar);
//sets user class objects
humanPlayer = new Player();
aIPlayer = new AI();
fileActions = new FileActions();
//panels
gamePanel = new GamePanel();
gamePanel.setSize(750, 750);
gamePanel.setFocusable(true);
addKeyListener(gamePanel);
addMouseListener(gamePanel);
addMouseMotionListener(gamePanel);
setVisible(true);
//adds panels to the frame with layout
add(menuPanel, BorderLayout.EAST);
add(gamePanel, BorderLayout.CENTER);
//add file choosers
chooser = new JFileChooser();
//adds file objects
file = new File("");
//timers
t = new Timer(1, this);
t.start();
}
@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
//save a game
if(e.getSource() == save)
{
//fCounter = chooser.showSaveDialog(this);
//if(fCounter == JFileChooser.APPROVE_OPTION)
//{
//file = chooser.getSelectedFile();
fileActions.addObject(gamePanel);
fileActions.saveGame();
//}
}
//load a save file
if(e.getSource() == load)
{
this.remove(gamePanel);
gamePanel = fileActions.loadGame();
this.add(gamePanel);
gamePanel.setFocusable(true);
addKeyListener(gamePanel);
addMouseListener(gamePanel);
addMouseMotionListener(gamePanel);
add(gamePanel, BorderLayout.CENTER);
setVisible(true);
}
//starts a new game
if(e.getSource() == newGame)
{
//gamePanel = null;
//gamePanel = new GamePanel();
gamePanel.setNewGameSetup(true);
gamePanel.setMainMenuView(false);
}
//exits the game
if(e.getSource() == exit)
{
System.exit(0);
}
gamePanel.repaint();
}
}
<小时/>面板类的一部分
public class GamePanel extends JPanel implements
ActionListener,KeyListener,MouseListener,MouseMotionListener,Serializable
{
//globals
private static int mapHeight = 0;
private static int mapWidth= 0;
private static int currentMapHoriztonal= 0;
private static int currentMapVertical= 0;
private static int currentMouseMapHoriztonal= 0;
private static int currentMouseMapVertical= 0;
private static int turnNumber= 0;
private int unitFocusNumber = -1;
private int cityFocusNumber = -1;
private Terrain[][] terrain;
private ArrayList<Unit> playerUnits = new ArrayList<Unit>();
private ArrayList<City> playerCities = new ArrayList<City>();
private boolean terrainCreate = true;
private boolean mainMenu = true;
private boolean newGameSetup = false;
private boolean mapView = false;
private boolean mapSizeOptions = false;
private boolean playerTurn = true;
private boolean[] move = new boolean[4];
private Font mainMenuTitle = new Font("Algerian",Font.BOLD,75);
private Font mainMenuOptions = new Font("Calibri",Font.BOLD,15);
private Player player = new Player();
private FileActions fA;
private AI aI = new AI();
public GamePanel()
{
}
//getters
public int getMapHeight()
{
return mapHeight;
}
public boolean getMapView()
{
return mapView;
}
public Terrain[][] getTerrain()
{
return terrain;
}
//setters
public void setMapHeight(int height)
{
mapHeight = height;
}
public void setMapWidth(int width)
{
mapWidth = width;
}
public void setMapView(boolean b)
{
mapView = b;
}
public void setMainMenuView(boolean b)
{
mainMenu = b;
}
public void setNewGameSetup(boolean b)
{
newGameSetup = b;
}
//painters
//paints the game
public void paintComponent(Graphics g)
{
if(mainMenu == true)
{
paintMainMenu(g);
}
if(newGameSetup == true)
{
paintSetupScreen(g);
}
else if(mapView == true)
{
if(terrainCreate == true)
{
//sets the terrain
terrain = new Terrain[mapHeight][mapWidth];
for(int i = 0; i < mapHeight; i++)
{
for(int j = 0; j < mapWidth; j++)
{
terrain[i][j] = new Terrain(j,i,mapWidth,mapHeight);
terrain[i][j].setTerrain(j,i);
}
}
for(int i = 0; i < 4; i++)
{
playerUnits.add(new Scout(75*i,75*i));
}
playerUnits.add(new Settler(75*9,75*8));
playerUnits.add(new Settler(75*14,75*12));
terrainCreate = false;
}
if(terrainCreate == false)
{
paintTerrain(g);
paintCities(g);
paintUnits(g);
paintHud(g);
}
}
}
任何帮助将不胜感激!
编辑:这是实际加载和保存游戏的类。
public class FileActions implements Serializable
{
private ArrayList<Object> objects = new ArrayList<Object>();
//setters
public void addObject(Object o)
{
objects.add(o);
}
//getters
public void saveGame()
{
try
{ // Catch errors in I/O if necessary.
// Open a file to write to, named SavedObj.sav.
FileOutputStream saveFile=new FileOutputStream("NTT.sav");
// Create an ObjectOutputStream to put objects into save file.
ObjectOutputStream save = new ObjectOutputStream(saveFile);
// Now we do the save.
for(int i = 0; i < objects.size();i++)
{
save.writeObject(objects.get(i));
}
// Close the file.
save.close(); // This also closes saveFile.
}
catch(Exception exc)
{
exc.printStackTrace(); // If there was an error, print the info.
}
}
public GamePanel loadGame()
{
GamePanel stuff = new GamePanel();
try
{
// Open file to read from, named SavedObj.sav.
FileInputStream saveFile = new FileInputStream("NTT.sav");
// Create an ObjectInputStream to get objects from save file.
ObjectInputStream save = new ObjectInputStream(saveFile);
stuff = (GamePanel) save.readObject();
// Close the file.
save.close(); // This also closes saveFile.
}
catch(Exception exc)
{
exc.printStackTrace(); // If there was an error, print the info.
}
System.out.println(stuff);
return stuff;
}
}
最佳答案
好吧,所以我做了一些更多的挖掘,本质上我不应该在使用序列化作为保存方法时使用静态变量,因为静态变量不是 GamePanel 对象的一部分而是类的一部分,所以当 save 方法保存时对象它实际上并不保存静态变量变成的任何内容。我将需要保存的所有变量设置为非静态,并且一切正常
关于java - 如何在 Java 中加载游戏并返回到游戏之前的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33638742/
我正在寻找一种使此打印 HTML 代码 fragment 向后兼容旧 Android 版本的简单方法: @TargetApi(Build.VERSION_CODES.KITKAT) private v
我在 GCC 终端 (centos linux) 中为 ATM 项目编译以下 c 和 .h 代码时收到以下错误。请帮忙,因为我是编程新手。 validate_acc.h #ifndef _VALIDA
在写关于 SO 的不同问题的答案时,我制作了这个片段: @import url('https://fonts.googleapis.com/css?family=Shadows+Into+Light'
试图弄清楚我应该如何在 my_div_class 之前放置一个 span 而不是替换所有它。现在它取代了 div,但我不想这样做。我假设它类似于 :before 但不知道如何使用它。 { va
我正在使用选择库 http://github.hubspot.com/select/和 noUiSlider https://refreshless.com/nouislider/ .我面临的问题如下
我是开发新手,独自工作。我正在使用 Xcode 和 git 版本控制。可能我没有适本地组织和做错事,但我通常决定做 promise 只是为了在我破坏一切之前做出安全点。在那一刻,我发现很难恰本地描述我
我想确保在同一个桶和键上读取和写入时,应该更新获取的值,也就是说,应该在对其进行写入操作之后获取它。我怎样才能做到这一点? 我想要的是,如果我更新一个键的值,如果我同时使用不同线程获取值,则更新同一个
我的问题与this有关问题,已经有了答案: yes, there is a happens-before relationship imposed between actionsof the thre
The before and after hook documentation on Relish仅显示 before(:suite) 在 before(:all) 之前调用。 我什么时候应该使用其中
我有 CSV 行,我想在其中检测所有内部双引号,没有文本限定符。这几乎可以正常工作,但我的正则表达式还可以检测双引号后的字符。 CSV 部分: "7580";"Lorem ipsum";"";"Lor
是否可以通过Youtube数据API检查广告是否可以与特定视频一起显示? 我了解contentDetails.licensedContent仅显示视频是否已上传至同一伙伴然后由其声明版权。由于第三者权
考虑一下用漂亮的彩色图表描述的“像素管道” https://developers.google.com/web/fundamentals/performance/rendering/ 我有一个元素(比
之前?
在 MVC3 中,我可以轻松地将 jQuery 脚本标签移动到页面底部“_Layout.vbhtml” 但是,在 ASP.NET MVC3 中,当您使用编辑器模板创建 Controller 时,脚手
悬停时内容被替换,但是当鼠标离开元素时我希望它变回来。我该怎么做? $('.img-wrap').hover(function(){ $(this).find('h4').text('Go
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。
版本:qwt 6.0.1我尝试开发频谱的对数缩放。我使用简单的线条来启用缩放plotspectrum->setAxisScaleEngine(QwtPlot::yLeft, new QwtLog10S
我有两个相同的表,I_Subject 和 I_Temp_Subject,我想将 Temp_Subject 表复制到 Subject 表。 I_Temp_Subject 由简单用户使用,I_Subjec
我的印象是第一次绘制发生在触发 DOMContentLoaded 事件之后。特别是,因为我认为为了让第一次绘制发生,需要渲染树,它依赖于 DOM 构造。另外,我知道 DOM 构造完成时会触发 DOMC
我是一名优秀的程序员,十分优秀!