ผลต่างระหว่างรุ่นของ "01204223/kivy"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 156: แถว 156:
 
แล้วทดลองเรียกให้โปรแกรมทำงาน
 
แล้วทดลองเรียกให้โปรแกรมทำงาน
  
=== 3.เพิ่ม property velocity ให้ลูกบอลและปรับทิศทางเมื่อชนขอบ ===
+
=== 3.เพิ่ม property เกี่ยวกับความเร็วให้ลูกบอลและปรับทิศทางเมื่อชนขอบ ===
 +
 
 +
สังเกตว่าถ้าเราต้องการให้ลูกบอลเด้งไปมาได้ ลูกบอลจะต้องมีข้อมูลเกี่ยวกับความเร็ว เราจะเพิ่ม property <tt>vx</tt> และ <tt>vy</tt> ให้กับลูกบอล และเขียนเมท็อด <tt>move</tt> ที่ <tt>PongBall</tt> เพื่อปรับตำแหน่งตามความเร็วนั้น
 +
 
 +
<pre>
 +
class PongBall(Widget):
 +
    vx = NumericProperty(1)
 +
    vy = NumericProperty(1)
 +
 
 +
    def move(self):
 +
        self.x += self.vx
 +
        self.y += self.vy
 +
</pre>
 +
 
 +
เรากำหนดค่าเริ่มต้นของ property ทั้งสองเป็น 1
 +
 
 +
สังเกตว่าเราใช้ <tt>NumericProperty</tt> ดังนั้นต้องไป import ด้วย โดยแก้หัวโปรแกรมเป็น
 +
 
 +
from kivy.properties import ObjectProperty, NumericProperty

รุ่นแก้ไขเมื่อ 00:51, 15 กรกฎาคม 2556

เอกสารส่วนนี้ดัดแปลงมาจาก Pong Game Tutorial

ติดตั้ง kivy

การติดตั้ง สั่งคำสั่งต่อไปนี้ใน shell (อย่าลืม login เครือข่ายนนทรีก่อน)

sudo apt-get install python-setuptools python-pygame python-opengl \
  python-gst0.10 python-enchant gstreamer0.10-plugins-good python-dev \
  build-essential libgl1-mesa-dev libgles2-mesa-dev cython python-pip

จากนั้นสั่ง

sudo easy_install kivy

ทดลองโปรแกรมด้านล่าง

ให้สร้างไดเร็กทอรีย่อย จากนั้นป้อนโปรแกรมด้านล่างลงในแฟ้ม main.py

from kivy.app import App
from kivy.uix.widget import Widget

class PongGame(Widget):
    pass

class PongApp(App):
    def build(self):
        return PongGame()

if __name__ == '__main__':
    PongApp().run()

Kv Language และการสร้าง widget

Kivy แยกส่วนออกแบบหน้าจอออกมาเป็นแฟ้มนามสกุล kv ในส่วนนี้เราจะทดลองการใช้แฟ้มดังกล่าว และแนวคิดพื้นฐานเกี่ยวกับการตอบสนอง event และ observer patterns

เพิ่มแฟ้มชื่อ pong.kv ในไดเร็กทอรี

#:kivy 1.7.1

<PongGame>:    
    Label:
        font_size: 70  
        center_x: (root.width * 3) / 4
        top: root.top - 50
        text: "hello"

ทดลองเรียก python main.py จะเห็นหน้าจอที่มีคำว่า hello

แฟ้ม pong.kv จะถูกอ่านโดยอัตโนมัติโดย App ที่ชื่อ PongApp

เพิ่มลูกบอล

เราจะเพิ่มคลาส PongBall ลงใน main.py

class PongBall(Widget):
    pass

จากนั้นแก้ไข pong.kv โดยเพิ่มข้อมูลเกี่ยวกับการวาดวัตถุของคลาส PongBall และเพิ่มลูกบอลลงใน widget PongGame

#:kivy 1.7.1

<PongBall>:
    size: 50, 50
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size

<PongGame>:    
    Label:
        font_size: 70  
        center_x: (root.width * 3) / 4
        top: root.top - 50
        text: "hello"

    PongBall:
        center: self.parent.center

จากนั้นทดลองรัน

ลูกบอลเคลื่อนที่: Clock, properties

ในส่วนนี้เราจะทำให้ลูกบอลเคลื่อนที่ได้ มีกิจกรรมที่เราต้องทำ 3 ขั้นตอน

1. การปรับสถานะเกม

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

เราจะสร้างเมท็อด update ในคลาส PongGame เพื่อปรับตำแหน่งลูกบอล

class PongGame(Widget):

    def update(self, dt):
        pass

จากนั้นแก้ไขคลาส PongApp ให้ตั้งเวลาเรียกฟังก์ชันดังกล่าวทุก ๆ 1/60 วินาที

class PongApp(App):
    def build(self):
        game = PongGame()
        Clock.schedule_interval(game.update, 1.0/60.0)
        return game

สังเกตว่าเราใช้ Clock ด้วย เราจะต้อง import ชื่อดังกล่าว โดยเพิ่ม

from kivy.clock import Clock

ไว้ที่ต้นโปรแกรม

โปรแกรมดังกล่าวเมื่อเรียกให้ทำงาน จะไม่เห็นผลลัพธ์เปลี่ยนแปลงใด ๆ เพราะว่าเรายังไม่ได้ทำงานอะไรเลยในเมท็อด update

2. ทำให้ PongGame รู้จักวัตถุ PongBall: properties และการกำหนด id

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

เราสามารถ "ร้อย" วัตถุที่สร้างขึ้นในแฟ้ม kv ให้ "มองเห็น" กันได้

ขั้นแรกเราจะเพิ่ม property ball ในคลาส PongGame

class PongGame(Widget):
    ball = ObjectProperty(None)

    # ... (ละไว้) ...

ให้เพิ่มการ import ObjectProperty ที่หัวแฟ้มด้วย: from kivy.properties import ObjectProperty

จากนั้นปรับกฎในแฟ้ม kv ดังนี้

<PongGame>:    
    ball: pong_ball

    # ...

    PongBall:
        id: pong_ball
        center: self.parent.center

สังเกตว่าเราให้ชื่อกับวัตถุคลาส PongBall ที่เราสร้างภายใน PongGame ว่า pong_ball จากนั้นเรากำหนด property ball ให้อ้างถึงวัตถุดังกล่าวด้วยชื่อ pong_ball

เพื่อทดลองว่าเราสามารถอ้างถึง pong_ball ได้จริง ๆ ให้แก้เมท็อด update ในคลาส PongGame เป็น

    def update(self, dt):
        self.ball.x += 1

แล้วทดลองเรียกให้โปรแกรมทำงาน

3.เพิ่ม property เกี่ยวกับความเร็วให้ลูกบอลและปรับทิศทางเมื่อชนขอบ

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

class PongBall(Widget):
    vx = NumericProperty(1)
    vy = NumericProperty(1)

    def move(self):
        self.x += self.vx
        self.y += self.vy

เรากำหนดค่าเริ่มต้นของ property ทั้งสองเป็น 1

สังเกตว่าเราใช้ NumericProperty ดังนั้นต้องไป import ด้วย โดยแก้หัวโปรแกรมเป็น

from kivy.properties import ObjectProperty, NumericProperty