背景: 我最近在AS3中完成了一个井字游戏,使用了我多年前用C编写的一些基于函数的简单代码。 现在,我正在寻求使用OOP技术和最佳实践“正确的方式”。 现在一切都被分成整齐的小包装,看起来很漂亮,我旅程的最后一部分是让所有的小家伙彼此沟通。
我的困境: 我想将保存游戏状态的代码从我的main移动到com.okaygraphics.model.GameState中自己的类。 问题是几乎所有其他包获取并设置这些游戏状态属性。 我正在试图找出封装这些东西的最简单方法,同时仍允许我的其他类访问它。
我在哪里:
package com.okaygraphics.model{
public class GameState {
private var _player1State:uint=0x00000000;
private var _player2State:uint=0x00000000;
private var _activePlayer:int=0;
public function get p1GameState():uint {
return _player1State;
}
public function set p1GameState(value:uint):void {
_player1State = value;
}
public function get p2GameState():uint {
return _player2State;
}
public function set p2gameState(value:uint):void {
_player2State = value;
}
public function get activePlayer():int {
return _activePlayer
}
public function set activePlayer(value:int):void {
_activePlayer = value;
}
}
}
Qestions:
1)我需要一个构造函数吗?我的意思是,我的程序永远不会有多个GameState。如果我应该将getter / setter作为实例方法调用,如何让其他类从各自的包中引用SAME实例?
2)我是否需要吸气剂和二传手?也许这个班可能只有3个公共场所?如果是这样,我将如何实现与其他课程相关的适当范围?
3)我应该使用static关键字将所有内容分配给类本身吗?如果是这样,我将如何实现和使用这些静态方法?
4)这是一个错误吗?我完全把自己编入角落吗?
这似乎是一项非常常见的任务,但我仍然不完全理解。我将非常感谢您提供的简短解释,一些链接或技术名称。
提前致谢, -max
答案 0 :(得分:4)
你可以通过几种不同的方式来解决这个问题。
您可以将GameState
设为Singleton。这将确保GameState
的任何实例都是同一个实例。以下是如何做到这一点:
private static var _gameState:GameState;
private static var _allowInstantiation:Boolean;
public function GameState()
{
if (!_allowInstantiation)
{
throw new Error("GameState is a Singleton. Use GameState.getInstance() instead of new GameState().");
}
else
{
_allowInstantiation = false;
}
}
public static function getInstance():GameState
{
if (!_gameState)
{
_allowInstantiation = true;
_gameState = new GameState();
}
return _gameState;
}
然后,只要您想获得GameState
,就可以使用以下语法:
var _gameState:GameState = GameState.getInstance();
通过使用Singleton,您仍然可以使用已经创建的getter和setter,但Singleton将确保访问GameState
的每个类都将访问同一个实例。
或者,如果您不想使用Singleton,则可以改为使用私有变量公共静态变量:
public static var player1State:uint=0x00000000;
public static var player2State:uint=0x00000000;
public static var activePlayer:int=0;
你将不再需要getter / setter,你可以从其他类中设置它们:
GameState.player1State = 0xFF0000;
GameState.player2State = 0xFF0000;
GameState.activePlayer = 1;
无论你设置模型,还是要考虑控制器和视图如何与它进行通信。请记住,模型和视图的分离是MVC模式的主要目标之一。
答案 1 :(得分:2)
1)你可以做的是创建 singleton 类。这是一个只被暗示过一次的课程。一个快速谷歌(AS3 Singleton的搜索堆栈溢出),你应该找到一些单例类的好例子。使用单例,您只需要包含GameState类,您将访问唯一的一个。
2)稍后只能使用吸气剂和固定剂来做更好的伤害。
3)无法真正回答。
4)不。似乎是要走的路。
答案 2 :(得分:1)
我强烈建议您查看MVC设计模式并在游戏中使用它。 (游戏状态是模型的一部分。)
现在,关于如何从所有其他类访问游戏状态(这是正确的单词而不是包),您可以使用singleton pattern。