Button 我应该如何在starling设置触摸控制?

Button 我应该如何在starling设置触摸控制?,button,touch,controls,flash-builder,multi-touch,Button,Touch,Controls,Flash Builder,Multi Touch,我正在开发一个有两个控件的starling游戏。一种是用户的左手拇指触摸屏幕左侧的任何位置,从而在y轴上下拖动角色。另一个我很难实现的控件是屏幕右下角的一个按钮,它会让角色发射子弹 我的问题是,当按下按钮时,如何在不让角色跳到屏幕底部的情况下进行设置 我是否需要使用multi-touch来运行此功能 我有一个更具体的问题,那就是如何为八哥中的精灵定义一个矩形?因为starling没有绘图API,所以我不能这么做 touchLayer.graphics.beginFill(0x00

我正在开发一个有两个控件的starling游戏。一种是用户的左手拇指触摸屏幕左侧的任何位置,从而在y轴上下拖动角色。另一个我很难实现的控件是屏幕右下角的一个按钮,它会让角色发射子弹

我的问题是,当按下按钮时,如何在不让角色跳到屏幕底部的情况下进行设置

我是否需要使用multi-touch来运行此功能

我有一个更具体的问题,那就是如何为八哥中的精灵定义一个矩形?因为starling没有绘图API,所以我不能这么做

        touchLayer.graphics.beginFill(0x000000, 0);
        touchLayer.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
        touchLayer.graphics.endFill(); 
目前,我的角色拖动功能正常,但触摸在屏幕上随处可见(我不知道如何使它只出现在屏幕的左侧…)

任何建议都将不胜感激,谢谢

这是我的InGame类的完整代码

package screens
{
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.utils.getTimer;

    import objects.Enemy;
    import objects.GameBackground;
    import objects.Laser;
    import objects.Scarlet;
    import objects.SnowBall;

    import starling.display.Button;
    import starling.display.Sprite;
    import starling.events.Event;
    import starling.events.Touch;
    import starling.events.TouchEvent;
    import starling.utils.RectangleUtil;
    import starling.utils.deg2rad;

    public class InGame extends Sprite
    {
        private var startBtn:Button;
        private var fireBtn:Button;
        private var bg:GameBackground;
        private var scarlet:Scarlet;

        private var enemies:Array;
        private var lasers:Array;
        private var scarletLocation:Point;

        private var lasersLayer:Sprite;
        private var enemiesLayer:Sprite;
        private var touchLayer:Sprite;

        private var enemySpawnDelay:Number;
        private var enemySpawnCounter:Number;

        private var difficulty:Number;
        private var difficultyRate:Number;

        private var timePrevious:Number;
        private var timeCurrent:Number;
        private var elapsed:Number;

        private var gameState:String;
        private var playerSpeed:Number;
        private const MIN_SPEED:Number = 650;

        //private var scoreDistance:int;

        private var gameArea:Rectangle;
        private var touchArea:Rectangle;
        private var shape:starling.display.Sprite = new starling.display.Sprite();

        private var target:Point = new Point(100, 100);

        private var touch:Touch;
        private var touchX:Number;
        private var touchY:Number;

        public function InGame()
        {
            super();
            this.addEventListener(starling.events.Event.ADDED_TO_STAGE, onAddedToStage);
        }

        private function onAddedToStage(event:Event):void
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
            drawGame();
        }

        private function drawGame():void
        {
            bg = new GameBackground();
            this.addChild(bg);

            scarlet = new Scarlet;
            scarlet.x = stage.stageWidth/2;
            scarlet.y = stage.stageHeight/2;
            this.addChild(scarlet);

            startBtn = new Button(Assets.getTexture("PlayBtn"));
            startBtn.x = stage.stageWidth * 0.5 - startBtn.width * 0.5;
            startBtn.y = stage.stageHeight * 0.5 - startBtn.height * 0.5 + 35;
            this.addChild(startBtn);

            fireBtn = new Button(Assets.getTexture("FireBtn"));
            fireBtn.x = 675;
            fireBtn.y = 435;
            this.addChild(fireBtn);

            //defines area scarlet can fly in
            gameArea = new Rectangle(0, 15, stage.stageWidth, stage.stageHeight - 150);
        }

        public function disposeTemporarily():void
        {
            this.visible = false;
        }

        public function initialize():void
        {
            this.visible = true;

            this.addEventListener(Event.ENTER_FRAME, checkElapsed);

            scarlet.x = -stage.stageWidth;
            scarlet.y = stage.stageHeight * 0.5;

            gameState = "idle";

            playerSpeed = 0;

            difficultyRate = 0.3;
            difficulty = 1;
            enemySpawnDelay = enemySpawnCounter = 100;

            enemies = new Array();
            lasers = new Array();

            scarletLocation = new Point(200, 400);

            addEventListener(Event.ENTER_FRAME, update);

            lasersLayer = new Sprite();
            enemiesLayer = new Sprite();
            touchLayer = new Sprite();

            addChild(lasersLayer);
            addChild(enemiesLayer);
            addChild(touchLayer);

            addEventListener(Event.ADDED_TO_STAGE, setupTouchLayer);
            touchLayer.addEventListener(Event.TRIGGERED, shootLaser);

            //scoreDistance = 0;

            startBtn.addEventListener(Event.TRIGGERED, onStartBtnClick);

            this.addEventListener(TouchEvent.TOUCH, onTouch);
        }

        private function onStartBtnClick(event:Event):void
        {
            startBtn.visible = false;
            startBtn.removeEventListener(Event.TRIGGERED, onStartBtnClick);

            launchScarlet();
        }

        private function launchScarlet():void
        {
            this.addEventListener(TouchEvent.TOUCH, onTouch);
            this.addEventListener(Event.ENTER_FRAME, onGameTick);
        }

        private function onTouch(event:TouchEvent):void
        {
            touch = event.getTouch(stage);

            touchX = touch.globalX;
            touchY = touch.globalY;

            target.x = event.touches[0].globalX;
            target.y = event.touches[0].globalY;
        }

        private function onGameTick(event:Event):void
        {
            switch(gameState)
            {
                case"idle":
                    //Take off
                    if (scarlet.x < stage.stageWidth * 0.5 * 0.5)
                    {
                        scarlet.x += ((stage.stageWidth * 0.5 * 0.5 + 10) - scarlet.x) * 0.5;
                        scarlet.y = stage.stageHeight * 0.5;

                        playerSpeed += (MIN_SPEED - playerSpeed) * 0.05;
                    }
                    else
                    {
                        gameState = "flying";
                    }
                    break;
                case"flying":
                    playerSpeed -= (playerSpeed - MIN_SPEED) * 0.01;

                    scarlet.y -= (scarlet.y - touchY) * 0.1;

                    if (-(scarlet.y - touchY) < 150 && -(scarlet.y - touchY) > -150)
                    {
                        scarlet.rotation = deg2rad(-(scarlet.y - touchY) * 0.075);
                    }

                    if (scarlet.y > gameArea.bottom - scarlet.height * 0.5)
                    {
                        scarlet.y = gameArea.bottom - scarlet.height * 0.5;
                        scarlet.rotation = deg2rad(0);
                    }
                    if (scarlet.y < gameArea.top + scarlet.height * 0.5)
                    {
                        scarlet.y = gameArea.top + scarlet.height * 0.5;
                        scarlet.rotation = deg2rad(0);
                    }

                    //scoreDistance += (playerSpeed * elapsed) * 0.1;
                    //trace(scoreDistance);

                    break;
                case"over":
                    break;
            }
        }

        //addapted from "Shoot"
        private function setupTouchLayer(event:Event):void
        {
            touchLayer.graphics.beginFill(0x000000, 0);
            touchLayer.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            touchLayer.graphics.endFill();

            touchArea = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
        }

        private function shootLaser(event:TouchEvent):void
        {
            makeLaser(scarletLocation);
        }

        private function makeLaser(scarletLocation:Point):void
        {
            var newLaser:Laser = new Laser();

            newLaser.x = scarletLocation.x;
            newLaser.y = scarletLocation.y;

            newLaser.xVel = 5;
            newLaser.yVel = 5;

            newLaser.addEventListener(Laser.PURGE_EVENT, purgeLaserHandler);

            lasersLayer.addChild(newLaser);
            lasers.push(newLaser);
        }

        private function purgeLaserHandler(event:Event):void
        {
            var targetLaser:Laser = Laser(event.target);
            purgeLaser(targetLaser);
        }

        private function purgeLaser(targetLaser:Laser):void
        {
            targetLaser.removeEventListener(Laser.PURGE_EVENT, purgeLaserHandler);
            try
            {
                var i:int;
                for (i = 0; i < lasers.length; i++)
                {
                    if (lasers[i].name == targetLaser.name)
                    {
                        lasers.splice(i, 1);
                        lasersLayer.removeChild(targetLaser);
                        i = lasers.length;
                    }
                }
            }
            catch(e:Error)
            {
                trace("Failed to delete laser!", e);
            }
        }

        private function makeEnemies():void
        {
            enemySpawnCounter++;

            if (enemySpawnCounter > enemySpawnDelay)
            {
                enemySpawnCounter = 0;
                enemySpawnDelay -= difficultyRate;
                difficulty += difficultyRate;
                makeEnemy();
            }
        }

        private function makeEnemy():void
        {

            var i:int;
            for (i = 0; i < Math.floor(difficulty); i++)
            {
                var newEnemy:Enemy = new SnowBall();

                newEnemy.x = 925;
                newEnemy.y = Math.random() * 375 + 50;
                //trace(newEnemy.x); trace(newEnemy.y);
                newEnemy.xVel = (-Math.random() * difficulty) - 5;
                newEnemy.sinMeter = Math.random() * 10;
                newEnemy.bobValue = Math.random() * difficulty;

                newEnemy.addEventListener(Enemy.PURGE_EVENT, purgeEnemyHandler);

                enemiesLayer.addChild(newEnemy);
                enemies.push(newEnemy);
            }
        }

        private function purgeEnemyHandler(event:Event):void
        {
            var targetEnemy:Enemy = Enemy(event.target);
            purgeEnemy(targetEnemy);
        }

        private function purgeEnemy(targetEnemy:Enemy):void
        {
            targetEnemy.removeEventListener(Enemy.PURGE_EVENT, purgeLaserHandler);
            try
            {
                var i:int;
                for (i = 0; i < enemies.length; i++)
                {
                    if (enemies[i].name == targetEnemy.name)
                    {
                        enemies.splice(i, 1);
                        enemiesLayer.removeChild(targetEnemy);
                        i = enemies.length;
                    }
                }
            }
            catch(e:Error)
            {
                trace("Failed to delete enemy!", e);
            }
        }

        private function newHitTest(laser:Laser):void
        {
            for each (var enemy:Enemy in enemies)
            {
                if (enemy.status != "Dead" && enemy.hitTest(new Point(laser.x, laser.y)))
                {
                    enemy.destroy();
                    purgeLaser(laser);
                }
            }
        }

        private function checkElapsed(event:Event):void
        {
            timePrevious = timeCurrent;
            timeCurrent = getTimer();
            elapsed = (timeCurrent - timePrevious) * 0.001;
        }

        private function update():void
        {
            //trace(enemies.length, lasers.length);

            for each (var enemy:Enemy in enemies)
            {
                enemy.update();
            }

            for each (var laser:Laser in lasers)
            {
                laser.update();
                newHitTest(laser);
            }

            makeEnemies();
        }
        //addapted from "Shoot"
    }
}
包屏幕
{
导入flash.geom.Point;
导入flash.geom.Rectangle;
导入flash.utils.getTimer;
进口物品。敌人;
导入objects.GameBackground;
输入物体。激光;
进口物品。鲜红;
导入objects.SnowBall;
导入starling.display.Button;
导入starling.display.Sprite;
导入starling.events.Event;
导入starling.events.Touch;
导入starling.events.TouchEvent;
导入starling.utils.RectangleUtil;
进口starling.utils.deg2rad;
公共类InGame扩展了Sprite
{
专用var startBtn:按钮;
私有var fireBtn:按钮;
私有变量bg:游戏背景;
斯佳丽:斯佳丽;
私人敌人:阵列;
专用var激光器:阵列;
地点:点;
私人激光层:雪碧;
私人杀手:精灵;
私人接触层:精灵;
私有var enemySpawnDelay:编号;
private var enemyspawincounter:Number;
私人var难度:数字;
私有var困难酸盐:数量;
private-var-timePrevious:编号;
专用var时间电流:数字;
私有变量:数字;
私有var游戏状态:字符串;
私人var播放器速度:数字;
私人施工最小速度:编号=650;
//私人距离:int;
私有区域:矩形;
私有区域:矩形;
私有变量形状:starling.display.Sprite=新的starling.display.Sprite();
私有var目标:点=新点(100100);
私人触摸:触摸;
私有变量x:数字;
私有变量touchY:数字;
公共职能
{
超级();
此.addEventListener(starling.events.Event.ADDED_至_阶段,OnAddedStatage);
}
AddedStatage上的私有函数(事件:事件):void
{
此.removeEventListener(Event.ADDED_至_阶段,OnAddedStatage);
drawGame();
}
私有函数drawGame():void
{
bg=新游戏背景();
这是addChild(bg);
猩红色=新的猩红色;
scarlet.x=stage.stageWidth/2;
scarlet.y=stage.stageHeight/2;
这是addChild(scarlet);
startBtn=new按钮(Assets.getTexture(“PlayBtn”);
startBtn.x=舞台宽度*0.5-舞台宽度*0.5;
起始高度y=舞台高度*0.5-起始高度*0.5+35;
本.addChild(startBtn);
fireBtn=新按钮(Assets.getTexture(“fireBtn”);
fireBtn.x=675;
fireBtn.y=435;
这个.addChild(fireBtn);
//定义scarlet可以飞入的区域
游戏区域=新矩形(0,15,stage.stageWidth,stage.stageHeight-150);
}
公共函数临时处置():无效
{
可见=假;
}
公共函数初始化():void
{
可见=真实;
this.addEventListener(Event.ENTER_FRAME,checkAppeased);
scarlet.x=-stage.stageWidth;
scarlet.y=舞台高度*0.5;
gameState=“空闲”;
playerSpeed=0;
硬脂酸盐=0.3;
难度=1;
enemySpawnDelay=enemySpawnCounter=100;
敌人=新阵列();
激光器=新阵列();
ScarlettLocation=新点(200400);
addEventListener(Event.ENTER_FRAME,update);
LaserLayer=新精灵();
enemiesLayer=新精灵();
touchLayer=新精灵();
addChild(激光层);
addChild(敌人杀手);
addChild(touchLayer);
addEventListener(Event.ADDED_至_阶段,setupTouchLayer);
touchLayer.addEventListener(事件触发,shootLaser);
//得分距离=0;
startBtn.addEventListener(Event.TRIGGERED,onStartBtnClick);
this.addEventListener(TouchEvent.TOUCH,onTouch);
}
启动时的专用函数单击(事件:事件):无效
{
startBtn.visible=假;
startBtn.removeEventListener(Event.TRIGGERED,onStartBtnClick);
启动Scarlet();
}
私有函数launchScarlet():void
{
this.addEventListener(TouchEvent.TOUCH,onTouch);
this.addEventListener(Event.ENTER_FRAME,onGameTick);
}
私有函数onTouch(事件:TouchEvent):无效
{
touch=event.getTouch(舞台);
touchX=touch.globalX;
touchY=touch.globalY;
target.x=event.touchs[0].globalX;
target.y=event.touchs[0].globalY;
}
私有函数onGameTick(事件:事件):无效
{
开关(游戏状态)
            Starling.multitouchEnabled = true;