кнопки не работают - PullRequest
       3

кнопки не работают

1 голос
/ 06 августа 2011

У меня есть следующая проблема / ошибка:

Я создал пользовательский класс кнопок (называемый CustomBlitButton), в котором определена кнопка. Состояния переворачивания кнопки определяются внутри класса CustomScreen. Это потому, что пользовательский экран содержит одну или несколько кнопок. Я могу создать кнопку при использовании функции createButton класса CustomScreen.

Так что, если я хочу сделать экран с меню, то есть несколько кнопок, которые я делаю так (это просто отрывок):

private var buttonOff:ButtonOff = new ButtonOff(0, 0);
private var buttonOver:ButtonOver = new ButtonOver(0, 0);

private var buttonOff2:ButtonOff = new ButtonOff(0, 0);
private var buttonOver2:ButtonOver = new ButtonOver(0, 0);

private var creditsButton:CustomBlitButton;
private var settingsButton:CustomBlitButton;


titleScreen = new CustomScreen(FrameWorkStates.STATE_SYSTEM_TITLE,     stageWidth, stageHeight, 0, 0, testPic,
                                           false, 0x000000);            

titleScreen.createButton(creditsButton, buttonOff, buttonOver, "Credits", new Point(centerX - 50, stageHeight / 2 + 25), 100, 20,
                                     screenButtonFormat, 2);

titleScreen.createButton(settingsButton, buttonOff2, buttonOver2, "Settings", new Point(centerX - 50, stageHeight / 2 + 50), 100, 20,
                                     screenButtonFormat, 2);

Но это не работает! :( На экране появляются несколько кнопок, и у каждой из них есть свой собственный EventListener, но только последняя созданная мной кнопка меняет свой цвет, когда я наводю на нее мышь. Все остальные кнопки не меняют свои цвета при наведении на них мышью.

Пожалуйста, кто-нибудь может мне помочь с этой проблемой? Большое спасибо .:)

Это код, где определяется пользовательский экран с состояниями переворачивания пользовательской кнопки.

package com.framework_mod.src
{
import flash.display.*;
import flash.events.*;
import flash.geom.Point;
import flash.text.*;



public class CustomScreen extends Sprite {

    private var displayText:TextField = new TextField();
    private var backgroundBitmapData:BitmapData;
    private var backgroundBitmap:Bitmap;
    private var okButton:SimpleBlitButton;
    private var custButton:CustomBlitButton;
    private var settingsButton:SimpleBlitButton;
    private var creditsButton:SimpleBlitButton;
    private var instructionsButton:SimpleBlitButton;
    private var highscoreButton:SimpleBlitButton;
    private var levelButton:SimpleBlitButton;
    private var testButton:CustomBlitButton;


    private var id:int;


    public function CustomScreen(id:int, width:Number, height:Number, xPos:int, yPos:int, image:BitmapData,
                                isTransparent:Boolean, color:uint) {
        this.id = id;

        backgroundBitmap = new Bitmap(image);
        this.x = xPos;
        this.y = yPos;
        addChild(backgroundBitmap);
    }



    public function createDisplayText(text:String, width:Number, location:Point, textFormat:TextFormat):void {
        displayText.y = location.y;
        displayText.x = location.x;
        displayText.width = width;
        displayText.defaultTextFormat = textFormat;
        displayText.text = text;
        displayText.selectable = false;
        displayText.mouseEnabled = true;
        displayText.embedFonts = true;
        displayText.blendMode = BlendMode.LAYER;
        displayText.alwaysShowSelection = false;
        addChild(displayText);
    }



    public function createButton(button:CustomBlitButton, btnOff:ButtonOff, btnOver:ButtonOver, text:String, location:Point, width:Number,
                                     height:Number, textFormat:TextFormat, positionOffset:Number = 0):void {

        custButton = button;

        custButton = new CustomBlitButton(btnOff, btnOver, location.x, location.y, width, height, text,
                                        textFormat, positionOffset);
        addChild(custButton);

        custButton.addEventListener(MouseEvent.MOUSE_OVER, buttonOverListener, false, 0, true);
        custButton.addEventListener(MouseEvent.MOUSE_OUT, buttonOffListener, false, 0, true);
        custButton.addEventListener(MouseEvent.CLICK, buttonClickListener, false, 0, true);


    }


    public function setDisplayText(text:String):void {
        displayText.text = text;
    }



    public function buttonClickListener(e:MouseEvent):void {
        dispatchEvent(new CustomEventButtonId(CustomEventButtonId.BUTTON_ID, id));
    }


    private function buttonOverListener(e:MouseEvent):void {
        custButton.changeBackGroundColor(CustomBlitButton.OVER);
    }


    private function buttonOffListener(e:MouseEvent):void {
        custButton.changeBackGroundColor(CustomBlitButton.OFF);
    }

}

}

Это код, по которому определяется кнопка:

package com.framework_mod.src
{
import flash.display.*;
import flash.text.*;


public class CustomBlitButton extends Sprite
{
    public static const OFF:int = 1;
    public static const OVER:int = 2;

    private var offBackGroundBD:BitmapData;
    private var overBackGroundBD:BitmapData;

    private var imageBg:BitmapData;

    private var positionOffset:Number;
    private var tempText:TextField = new TextField();

    private var buttonBackGroundBitmap:Bitmap;
    private var buttonTextBitmapData:BitmapData;
    private var buttonTextBitmap:Bitmap;

    public function CustomBlitButton(imageOff:BitmapData, imageOver:BitmapData, x:Number, y:Number, width:Number,
                                     height:Number, text:String, textformat:TextFormat, positionOffset:Number = 0)
    {
        this.positionOffset = positionOffset;
        this.x = x;
        this.y = y;


        offBackGroundBD = imageOff;
        overBackGroundBD = imageOver;

        buttonBackGroundBitmap = new Bitmap(offBackGroundBD);

        tempText.embedFonts = true;
        tempText.blendMode = BlendMode.LAYER;
        tempText.autoSize = TextFieldAutoSize.LEFT;
        tempText.defaultTextFormat = textformat;
        tempText.selectable = false;
        tempText.setTextFormat(textformat);
        tempText.text = text;

        buttonTextBitmapData = new BitmapData(tempText.textWidth + positionOffset, tempText.textHeight
                                              + positionOffset,true,0x00000000);

        buttonTextBitmapData.draw(tempText);
        buttonTextBitmap = new Bitmap(buttonTextBitmapData);
        buttonTextBitmap.x = ((buttonBackGroundBitmap.width - int(tempText.textWidth))/2)-positionOffset;
        buttonTextBitmap.y = ((buttonBackGroundBitmap.height - int(tempText.textHeight))/2)-positionOffset;

        addChild(buttonBackGroundBitmap);
        addChild(buttonTextBitmap);
        this.buttonMode = true;
        this.mouseChildren = false;
        this.useHandCursor = true;
    }

    public function changeBackGroundColor(typeval:int):void
    {
        if (typeval == CustomBlitButton.OFF)
        {
            buttonBackGroundBitmap.bitmapData = offBackGroundBD;
        }
        else
        {
            buttonBackGroundBitmap.bitmapData = overBackGroundBD;
        }
    }


}

}

1 Ответ

1 голос
/ 20 августа 2011

ваш код очень грязный, но хочу указать на некоторые глюки, которые я обнаружил, которые, возможно, заставят ваш код работать:

Во-первых, когда вы создаете свои кнопки в одном экземпляре CustomScreen, они связываются с одной и той же переменной: CustomScreen.custButton

тогда custButton - это тот, у кого есть слушатели, а не ссылка на связанные кнопки: creditsButton и settingsButton

так, каждый раз, когда вы создаете кнопку, вы связываете custButton с другим объектом, также связывает слушателей, а предыдущая кнопка становится несвязанной и не прослушивает события

я рекомендую вам создать настоящий класс Button, из которого должна происходить каждая кнопка, этот «материнский» класс должен реализовывать своих собственных слушателей и отправлять события для событий мыши, которые вам нравятся ...

вот что я делаю:

Во-первых, создайте интерфейс кнопки, если вам нужен порядок:

package buttons 
{
    import flash.events.MouseEvent;

    /**
     * ...
     * @author Joe Cabezas
     */
    public interface IButton 
    {
        function onClick(e:MouseEvent):void;
        function onRollOver(e:MouseEvent):void;
    }

}

Затем создайте класс Button, из которого должны быть получены все типы Button:

package buttons 
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    /**
     * ...
     * @author Joe Cabezas
     */
    public class Button extends Sprite implements IButton
    {

        public function Button() 
        {
            this.agregarListeners();
        }

        private function agregarListeners():void 
        {
            this.addEventListener(MouseEvent.CLICK, onClick);
            this.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
        }

        /* INTERFACE botones.IButton */

        public function onClick(e:MouseEvent):void
        {

        }

        public function onRollOver(e:MouseEvent) :void
        {

        }

    }

}

Далее, каждый раз, когда вы хотите создать кнопку, просто расширяйте класс кнопок выше, и он автоматически настроит своих собственных слушателей, см. Этот пример MenuButton, расширяющего класс кнопок.

package buttons
{
    import com.as3joelib.generators.TextFieldGenerator;
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormatAlign;
    /**
     * ...
     * @author Joe Cabezas
     */
    public class BotonMenuSuperior extends Button 
    {
        //constantes de diseño
        private const padding:Number = 10;

        private var fondo:Sprite;
        private var color:uint;

        private var text_string:String
        private var text_field:TextField;

        public function BotonMenuSuperior(text:String, color:uint) 
        {
            super();

            this.text_string = text;
            this.color = color;

            this.setup();
            this.dibujar();
        }

        private function setup():void 
        {
            //crear textfield
            this.text_field = TextFieldGenerator.crearTextField(this.text_string, {
                //border:true,
                size:15,
                embedfonts:false,
                color:0xffffff
            });
            this.text_field.x = this.padding*0.75;
            this.text_field.y = this.padding*0.75;

            //crear fondo
            this.fondo = new Sprite();

            this.fondo.graphics.beginFill(this.color);
            this.fondo.graphics.drawRect(0, 0, this.text_field.textWidth + 2*this.padding, this.text_field.textHeight + 2*this.padding);
            this.fondo.graphics.endFill();
        }

        private function dibujar():void 
        {
            this.addChild(this.fondo);
            this.addChild(this.text_field);
        }


        //overriding functions to create the custom behavior of this button when mouse events happens
        override public function onClick (e:MouseEvent):void{
            //do here whatever you like when user clicks this button, like:
            this.scaleX = this.scaleY = 1.5;
        }


    }

}

Как вы можете видеть, этот класс не определил / не создал своих слушателей, потому что он уже есть, затем вы можете создавать свои собственные события, модулируя класс Button для всплытия своих событий ...

надеюсь, это вам поможет!

также, подсказка, в вашем коде:

public class CustomScreen extends Sprite {

    ...

    public function createButton(button:CustomBlitButton, btnOff:ButtonOff, btnOver:ButtonOver, text:String, location:Point, width:Number,
                                 height:Number, textFormat:TextFormat, positionOffset:Number = 0):void {

    custButton = button; //<-- this

    custButton = new CustomBlitButton(btnOff, btnOver, location.x, location.y, width, height, text,
                                    textFormat, positionOffset);
    addChild(custButton);

    ...
    }
}

как первый параметр будет полезен с этим кодом?

это как:

public funcion(a:Number, b:number):Number{
    var xa:Number = a;

    xa = 2;

    return xa + b;
}

пожалуйста, создайте интерфейсы, это сделает ваш код более упорядоченным

до свидания!

PD: я говорю по-испански, так что извините, если плохо говорю по-английски

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...