เมนูเพิ่มเติม
เข้าชม: 2665|ตอบกลับ: 7

[Adminstrator]


เหงาจุง

อาสึนะ คิริโตะ HBD Tz Azusa Yui Mikasa Ackerman Hatsune Miku Tokisaki Kurumi 2Y Yatogami Tohka Itsuka Shido Tobiichi Origami Itsuka Kotori Yoshino Tokisaki Kurumi Kuriyama Mirai Yaya Mio Yukina Tsumugi HBD Miku 7Y Halloween 2014 Sinon  Christmas ! 2014 Happy new year 2015 Saitama Inori วันแม่ 2559

  • โมเอะ: 47521
  • Money: 5462126
  • Tz: 51238
  • Posts: 5429
  • Donate: 970 THB
  • Joined: 11-11-2011
พลังน้ำใจ: 196353
   Pet:
Rem V.1
หัวฟ้านางเอก

โพสต์เมื่อ 10-12-2011 22:24:59 |แสดงโพสต์ทั้งหมด
คือมีรีเควสมา เกี่ยวกับโค้ดกระพริบ
ประมาณว่าเขียนเป็นตัวอย่างพร้อมอธิบายลงบอร์ดครับ

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

ก่อนอื่นครับให้เราไปเซ็ตไฟล์ดังนี้ก่อน
file>>>properties ตามรูป



กันการเกินการตัดบรรทัดโดยอัตโนมัติครับ
เวลาบรรทัดมีข้อความยาวๆ มันจะทำให้เกิดการตัดเป็น2บรรทัด
เพราะมีการตัดบรรทัดเป็น2บรรทัดนี่แหละ อาจจะทำให้เอฟเฟคไม่เป็นดังที่คิด



ไอเดียคือ โค้ดกระพริบ
แต่ไม่ได้จำกัดว่ากระพริบอะไรแบบไหนยังไงก็ขอคิดรูปแบบตามใจตัวเองแล้วกันนะ

tagsโค้ดกระพริบขั้นพื้นฐานคือ
{\t(90,100,\alpha&HFF&)\t(190,200,\alpha&H00&)
\t(290,300,\alpha&HFF&)\t(390,400,\alpha&H00&)
\t(490,500,\alpha&HFF&)\t(590,600,\alpha&H00&)
\t(690,700,\alpha&HFF&)\t(790,800,\alpha&H00&)
\t(890,900,\alpha&HFF&)\t(990,1000,\alpha&H00&)
\t(1090,1100,\alpha&HFF&)\t(1190,1200,\alpha&H00&)}ข้อความ

ตามtagsข้างบน เป็นการกระพริบ6 ครั้ง
\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&HFF&)\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&H00&) คือกระพริบ1ครั้ง


อธิบายtagsได้ดังนี้
\t(เวลาเริ่มต้น,เวลาสิ้นสุด,ผลลัพธ์ที่จะทำให้เกิด) เป็นการเปลี่ยนแปลงจากเวลาเริ่มต้นจะค่อยๆเปลี่ยนเป็นผลลัพธ์ณ เวลาสิ้นสุด
\alpha&HFF&อักษรโปร่งใส ค่าFFคือค่าความโปร่งใสเป็นเลขฐาน16(0-F) ในที่นี้คือใสมากจนมองไม่เห็น
\alpha&H00&อักษรโปร่งใส ค่า00คือค่าความโปร่งใสเป็นเลขฐาน16(0-F) ในที่นี้คือไม่ใสเลยมองเห็นชัดเจน


การกระพริบแบบแรกคือ
กระพริบโดยกำหนดเวลาตายตัวจะกระพริบเป็นเวลาตามระยะห่างที่กำหนดเท่ากันตั้งแต่ต้นจนจบ
โค้ดดังนี้




code set_time = 100
code numerator = 0;denominator = 0;j = 1;tags = ""
code function blink(j,time) tag =string.format("\\t(%d,%d,\\alpha&HFF&)\\t(%d,%d,\\alpha&H00&)",time*(2*j-1)-10,time*(2*j-1),time*(2*j)-10,time*(2*j)); return tag end
code function conline(ldur) if(set_time>=100 and set_time<=2000) then denominator = math.floor((ldur+numerator)/set_time); numerator = (ldur+numerator)%set_time; while(j<=denominator) dotags = tags..blink(j,set_time); j = j+1; end; end; return tags end

templateline noblank  {\pos($lx,$ly)!conline($ldur)!}


ขออธิบายแนวคิดดังนี้
เนื่องจากว่าโค้ดเราทำการapplyเป็บบรรทัดๆซึ่งแต่ละตัวอักษรเวลาจะไม่เท่ากัน
เราจึงมีการกำหนดค่าเศษส่วนเพื่อให้เวลาที่คำนวนออกมานั้นเท่าๆกัน
เช่นกำหนดให้เวลาห่าง100เท่าๆกัน แต่เราไทม์เวลาได้250
เรานำ250มาหาร 100ได้ส่วน2 แปลว่าตัวอักษรนี้กระพริบ2ครั้ง
และเศษที่เหลือจากเวลาก่อนหน้าคือ50ไว้เอามาบวกกับเวลาที่เราไทม์ตัวต่อไป
เท่านี้เวลาที่เราไทม์ไม่ว่าจะไทม์เท่าไหร่ก็จะได้ผลออกมาเท่าๆกันทุกบรรทัด
ซึ่ง เศษคือ numerator  และส่วน  คือ  denominator

อธิบายโค้ด
1 set_time = 100 บรรทัดนี้เป็นตัวกำหนดว่าจะให้ห่างเท่าไหร่ตามแต่เราจะใส่ อยู่ในตัวแปรชื่อset_time
2 numerator = 0;denominator = 0;j = 1;tags = ""เป็นการกำหนดตัวแปรค่าเริ่มต้นต่างๆเพื่อใช้ในโค้ด ประกาศไว้ข้างนอกเพื่อบอกว่าค่าพวกนี้ใช้กับทุกบรรทัดได้ บรรทัดนี้ไม่ต้องไปยุ่งมัน
3function blink(j,time) tag =string.format("\\t(%d,%d,\\alpha&HFF&)\\t(%d,%d,\\alpha&H00&)",time*(2*j-1)-10,time*(2*j-1),time*(2*j)-10,time*(2*j)); return tag end

เป็นการเขียนฟังค์ชั่นซึ่งมีรูปแบบดังนี้
functionชื่อฟังค์ชั่น(ตัวแปรจากภายนอกที่รับมาเพื่อใช้ในการคำนวนภายในนี้มีหลายตัวคั่นด้วย,)
        คำสั่งคำนวนปิดท้ายด้วย;ต่อ1คำสั่ง        
        returnค่าที่คำนวนได้แล้วส่งกลับไปถ้าใช้""คือส่งค่าว่างๆไปให้
end

ในที่นี้คือ

functionblink(j,time)
        tag=string.format("\\t(%d,%d,\\alpha&HFF&)\\t(%d,%d,\\alpha&H00&)",time*(2*j-1)-        10,time*(2*j-1),time*(2*j)-10,time*(2*j));
        returntag
end

ตรงส่วนtag ต่างกับ tagsเป็นการตั้งชื่อใกล้เคียงกันครับแต่คนละตัวโดยจะใช้เก็บข้อความ
string.format("");คือ รูปแบบข้อความครับค่าที่อยู่ใน""เป็นรูปแบบข้อความที่เก็บ
ในที่นี้เราต้องการเก็บ\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&HFF&)\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&H00&)
เพื่อเอามาใช้ในการวนลูป พิมพ์ซ้อนๆกันนั่นเอง
การเก็บข้อความในstring.formatนั้น
1เครื่องหมาย \ต้องพิมพ์ \\ซ้อนกันนะครับ
\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&HFF&)จึงเป็น  \\t(%d,%d,\\alpha&HFF&)
2%d คือค่าตัวเลขที่จะเอามาใส่ครับสังเกตว่าจะมี4ตัว จะเรียงลำดับตัวที่จะใส่ดังนี้  
        1time*(2*j-1)-10
        2time*(2*j-1)
        3time*(2*j)-10
        4time*(2*j)
แต่ละตัวคั่นด้วยเครื่องหมาย ,(ลูกน้ำ) และ *คือเครื่องหมายคูณ

เรามาดูการหลักการคำนวนกันนะครับค่าtime  กับj  เรารับมาจากข้างนอกดังที่เห็นblink(j,time)
timeคือเวลาครับ jคือค่าที่เวลาทำการวนลูปค่าจะเพิ่มไปเรื่อยๆทีละ1
หลักการคือ เราสังเกตตรงเวลา
\t(90,100,\alpha&HFF&)\t(190,200,\alpha&H00&)
\t(290,300,\alpha&HFF&)\t(390,400,\alpha&H00&)
\t(490,500,\alpha&HFF&)\t(590,600,\alpha&H00&)
\t(690,700,\alpha&HFF&)\t(790,800,\alpha&H00&)

เวลาคือ 90 100 190 200290 300 390 400.....
90ถึง 100ข้อความจะค่อยๆหายไป
เริ่มเมื่อ90หายไปอย่างสมบูรณ์เมื่อเวลาไปถึง100
จากนั้น190ข้อความจะค่อยๆปรากฏและมาเห็นชัดเจนเมื่อเวลา200
พอมา290ข้อความจะค่อยๆหายไปอีกครั้งวนไปเรื่อยๆ

สมการจึงเป็นtime*(2*j-1)-10
2*j-1เป็น สมการเลขคี่ครับ
เมื่อjมีค่าตั้งแต่1เพิ่มไปเรื่อยๆทีละ1 เมื่อคูณด้วย2ค่าที่ได้จะเป็นเลขคู่2 4 6 8 10.....
ลบออกไป1ก็จะเป็นเลขคี่13 5 7 9.... คือคำตอบสมการนี้
และtimeคือ เวลาในที่นี้ก็คือset_time ถ้าset_time= 100
        1time*(2*j-1)-10 คือ100*(13 5 7 9.... )-10 ก็จะได้90 290 490 690....
        2time*(2*j-1)      คือ100*(13 5 7 9.... ) ก็จะได้100 300 500 700....
        3time*(2*j)-10    คือ100*(24 6 8 10.....)-10 ก็จะได้190 390 590 790....
        4time*(2*j)         คือ100*(24 6 8 10.....)-10 ก็จะได้200 400 600 800....

และเมื่อเราเรียกฟังค์ชั่นนี้มาใช้ค่า\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&HFF&)\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&H00&)
จะคำนวนเวลาให้เองเรื่อยๆครับ เมื่อjเพิ่มขึ้นทีละ1


4function conline(ldur)
        if(set_time>=100and set_time<= 2000) then
                denominator= math.floor((ldur+numerator)/set_time);  
                numerator= (ldur+numerator)%set_time;
           while(j<=denominator) do
                        tags= tags..blink(j,set_time);
                        j= j+1;
           end;
        end;
        returntags
end

คงจำฟังค์ชั่นกันได้
functionชื่อฟังค์ชั่น(ตัวแปรจากภายนอกที่รับมาเพื่อใช้ในการคำนวนภายในนี้มีหลายตัวคั่นด้วย,)
        คำสั่งคำนวนปิดท้ายด้วย;ต่อ1คำสั่ง        
        returnค่าที่คำนวนได้แล้วส่งกลับไปถ้าใช้""คือส่งค่าว่างๆไปให้
end

แต่ในที่นี้จะพิเศษหน่อยเมื่อมีการตรวจสอบเงื่อนไข(if)และการวนลูป(while)มาด้วย
การตรวจสอบเงื่อนไข(if)เราใช้คำสั่งดังนี้ครับ
        if(เงื่อนไขถ้าเป็นจริงจะทำคำสั่งถ้าไม่ใช่จะข้ามคำสั่งไปไม่ทำ)then
                คำสั่งที่จะให้ทำ;
        end;

โค้ดเราก็จะเป็น
        if(set_time>=100and set_time<= 2000) then
                denominator= math.floor((ldur+numerator)/set_time);  
                numerator= (ldur+numerator)%set_time;
           while(j<=denominator) do
                        tags= tags..blink(j,set_time);
                        j= j+1;
           end;
        end;

เรามีคำสั่งในif ด้วยกัน3คำสั่ง
1 denominator = math.floor((ldur+numerator)/set_time);  
2 numerator = (ldur+numerator)%set_time;
3  while(j<=denominator) do
                        tags= tags..blink(j,set_time);
                        j= j+1;
           end;

อธิบายดังนี้
denominator= math.floor((ldur+numerator)/set_time);
คำนวนค่าส่วนเก็บไว้ในตัวแปรชื่อ denominator
math.floor(สมการที่คำนวน)คือคำสั่งปัดเศษตัวเลขที่ได้ภายในวงเล็บ
ถ้าmath.floor(5.7)ก็จะเป็นค่า 5     ถ้าmath.floor(5.1)ก็จะได้ค่า 5
ldurคือชื่อตัวแปรจากconline(ldur) โดยเรารับค่า$ldurมาใส่ครับ
$ldurก็คือ ค่าระยะเวลาendtime - start time ของบรรทัดนั้นๆ
numeratorคือตัวแปรเก็บค่าเศษที่เหลือจากบรรทัดก่อนหน้า
/ในที่นี้คือเครื่องหมายหาร
set_time คือ เวลาset_timeที่เรากำหนดนั่นเอง

numerator= (ldur+numerator)%set_time;
ldur คือ  ค่าระยะเวลาendtime - start time ของบรรทัดนั้นๆ
numeratorคือตัวแปรเก็บค่าเศษที่เหลือจากบรรทัดก่อนหน้า
%คือ เคื่องหมายหารเอาแต่เศษครับเช่น 8%10 ได้เศษ8   11%10 ได้เศษ1  12%10 ได้เศษ2
ไม่มีการเก็บส่วนไว้
set_time คือ เวลาset_timeที่เรากำหนดนั่นเอง


while(j<=denominator)do
                tags= tags..blink(j,set_time);
                j= j+1;
end;

คือคำสั่งวนลูปครับ  ลักษณะการใช้งานดังนี้
while(เงื่อนไข)do
        คำสั่ง;
end;

เงื่อนไขกำหนดว่า  ขณะที่ jน้อยกว่าหรือเท่ากับdenominatorให้ทำคำสั่งต่อไปนี้
กล่าวง่ายๆถ้า jมากกว่าก็หลุดจากลูป

คำสั่ง tags =tags..blink(j,set_time);
tagsคือค่าที่เราประกาศไว้แต่ตอนต้นเป็นค่าว่างใช้เก็บข้อความ
..(จุด2ตัว)คือ การต่อข้อความกับข้อความในที่นี้ต่อ tagsกับblink
blink(j,set_time);คือคำสั่งเรียกใช้ฟังค์ชั่นblink(j,time); โดยส่งค่าjและset_timeเข้าไป
ค่าที่ได้ออกมาคือ \t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&HFF&)\t(เวลาเริ่ม,เวลาสิ้นสุด,\alpha&H00&)

สรุปคำสั่งนี้ จะเป็นการต่อข้อความออกมาเรื่อยๆตามที่วนลูปนั่นเอง

คำสั่งj =j+1;
กำหนดค่า j เพิ่มขึ้น1ค่ามีความสำคัญอย่างยิ่ง
เพราะว่าถ้าค่าjไม่เพิ่ม ลูปจะวนไม่สิ้นสุดโปรแกรมจะแฮ้งค์ได้


การใช้งาน
templateline noblank  {\pos($lx,$ly)!conline($ldur)!}

คำนวนเป็นบรรทัดโดยใช้template line
noblankคือไม่คำนวนบรรทัดที่ว่างเปล่า

โค้ดคือ เซ็ตตำแหน่ง xy ของบรรทัด
คำสั่งconline($ldur)ซึ่งเป็นชื่อฟังค์ชั่นจะต้องอยู่ระหว่าง !และ !ลองดูครับ


โหลดไฟล์ไปทดสอบได้นอกจากนี้ผมยังสร้างแบบอื่นๆไว้ด้วย
ไม่สมบูรณ์เท่าไหร่และถ้าให้อธิบายคงยืดยาวเกินไป ลืมไปละสร้างถึงไหน
เอาไปลองสนุกๆได้นะครับสงสัยถามได้นะ


http://www.mediafire.com/?sharekey=41fcf2f7b65a01c575a4fc82078ae6c8851cf8494eff5e40f0a154af670496da

blink คือไฟล์ตามตัวอย่าง
blinkborder คือไฟล์ที่ทดลองสร้างดัดแปลงหลายๆแบบ



พวกข้างล่างสร้างไว้ตั้งแต่ได้รีเควสเข้ามา ลืมไปละว่าจะเขียนอะไรต่อโค้ดจึงยังมั่วๆอยู่นะ
วิธีใช้ก็จะใช้ฟังค์ชั่นไหนเปลี่ยนสไตล์\default-furiganaเป็น\defaultแล้วลองapplyดู

codeline  function constr(syln,dur) if(dur~=0) then while(j<=syln) do time(dur); tags =tags..blink(j,set_time);j = j+1 end end;  return tags end
เครื่องหมาย~= คือไม่เท่ากับ
อื่นๆก็ไม่มีอะไรโดยรวมๆ โค้ดยังมั่วๆอยู่แต่ชอบครับ
set_timeเป็น0ก็จะแบบนึงไม่ใช่ก็จะอีกแบบ ชอบset_timeเป็น0

codeline function condi(syln,dur) if(dur~=0) then while(j<=syln) do tags = tags..blink(j,dur);j =j+1 end end;  return tags end
ไอ้ตัวนี้เหมือนด้านบนนั่นแหละแต่กระพริบเอฟเฟคสลับๆประมาณนั้น
  • ถูกใจ!

    yuriinter พลังน้ำใจ +2


[Diamond Member]


ชิว ชิว !!!

HBD Tz Azusa Yui Yukina HBD Miku 7Y

  • โมเอะ: 523
  • Money: 198
  • Tz: 533
  • Posts: 166
  • Donate: 0 THB
  • Joined: 26-2-2012
พลังน้ำใจ: 875
โพสต์เมื่อ 28-2-2012 16:45:00 |แสดงโพสต์ทั้งหมด
ขอบคุณสำหรับความรู้นะครับ แต่ว่ายาวไปนิส อ่านเสร็จแล้วตาลาย

[Perfect Member]


Happy new year 2015 Sinon

  • โมเอะ: 479
  • Money: 2195
  • Tz: 478
  • Posts: 539
  • Donate: 0 THB
  • Joined: 7-3-2012
พลังน้ำใจ: 13
   Pet:
Noumi Kudryavka
ให้กำลังใจกันด้วยนะ

โพสต์เมื่อ 30-3-2012 16:34:56 |แสดงโพสต์ทั้งหมด
พึ่งรู้นะครับ ขอบคุณมากๆ

[Silver Member]


  • โมเอะ: 102
  • Money: 351
  • Tz: 102
  • Posts: 180
  • Donate: 0 THB
  • Joined: 26-3-2012
พลังน้ำใจ: 3
โพสต์เมื่อ 1-4-2012 16:01:12 |แสดงโพสต์ทั้งหมด
ขอบคุณมากครับ สำหรับความรู้ใหม่ๆ

[Donate Tz]


โสด

Rika Halloween 2013 Mikasa Ackerman Hatsune Miku Tokisaki Kurumi 2Y Itsuka Shido Tobiichi Origami Itsuka Kotori Yoshino Tokisaki Kurumi Yatogami Tohka Kuriyama Mirai Yaya Yukina Tsumugi HBD Miku 7Y Halloween 2014 Sinon  Christmas ! 2014 Happy new year 2015

  • โมเอะ: 538
  • Money: 2670
  • Tz: 539
  • Posts: 129
  • Donate: 100 THB
  • Joined: 21-3-2012
พลังน้ำใจ: 0
   Pet:
kanade


โพสต์เมื่อ 6-4-2012 22:26:51 |แสดงโพสต์ทั้งหมด
อืม น่าสนใจดี คิคิคิๆ

[Silver Member]


Yui HBD Tz Hatsune Miku Tokisaki Kurumi 2Y Itsuka Shido Yatogami Tohka Tobiichi Origami Itsuka Kotori Yoshino Tokisaki Kurumi Kuriyama Mirai Yaya Yukina

  • โมเอะ: 176
  • Money: 134
  • Tz: 161
  • Posts: 46
  • Donate: 0 THB
  • Joined: 11-9-2012
พลังน้ำใจ: 0
   Pet:
Misaki Mei
มอง มอง มองเข้าไป =0=

โพสต์เมื่อ 13-10-2012 15:23:13 |แสดงโพสต์ทั้งหมด
โอ้ว..น่าสนดีนะคะเนี่ย

Maxlipver เชิญชวนคุณให้เข้าชม ThaiZeed สังคมของคนรัก ~Anime!!
http://www.thaizeed.net/bbs/?fromuid=28024

[Platinum Member]


Saitama

  • โมเอะ: 156
  • Money: 180
  • Tz: 156
  • Posts: 41
  • Donate: 0 THB
  • Joined: 28-3-2012
พลังน้ำใจ: 1647
   Pet:
Hachikuji Mayoi 2
Kyaaaa

โพสต์เมื่อ 22-11-2014 12:58:15 |แสดงโพสต์ทั้งหมด
ขอเอาไปประยุกต์ดูนะจ้า ขอบใจจ้า

[Advance Member]


  • โมเอะ: 24
  • Money: 53
  • Tz: 24
  • Posts: 6
  • Donate: 0 THB
  • Joined: 22-5-2014
พลังน้ำใจ: 0
โพสต์เมื่อ 11-1-2015 15:26:19 |แสดงโพสต์ทั้งหมด
Thanks Krub


ปิด

ประกาศจาก Admin

ช่วยบริจาคค่า VPS หน่อยจ้า
ช่วยบริจาคค่า VPS หน่อยจ้า
ช่วยหน่อยเนอะ ไม่ได้บังคับนะเออ เเต่สักหน่อยก๊ยังดี ^^

ดู »

ThaiZeed

|ดูการ์ตูนออนไลน์|โหลดการ์ตูน|Doujin|ดูการ์ตูนซับไทย|ดูการ์ตูนพากย์ไทย|อ่านการ์ตูน|

GMT+7, 3-12-2016 16:40 , Processed in 0.070710 second(s), 39 queries , Xcache On.

Powered by Discuz!

© 2001-2012  Template BY: GDC & 2th