AS ตอนที่ 4:ลดรูป ย่อโค้ด

เริ่มโพสต์โดย X Saint, 26 พ.ค. 2006, 13:04 น.

0 สมาชิก และ 1 บุคคลทั่วไป กำลังเปิดอ่านโพสต์นี้

Layiji

#15
ได้แล้วครับ
http://f0nt.com/forum/index.php?action=dlattach;topic=6169.0;id=9584

เอ่อ ผมสงสัยอย่างครับ คือว่าถ้าหาว่าเปลี่ยนสูตรตรงนี้
  this._width+=10*compr(this._width, this.tWidth);
              this._height+=10*compr(this._height, this.tHeight);
              this._x+=5*compr(this._x, this.tX);
              this._y+=5*compr(this._y, this.tY)


เฉพาะตัวเลขหน้าเครื่องหมาย คูณ เพื่อต้องการให้มันเคลื่อนที่เร็วกว่านี้ พอดีลองเปลี่ยนแล้วปรากฎว่า มันสั่นระริกๆ น่ะครับ แล้วเราจะรู้ได้ยังไงว่ามันจะไม่สั่น
http://f0nt.com/forum/index.php?action=dlattach;topic=6169.0;id=9585




นักเขียนการ์ตูนรายปี

X Saint

#16
จากสูตรนี้

this._x+=5*compr(this._x, this.tX);

ในส่วนของฟังก์ชั่น compr ถ้าลองไล่กลับไปดู เราจะได้ค่าเป็น 1 หรือ -1 หรือ 0 เท่านั้น
ซึ่งใช้กำหนดทิศทางคับ ส่วน ตัวคูณ ใช้เพื่อกำหนดจำนวน pixel

ดังนั้น 5 มันจึงเป็นค่า speed จริงๆอย่างที่เข้าใจ ยิ่งมาก ก็ยิ่งขยับทีละเยอะๆ

แต่สาเหตุที่มันสั่นระริก เพราะว่า มันวิ่งไปไม่ถึงค่าทีทำให้ compr เป็น 0 สักที เนื่องจากตำแหน่งปลายทางที่กำหนดไม่ได้เป็นเลขลงตัวตามค่าทวีคูณของค่าความเร็วครับ

นั่นเลยเป็นข้อจำกัดของการกำหนดเงื่อนไขการตรวจสอบให้หยุดแบบนี้... ซึ่งมันเข้าใจง่าย เพราะตรงไปตรงมาว่าถึงจุดก็หยุด... แต่สามารถสร้างเงื่อนไขเพิ่มความรัดกุมได้ เช่น ถ้าค่าตำแหน่งที่วิ่งไปแล้วมีค่าความต่างน้อยกว่า speed ก็ให้มันเลื่อนไปที่ตำแหน่งปลายทางเป๊ะๆ จะได้หยุดเลย เป็นต้นครับ....
(ตรงนี้จะทำให้โค้ดยาวขึ้นและเพิ่มความงงเล็กน้อย... ผมพยายามทำให้โค้ดสั้น และตรงไปตรงมาที่สุดคับ... แต่ยังมึนกันหมดเลย   :05:)

Layiji

ผมนั่งงงตรงฟังก์ชั่นตั้งนานน่ะครับ งงตรงที่ว่าจะคิดได้ยังไงว่าเอาแค่ค่าลบ ออกมาพอ
ถ้าผมคิดจะเป็นใช้ฟังก์ชั่นวนๆๆๆ แบบยาวๆ  :05:
นักเขียนการ์ตูนรายปี

X Saint

ฟังก์ชั่นนี้ค่อนข้างตรงไปตรงมานะคับ
คืออยากรู้ว่าต้องเคลื่อนที่ไปทิศทางไหน จึงเอา 2 จุดมาเปรียบเทียบกัน
จุดที่อยู่ทางขวาย่อมมีค่ามากกว่าจุดที่อยู่ทางซ้าย
จึงได้ออกมาเป็น

สมมุติ จุดA คือ ต้นทาง และจุดB คือ ปลายทาง

ถ้า A > B --> A อยู่ขวา ต้องเคลื่อนที่ไปซ้าย ทิศทางจึงเป็น -1
ถ้า A < B --> A อยู่ซ้าย ต้องเคลื่อนที่ไปขวา ทิศทางจึงเป็น 1
ส่วน 0 เพื่อปรับให้อยู่กับที่ไม่ต้องเคลื่อนอีกแล้ว

อ้างอิงif(this._x>this.tX) { return -1;}
else if(this._x<this.tX) { return 1;}
else { return 0;}



ส่วนอีกวิธีที่ใช้ ค่าสัมบูรณ์นั้น จะดูงงกว่า แต่เป็นวิธีที่ดีที่รวบการเปรียบเทียบเป็นเพียงสมการ...

แอ๊ะ

เข้ามาลงทะเบียนก่อน :22:

ยังไม่ได้เริ่มทำ
[ว่างให้เช่า]

bubbleball

ปัญหาของคุณ layiji

สมมุติถ้าผู้กองสั่งให้ทหารนายหนึ่งเดินไปทีละ ครึ่งเมตร ไปจนถึงริมหน้าผา นายทหารก็เดินไปเรื่อยๆ จนเผอิญก้าวสุดท้ายมันเหลือแค่  ค่อนเมตรนี่สิ  เดินไปอีกครึ่งเมตร สมองก็ต้องคิดก่อนว่าถ้ายังก้าวด้วยระยะทางเท่าเดิม คงไ้ด้ตกเหวแน่ๆ สู้รักษาชีวิต ก้าวไปตรงริมเหว พอดีน่าจะดีกว่า  :33:


check before done before error happend  :22:

ส่วนโค้ดต้องให้อาจารย์เฉลยครับ  :40:

Layiji

รอให้สอนบทต่อไปอยู่เลยครับ คนเรียนน้อยลงเรื่อยๆซะแล้ว  :05:

นักเขียนการ์ตูนรายปี

Ah!

ช่วงนี้งานยุ่งครับ
ไว้ให้เพลาๆลง จะกลับมาตั้งใจเรียนครับ
        AH_LuGDeK, AH_LuGDeK_R

เต่ามาก

เดี๋ยวผมจะโอนหน่วยกิตทีหลังนะครับ  :42:

นายโอ้เอ้

ตายล่ะ ลืมลงทะเบียน  :44:
Today you , Tomorrow me.

จ๋o

#25
ตามมาลงทะเบียนทีหลัง :22:

จานครับ ทำแล้วได้เยี่ยงนี้ครับ:05:
http://f0nt.com/forum/index.php?action=dlattach;topic=6169.0;id=9778
อ้างอิงโค๊ด
function compr(org, des) {
    if(org>des) { return -1;}
    else if(org<des) { return 1;}
    else { return 0;}
}
function moveBox(bx) {
   bx.onEnterFrame = function() {
      if(this._width!=this.tWidth||this._height!=this.tHeight||this._x!=this.tX||this._y!=this.tY) {
              this._width+=10*compr(this._width, this.tWidth);
              this._height+=10*compr(this._height, this.tHeight);
              this._x+=5*compr(this._x, this.tX);
              this._y+=5*compr(this._y, this.tY);
      } else {
              delete bx.onEnterFrame;
      }
   };
}
butt1.onRelease = function(){
   boxA.tWidth=100;
    boxA.tHeight=30;
    boxA.tX=60;
    boxA.tY=120;
    boxB.tWidth=220;
    boxB.tHeight=60;
    boxB.tX=60;
    boxB.tY=50;
    moveBox(boxA);
    moveBox(boxB);
}
butt2.onRelease = function(){
   boxA.tWidth=100;
    boxA.tHeight=100;
    boxA.tX=60;
    boxA.tY=50;
    boxB.tWidth=100;
    boxB.tHeight=100;
    boxB.tX=180;
    boxB.tY=50;
    moveBox(boxA);
    moveBox(boxB);
}
แต่ผมอยากได้อย่างงี้ ผมต้องเปลี่ยนแปลงตรงไหนยังไงเหรอครับ :44:
http://f0nt.com/forum/index.php?action=dlattach;topic=6169.0;id=9779

Kums


X Saint

อ้าว ไม่เห็น...  :42:

โทษทีคับ  :42:

ที่ว่าจะให้เป็นแบบนั้นหมายถึงจังหวะ ความเร็ว ที่มี easing หรือว่า ความยาวของ 2 กรอบที่เท่ากันหน่ะคับ ?

จ๋o

หมายถึงทิศทางน่ะครับ จะเห็นว่า แบบแรกมันจะยืดออกทั้งสองข้าง แล้วค่อยเลื่อนมาที่ตำแหน่งปลายทาง แต่แบบที่สอง(ที่อยากให้เป็น)จะยึดตำแหน่งทางด้านหนึ่งไว้แล้วนยืดอีกด้านไปที่ตำแหน่งปลายทาง :42:

X Saint

อ๋อ ถ้าอันนั้นอยู่ที่กำหนดจุด registerหรือจุด pivot ให้กับ movieClip ครับ
สังเกตว่าตอน convert เป็น MC มันจะมีกรอบให้เลือกจุด 9 จุด...
หรือถ้าเข้าไป edit ตัว MC จะเห็นว่ามันมี + อยู่ ก็คือ ถ้า + อยู่ตรงกลาง การยืดออกจะยืดทั้งสองด้านครับ
แต่ถ้าเรากำหนดให้อยู่มุมซ้ายบน เวลายืดก็จะออกไปทางด้านขวา ล่าง ครับ

SMF 2.1.7 © 2026, Simple Machines