首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏人物精灵定位与运动

游戏人物精灵定位与运动
EN

Code Review用户
提问于 2014-07-30 11:08:48
回答 2查看 134关注 0票数 3

玩家将有不同的法术,可以投在不同的键盘键组合。

现在,我拥有的是一个.as文件,其中包含所有内容。一群ifs,检查组合if (combo="WW") {}if (flightMode) {}等,我知道这是不好的做法,并使它混淆。

会有更多的组合/不同的键组合,所以我需要开始学习整洁。

我正在寻找代码正确性和最佳实践。

代码语言:javascript
复制
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

我怎么才能优化这个?我没有定制课程的经验。

EN

回答 2

Code Review用户

发布于 2014-07-30 14:03:25

单责任原则

“一个类应该有一个,而且只有一个,需要改变的理由。”(在面向对象设计原理中定义)您可以使用此原则对代码中有相同理由更改为类的部分进行分组。想象一下,为了添加一个新的玩家咒语或一个新的键组合,您需要做什么更改,然后将它们提取到一个类中。

另一方面,如果您最终更改一个类的原因不止一个,那么这个类应该被分成几个类,并有不同的更改原因。

票数 3
EN

Code Review用户

发布于 2014-10-24 08:14:34

你的变量

代码语言:javascript
复制
public var Up:Boolean;
public var Down:Boolean;
public var Right:Boolean;
public var Left:Boolean;

都没有用过。我想这是因为你把所有的东西都塞进了一节课。如果您使用多个类(如Kolargol00所说,通过SRP ),那么您将有更小的类,并且更容易找到这些未使用的变量。

具体来说,我会为键盘输入创建一个类,为英雄角色创建一个类,并为一个墙创建一个类。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/58493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档