สารบัญ:

Space Invaders ใน Micropython บน Micro:bit: 5 ขั้นตอน
Space Invaders ใน Micropython บน Micro:bit: 5 ขั้นตอน

วีดีโอ: Space Invaders ใน Micropython บน Micro:bit: 5 ขั้นตอน

วีดีโอ: Space Invaders ใน Micropython บน Micro:bit: 5 ขั้นตอน
วีดีโอ: micro:bit Shooting Game 2024, กรกฎาคม
Anonim
Image
Image

ในบทความก่อนหน้านี้ เราได้สำรวจการสร้างเกมบน GameGo ซึ่งเป็นคอนโซลเกมย้อนยุคแบบพกพาที่พัฒนาโดยการศึกษาของ TinkerGen เกมที่เราสร้างนั้นชวนให้นึกถึงเกม Nintendo เก่า ในบทความของวันนี้ เราจะย้อนกลับไปสู่ยุคทองของเกมอาร์เคด เราจะสร้างเกม Space Invaders ขึ้นมาใหม่ใน Micropython บนไมโครคอนโทรลเลอร์ Micro:bit - และในทางกลับกัน เราจะใช้ส่วนขยาย BitPlayer Micro:bit ซึ่งช่วยให้เราเล่นเกมได้สะดวกยิ่งขึ้น

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

เสบียง

TinkerGen BitPlayer

BBC Micro:bit

ขั้นตอนที่ 1: วงหลัก

จอยสติ๊ก
จอยสติ๊ก

ในบทช่วยสอนนี้ ฉันจะใช้คำว่า "วิธีการ" ค่อนข้างบ่อย เมธอดใน python ค่อนข้างคล้ายกับฟังก์ชัน ยกเว้นว่ามันเกี่ยวข้องกับอ็อบเจกต์/คลาส ดังนั้น เพื่อให้เข้าใจง่ายขึ้น คุณสามารถอ่านเป็น "ฟังก์ชันภายในคลาส" ได้ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิธีการได้ที่นี่

เราเข้าสู่วงหลักด้วย

ในขณะที่ไม่ใช่ game_over:

สภาพ. ภายในเราได้รับจำนวนผู้บุกรุก โอกาสที่พวกเขาจะปรากฏตัว และจำนวนที่จำเป็นเพื่อไปยังระดับถัดไปจากพจนานุกรมระดับ ต่อไปเราจะตรวจสอบการเคลื่อนไหวซ้ายขวาด้วยวิธีการอินสแตนซ์ Listen_Dir ของอินสแตนซ์คลาส JoyStick หากเงื่อนไขใดประเมินเป็น True เราจะเพิ่ม/ลดค่า x ของตัวละครที่เล่นได้ เราจำกัดมันเป็น [-2, 2] ด้วยเงื่อนไขสองข้อ จากนั้นเราจะเริ่มต้นอินสแตนซ์ของคลาส DisplayBuffer และตรวจสอบการกดปุ่ม "shield" หรือ "fire bullet" เราใช้เมธอด DisplayBuffer.set() เพื่อตั้งค่าอ็อบเจ็กต์สำหรับการเรนเดอร์ในภายหลัง สำหรับการเรนเดอร์ชีลด์ เราใช้ DisplayBuffer.set() โดยตรง แต่สำหรับกระสุนและผู้บุกรุก เราเพิ่มพวกมันลงในรายการตามลำดับและ set() ทีละรายการในลูปด้วยโค้ดต่อไปนี้สำหรับการเรนเดอร์ในภายหลังด้วย DispBuffer.render():

สำหรับ b ในสัญลักษณ์แสดงหัวข้อย่อย: b.render(dispBuf) สำหรับ v ใน vaders: v.render(dispBuf)

ผู้บุกรุก กระสุน และโล่ทั้งหมดจะแสดงขึ้นทุกครั้งที่มีการวนซ้ำหลักด้วย

dispBuf.render()

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

ขั้นตอนที่ 2: จอยสติ๊ก

จอยสติ๊ก
จอยสติ๊ก

BitPlayer ถือและใช้งานง่ายด้วยจอยสติ๊ก 2 แกนเช่นตัวควบคุม Gameboy หรือ PSP นอกจากนี้ยังมีปุ่มตั้งโปรแกรมอีก 6 ปุ่มที่มีป้ายกำกับว่า L, R, A, B, C และ D สำหรับประสบการณ์ที่ดื่มด่ำและโต้ตอบได้ BitPlayer มีออด มอเตอร์สั่น และพอร์ต Grove I2C เพื่อเชื่อมต่ออุปกรณ์ต่อพ่วงเพิ่มเติม เช่น จอภาพ OLED

เราใช้คันโยกโยกซ้าย-ขวาของจอยสติ๊กสำหรับเกมนี้ เช่น ตัวอย่างเต็มรูปแบบเกี่ยวกับการใช้ปุ่ม BitPlayer ทั้งหมด คุณสามารถดูที่ joystick_example.py ในที่เก็บ GitHub ของโปรเจ็กต์นี้ ในการสร้างอินสแตนซ์ของคลาส JoyStick เราจะตรวจสอบการอ่านเริ่มต้นของแกน X และเก็บค่านั้นไว้ในตัวเอง Read_X จากนั้นในฟังก์ชัน Listen_Dir เราจะตรวจสอบว่าค่าเบี่ยงเบนจากค่าเริ่มต้นนั้นสูงกว่าตัวแปรความไวหรือไม่ (ลองปรับแต่งเอง หากคุณรู้สึกว่า JoyStick มีความละเอียดอ่อนเกินไป) และคืนค่า True ของ False ตามทิศทางที่ตรวจพบ

มาดูตัวอย่างที่เป็นรูปธรรมเกี่ยวกับวิธีการทำงาน:

สมมติว่าการอ่านแกน X เริ่มต้นของเราคือ 0 หากเราเลื่อนจอยสติ๊กไปทางขวา:

New_X = JoyStick_X.read_analog() #New_X=200

ขวา = New_X - self. Read_X #Right = 200 Left = self. Read_X - New_X #Left = -200

จากนั้นเมื่อเราตรวจสอบทิศทาง:

ความแม่นยำ = 150ถ้าถูกต้อง > ความแม่นยำ: #200 > 150 True Get_Rocker = DIR['R'] elif Left > ความแม่นยำ: #-200 > 150 False Get_Rocker = DIR['L'] อื่น: Get_Rocker = DIR['NONE'] ถ้า Dir == Get_Rocker: return True else: return False

ขั้นตอนที่ 3: แสดงบัฟเฟอร์

บัฟเฟอร์การแสดงผล
บัฟเฟอร์การแสดงผล

คลาส DisplayBuf มีหน้าที่ควบคุมหน้าจอ LED มันทำได้โดยใช้สองวิธีคือ set() และ render() set() วิธีการเปลี่ยนค่าที่สอดคล้องกับพิกเซลหน้าจอ LED คุณอาจจำได้ว่าพิกเซลบนหน้าจอ Micro:bit LED สามารถแสดงเป็นสตริงหรือรายการ - "00000:00000:000000:00000:00000" เป็นหน้าจอว่าง "00000:00000:00000:00000:00100" เป็นหน้าจอที่มีพิกเซลแสงสลัวอยู่ตรงกลางแถวด้านล่าง

00000:

00000

:00000

:00000:

00100"

สัญกรณ์นี้อาจดำเนินการได้ง่ายขึ้น:)

ดังนั้น สิ่งที่เราทำระหว่าง main loop คือ call set() method ของ DisplayBuf เพื่อตั้งค่าอ็อบเจกต์ทั้งหมดของเราที่ต้องแสดงบนหน้าจอ จากนั้นเราใช้เมธอด render() เพื่อแสดงทั้งหมดบนหน้าจอพร้อมกัน

ขั้นตอนที่ 4: ผู้บุกรุก กระสุน และผู้เล่น

ผู้บุกรุก กระสุน และผู้เล่น
ผู้บุกรุก กระสุน และผู้เล่น

Bullets and Invaders เป็นของคลาส Mover อินสแตนซ์คลาสของผู้เสนอญัตติมีตำแหน่ง x, y และความเร็ว รวมถึงความสว่าง คลาสผู้เสนอญัตติมีสองเมธอด set() และ move() เมธอด set() เรียกเมธอด DisplayBuf set() พร้อมพิกัดที่อัปเดตเพื่อบันทึกสำหรับการเรนเดอร์ในภายหลังบนเมทริกซ์ LED move() วิธีการอัพเดทอินสแตนซ์ประสานงานตามความเร็วของอินสแตนซ์ - ซึ่งจะมีประโยชน์ในภายหลัง เมื่อเราต้องการเปลี่ยนความเร็วของผู้บุกรุกตามระดับความคืบหน้า

Class Bullet และ class Invader เป็นคลาสย่อยของคลาส Mover ที่นี่เราใช้สิ่งที่เรียกว่ามรดก ฟังก์ชันของ super() ทำให้เราสามารถเรียกเมธอดของ superclass ใน subclass โดยไม่ต้องทำซ้ำโค้ด

ขั้นตอนที่ 5: ทำให้เป็นของคุณเอง

ทำให้เป็นของคุณเอง
ทำให้เป็นของคุณเอง

ยินดีด้วย! คุณเพิ่งสร้างเกม Space Invaders สุดคลาสสิกบน Micro:bit ด้วยฮาร์ดแวร์เกมสุดเจ๋ง แน่นอน คุณสามารถปรับปรุงโค้ดเกมได้จากที่นี่ - ตัวอย่างเช่น ณ ตอนนี้ เกมมีเพียงระดับเดียวเท่านั้น - คุณสามารถเพิ่มระดับที่ท้าทายมากขึ้นได้ อย่างที่คุณอาจจำได้ เกมต้นฉบับมีหินลอยอยู่ด้านหน้าผู้เล่น ซึ่งคุณสามารถเพิ่มได้เช่นกัน

หากคุณสร้างเกมเวอร์ชันที่ปรับปรุงแล้ว แบ่งปันในความคิดเห็นด้านล่าง! สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ BitPlayer และฮาร์ดแวร์อื่นๆ สำหรับผู้ผลิตและผู้ให้การศึกษา STEM โปรดเยี่ยมชมเว็บไซต์ของเรา https://tinkergen.com/ และสมัครรับจดหมายข่าวของเรา

TinkerGen เพิ่งสร้างแคมเปญ Kickstarter สำหรับ MARK (Make A Robot Kit) ซึ่งเป็นชุดหุ่นยนต์สำหรับสอนการเขียนโค้ด หุ่นยนต์ AI!

รหัส Micropython ดั้งเดิมจาก hexkcd/micro-vaders ถูกเปลี่ยนเป็นทำงานกับ TinkerGen BitPlayer

แนะนำ: