玩家将有不同的法术,可以投在不同的键盘键组合。
现在,我拥有的是一个.as文件,其中包含所有内容。一群ifs,检查组合if (combo="WW") {},if (flightMode) {}等,我知道这是不好的做法,并使它混淆。
会有更多的组合/不同的键组合,所以我需要开始学习整洁。
我正在寻找代码正确性和最佳实践。
package
{
import flash.display.Sprite;
import flash.utils.getDefinitionByName;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import nape.geom.Vec2;
import nape.phys.Body;
import nape.phys.BodyList;
import nape.phys.BodyType;
import nape.shape.Polygon;
import nape.space.Space;
import nape.util.ShapeDebug;
public class Main extends Sprite
{
public var gravity:Number = 600;
public var space:Space = new Space(new Vec2(0, gravity));
public var antiGravity:Vec2 = new Vec2(0, -gravity);
public var impulse:Vec2 = new Vec2(0, 0);
public var flight:Vec2 = new Vec2(0, 0);
public var mainChar:Body = new Body(BodyType.DYNAMIC);
public var allow2ndKey:Boolean;
public var allow3rdKey:Boolean;
public var combo:String;
public var spellTimerStart:Boolean;
public var heroPosition:Boolean = true;
public var heroFlightMode:Boolean = false;
public var flightModeMovement:Boolean = false;
public var velChange:Number;
public var desiredVel:Number = -1800;
public var startingHeroY:Number;
public var spellTimer:Number = 70;
public var reset:Boolean = false;
public var flyUp:Number;
public var flyUpVel:Number = -150;
public var Up:Boolean;
public var Down:Boolean;
public var flyDown:Number;
public var flyDownVel:Number = 150;
public var Right:Boolean;
public var flyRight:Number;
public var flyRightVel:Number = 125;
public var Left:Boolean;
public var flyLeft:Number;
public var flyLeftVel:Number = -125;
public var keys:Array = [];
public var float:Number = 30;
public var floatUp:Boolean = true;
public var fallSTR:Number;
public var fall:Vec2 = new Vec2(0, 0);
public var exeOnce:Boolean=true;
public var floor:Body;
public function Main():void
{
createMainCharacter(stage.stageWidth * 10 / 100, stage.stageHeight * 10 /100, 50, 50);
createWall (0, 500, stage.stageWidth, 10);
addEventListener(Event.ENTER_FRAME, update);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
}
private function update(e:Event):void
{
space.step(1 / stage.frameRate, 10, 10);
var bodies:BodyList = space.bodies;
for (var i:int = 0; i < bodies.length; i++)
{
var body:Body=bodies.at(i);
if (body.userData.sprite != null)
{
body.userData.sprite.x = body.position.x;
body.userData.sprite.y = body.position.y;
body.userData.sprite.rotation=(body.rotation*180/Math.PI)%360;
}
}
if (combo == "WW")
{
if (heroPosition) {
startingHeroY = mainChar.position.y;
}
heroPosition = false;
velChange = desiredVel - mainChar.velocity.y;
impulse.x = 0.0;
impulse.y = velChange;
mainChar.applyImpulse(impulse);
if (mainChar.position.y <= startingHeroY - 1) {
desiredVel = -55;
}
}
if (combo == "WWW")
{
heroFlightMode = true;
reset = true;
}
if (heroFlightMode)
{
velChange = -mainChar.velocity.y-float;
antiGravity.x = 0.0;
antiGravity.y = velChange;
mainChar.applyImpulse(antiGravity);
flightModeMovement = true;
if (float == 30) {
floatUp = true;
}
if (float == 65) {
floatUp = false;
}
if (floatUp) {
float++;
} else {float--;}
} else flightModeMovement = false;
if (flightModeMovement) {
if (keys[Keyboard.W])
{
flyUp = -mainChar.velocity.y - 400; // flyUpVel - mainChar.velocity.y;
flight.x = 0.0;
flight.y = flyUp;
mainChar.applyImpulse(flight);
}
if (keys[Keyboard.S])
{
flyDown = flyDownVel - mainChar.velocity.y;
flight.x = 0.0;
flight.y = flyDown;
mainChar.applyImpulse(flight);
}
if (keys[Keyboard.D])
{
flyRight = flyRightVel - mainChar.velocity.x;
flight.x = flyRight;
flight.y = 0.0;
mainChar.applyImpulse(flight);
}
if (keys[Keyboard.A])
{
flyLeft = flyLeftVel - mainChar.velocity.x; // flyLeftVel = -3
flight.x = flyLeft;
flight.y = 0.0;
mainChar.applyImpulse(flight);
}
if (keys[Keyboard.SPACE])
{
heroFlightMode = false;
}
}
if (spellTimerStart) {
spellTimer--;
} else spellTimer = 70;
if (spellTimer <= 0) {
reset = true;
if (exeOnce) {
fallSTR = 500;
fall.x = 0.0;
fall.y = fallSTR;
mainChar.applyImpulse(fall);
}
exeOnce = false;
}
if (reset)
{
// reset everything
combo = "null";
allow2ndKey = false;
allow3rdKey = false;
spellTimerStart = false;
heroPosition = true;
spellTimer = 70;
desiredVel = -1200;
startingHeroY = 0;
reset = false;
}
} // update end.
private function createWall (x:Number, y:Number, width:Number, height:Number):void
{
var wall:Body = new Body(BodyType.STATIC);
wall.shapes.add(new Polygon(Polygon.rect(x, y, width, height)));
var wallSprite:Sprite = new Sprite();
wallSprite.graphics.beginFill(0x000000);
wallSprite.graphics.drawRect(x, y, width, height);
wallSprite.graphics.endFill;
addChild(wallSprite);
wall.userData.sprite = wallSprite;
addChild(wall.userData.sprite);
wall.space = space;
}
private function createMainCharacter(x:Number, y:Number, width:Number, height:Number):void
{
var mainCharShape:Polygon = new Polygon(Polygon.box(width, height));
mainChar.shapes.add(mainCharShape);
mainChar.position.setxy(x, y);
mainChar.space = space;
var mainCharSprite:Sprite = new Sprite();
mainCharSprite.graphics.beginFill(0x000000);
mainCharSprite.graphics.drawRect( -width/2, -height/2, width, height);
mainCharSprite.graphics.endFill;
addChild(mainCharSprite);
mainChar.userData.sprite = mainCharSprite;
addChild(mainChar.userData.sprite);
}
public function onKeyUp(e:KeyboardEvent):void
{
keys[e.keyCode] = false;
if (spellTimerStart) {
allow2ndKey = true;
}
}
public function onKeyDown(e:KeyboardEvent):void
{
keys[e.keyCode] = true;
switch(e.keyCode)
{
case Keyboard.W:
if (!flightModeMovement) {
spellTimerStart = true;
exeOnce = true;
combo = "W";
if (allow3rdKey && spellTimer) {
combo = "WWW";
spellTimer = 70;
} else {
if (allow2ndKey && spellTimer > 0)
{
combo = "WW";
spellTimer += 50;
allow2ndKey = false;
allow3rdKey = true;
}
}
}
break
}
}
} // Class end
} // package end我怎么才能优化这个?我没有定制课程的经验。
发布于 2014-07-30 14:03:25
“一个类应该有一个,而且只有一个,需要改变的理由。”(在面向对象设计原理中定义)您可以使用此原则对代码中有相同理由更改为类的部分进行分组。想象一下,为了添加一个新的玩家咒语或一个新的键组合,您需要做什么更改,然后将它们提取到一个类中。
另一方面,如果您最终更改一个类的原因不止一个,那么这个类应该被分成几个类,并有不同的更改原因。
发布于 2014-10-24 08:14:34
你的变量
public var Up:Boolean;
public var Down:Boolean;
public var Right:Boolean;
public var Left:Boolean;都没有用过。我想这是因为你把所有的东西都塞进了一节课。如果您使用多个类(如Kolargol00所说,通过SRP ),那么您将有更小的类,并且更容易找到这些未使用的变量。
具体来说,我会为键盘输入创建一个类,为英雄角色创建一个类,并为一个墙创建一个类。
https://codereview.stackexchange.com/questions/58493
复制相似问题