ActionScript3 : ต้องการเปลี่ยนตำแหน่งของวัตถุเชิงมุมแบบต่าง ๆ เช่น การแกว่ง (oscillation), การหมุน (Rotation) ฯล
แนวคิด / แนวทาง : เราจะทดลองประยุกต์การใช้งาน Math.sin() และ Math,cos() เพื่อทำให้เกิดการเคลื่อนที่เชิงมุมแบบต่าง ๆ
วิธีการ / ขั้นตอน : หากเราทดสอบการเปลี่ยนค่าของ Math,cos(radian) หรือ Math,sin(radian) โดยการเพิ่มค่าของ radian ขึ้นครั้งละ 1 ไปเรื่อย ๆ เราจะพบว่า Math,sin(radian) และ Math,cos(radian) จะมีค่าวนไปมาระหว่าง -1 ถึง 1 เท่่านั้น จากคุณสมบัตินี้เราสามารถนำมาประยุกต์ใช้กับการเคลื่อนที่ที่มีลักษณะแบบวนไปมาได้ เช่น การแกว่ง การเคลื่อนที่เป็นวงกลม การเคลื่อนที่เป็นวงรี การหมุนรอบแก่น การเคลื่อนที่แบบลูกคลื่น เป็นต้น
ตัวอย่างที่ 1 การเคลื่อนที่แบบ sine wave
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class SineWaveMoving extends Sprite{
private var _xRadius:Number = 100; /**** ****/
private var _angle:Number=45; /**** degree ****/
private var _yRadius:Number=150;
private var _speed:Number=10;
public function SineWaveMoving(){
this.drawMe();
this.setPosition(0,400);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",moveMe);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this.x=x;
this.y=y;
}
private function drawMe():void{
/**** to draw a red circle with 50 pixels radias ****/
this.graphics.beginFill(0xFF0000,200);
this.graphics.drawCircle(0,0,10);
this.graphics.endFill();
}
private function moveMe(e:TimerEvent):void{
this.y=200+Math.sin(_angle)*_xRadius;
this.x+=_speed;
this._angle+=0.5;
}
}
}
ตัวอย่างนี้เราทำให้การเคลื่อนที่ในแนวแกน x (ระนาบ) เป็นแบบเส้นตรงด้วย
this,x+= _speed;
และทำให้การเคลื่อนที่แนวแกน y (แนวดิ่ง) เปลียนในรูปแบบ sine wave ด้วย
this.y=200+Math.sin(_angle)*_yRadius;
เมื่อ _yRadius เป็นค่าความสูงของ Wave
Demo : http://wonderfl.net/c/piB8
ตัวอย่างที่ 2 การเคลื่อนที่แบบสั่น (Oscillation)
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class OscillationMoving extends Sprite{
private var _xRadius:Number = 100; /**** ****/
private var _angle:Number=45; /**** degree ****/
private var _yRadius:Number=150;
private var _speed:Number=10;
public function OscillationMoving(){
this.drawMe();
this.setPosition(0,400);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",moveMe);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this.x=x;
this.y=y;
}
private function drawMe():void{
/**** to draw a red circle with 50 pixels radias ****/
this.graphics.beginFill(0xFF0000,200);
this.graphics.drawCircle(0,0,10);
this.graphics.endFill();
}
private function moveMe(e:TimerEvent):void{
this.x=200+Math.cos(_angle)*_xRadius;
this._angle+=0.5;
}
}
}
Demo :
ตัวอย่างที่ 3 การเคลื่อนที่แบบแบบวงกลมหรือวงรี ในตัวอย่างนี้จะไม่ได้ใช้สมการวงกลมหรือวงรีตามหลักของ trigonometry แต่จะใช้การกำหนดค่าการเคลื่อนที่เชิงมุมของ x และ y ไปพร้อมกัน โดยให้การเปลี่ยนค่าของ x ขึ้นกับค่า Math.cos(radian) และการเปลี่ยนแปลงค่าของ y ขึ้นกับ Math.sin(radian)
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class CircularMoving extends Sprite{
private var _xRadius:Number = 100; /**** ****/
private var _angle:Number=45; /**** degree ****/
private var _yRadius:Number=150;
private var _speed:Number=10;
public function CircularMoving(){
this.drawMe();
this.setPosition(0,400);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",moveMe);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this.x=x;
this.y=y;
}
private function drawMe():void{
/**** to draw a red circle with 50 pixels radias ****/
this.graphics.beginFill(0xFF0000,200);
this.graphics.drawCircle(0,0,10);
this.graphics.endFill();
}
private function moveMe(e:TimerEvent):void{
this.x=200+Math.cos(_angle)*_xRadius;
this.y=200+Math.sin(_angle)* _yRadius;
this._angle+=0.5;
}
}
}
Demo :
ระดับความยาก : 3
เอกสารอ้างอิง : 1 http://en.wikipedia.org/wiki/Trigonometric_functions
วิธีการ / ขั้นตอน : หากเราทดสอบการเปลี่ยนค่าของ Math,cos(radian) หรือ Math,sin(radian) โดยการเพิ่มค่าของ radian ขึ้นครั้งละ 1 ไปเรื่อย ๆ เราจะพบว่า Math,sin(radian) และ Math,cos(radian) จะมีค่าวนไปมาระหว่าง -1 ถึง 1 เท่่านั้น จากคุณสมบัตินี้เราสามารถนำมาประยุกต์ใช้กับการเคลื่อนที่ที่มีลักษณะแบบวนไปมาได้ เช่น การแกว่ง การเคลื่อนที่เป็นวงกลม การเคลื่อนที่เป็นวงรี การหมุนรอบแก่น การเคลื่อนที่แบบลูกคลื่น เป็นต้น
ตัวอย่างที่ 1 การเคลื่อนที่แบบ sine wave
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class SineWaveMoving extends Sprite{
private var _xRadius:Number = 100; /**** ****/
private var _angle:Number=45; /**** degree ****/
private var _yRadius:Number=150;
private var _speed:Number=10;
public function SineWaveMoving(){
this.drawMe();
this.setPosition(0,400);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",moveMe);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this.x=x;
this.y=y;
}
private function drawMe():void{
/**** to draw a red circle with 50 pixels radias ****/
this.graphics.beginFill(0xFF0000,200);
this.graphics.drawCircle(0,0,10);
this.graphics.endFill();
}
private function moveMe(e:TimerEvent):void{
this.y=200+Math.sin(_angle)*_xRadius;
this.x+=_speed;
this._angle+=0.5;
}
}
}
ตัวอย่างนี้เราทำให้การเคลื่อนที่ในแนวแกน x (ระนาบ) เป็นแบบเส้นตรงด้วย
this,x+= _speed;
และทำให้การเคลื่อนที่แนวแกน y (แนวดิ่ง) เปลียนในรูปแบบ sine wave ด้วย
this.y=200+Math.sin(_angle)*_yRadius;
เมื่อ _yRadius เป็นค่าความสูงของ Wave
Demo : http://wonderfl.net/c/piB8
ตัวอย่างที่ 2 การเคลื่อนที่แบบสั่น (Oscillation)
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class OscillationMoving extends Sprite{
private var _xRadius:Number = 100; /**** ****/
private var _angle:Number=45; /**** degree ****/
private var _yRadius:Number=150;
private var _speed:Number=10;
public function OscillationMoving(){
this.drawMe();
this.setPosition(0,400);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",moveMe);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this.x=x;
this.y=y;
}
private function drawMe():void{
/**** to draw a red circle with 50 pixels radias ****/
this.graphics.beginFill(0xFF0000,200);
this.graphics.drawCircle(0,0,10);
this.graphics.endFill();
}
private function moveMe(e:TimerEvent):void{
this.x=200+Math.cos(_angle)*_xRadius;
this._angle+=0.5;
}
}
}
Demo :
ตัวอย่างที่ 3 การเคลื่อนที่แบบแบบวงกลมหรือวงรี ในตัวอย่างนี้จะไม่ได้ใช้สมการวงกลมหรือวงรีตามหลักของ trigonometry แต่จะใช้การกำหนดค่าการเคลื่อนที่เชิงมุมของ x และ y ไปพร้อมกัน โดยให้การเปลี่ยนค่าของ x ขึ้นกับค่า Math.cos(radian) และการเปลี่ยนแปลงค่าของ y ขึ้นกับ Math.sin(radian)
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class CircularMoving extends Sprite{
private var _xRadius:Number = 100; /**** ****/
private var _angle:Number=45; /**** degree ****/
private var _yRadius:Number=150;
private var _speed:Number=10;
public function CircularMoving(){
this.drawMe();
this.setPosition(0,400);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",moveMe);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this.x=x;
this.y=y;
}
private function drawMe():void{
/**** to draw a red circle with 50 pixels radias ****/
this.graphics.beginFill(0xFF0000,200);
this.graphics.drawCircle(0,0,10);
this.graphics.endFill();
}
private function moveMe(e:TimerEvent):void{
this.x=200+Math.cos(_angle)*_xRadius;
this.y=200+Math.sin(_angle)* _yRadius;
this._angle+=0.5;
}
}
}
Demo :
ระดับความยาก : 3
เอกสารอ้างอิง : 1 http://en.wikipedia.org/wiki/Trigonometric_functions
ความคิดเห็น
แสดงความคิดเห็น