1

AS3で定期的に次のようなカレンダーを作成する必要があります。

通常のカレンダー

そしてこれは日付がクリックされたとき:

日付をクリックしました

私は基本を理解していると思いますが、ここからどこに行けばいいのかわからず、日々を適切に機能させるためにコードの何が問題になっているのか理解できません。

メインコード:

package code {

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;


public class Main extends MovieClip {

    private var days:Array = new Array();
    public var selectedDay:Day = null;

    public function Main() {
        // constructor code
        var across: int = 7;

        for( var i:int = 0; i < 31; i++)
        {
            var row:int = Math.floor( i / across );
            var col:int = i % across;

            var d:Day = new Day();
            addChild(d);
            d.x = col * (d.width);
            d.y = row * (d.height);
            days.push(d);
            d.addEventListener(MouseEvent.CLICK, onClick);
        }



    }

    public function onClick(e:MouseEvent):void{
        if (selectedDay == null){
            trace("meow!");
            days[1].gotoAndStop(2);
        }
        else if (selectedDay != null){

        }
}
}

}

およびデイコード:

package code {

import flash.display.MovieClip;
import flash.text.TextField;


public class Day extends MovieClip {

    public var weekday_txt:TextField;
    public var date_txt:TextField;

    public function Day() {
        // constructor code
        for (var num:int = 0; num < 7; num++){

            var weekDays:Array = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
            weekday_txt.text = weekDays[num];
            //trace(weekDays[num]);
            date_txt.text = ""+42;
        }
    }
}

}

助けてくれてありがとう!

4

2 に答える 2

1

論理的なエラーを説明するよりも簡単なので、クラスを書き直しました。

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;

public class Main extends MovieClip{

    private var days:Array = new Array();
    private var selectedDay:Day;

    public function Main() {
        stop();

        days = new Array();
        var weekDayTitles:Array = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");

        var across:int = 7;
        for (var i:int=0; i<31; i++){
            var row:int=Math.floor(i/across);
            var col:int = i%7;

            var d:Day = new Day();
            addChild(d);
             d.x = col * (d.width);
            d.y = row * (d.height);
            d.setWeekDay(weekDayTitles[col]);
            d.setDate(""+(i+1));
            days.push(d);
            d.addEventListener(MouseEvent.CLICK, onClick);
        }
    }

    public function onClick(e:MouseEvent):void{
        if (selectedDay != null){
            selectedDay.setAsUnSelected();
        }
        selectedDay = Day(e.target);
        selectedDay.setAsSelected();
    }

}// Class

そして、Dayクラスは次のようになります。

// make sure this class is linked to a movieclip 
// in your library that has two frames 
// frame 1 = "unselected"
// frame 2 = "selected";

// make sure to have 2 textfields in the linked symbol, one named : "weekdayTxt" and the other "dateTxt"

public class Day extends MovieClip{

    public var weekday_txt:TextField;
    public var date_txt:TextField;

    public function Day() {
        gotoAndStop(1);
        weekday_txt = this.weekdayTxt;
        date_txt = this.dateTxt;
    }

    public function setWeekDay(_day:String):void{
        weekday_txt.text = _day;
    }

    public function setDate(_date:String):void{
        day_txt.text = _date;
    }

    public function setAsSelected():void{
        this.gotoAndStop(2);
    }

    public function setAsUnSelected():void{
        this.gotoAndStop(1);
    }

}// Class
于 2013-03-26T19:17:33.403 に答える
0

まあ、あなたはそれの要点を持っていると思いますが、あなたのonClickメソッドは常に配列の2日目をターゲットにして、それをフレーム2に設定していることに気付きました。これは、「selectedDay」を初期化したようには見えないためです。 ..:

public function onClick(e:MouseEvent):void{
    if (selectedDay == null){
        trace("meow!");
        days[1].gotoAndStop(2);
    }
    else if (selectedDay != null){

    }
}

関数を次のように変更すると役立つ場合があります。

public function onClick(e:MouseEvent):void{
    if (selectedDay != null){
       selectedDay.gotoAndStop(1);  //assuming frame 1 is an "unselected" state 
    }  // you don't really need an else, if you are not going to do anything in it
    selectedDay = e.target;
    selectedDay.gotoAndStop(2);
}


public function getSelectedDayInfo():Object{
    var _object = new Object();
    _object.weekday = "nothing selected";
    _object.date = "nothing selected";
    if(selectedDay != null){
        _object.weekday = selectedDay.weekday_txt.text;
        _object.date = selectedDay.date_txt.text;
    }
    return (_object);
}

お役に立てば幸いです...

于 2013-03-26T02:34:11.967 に答える