|
2110101 : Lab6 - Bouncing Ball

สิ่งที่ต้องการ
ดูลูกบอลสามลูกข้างล่างนี้
ลูกทางซ้ายเด้งไปมาแบบไปมีการสูญเสียพลังงานในสภาพไร้แรงโน้มถ่วง
สิ่งที่ต้องการให้เขียนคือ
XBall1.java
ซึ่งมีพฤติกรรมการเด้งของลูกบอลแบบไม่มีการสูญเสียพลังงาน
และอยู่ในสภาพที่มีแรงโน้มถ่วงด้วย
และ XBall2.java
ซึ่งเป็นลูกบอลที่มีการเสียการสูญเสียพลังงาน
และอยู่ภายใต้แรงโน้มถ่วง
(อยากให้เริ่มเด้งใหม่
ให้นำ mouse
ไปคลิกภายในบริเวณ)
ให้นักเรียนแก้โปรแกรมในส่วนที่หมายเลขบรรทัดเป็นสีเทา
ข้อแนะนำ
- ทำ XBall1.java ก่อน
เพราะมีการเพิ่มเติมคำสั่งอีกเพียงสองสามบรรทัดเท่านั้น
- โปรแกรมเริ่มต้นที่ให้ใน
XBall1 และ XBall2
จะพฤติกรรมเป็นแบบลูกบอลทางซ้ายในรูปข้างบนนี้
- เมื่อต้องการสั่งทำงาน
ให้กดปุ่ม F5
- อ่านคำอธิบายเพิ่มเติมข้างล่างนี้ก่อน
คำอธิบายเพิ่มเติม
- ส่วนของโปรแกรมที่ปรากฏในเมท็อด
run
ซึ่งมีพฤติกรรมแบบเด้งไปมาในสภาพไร้แรงโน้มถ่วงและไม่มีการสูญเสียพลังงานนั้น
เป็นดังนี้
while (ballThread == Thread.currentThread()) {
frameWidth = getSize().width;
frameHeight = getSize().height;
if (x <= radius || x >= frameWidth - radius) dx = -dx;
if (y <= radius || y >= frameHeight - radius) dy = -dy;
x += dx;
y += dy;
repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {}
}
|
- เงื่อนไขที่ while
อ่านแล้วอาจงงๆ
แต่ตีความได้ว่าให้ทำงานใน
loop นี้ไปเรื่อยๆ
จนกว่าลูกบอลจะถูกทำลาย (โดยการนำเมาส์ไป
click ในบริเวณที่เด้ง)
ตรงนี้อย่าไปสนใจมาก
ว่าทำไมเป็นแบบนี้
เพราะเนื้อหาที่สอนไม่ได้ครอบคลุมตรงนี้
- สองบรรทัดต่อมาเป็นการคำนวณหาความกว้าง
(frameWidth) และความสูง (frameHeight)
ของกรอบที่ลูกบอลเด้งอยู่ภายใน
- มีตัวแปร 5
ตัวที่ต้องทำความเข้าใจความหมายของมัน
(ทั้ง 5
ตัวนี้ได้ประกาศและตั้งค่าเริ่มต้นไว้เรียบร้อยแล้วที่อื่น)
ดังนี้
- ตัวแปร x และ y เก็บพิกัด (x,y)
ของลูกบอล (x,y)
มีค่าเป็น (0,0)
ที่มุมซ้ายบนของกรอบ x
มีค่าเพิ่มขึ้นไปทางซ้าย
y
มีค่าเพิ่มขึ้นเมื่อดิ่งลง
- ตัวแปร dx และ dy
เก็บอัตราการเปลี่ยนแปลงตำแหน่งของลูกบอล
ทางแนวนอนและแนวตั้ง
หรือพูดอีกอย่างหนึ่งว่า
(dx, dy) เป็นเวกเตอร์ของความเร็วของลูกบอล
ตัวอย่างเช่น ถ้า dx เป็นบวกก็แสดงว่าลูกบอลกำลังเคลื่อนที่ไปทางขวา
ถ้า dy เป็นลบก็แสดงว่าลูกบอลกำลังลอยขึ้น
เป็นต้น
- ตัวแปร radius
แทนรัศมีของลูกบอล
- เงื่อนไข if
สองบรรทัดต่อมาเป็นการตรวจสอบว่าตำแหน่งของลูกบอลกระทบขอบหรือไม่
ถ้ากระทบให้เปลี่ยนแปลงเวกเตอร์ที่แทนความเร็วของลูกบอล
เช่นถ้ากระทบขอบซ้าย (นั่นคือเงื่อนไข
x <= radius) หรือกระทบขอบขวา (x >=
frameWidth - radius) ก็ให้กลับทิศ dx
เป็นต้น
- คำสั่ง x += dx; และ y += dy
เป็นการปรับตำแหน่งลูกบอล
- เมท็อด repaint()
สั่งให้วาดรูปลูกบอลใหม่ตามพิกัด
(x,y) ใหม่ที่คำนวณได้
- สามบรรทัดต่อมาสุดท้ายของ
loop
บอกว่าให้ระบบหยุดรอประมาณ
30 millisecond (เป็นคำสั่งและเมท็อดที่ยังไม่เคยอธิบายมาก่อน)
ซึ่งเป็นการควบคุมให้ตำแหน่งลูกบอลเกิดการเปลี่ยนแปลงทุกๆ
30ms
- ตำแหน่ง ขนาด
และความเร็วเริ่มต้นของลูกบอล
ถูกกำหนดไว้แล้ว ก่อนเข้า
loop นี้ (ถ้าอยากรู้ว่าตั้งค่าเท่าใด
ให้ไปดูที่เมท็อด setBallProperties)
- ข้อสังเกต
- ในสภาพไร้แรงโน้มถ่วงและไม่สูญเสียพลังงาน
dx และ dy
มีการเปลี่ยนแปลงก็เฉพาะตอนกระทบขอบเท่านั้น
- ถ้ามีแรงโน้มถ่วงด้วย
ก็แสดงว่าลูกบอลต้องมีความเร่งตามแนวดิ่งลง
นั่นคือ dy
ต้องมีการเปลี่ยนแปลง
จะเปลี่ยนอย่างไร
เท่าใด
และเมื่อไรเป็นสิ่งที่ให้นักเรียนคิด
- การสูญเสียพลังงานจะเกิดขึ้นขณะลูกบอลกระทบกับขอบ
ทำไห้ความเร็วก่อนกระทบและหลังกระทบไม่เท่ากัน
(แน่นอนว่าหลังกระทบต้องมีขนาดน้อยกว่า
เพราะได้สูญเสียพลังงาน)
จะลดลงอย่างไร เท่าใด
เมื่อไร
เป็นสิ่งนักเรียนต้องคิด
คะแนนเต็ม : 10 คะแนน
- เขียนโปรแกรม 10 คะแนน (ลูกละ
5 คะแนน
ไม่มีระบบตรวจอัตโนมัติ
จะตรวจให้ภายหลัง)
เวลาปฏิบัติการ : 45
นาที
|