[illustrator]ทำ Gradient แบบโค้งๆด้วยการ Blend by

27
Feb
0

ปกติแล้วใน illustrator เราสามารถทำ Gradient ได้ง่ายๆสองแบบคือ linear กับ radial แบบที่เห็นในรูปครับ ซึ่งหลายๆคนก็คงทราบกันอยู่แล้ว

แต่ถ้าอยากให้มันโค้งๆ ไม่ใช่แบบปกติอย่างนี้ก็สามารถทำได้ครับ

1.สร้างรูปสีเหลี่ยมหรือวงกลม เป็นสีๆแบบในรูปครับ

2.กดคำสั่ง object > blend > make ก็จะได้รูปแบบนี้ครับ

3.เสร็จแล้วก็สร้างเป็น brush ใหม่ครับ เลือก Art Brush (กดสร้าง Brush ใหม่จากหน้าต่าง Brushes)

4.ลองสร้างเส้นโค้งๆขึ้นมา แล้วกดเลือก Brush ที่เราเพิ่งสร้างขึ้นดูครับ

ก็จะได้เส้นโค้งที่ไล่สีแบบโค้งๆตามเส้น

5.นอกจากนี้เรายังสามารถนำไปประยุกต์ทำเป็นรูปแบบอื่นๆได้อีกด้วย

การทำ blend แบบนี้สามารถทำแบบอื่นๆได้อีกด้วย เช่น


ใช้ Actions ปรับรูป [Ps] by

24
Feb
0

อยากปรับรูปสวยๆใช้เวลาไม่นานก็เสร็จ

ทีวีไดเร็กซ์ขอเสนอวิธีใช้ Photoshop Actions ชั่น ชั่น ชั่น (เสียงเอคโค่)

ก่อนอื่นต้องมีไฟล์สำหรับโหลด action นะจ๊ะ สกุล .atn จ่ะ

สามารถเสิร์จหาใช้ฟรีๆได้เยอะแยะที่ http://www.deviantart.com/

มีรูปตัวอย่างพร้อมหลังการใช้งานเสร็จสรรพ

พอได้ไฟล์มาแล้วก็เปิดโปรแกรม Photoshop เลือกรูปที่จะปรับขึ้นมาเลยจ้า

ไปที่ช่อง Actions ด้านข้าง (ถ้าหาไม่เจอให้ไปที่แถบ Window ด้านบนแล้วเลือก Actions)

กดปุ่มลูกศรด้านบนแล้วเลือก Load Actions ตามภาพนะจ๊ะ

เปิดไฟล์ .atn ที่เซฟไว้ในเครื่องขึ้นมาจ่ะ

วิธีใช้งานก็แค่จิ้ม Action ในโฟลเดอร์ กดเพลย์ด้านล่างได้ทันที

เสร็จแล้วววว

ปรับรูปแบบมืออาชีพได้ในเวลาสั้นๆ!

ลองใช้หลาย Actions เพื่อเลือกผลลัพท์ที่ชอบที่สุดเน่อ

เมื่อ Code ของเรามาถึงทางแยก !!!! (Tutoial การแตก Branch ใน SVN) by

6
Feb
0

    เมื่อเราพัฒนา Web หรือ Application ของเรามาถึงจุดหนึ่ง ที่เราจะต้องทำการเพิ่ม Feature ใหม่ ควบคู่ไปกับการ Debug Code เก่า จะทำยังไงล่ะทีนี้ แม่จ้าววว!!

    SVN ช่วยท่านได้!! เรามาทดลองทำกันเลยดีกว่าไม่ต้องพูดให้มากความ

  • ก่อนอื่น Update และ Commit Folder ที่จะแตก Branch ให้เรียบร้อยก่อน
  • เริ่มจาก คลิ๊กขวาที่ Folder ที่เราจะแตกไฟล์ คลิ๊กที่ TortoiseSVN ต่อไปคลิ๊กที่ Branch/Tag ตามรูป
    1
  • เมื่อกด Branch/tag แล้วจะปรากฏหน้าต่างดังรูป ในช่อง To path: จะมี URL ของ Folder ปัจจุบันอยู่ (ชื่อเดิมนั่นเอง) ให้เราเปลี่ยนชื่อ Folder หรือเติม Postfix ต่อท้าย (สรุปคือให้มันไม่เหมือนเดิมน่ะแหละ) และในช่อง Log message ให้เราใส่ข้อความเพื่อเตือนความจำตัวเอง หรือเพื่อให้คนอื่นที่ใช้ SVN ร่วมกันเราอยุ่มาอ่านแล้วเข้าใจได้ จากนั้นกด OK
    2
  • ปล่อยให้ SVN ทำการ Copy Folder ที่เราจะแตก Branch เมื่อ SVN ทำเสร็จ ก็กด OK ไปต่อกันเลย
    3
  • กลับมาที่ Folder ในเครื่องเรา จะเห็นว่า มันยังอยู่เหมือนเดิม ปกติดีไม่มีอะไรเพิ่ม หรือลด ไปเลย แน่นอนล่ะ เราต้อง Update ก่อนสิครับ ให้เราย้อนกลับไป 1 ขั้น แล้ว Update SVN ซะ จะเห็นว่ามีการ Download เต็มไปหมด นั้นละครับสิ้งที่เราต้องการ 55+ เมื่อเสร็จแล้วก็กด OK ตามสูตร
    4
  • จะเห็นว่าเรามี Folder ใหม่ ที่มีชื่อ ตามที่เรากำหนดไว้ในข้อ 2 ออกมาเรียบร้อย จากนี้เราก็ทำการ Develop แบบคู่ขนานต่อไปได้เลย เย่ๆ!!
    5

เปลี่ยนตัวเลข ให้อยู่ในรูปแบบ number format by

1
Feb
0

//เปลี่ยน number fortmat ให้ , เช่น 9999 จะเป็น 9,999
function numberFormat(value:int):String{
var numberFormatter:NumberFormatter = new NumberFormatter();
var formattedVal:String = numberFormatter.format(value);
if (formattedVal.length == 0) {
return numberFormatter.error;
} else {
return formattedVal;
}
}

รูปก่อนที่ยังไม่ได้เปลี่ยนให้อยู่ในรูปแบบ number format
screen-shot-2013-02-01-at-23543-am

รูปที่ได้ทำการเปลี่ยนให้อยู่ในรูปแบบ number format แล้ว
screen-shot-2013-02-01-at-23141-am

Flash + Java Socket ตอนที่ 2 by

1
Feb
0

ไฟล์ .as ต่างๆ

    Main.as
    Login.as
    Lobby.as
    AppManager.as
    Connector.as
    GlobalVar.as
    ChatEvent.as
    ConnectorInterface.as

Main.as

    ตัวจัดการหลักจะเป็น Class AppManager ครับ

package app.flash.common {
import flash.display.MovieClip;
public class Main extends MovieClip {
private static var self:Main = null;
public static function getInstance(){
return self;
}
public function Main() {
self = this;
(AppManager.getInstance()).startApp();
this.addChild(Login.getInstance());
}
}
}

Login.as
หน้า login
package app.flash.common{
import flash.display.MovieClip;
import flash.text.TextField;
import flash.events.MouseEvent;
public class Login extends MovieClip {
private static var self:Login = null;
private var nameTxt:TextField;
public static function getInstance() {
if (self==null) {
self = new Login();
}
return self;
}
private static function onClicked(e:MouseEvent) {
var login:Login = Login.getInstance();
if (login.nameTxt.text != "") {
var global:GlobalVars = GlobalVars.getInstance();
global.userName = login.nameTxt.text;
var main:Main = Main.getInstance();
main.removeChildAt(0);
main.addChild(global.lobby);
}
}
public function Login() {
nameTxt = name_txt;
nameTxt.border = true;
nameTxt.borderColor = 0xffffff;
nameTxt.text = "";
submit_mc.addEventListener(MouseEvent.CLICK,onClicked);
}
}

}

Lobby.as
ส่วนของ lobby หลักใช้เป็นแค่ Display
package app.flash.common{
import flash.display.MovieClip;
import flash.text.TextField;
public class Lobby extends MovieClip {
public var showTxt:TextField;
public var inputChatTxt:TextField;
public function Lobby() {
showTxt = show_txt;
inputChatTxt = inputChat_txt;
inputChatTxt.border = true;
inputChatTxt.borderColor = 0x000000;
showTxt.text = "chat start::\n";
}
}
}

AppManager.as

package app.flash.common{
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.MovieClip;

public class AppManager implements ConnectorInterface {
private static var self:AppManager = null;
public var socket:Connector = new Connector();
private var chatEvent:ChatEvent = null;
private var global:GlobalVars = GlobalVars.getInstance();
public static function getInstance():AppManager {
if (self == null) {
self = new AppManager();
}
return self;
}
public function sendMessage(msg:String) {
msg = "0( " + global.userName + " ) say: " + msg;
socket.sendMessage(msg);
}
public function onLobby(e:Event) {
var localChatEvent:ChatEvent = e.target as ChatEvent;
var input:String = localChatEvent.msg;
var lobby:Lobby = (GlobalVars.getInstance()).lobby;
lobby.showTxt.appendText(input);
trace("AppManager.onLobby");
}

public function onStart():void {
trace("Connector start");
global.connected = true;
chatEvent = new ChatEvent(socket);
chatEvent.addEventListener("onLobbyMessage",onLobby);
}
public function onTerminate():void {
trace("Connector terminate");
}
public function onMessage(input:String):void {
trace("onMessage from main");
}
public function onError():void {
trace("onError from main");
global.connected = false;
}
public function startApp():void {
socket.host = "localhost"; // url ของ server ในตัวอย่างนี้ใช้ localhost
socket.port = 8080; // port ที่ใช้ในการ connect เข้าไป
socket.delegate = this;
socket.startConnect(); // สั่งให้ socket connect socket.connect(host,port);
}
}
}

Connector.as
package app.flash.common{
import flash.net.Socket;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.system.Security;
import flash.utils.ByteArray;
public class Connector extends Socket {
public static var self:Connector = null;
public var delegate:ConnectorInterface = null;
public var host:String;
public var port:int;
public var msg:String;
public function startConnect() {
this.connect(host,port);

}
// function นี้ใช้สำหรับส่ง ข้อมูลไปให้ server ที่เราได้ทำการ connect ไว้ตั้งแต่ตอนแรก
public function sendMessage(sender:String) {
trace("send '"+sender+"' to server");
this.writeUTFBytes(sender+"\n");
this.flush();
trace("end");
}
private static function onConnected(e:Event):void {
self.delegate.onStart(); //ส่งไปบอก AppManager ว่าทำการ connect server สำเร็จ
}
private static function onError(e:IOErrorEvent):void {
self.delegate.onError();
}

private static function onMessage(e:ProgressEvent):void {
try {
var msg:String = self.readUTFBytes(self.bytesAvailable); // ข้อมุลที่ได้จากทางฝั่ง server
self.msg = msg;
} catch (e:Event) {
trace(e.toString());
}
}
private static function onServerClose(e:Event):void {
self.delegate.onTerminate();
}
private static function sError(SecurityErrorEvent):void {
trace("security error");
}
public function Connector() {
self = this;
this.objectEncoding = 0;
this.addEventListener(Event.CONNECT,onConnected); // connect to server
this.addEventListener(IOErrorEvent.IO_ERROR,onError);
this.addEventListener(ProgressEvent.SOCKET_DATA,onMessage); //เมื่อได้รับข้อมุลจากทาง server Event ตัวนี้จะทำงานก็ต่อเมื่อ server มีการส่งข้อมูลเข้ามา
this.addEventListener(Event.CLOSE,onServerClose);
this.addEventListener(SecurityErrorEvent.SECURITY_ERROR,sError);
}
}
}

GlobalVar.as
package app.flash.common{
import flash.events.MouseEvent;
public class GlobalVars {
private static var self:GlobalVars = null;
public var lobby:Lobby = new Lobby();
public var login:Login = Login.getInstance();
public var connected:Boolean = false;
public var userName:String;
public function settingLobby() {
lobby.sender_mc.addEventListener(MouseEvent.CLICK,function(e:*){
var app:AppManager = AppManager.getInstance();
app.sendMessage(lobby.inputChatTxt.text); //ส่งข้อความไปให้ AppManager เพื่อที่จะส่งไปให้ server
lobby.inputChatTxt.text = "";
});
}
public static function getInstance() {
if (self== null) {
self = new GlobalVars();
self.settingLobby();
}
return self;
}
}
}

ChatEvent.as
เราสามารถสร้าง custom event เพื่อแยกข้อมุลแต่ละประเภทออกเป็นส่วนๆ
โดยในตัวอย่างนี้ ยกตัวอย่างเฉพาะ lobby ถ้าหากต้องการเพิ่มเติมก็สามารถเพ่ิม case ต่างๆที่หลังได้ เช่น lobby , room, private
package app.flash.common{
import flash.events.EventDispatcher;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.net.Socket;

public class ChatEvent extends EventDispatcher {
private static var self:ChatEvent = null;
private static var LOBBY:int = 0;
private static var socket:Connector = null;
public var msg:String = new String();
public static function onMessage(e:ProgressEvent) {
try {
trace("chatEvent:"+socket.msg);
self.msg = socket.msg;
var checker:Number = new Number(self.msg.charAt(0));
self.msg = self.msg.substring(1,self.msg.length);
switch (checker) {
case LOBBY :
self.dispatchEvent(new Event("onLobbyMessage"));
break;
}

} catch (e:Event) {
trace(e.toString());
}
}
public function ChatEvent(socketIn:Connector) {
self = this;
socket = socketIn;
socket.addEventListener(ProgressEvent.SOCKET_DATA,onMessage);
}
}
}

ConnectorInterface.as
package app.flash.common{
public interface ConnectorInterface {
function onStart():void;
function onTerminate():void;
function onMessage(input:String):void;
function onError():void;
}
}

Flash + Java Socket ตอนที่ 1

http://blog.levelup.in.th/2013/01/31/flash-java-socket-ตอนที่-1/

Flash + Java Socket ตอนที่ 3 จะเป็นในส่วนของ java socket