ปัญหาเกี่ยวกับการใช้ตัวจับเวลา

ฉันเขียนตัวจับเวลาเพื่อแสดงให้ผู้ใช้เห็นว่าเขา/เธออยู่ในฉากปัจจุบันนี้มากแค่ไหน:

timer_txt.x = 352;
timer_txt.y = 705;
var nCount: Number = 0;
var myTimer: Timer = new Timer(50, nCount);

timer_txt.text = "Time: " + nCount.toString();
myTimer.start();

function countUp(e: TimerEvent): void {
   nCount++;
   timer_txt.text = "Time: " + nCount.toString();
   if (nCount > 60) {
      var formattedTime =
        ((Math.floor(nCount / 60)) + ":" + (nCount % 60 >= 10 ? "" : "0") + (nCount % 60));
      timer_txt.text = "Time: " + formattedTime.toString();
   }
}

ฉันมีปุ่ม reset เพื่อรีเซ็ตวัตถุอื่นๆ ในฉาก แต่ไม่ใช่ timer

ปัญหาของฉันคือ:

  1. เมื่อใดก็ตามที่ฉันคลิกที่ปุ่ม reset timer จะช้าลงเรื่อยๆ และฉันไม่รู้ว่าทำไมในขณะที่ฉันไม่ได้ทำการเปลี่ยนแปลงใดๆ ในตัวจับเวลา ฉันมี flags และ child มากมายบนเวที เมื่อผู้ใช้คลิก/แตะปุ่ม reset flags ทั้งหมดจะเท่ากับ 0 และ child ทั้งหมดจะเป็น removed และ add อีกครั้งเมื่อถึงเวที

  2. เมื่อผู้ใช้ไปที่ฉากอื่น (ตัวจับเวลาควรหยุดทำงานในขณะที่ค่าปัจจุบันของตัวจับเวลาจำเป็นต้องถูกบันทึกไว้ในตัวแปร) และเมื่อผู้ใช้กลับมาที่ฉากนี้อีกครั้ง ตัวจับเวลาควรทำงานดังนี้: previous value + counting the time

  3. เวลาเปิดในมือถือความเร็วจะต่างจากพีซี มีวิธีแก้ไขใดในการเขียนโค้ดให้เข้ากันได้กับจังหวะเวลาของอุปกรณ์เนทีฟหรือไม่? นี่คือฟังก์ชั่นที่ฉันเขียน:

    function timerAtoB(firstColor: int): void {
       lineColor = firstColor;
       //GRID;
       //Path A to B
       var PathAB: Grid;
       PathAB = new Grid(4, 35, 20, 22, canvas, lineColor);
       this.addChild(PathAB);
    }
    

ฟังก์ชันนี้คือการเชื่อมต่อมิติ A กับมิติ B การเชื่อมต่อระหว่าง A และ B จะถูกสร้างขึ้นโดยใช้คลาสที่เรียกว่า Grid- คลาสนี้คือการค้นหาเส้นทางที่สั้นที่สุดระหว่าง A และ B และทำการเชื่อมต่อระหว่างกัน (ซึ่งฉันไม่ต้องการผ่านมันไปมากกว่านี้เพราะมัน มีความซับซ้อนมากขึ้น)

และฉันเรียกฟังก์ชันนี้ด้วยความล่าช้า:

delayCallFunctions(1000, timerAtoB, wireColor);

เมื่อฉันใช้งานบนมือถือของฉัน ความล่าช้านี้จะทำงานได้ตามปกติแต่ไม่ใช่ในเวลาที่ถูกต้อง ตัวอย่างเช่น ฉันเขียน 1000ms หมายถึงเรียกใช้ฟังก์ชันหลังจากประมาณ 1 sec แต่ในมือถือของฉัน ต้องใช้มากกว่า 1 sec เพื่อเรียกใช้ฟังก์ชัน

ขอขอบคุณล่วงหน้าสำหรับเวลาและความช่วยเหลือของคุณ


person mazName    schedule 16.06.2017    source แหล่งที่มา
comment
สำหรับประเด็นที่สอง ฉันได้ใช้คลาสของตัวแปร ทุกครั้งที่ผู้ใช้ออกจากฉาก ค่าปัจจุบันจะถูกส่งไปที่คลาส และเมื่อผู้ใช้กลับมาที่ฉากเดิม คลาสจะส่งตัวแปรไปยังฉาก แต่เห็นได้ชัดว่ามันทำงานไม่ถูกต้อง!   -  person mazName    schedule 16.06.2017
comment
คุณไม่มีผู้ฟังในตัวจับเวลาของคุณ   -  person BadFeelingAboutThis    schedule 16.06.2017


คำตอบ (1)


ปัญหาของคุณมีแนวโน้มว่าทุกครั้งที่คุณกลับมาเยี่ยมชมเฟรมที่มีโค้ดนี้ที่คุณโพสต์ จะมีการสร้างอินสแตนซ์ตัวจับเวลาอื่นขึ้น

var nCount: Number = 0;
var myTimer: Timer = new Timer(50, nCount);

รหัสนั้นจะรีเซ็ต nCount ของคุณเป็น 0 และสร้างตัวจับเวลาใหม่ทุกครั้งที่คุณเยี่ยมชมเฟรม

เป็นไปได้มากว่าสิ่งที่คุณต้องการทำคือ:

//just declare the vars
var nCount:Number;
var myTimer:Timer;

//assign them a value only if they are empty
if(nCount === NaN) nCount = 0;
if(!myTimer) myTimer = new Timer(50, 0);

คุณจะต้องทำ myTimer.stop(); ทุกครั้งที่คุณออกจากที่เกิดเหตุ

ความแตกต่างของความเร็วระหว่างเดสก์ท็อป/มือถือของคุณน่าจะเกี่ยวข้องกับประสิทธิภาพ เนื่องจากความล่าช้า 50 มิลลิวินาทีนั้นไม่ใช่เวลามากนักในการทำสิ่งที่ซับซ้อนในการคำนวณ และอุปกรณ์มือถืออาจไม่สามารถตามทันได้ และด้วยเหตุนี้จึงช้าลง ลองพิจารณาเพิ่มการหน่วงเวลานั้นเป็น 100ms หรือ 250ms เพื่อดูว่าจะช่วยได้หรือไม่ นอกจากนี้ ให้กำจัด formattedTime var เนื่องจากไม่จำเป็น และเครื่องจับเวลาจะทำงานได้ดีขึ้นหากไม่มีหรือไม่

ตามคำแนะนำ คุณไม่จำเป็นต้องมี nCount var จริงๆ เนื่องจากตัวจับเวลามีคุณสมบัติ currentCount ที่ติดตามจำนวนครั้งที่ถูกทำเครื่องหมายตั้งแต่ timer.reset() ครั้งล่าสุด

person BadFeelingAboutThis    schedule 16.06.2017
comment
ขอบคุณสำหรับคำแนะนำและคำตอบที่ดีของคุณ ปัญหาที่สองได้รับการแก้ไขแล้ว แต่ปัญหาที่หนึ่งและสามยังคงอยู่แม้ว่าฉันจะกำหนด '1,000ms' ให้กับตัวจับเวลาก็ตาม - person mazName; 17.06.2017
comment
หากคุณต้องการความช่วยเหลือในข้อ 1 ในคำถามของคุณ โปรดแก้ไขคำถามของคุณเพื่อรวมรหัสที่เกี่ยวข้อง (รหัสใดก็ตามที่ปุ่มรีเซ็ตของคุณเรียกใช้) สำหรับ #3 อาจอธิบายเพิ่มเติมอีกเล็กน้อยเกี่ยวกับสิ่งที่เกิดขึ้น และคุณจะทราบได้อย่างไรว่าความเร็วต่างกัน - person BadFeelingAboutThis; 19.06.2017
comment
ฉันได้แก้ไขคำถามและให้ข้อมูลเพิ่มเติมเกี่ยวกับคำถามของฉันแล้ว โปรดแจ้งให้เราทราบ หากมีข้อมูลเพิ่มเติมที่จำเป็น - person mazName; 21.06.2017