วิธีการ Build ไฟล์ Lua ใน Windows (เพื่อเช็คบัคหรืออะไรก็แล้วแต่) by

31
May
0

หลังจากที่ใช้ภาษา Lua มาได้สักพักแล้วก็ยังหา Tools ในการเขียนโค้ดที่ดีที่สุดและสามารถ Build ได้นั้นไม่เจอ เลยต้องเขียนโค้ดใน Editor ทั่วๆไปแล้วค่อย Copy ไป Debug / Test ใน Web ที่สามารถ Run ได้เอา (เช่น repl.it Lua) ซึ่งก็ค่อนข้างลำบาก จนในที่สุดก็ได้ค้นพบวิธีที่ทำให้ Editor ของผม (Sublime) สามารถ Run/Build ได้แล้ววว ซึ่งวิธีการมีหลายวิธีจะมาบอกวิธีที่สะดวกที่สุดละกันนะครับผม

 

1. ดาวน์โหลดและติดตั้ง “Sublime”

เข้าไปโหลดได้ที่เว็ปหลักได้เลย sublimetext
ซึ่งถ้าเราติดตั้งเสร็จก็สามารถใช้แก้ไขไฟล์ Lua ได้เลยแต่ยัง Build ไม่ได้นะครับ

หน้าตาพื้นฐานของ Sublime

 

2. ติดตั้ง “Package Control”

ถัดมาเราต้องติดตั้ง Package Control ซึ่งตัวนี้จะทำให้ Sublime ได้รับพลังมากขึ้นครับ ซึ่งไอเจ้าตัวนี้มันจะสามารถทำให้เราค้นหา Package ดีๆ (หรือเรียกตามธรรมดาก็คือ Plug in นั่นเอง) ได้โดยไม่ต้องไปหาที่อื่น แค่ค้นหาจากตัว Package นี้เองได้เลยทันที วิธีลงมีสองวิธี คือ

  • ใช้ Console
    • เปิดเมนู View > Show Console ขึ้นมา จากนั้นคัดลอกด้านล่างนี้ไปใส่แล้ว Enter เพื่อรันครับ
      import urllib2,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')
    • เมื่อรันเสร็จแล้วก็ทำการปิด Sublime แล้วเปิดใหม่ 1 ครั้งเป็นอันเสร็จครับ

      ลงด้วย Console

  • ลงใส่ในโฟลเดอร์ Package เอง
    • เปิดเมนู  Preferences > Browse Packages
    • โปรแกรมจะเปิดโฟลเดอร์ที่ไว้ใส่ Package ต่างๆมาให้
    • ดาวน์โหลด Package Control.sublime-package แล้วคัดลองโฟลเดอร์ไปใส่ในโฟลเดอร์ขั้นตอนก่อนหน้านี้
    • ทำการปิด Sublime แล้วเปิดใหม่ 1 ครั้งเป็นอันเสร็จครับ

เมื่อลงเสร็จแล้วจะมีเมนูดังรูป

 

3. ติดตั้ง และใช้งาน Package “Lua Dev”

ให้เรากดที่ Package Control ในรูปก่อนหน้านี้ หรือกด Ctrl+Shift+P แล้วพิมพ์ Package Control จากนั้นจะมีเมนูของ Package Control ขึ้นมาให้เลือก ให้เราเลือก Install Package จากนั้นพิมพ์ Lua เข้าไปแล้วเลือกกดที่ Lua Dev ครับ Package Control จะลง Lua Dev ให้ในทันที สบายสุดๆ

เลือก Lua Dev ดังรูป

จากนั้นเราต้องใช้งานมันก่อนโดยปกติโปรแกรมจะเห็น Syntax ของเราเป็น Lua ให้เราทำการเปลี่ยนเป็น Lua Dev เพื่อเพิ่มประสิทธิภาพครับ มีสองวิธีคือ

  • กดที Lua ขวาล่างของจอเราแล้วเลือก Lua Dev
  • เปิดเมนู เลือก View > Syntax แล้วเลือก Lua Dev

ถ้าสำเร็จทางขวาล่างจอเราจะกลายเป็น Lua Dev แทน Lua แล้วล่ะครับ

จุดแสดงถึงตัวอ่าน Syntax ที่เลือกใช้อยู่

ซึ่งมาถึงจุดนี้เจ้า Lua Dev จะพร้อมให้ทำการ Build แล้ว แต่ว่า! เรายังไม่มีตัว Build ซึ่งต้องทำการลงเพิ่มในขั้นถัดไปครับ

 

4. ดาวน์โหลดและติดตั้ง Lua Build

เข้าไปที่เว็ป luabinaries แล้วเลือกเวอร์ชั่นของ Lua ที่เราจะใช้ หรือดาวน์โหลดเวอร์ชั่นล่าสุดเลยได้ที่ลิงค์นี้ > Click

จากนั้นให้เราแกะ Zip ไว้ในที่ๆเราต้องการ ซึ่งจะมีไฟล์สำคัญสองตัวที่เราจะใช้คือ lua##.exe และ lua##.dll [## แทนเลขเวอร์ชั่นของเรา เช่น lua53]

ตัวอย่างโฟลเดอร์ Lua

เมื่อเราทำการแกะเสร็จแล้ว ทีนี้เราก็ต้องมาแก้ Config ของ Lua Dev ให้ทำการเรียกเจ้าตัวนี้ โดยการกลับไปที่ Sublime แล้วเปิดเมนูของ Package Control ขึ้นมา (วิธีตามข้อ 3) แต่ทีนี้ให้เราเลือก List Package แล้วเลือก Lua Dev

เลือก Package Lua Dev

จากนั้นโปรแกรมจะเปิดโฟลเดอร์ Package Lua Dev ขึ้นมา ให้เราทำการแก้ไขไฟล์ Lua.sublime-build ดังนี้

{
"cmd": ["lua53", "$file"],
"file_regex": "^(?:(?:\t)|(?:.+: ))(.+):([0-9]+): (.*)$",
"selector": "source.lua",
"path": "C:\\Program Files\\Sublime Text 2\\Lua"
}

ตรง cmd ให้ใส่ชื่อไฟล์ .exe ของเรา เช่น lua53 และตรง path ให้ใส่ path เต็มของโฟลเดอร์ที่เราลงไว้

 

5. Build ได้แล้ว รันดูได้เลย!!

รันโดยการ กด Ctrl+B หรือเปิดเมนูแล้วกด Tools > Build เท่านี้แหละครับผม

ปล. ถ้ามี Error สามารถดับเบิลคลิกเพื่อไปบรรทัดนั้นๆได้เลยด้วยนะครับ ซึ่งตัวรันบนเว็ปทำไม่ได้ล่ะเออ!

รันได้แล้ว ไร้บั๊ค ฟัคเย่!

credits : https://packagecontrol.io/installation#st2

(English) PHP Weighted Random by

31
May
0

ข้อมูลบางค่าที่จะนำมาตัดสินเรื่องต่างๆ ในเกมส์ หลายครั้งที่หนีไม่พ้นการสุ่ม หรือ Random
และโลกนี้ไม่ยุติธรรมเสมอไป จึงจำเป็นต้องมีการใช้การสุ่มแบบถ่วงน้ำหนัก หรือ weighted random
โดยส่วนใหญ่ทาง Server จะต้องเป็นผู้ตัดสินเรื่องนี้ จึงแสดงตัวอย่างวิธีการสร้างการสุ่มประเภทนี้ด้วยภาษา PHP
เริ่มด้วยการสร้าง Weighted Array ของตัวแปลขึ้นมาก่อน โดยให้ key เป็นผล value เป็นน้ำหนัก
$weight = array(
'a'=>1,
'b'=>3,
'c'=>5,
'd'=>7);

เนื่องจาก function ที่เราจะใช้สุ่มตัวเลขออกมาคือ rand ซึ่งจะให้ค่าเป็น int เท่านั้น หากมีค่าใดในน้ำหนักเป็นทศนิยม
ให้ทำการคุณทั้งหมดเพื่อเลื่อนทศนิยมทิ้งไปให้หมดก่อน ตัวอย่างเช่น ‘a’=>1.5, ‘b’=> 2 ให้คุณออกมาเป็น ‘a’=>15, ‘b’=>20 เสียก่อน
ต่อไปก็จะเป็นการสุ่มผลดังนี้
$roll = rand(1,array_sum($weight);
จากนั้นทำการหาผลของการสุ่มโดยไล่วัดตาม array
foreach($weight as $key=>$value){
if($roll > $value){
$roll = $roll - $value;
}else{
return $key;
}}

ซึ่งสามารถนำคำสั่งเหล่านี้ไปสร้างเป็น function ที่รับเพียง weight array ที่แตกต่างกันเพียงอย่างเดียวก็ได้

[Unity3D][NGUI][ParticleSystem] ใช้ ParticleSystem ร่วมกับ NGUI ใน Unity3D by

30
May
0

เมื่อเราใช้ ParticleSystem ร่วมกับ NGUI ใน Unity3D แล้วก็จะเจอปัญหา Particle ที่เรา Instantiate ขึ้้นมา มันตันไปอยู่ข้างหลัง UI หรือของต่างๆที่เป็น NGUI นะสิ จะปรับ z ก็ไม่ได้ เพราะว่า NGUI นั้นไม่สน z จะปรับ depth ก็ไม่ได้เพราะ Particle ไม่มี depth เอ้า แล้วจะทำยังไงละทีนี้ วิธีแก้ก็มีหลายอย่างมากมาย แต่วันนี้จะมานำเสนอ 2 วิธีนะครับ

วิธีแรกคือ ปรับ Sorting Order ของ Panel ที่เป็น Parent ของ Particle เป็น -1 ครับ ตามรูปเลย
11
พอเราปรับเป็น -1 แล้ว Particle ที่เคยอยู่ข้างหลังสุด ก็กลับมาอยู่หน้าสุดทันทีเลย 55 แต่ๆๆๆๆ วิธีนี้มีข้อเสียใหญ่หลวงๆๆอยู่ด้วยนั่นก็คือ มันจะกลับข้างหลัง-หน้า ทุกอย่างที่อยู่ใน Panel นั้นๆ หมดเลย เหอะๆ (กำ แล้วมาแนะนำทำไมฟะ) ถ้าของใน Panel นั้นไม่มีการเรียงลำดับ depth ซับซ้อนก็ให้ลองวิธีนี้ดูก่อนไงครับ มันปรับนิดเดียวเอง ถ้าปรับแล้ว มันมั่วมากๆๆๆ ก็ค่อยไปลองวิธีถุัดไปละกันเนอะ

วิธีที่สองคือ ให้เพิ่ม Layer เข้าไปอีกชั้นนึงตามรูป
12
พอกดแล้วจะขึ้นตามนี้ ก็พิมชื่อ Layer เข้าไป เช่น “Particle” ตามรูป
13
ต่อไปก็ให้ไปเปลี่ยน Layer ของ Particle ของเราให้เป็น Layer ใหม่ที่เราพึ่งตั้งเมือกี้ ตามรูป
14
ถ้ากดเปลี่ยน Layer แล้ว Unity มันถามว่าจะให้เปลี่ยนลูกๆเป็น Layer เดียวกันด้วยไหมก็ให้ตอบไปว่า “ใช่เสะ” ครับ

และถ้าเรา Instantiate Particle ที่มี Layer สูงกว่า Layer UI ของ NGUI แล้ว Particle นั้นก็จะถูก Render มาอยู่ข้างบนครับบบบบ

[Unity3D][NGUI] ScrollView && Grid by

30
May
0

ใครทีใช้ Unity3D ร่วมกับ NGUI ก็คงจะเคยเจอปัญหาเรื่องของ ScrollView และ Grid กันมาบ้าง วันนี้ผมมาเสนอวิธีแก้ปัญหา ScrollView และ Grid ที่ผมเคยเจอครับ

ปัญหาแรกคือ เมื่อ เราสร้างลูกของ Grid แบบ Run Time แล้วสั่ง Grid.Reposition(); และตามด้วยคำสั่ง ScrollView.ResetPosition(); เราก็จะเห็นว่าลูกของ Grid ที่เราพึ่งสร้างนั้นค่อยๆเลือนไปประจำตำแหน่งของมัน

ปัญหาที่สองคือ ถ้าเราสร้างลูกของ Grid มาจำนวนน้อย หรือมีจำนวนไม่มากพอที่จะทำให้ Grid นั้นล้นออกนอก ScrollView แล้วมันก็จะทำให้ ลูกของ Grid นั้นไปอยู่ตรงกลาง ScrollView ดังรูป
1

ปัญหาที่สามคือ เมื่อเราทำ Application หรือ Game ในหลายๆขนาดหน้าจอ ถ้าเราอยากให้ Grid ของเราอยู่ชิดข้างบนเสมอล่ะ ทำยังไงดี ก็ Grid มันไม่มี Anchor นี่นา

วิธีแก้ก็ทำตามนี้เลยครับ
ถ้าเป็น Grid แบบนี้
4
ให้ Set ค่า ScrollView ตามนี้ครับ
2
และ Set ค่า Grid ตามนี้ ซึ่งเราต้อง Add Component UIWidget ให้ Grid ด้วยมันจะได้มี Anchor ให้เราใช้ไงครับ
3

แต่ถ้าเป็น Grid แบบนี้
5
ก็ให้ Set ScrollView ตามนี้ครับ
6
และ Grid ตามนี้
7

ให้สังเกต ScrollView ตรง Content Origin นะครับ
และให้สังเกต Grid ตรง Pivot, Smooth Tween และ ขนาดของ UIWidget นะครับ

[Unity3D] เราจะแก้ปัญหา NSURLErrorDomain error -1012 ใน WWW class ของ Unity 5 ใน iOS ได้อย่างไร? by

30
May
0

เนื่องจากตอนนี้ Unity 5 ก็ออกมาสักพักใหญ่แล้ว แถมฟรีอีกตะหาก (ถ้ารายได้ไม่ถึงเป้า) เราก็ควรจะใช้ Unity 5 กันใช่ไหมครับ แต่ช่วงนี้ Unity 5 ได้ทำ bug (อันใหญ่หลวง) เอาไว้ นั่นคือหากเราใช้ WWW class เรียกไปที่ URL ใดๆ ที่เป็น https จะทำให้ไม่สามารถรับข้อมูลจาก URL นั้นๆ ได้เลย จะ WWW class จะแจ้ง error กลับมาว่า

The operation couldn’t be completed. (NSURLErrorDomain error -1012.)

ซึ่งเว็บเกมของผมเป็น HTTPS ทั้งหมดจึงกระทบเต็มๆ และบางคนอาจจะคิดว่าผมไม่พบปัญหานี้หรอก แต่ถ้าคุณต้องมีการเรียก Profile picture จาก  Facebook แล้วละก็ยังไงคุณก็จะถูกบังคับให้เรียกผ่าน HTTPS โดยอัตโนมัติ ถึง URL จะไม่ได้ระบุเป็น HTTPS  ก็ตาม เช่น http://graph.facebook.com/my_facebook_id/picture แต่สุดท้าย Facebook ก็จะ Redirect ไปยังที่อยู่รูปจริงๆ ที่เป็น HTTPS อยู่ดี และทำให้ไม่สามารถแสดงรูป profile facebook ได้ในที่สุด

จริงๆ แล้วปัญหานี้มีการแจ้งกันมาตั้งแต่เดือนมีนาคมแล้ว และ Unity ก็บอกว่าแก้ไปแล้วในเวอร์ชั่น 5.x.x แต่จนแล้วจนรอดก็ยังไม่ได้แก้จริงสักที ณ เวอร์ชั่นปัจจุบัน 5.0.1f ล่าสุดก็ยังไม่ได้แก้ ดังนั้นเราคงจะรอกันไม่ได้ ต้องหาวิธีแก้กันเอง โดยวิธีแก้ก็คือให้สร้างไฟล์ชื่อว่า CustomConnection.mm ขึ้นมา และใส่ code ด้านล่างลงไป

#include "Unity/WWWConnection.h"
@interface UnityWWWCustomRequestProvider : UnityWWWRequestDefaultProvider
{
}
+ (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers;
@end
@implementation UnityWWWCustomRequestProvider
+ (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers
{
NSMutableURLRequest* request = [super allocRequestForHTTPMethod:method url:url headers:headers];
// let's pretend for security reasons we dont want ANY cache nor cookies
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[request setHTTPShouldHandleCookies:NO];
return request;
}
@end
@interface UnityWWWCustomConnectionDelegate : UnityWWWConnectionSelfSignedCertDelegate
{
}
@end
@implementation UnityWWWCustomConnectionDelegate
- (NSCachedURLResponse*)connection:(NSURLConnection*)connection willCacheResponse:(NSCachedURLResponse*)cachedResponse
{
// we dont want caching
return nil;
}
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
[super connection:connection didReceiveResponse:response];
}
@end
IMPL_WWW_DELEGATE_SUBCLASS(UnityWWWCustomConnectionDelegate);
IMPL_WWW_REQUEST_PROVIDER(UnityWWWCustomRequestProvider);

จากนั้นเซพไปที่ Assets/Plugins/iOS/CustomConnection.mm เท่านี้เป็นอันจบ ไม่ต้องไป set path ใดๆ เพิ่มเติม Unity จะจัดการของมันเองต่ออัตโนมัติ โดยหลักการทำงานของมันคือการแก้ไข class WWW ของ Unity ด้วยตัวเราเองผ่าน Plugin เพื่อ bypass cache บางอย่างที่ WWW ทำงานผิดพลาด สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ Manual หน้านี้ครับ

ซึ่งวิธีแก้วิธีนี้ก็มาจากคนของ Unity นั่นแหละมาโพสต์บอกใน Forum ของเขาเองที่มีคนถาม แต่ด้วยเหตุผลประการใดก็ไม่อาจทราบได้ ตัว Unity หลักๆ กลับไม่ถูกแก้ไขเสียทีจนเราต้องมาแก้ไขเองนี่แหละ เท่านี้เป็นอันจบพิธีครับ :)

กู้เงิน | เศรษฐกิจพอเพียง | สินเชื่อบุคคล | สมัครบัตรกดเงินสด | สินเชื่อ | เงินกู้ด่วน | ยืมเงินทรูมูฟ | เงินด่วนนอกระบบ