HayBox เป็นเฟิร์มแวร์แบบโมดูลาร์ข้ามแพลตฟอร์มสำหรับคอนโทรลเลอร์แบบดิจิทัลหรือแบบผสมแอนะล็อก/ดิจิทัล โดยมีเป้าหมายหลักคือคอนโทรลเลอร์แบบ B0XX
คุณสมบัติได้แก่:
หากคุณต้องการใช้เฟิร์มแวร์ที่สร้างไว้ล่วงหน้าพร้อมการแมปพินและการกำหนดค่าเริ่มต้น โปรดดูส่วนไบนารีที่สร้างไว้ล่วงหน้า หากคุณต้องการเปลี่ยนแปลงโค้ด โปรดดูส่วนสิ่งปลูกสร้างจากแหล่งที่มา
.uf2
) เพียงใส่มันลงในโหมดบูทเซลในขณะที่เสียบเข้ากับพีซีของคุณ แล้วลากและวางไฟล์ .uf2
ลงบนไดรฟ์ RPI-RP2 ที่ปรากฏขึ้น.hex
) คุณสามารถใช้โปรแกรมเช่น QMK Toolbox เพื่อแฟลชไฟล์ .hex
ได้ปัจจุบันมีสามวิธีหลักในการสร้าง HayBox:
ทั้ง GitHub Actions และ GitHub Codespaces ต้องการให้คุณสร้างบัญชี GitHub แต่ไม่ต้องการให้คุณติดตั้งการขึ้นต่อกันใดๆ บนเครื่องภายในของคุณ
จำเป็นต้องมีการอ้างอิงต่อไปนี้เมื่อสร้างภายในเครื่อง:
หลังจากติดตั้งข้อกำหนดทั้งหมดแล้ว ให้ดาวน์โหลดและแตกไฟล์ HayBox รุ่นล่าสุด หรือโคลนพื้นที่เก็บข้อมูลหากคุณติดตั้ง git ไว้ (ซึ่งทำให้คุณสามารถดึงการอัปเดตได้ง่ายขึ้น)
หลังจากนั้น:
git config --global core.longpaths true
ในเทอร์มินัลใด ๆ (ภายใน VS Code หรือ cmd/PowerShell ปกติก็ใช้ได้ทั้งหมด)config/<environment>/config.cpp
) ปุ่มใดๆ ที่คอนโทรลเลอร์ของคุณไม่มีสามารถลบออกจากรายการได้HayBox/.pio/build/<environment>/firmware.uf2
ลงบน RPI -RP2 ไดรฟ์ที่ขึ้นมานี่อาจเป็นวิธีที่สะดวกที่สุดในการแก้ไขและสร้าง HayBox ขึ้นมาใหม่ แต่โปรดจำไว้ว่า Free Tier ของ GitHub มีข้อจำกัดบางประการเกี่ยวกับจำนวนที่คุณจะใช้ Codespace ในแต่ละเดือนได้ ด้วยเหตุนี้ คุณจะต้องแน่ใจว่าคุณได้ปิด Codespaces ของคุณเมื่อคุณไม่ได้ใช้งาน เพื่อเพิ่มสิ่งที่คุณได้รับจากโควต้าให้สูงสุด
ขั้นแรก สร้างบัญชี GitHub หรือเพียงเข้าสู่ระบบหากคุณมีอยู่แล้ว จากนั้นแยกพื้นที่เก็บข้อมูลนี้และเปิดทางแยกของคุณใน Codespace ใหม่โดยคลิกที่ปุ่มรหัสสีเขียว -> Codespaces -> สร้าง Codespace บนต้นแบบ สิ่งนี้ควรเปิด VS Code ในเบราว์เซอร์ของคุณพร้อมส่วนขยายและการอ้างอิงที่จำเป็นทั้งหมดที่ติดตั้งไว้ล่วงหน้า จากจุดนี้ กระบวนการจะเหมือนกับการสร้างในเครื่องมาก ยกเว้นว่าคุณไม่สามารถใช้ปุ่มอัปโหลดเพื่อแฟลชเฟิร์มแวร์ได้ คุณจะต้องดาวน์โหลดไบนารีที่คอมไพล์แล้วจาก HayBox/.pio/build/<environment>/
และแฟลชด้วยตนเองแทน (ดูเพิ่มเติมที่นี่)
พื้นที่เก็บข้อมูลนี้มีคำจำกัดความเวิร์กโฟลว์ GitHub Actions ที่สร้างสภาพแวดล้อม PlatformIO แต่ละรายการที่ระบุในเมทริกซ์ทุกครั้งที่พุช และอัปโหลดไบนารีของเฟิร์มแวร์เป็นอาร์ติแฟกต์ซึ่งคุณสามารถดาวน์โหลดได้โดยการคลิกเวิร์กโฟลว์เฉพาะที่เรียกใช้จากประวัติ คุณสามารถสร้างทางแยกของพื้นที่เก็บข้อมูลนี้และเปิดใช้งานการดำเนินการได้โดยคลิกการตั้งค่า -> การดำเนินการ -> ทั่วไป -> เลือก "อนุญาตการดำเนินการทั้งหมดและเวิร์กโฟลว์ที่นำมาใช้ซ้ำได้" -> บันทึก
วิธีที่เร็วที่สุดในการทำการเปลี่ยนแปลงหากคุณต้องการสร้างผ่าน GitHub Actions เท่านั้นคือการใช้ github.dev คุณสามารถทำได้โดยเพียงแค่ .
บนคีย์บอร์ดของคุณในขณะที่คุณเปิดที่เก็บนี้อยู่ และมันจะเปิดโปรแกรมแก้ไข VS Code ในเบราว์เซอร์ของคุณ สิ่งนี้ไม่ได้ให้ความสามารถในการพัฒนาแบบเดียวกับที่คุณได้รับใน Codespace แต่ช่วยให้คุณสามารถทำการเปลี่ยนแปลงและคอมมิตมันได้โดยตรงจากเบราว์เซอร์ของคุณ เปลี่ยนแปลงสิ่งที่คุณต้องการ จากนั้นใช้แท็บการควบคุมแหล่งที่มาทางด้านซ้ายเพื่อเพิ่ม คอมมิต และพุชการเปลี่ยนแปลงของคุณ สุดท้าย กลับไปที่พื้นที่เก็บข้อมูลและคลิกที่แท็บการดำเนินการ คลิกที่เวิร์กโฟลว์ของคุณทำงาน และรอให้สร้างส่วนต่างๆ
หากคุณกำลังเพิ่มสภาพแวดล้อมการกำหนดค่าอุปกรณ์/PlatformIO ใหม่ คุณจะต้องเพิ่มสภาพแวดล้อมให้กับเมทริกซ์เพื่อให้สร้างขึ้นโดยเวิร์กโฟลว์ GitHub Actions คุณยังสามารถลบสภาพแวดล้อมใดๆ ออกจากเมทริกซ์ที่คุณไม่สนใจ เพื่อลดการใช้ทรัพยากรและอาจเพิ่มความเร็วในการสร้างของคุณ
หากต้องการรีบูตคอนโทรลเลอร์ที่ใช้ Pico เข้าสู่โหมด bootsel ให้กด Start บนปลั๊กอินค้างไว้
หากต้องการเปลี่ยนไปใช้โหมดบอร์ด Brook บน GCPCCB2, GCCMX, B0XX R2 หรือ LBX ให้กด B บนปลั๊กอินค้างไว้
แบ็กเอนด์การสื่อสารจะถูกเลือกแตกต่างกันเล็กน้อย ขึ้นอยู่กับประเภทของไมโครคอนโทรลเลอร์ที่ใช้ในคอนโทรลเลอร์
บน Pico/RP2040 ระบบจะตรวจพบ USB กับ GameCube และ Nintendo 64 โดยอัตโนมัติ หากไม่ได้เสียบเข้ากับคอนโซล ค่าเริ่มต้นคือ XInput ซึ่งน่าจะใช้งานได้แบบ Plug-and-Play กับเกมพีซีส่วนใหญ่ แบ็กเอนด์อื่นๆ จะถูกเลือกโดยกดปุ่มใดปุ่มหนึ่งต่อไปนี้บนปลั๊กอิน:
บน Arduino/AVR แบ็กเอนด์ DInput จะถูกเลือกหากตรวจพบการเชื่อมต่อ USB มิฉะนั้น ระบบจะใช้ค่าเริ่มต้นเป็นแบ็กเอนด์ GameCube เว้นแต่จะเลือกแบ็กเอนด์อื่นด้วยตนเองโดยกดปุ่มใดปุ่มหนึ่งต่อไปนี้บนปลั๊กอิน:
ไม่เหมือนกับเฟิร์มแวร์อื่นๆ ที่คล้ายกัน HayBox เป็นค่าเริ่มต้นที่ให้คุณสลับโหมดได้ทันทีโดยไม่ต้องถอดปลั๊กคอนโทรลเลอร์ สิ่งนี้มีประโยชน์เป็นหลักบนพีซี ต่างจากคอนโซลที่คุณจะต้องรีสตาร์ทคอนโซลเพื่อเปลี่ยนเกมอยู่ดี นอกจากนี้ยังมีจุดประสงค์ในการลดจำนวนปุ่มที่คุณต้องถือด้วยมือเดียวขณะเสียบปลั๊ก
การรวมปุ่มโหมดตัวควบคุมเริ่มต้นคือ:
การรวมปุ่มโหมดแป้นพิมพ์เริ่มต้น (ใช้ได้เฉพาะเมื่อใช้แบ็กเอนด์ DInput ไม่ใช่ กับ XInput):
HayBox ต้องการโปรไฟล์ตัวควบคุม Dolphin ที่แตกต่างจากเฟิร์มแวร์ B0XX อย่างเป็นทางการ เนื่องจากใช้การแมป DInput ที่แตกต่างกันซึ่งเหมาะสมกว่าสำหรับการใช้งานในหลายเกม สิ่งเหล่านี้สามารถพบได้ในโฟลเดอร์ dolphin
ใน repo HayBox ไฟล์โปรไฟล์ได้รับการตั้งชื่อเพื่อระบุแบ็กเอนด์การสื่อสารและระบบปฏิบัติการที่ใช้สำหรับ:
ในการติดตั้งโปรไฟล์:
dolphin
ภายใน HayBox ไปยังโฟลเดอร์ <YourDolphinInstallation>UserConfigProfilesGCPad
(สร้างใหม่หากไม่มีอยู่)%appdata%Slippi LaunchernetplayUserConfigProfilesGCPad
~/.config/SlippiOnline/Config/Profiles/GCPad/
Cmd + Shift + G
และป้อนพาธ /Users/<USER>/Library/Application Support/Slippi Launcher/netplay/Slippi Dolphin.app/Contents/Resources/Sys/Config/Profiles/GCPad
%userprofile%DocumentsDolphin EmulatorConfigProfilesGCPad
~/.config/dolphin-emu/Profiles/GCPad/
* macOS รองรับเฉพาะ DInput (และไม่ค่อยดีนัก) ดังนั้นหากใช้คอนโทรลเลอร์ที่ใช้ Pico/RP2040 คุณจะต้องบังคับโหมด DInput โดยกด Z บนปลั๊กอินค้างไว้ และถึงอย่างนั้นก็อาจไม่ทำงาน ฉันไม่สามารถทำอะไรได้จริงๆ เกี่ยวกับการรองรับคอนโทรลเลอร์ที่ไม่ดีของ Apple (ซึ่งดูเหมือนว่าจะพังเมื่อมีการอัปเดตอื่นๆ ทุกครั้ง) และฉันไม่ได้เป็นเจ้าของอุปกรณ์ Apple ใด ๆ เลย ดังนั้นนี่จะถือว่าการใช้งาน HayBox ที่ไม่รองรับด้วย
แบ็กเอนด์การสื่อสาร (เช่น DInput, GameCube หรือ N64) จะถูกเลือกบางส่วนผ่านการตรวจจับอัตโนมัติ และบางส่วนขึ้นอยู่กับปุ่มที่ถืออยู่บนปลั๊กอิน สิ่งนี้ได้รับการจัดการใน config/<environment>/config.cpp
ในฟังก์ชัน setup()
ตรรกะนั้นค่อนข้างง่าย และแม้ว่าคุณจะไม่มีประสบการณ์ในการเขียนโปรแกรม แต่ก็ไม่ควรยากเกินไปที่จะดูว่าเกิดอะไรขึ้นและเปลี่ยนแปลงสิ่งต่าง ๆ ได้หากต้องการ
โฟลเดอร์กำหนดค่าที่สอดคล้องกับสภาพแวดล้อม Arduino คือ:
config/arduino_nativeusb/
สำหรับ Arduino ที่รองรับ USB ดั้งเดิม (เช่น Leonardo, Micro)config/arduino/
สำหรับ Arduino ที่ไม่รองรับ USB ดั้งเดิม (เช่น Uno, Nano, Mega 2560) สำหรับการกำหนดค่าอุปกรณ์ Arduino คุณอาจสังเกตเห็นว่าหมายเลข 125 ถูกส่งผ่านไปยัง GamecubeBackend()
ซึ่งช่วยให้คุณเปลี่ยนอัตราการโพลได้ เช่น หาก DIY ของคุณไม่รองรับ USB ดั้งเดิม และคุณต้องการใช้กับอะแดปเตอร์คอนโทรลเลอร์ GameCube ที่โอเวอร์คล็อก ในตัวอย่างนี้ คุณสามารถส่งผ่าน 1,000 เพื่อซิงค์สูงสุดที่อัตราการโพล 1,000Hz หรือ 0 เพื่อปิดใช้งานการแก้ไขความล่าช้านี้โดยสมบูรณ์ อัตราการโพลสามารถส่งผ่านไปยังตัวสร้าง N64Backend ได้ในลักษณะเดียวกับสิ่งนี้
คุณอาจสังเกตเห็นว่าอัตราการโพล 1,000Hz ทำงานบนคอนโซลเช่นกัน โปรดทราบว่าแม้ว่าจะใช้งานได้ แต่จะส่งผลให้อินพุตล่าช้ามากขึ้น จุดกำหนดอัตราการโพลที่นี่คือเพื่อให้แบ็กเอนด์ GameCube สามารถหน่วงเวลาจนกว่าจะถึงโพลถัดไปก่อนที่จะอ่านอินพุต เพื่อให้อินพุตมีความสดใหม่และไม่ล้าสมัย
สำหรับ Pico/RP2040 ไม่จำเป็นต้องส่งผ่านอัตราการโพลคอนโซล เนื่องจาก Pico มีพลังการประมวลผลเพียงพอที่จะอ่าน/ประมวลผลอินพุตหลังจากได้รับโพลคอนโซล ดังนั้นจึงไม่จำเป็นต้องคาดเดาว่าโพลจะมาถึงเมื่อใดและเตรียมสิ่งต่างๆ ล่วงหน้า.
หากต้องการกำหนดค่าปุ่มค้างสำหรับโหมดอินพุต (โหมดคอนโทรลเลอร์/คีย์บอร์ด) ให้แก้ไขฟังก์ชัน select_mode()
ใน config/mode_selection.hpp
แต่ละคำสั่ง if
เป็นการรวมปุ่มเพื่อเลือกโหมดอินพุต
โหมดอินพุตส่วนใหญ่รองรับการส่งผ่านในโหมดการทำความสะอาด SOCD เช่น socd::2IP_NO_REAC
ดูที่นี่สำหรับโหมดอื่นๆ ที่มี
สำหรับการสร้างโหมดอินพุตใหม่ จะช่วยได้มากหากคุณรู้ C++ บ้างหรือมีประสบการณ์ด้านการเขียนโปรแกรมมาบ้างแล้ว อย่างที่กล่าวไปแล้ว คุณควรจะสามารถผ่านไปได้แม้จะไม่มีประสบการณ์มาก่อน หากคุณเพียงแค่ใช้โหมดใหม่ของคุณจากโหมดที่มีอยู่แล้วและยกตัวอย่าง
โหมดอินพุตมีสองประเภท: ControllerMode และ KeyboardMode
โหมดคีย์บอร์ดนั้นง่ายกว่าเล็กน้อย ดังนั้นมาเริ่มกันเลย
KeyboardMode ทำงานเหมือนคีย์บอร์ดมาตรฐานและควรใช้งานได้กับอุปกรณ์ใดๆ ที่รองรับคีย์บอร์ด
คุณมีอิสระที่จะใช้ลอจิกและเทคนิคการเขียนโปรแกรมใดก็ได้ที่คุณต้องการในฟังก์ชัน UpdateKeys()
เพื่อตัดสินใจเอาต์พุตตามสถานะอินพุต คุณสามารถสร้างเลเยอร์อินพุต (เช่นเลเยอร์ D-Pad ในโหมด Melee ที่จะเปิดใช้งานเมื่อกด Mod X และ Mod Y ค้างไว้) หรืออินพุตแบบมีเงื่อนไขประเภทอื่น ๆ
สามารถดูรายการรหัสรหัสที่ใช้ได้ ที่นี่
โปรดจำไว้ว่าโหมดแป้นพิมพ์สามารถเปิดใช้งานได้เมื่อใช้แบ็กเอนด์การสื่อสาร DInput เท่านั้น ( ไม่ใช่ XInput)
ControllerMode ใช้สถานะอินพุตปุ่มดิจิทัลและแปลงเป็นสถานะเอาต์พุตที่สอดคล้องกับเกมแพดมาตรฐาน ControllerMode ใด ๆ จะทำงานร่วมกับ CommunicationBackend ใด ๆ CommunicationBackend เพียงอ่านอินพุตจากแหล่งอินพุตตั้งแต่หนึ่งแหล่งขึ้นไป ใช้ ControllerMode ปัจจุบันเพื่ออัปเดตเอาต์พุตตามอินพุตเหล่านั้น และจัดการการส่งเอาต์พุตไปยังคอนโซลหรือพีซี
หากต้องการสร้าง ControllerMode คุณเพียงแค่ต้องใช้ฟังก์ชัน UpdateDigitalOutputs()
และ UpdateAnalogOutputs()
UpdateDigitalOutputs()
คล้ายกันมากกับฟังก์ชัน UpdateKeys()
ในโหมดแป้นพิมพ์ โดยมีความแตกต่างที่แทนที่จะเรียกใช้ฟังก์ชัน Press()
เพื่อส่งข้อมูลทันที เราเพียงแค่ตั้งค่าสถานะเอาต์พุตสำหรับการวนซ้ำนี้ ตามชื่อที่ระบุ เราจะจัดการกับเอาต์พุตดิจิทัลในฟังก์ชันนี้เท่านั้น
UpdateAnalogOutputs()
นั้นซับซ้อนกว่าเล็กน้อย ก่อนอื่นจะต้องเรียก UpdateDirections()
ก่อนดำเนินการอย่างอื่น ฟังก์ชันนี้รับค่าที่ระบุว่าแท่งซ้ายและขวาของคุณชี้ไปทางซ้าย/ขวา/ขึ้น/ลงหรือไม่ คุณยังส่งผ่านค่าอะนาล็อกสติ๊กขั้นต่ำ เป็นกลาง (กลาง) และสูงสุด เพื่อให้คุณสามารถกำหนดค่าเหล่านี้ได้ในแต่ละโหมด ข้อมูลทั้งหมดนี้ใช้เพื่อตั้งค่าอนาล็อกแบบแท่งโดยอัตโนมัติตามอินพุตที่คุณส่งเข้ามา นี่คือทั้งหมดที่คุณต้องทำ เว้นแต่ว่าคุณต้องการใช้ตัวแก้ไข
UpdateDirections()
ยังเติม directions
ตัวแปรด้วยค่าที่ระบุทิศทางของแท่งปัจจุบัน ซึ่งอาจเป็น 1, 0 หรือ -1 สำหรับแกน X และ Y สำหรับแท่งทั้งสอง ค่าเหล่านี้ช่วยให้เขียนตรรกะตัวปรับแต่งได้ง่ายขึ้นมาก
หลังจากเรียก UpdateDirections()
แล้ว ให้เพิ่มตรรกะการจัดการตัวแก้ไขที่คุณต้องการ โปรดจำไว้ว่า UpdateDirections()
ได้ตั้งค่าอนาล็อกสติ๊กเริ่มต้นไว้แล้ว ดังนั้นเมื่อจัดการกับตัวแก้ไข คุณจะต้องตั้งค่าด้วยตนเองสำหรับแกนที่กำลังถูกแก้ไขจริง ๆ เท่านั้น นอกเหนือจากนี้ ฉันไม่สามารถสอนวิธีเขียนตรรกะตัวปรับแต่งของคุณได้ ดังนั้นเพียงแค่ดูตัวอย่างและลองเล่นดู
สุดท้าย ตั้งค่าทริกเกอร์แบบอะนาล็อกที่คุณต้องการ
หมายเหตุ: เอาต์พุตทริกเกอร์แบบอะนาล็อกสามารถจัดการได้เช่นกันใน UpdateDigitalOutputs()
แต่ฉันคิดว่ามันมักจะดูสะอาดกว่าถ้าเก็บไว้พร้อมกับเอาต์พุตแบบอะนาล็อกอื่น ๆ
หมายเหตุ: คุณไม่จำเป็นต้องกังวลเกี่ยวกับการรีเซ็ตสถานะเอาต์พุตหรือล้างข้อมูลใดๆ ซึ่งจะดำเนินการโดยอัตโนมัติเมื่อเริ่มต้นการวนซ้ำแต่ละครั้ง
ในตัวสร้างของแต่ละโหมด (สำหรับโหมดคอนโทรลเลอร์ และ โหมดคีย์บอร์ด) คุณสามารถกำหนดค่าคู่ของอินพุตทิศทางที่ตรงกันข้ามเพื่อใช้การทำความสะอาด SOCD
ตัวอย่างเช่น ใน src/modes/Melee20Button.cpp
:
_socd_pair_count = 4;
_socd_pairs = new socd::SocdPair[_socd_pair_count]{
socd::SocdPair{&InputState::left, &InputState::right, socd_type},
socd::SocdPair{ &InputState::down, &InputState::up, socd_type},
socd::SocdPair{ &InputState::c_left, &InputState::c_right, socd_type},
socd::SocdPair{ &InputState::c_down, &InputState::c_up, socd_type},
};
ซึ่งจะตั้งค่าซ้าย/ขวา ลง/ขึ้น C-ซ้าย/C-Right และ C-ลง/C-Up เป็นคู่ของทิศทางหลักที่ตรงกันข้ามซึ่งจะใช้การทำความสะอาด SOCD การทำความสะอาด SOCD จะดำเนินการโดยอัตโนมัติก่อน UpdateDigitalOutputs()
และ UpdateAnalogOutputs()
และคุณไม่จำเป็นต้องกังวลอีกต่อไป
สำหรับแต่ละ SocdPair
คุณสามารถส่งผ่าน SocdType
ที่คุณเลือกได้ ตามค่าเริ่มต้นสำหรับโหมดส่วนใหญ่ ค่านี้จะถูกส่งผ่านเป็นพารามิเตอร์ตัวสร้างตัวเดียว แต่เป็นไปได้ที่จะส่งผ่านหลายพารามิเตอร์ หรือใช้ค่าฮาร์ดโค้ดก็ได้ ทั้งสองวิธีนี้มีตัวอย่างอยู่ใน src/modes/FgcMode.cpp
SocdType | คำอธิบาย |
---|---|
SOCD_NEUTRAL | ซ้าย + ขวา = เป็นกลาง - ค่าเริ่มต้นหากไม่มีการระบุ SocdType ใน SocdPair |
SOCD_2IP | ลำดับความสำคัญอินพุตที่สอง - ซ้าย -> ซ้าย + ขวา = ขวา และในทางกลับกัน การปล่อยทิศทางที่สองจะทำให้มีทิศทางเดิม |
SOCD_2IP_NO_REAC | ลำดับความสำคัญอินพุตที่สองโดยไม่มีการเปิดใช้งานอีกครั้ง - เช่นเดียวกับข้างต้น ยกเว้นการปล่อยทิศทางที่สองจะส่งผลให้เป็นกลาง ทิศทางเดิมจะต้องได้รับการกระตุ้นทางกายภาพ |
SOCD_DIR1_PRIORITY | ปุ่มแรกใน SocdPair จะมีลำดับความสำคัญมากกว่าปุ่มที่สองเสมอ |
SOCD_DIR2_PRIORITY | ปุ่มที่สองใน SocdPair จะมีลำดับความสำคัญมากกว่าปุ่มแรกเสมอ |
SOCD_NONE | ไม่มีความละเอียด SOCD - เกมเป็นผู้ตัดสิน |
โปรดทราบว่าคุณไม่จำเป็นต้องใช้ฟังก์ชัน HandleSocd()
เช่นเดียวกับในโหมด Melee20Button และ Melee18Button มันถูกแทนที่ในโหมดเหล่านี้เท่านั้น เพื่อให้เราสามารถตรวจสอบว่าซ้ายและขวาถูกค้างไว้ ก่อน การทำความสะอาด SOCD เพราะเมื่อทั้งสองถูกยึดไว้ (โดยไม่ได้ถือในแนวตั้ง) เราจำเป็นต้องแทนที่ตัวแก้ไขทั้งหมด
หากคอนโทรลเลอร์ของคุณไม่มีปุ่มไลท์ชิลด์ คุณอาจต้องการใช้ Mod X สำหรับไลท์ชิลด์และเอียงชีลด์ไปที่ R แทน คุณสามารถทำได้โดยใช้โหมด Melee18Button แทน Melee20Button
โหมด Melee20Button และ Melee18Button มีตัวเลือกพิกัดที่จะใช้เมื่อกดลง + ขวา ตามค่าเริ่มต้น การกด + ย้อนกลับจะทำให้คุณสามารถยกเลิกการกระทุ้งอัตโนมัติได้ ซึ่งเป็นเทคนิคที่มีประโยชน์สำหรับอักขระบางตัว
เทคนิคยอดนิยมอีกวิธีหนึ่งที่ใช้เส้นทแยงมุมลง + ขวาคือสิ่งที่เรียกว่าการหมอบคลาน/เดิน เทคนิคนี้เกี่ยวข้องกับการกด + ไปข้างหน้าในมุมหนึ่งขณะหมอบ ซึ่งหลังจากหมอบคลานยกเลิกการโจมตีแล้ว คุณจะเริ่มเดินไปหาคู่ต่อสู้โดยอัตโนมัติแทนที่จะกลับหมอบลง สิ่งนี้มีประโยชน์มากสำหรับการไล่ตามเทคโนโลยี แต่พิกัดที่ใช้สำหรับเทคนิคนี้ไม่อนุญาตให้คุณยกเลิกการกระทุ้งอัตโนมัติ
สามารถกำหนดค่าได้ตามที่เห็นใน config/mode_selection.hpp
โดยการตั้งค่าตัวเลือก crouch_walk_os
เป็นจริง:
new Melee20Button(socd::SOCD_2IP_NO_REAC, { .crouch_walk_os = false })
คุณจะต้องเปลี่ยนแปลงสิ่งนี้ใน config/<environment>/config.cpp
ของคุณเพื่อที่จะนำไปใช้กับปลั๊กอิน เนื่องจาก mode_selection.hpp
จะควบคุมเฉพาะสิ่งที่เกิดขึ้นเมื่อคุณ เปลี่ยน โหมดเท่านั้น
โหมด ProjectM มีตัวเลือกพิเศษเพื่อกำหนดค่าการทำงานบางอย่าง เท่าที่เห็นใน config/mode_selection.hpp
:
new ProjectM(
socd::SOCD_2IP_NO_REAC,
{ .true_z_press = false, .ledgedash_max_jump_traj = true }
)
ประการแรก ตัวเลือก ledgedash_max_jump_traj
ช่วยให้คุณสามารถเปิดหรือปิดใช้งานพฤติกรรมที่ยืมมาจากโหมดประชิดโดยที่การกดซ้ายและขวา (และไม่มีทิศทางในแนวตั้ง) จะให้ค่าคาร์ดินัล 1.0 โดยไม่คำนึงถึงตัวปรับแต่งที่ถืออยู่
หากคุณเปลี่ยนโหมด SOCD เป็น 2IP (พร้อมการเปิดใช้งานใหม่) คุณควรเปลี่ยนตัวเลือกนี้เป็น false หากคุณต้องการประสบการณ์การเล่นเกมที่ราบรื่น
ประการที่สอง ตัวเลือก true_z_press
มีอยู่เนื่องจาก Project M/Project+ ไม่รองรับการกด Z แบบเดียวกับที่ Melee ทำ Melee ตีความการกด Z เป็น lightshield + A ดังนั้นจึงสามารถใช้สำหรับการยกเลิก L โดยไม่ทำให้คุณขาดเทคโนโลยี ใน PM/P+ การกด Z จะกระตุ้นเทคโนโลยีและทำให้เกิดการล็อคเทคโนโลยีที่ไม่พึงประสงค์หากใช้เพื่อยกเลิก L ตามค่าเริ่มต้นใน HayBox โหมด ProjectM จะถูกตั้งค่าให้ใช้มาโครของ lightshield + A เพื่อรักษาพฤติกรรมที่คาดหวังจากการโจมตีระยะประชิด อย่างไรก็ตาม มาโครนี้ไม่อนุญาตให้คุณใช้การโจมตีแบบโยง/การต่อสู้ หรือการจับสิ่งของ เพื่อแก้ไขปัญหานี้ คุณสามารถกด Mod X + Z เพื่อส่งข้อมูล Z จริงได้
หากสิ่งนี้รบกวนจิตใจคุณ และคุณเพียงต้องการส่งข้อมูลอินพุต Z จริงตามค่าเริ่มต้นเมื่อกด Z คุณสามารถตั้งค่าตัวเลือก true_z_press
เป็นจริงได้
HayBox รองรับแหล่งอินพุตหลายแหล่งที่สามารถอ่านได้เพื่ออัปเดตสถานะอินพุต:
GpioButtonInput
- ใช้กันมากที่สุดสำหรับการอ่านสวิตช์/ปุ่มที่เชื่อมต่อโดยตรงกับพิน GPIO การแมปอินพุตถูกกำหนดโดยอาร์เรย์ของ GpioButtonMapping
ดังที่เห็นได้ในการกำหนดค่าที่มีอยู่เกือบทั้งหมดSwitchMatrixInput
- คล้ายกับข้างต้น แต่จะสแกนเมทริกซ์สวิตช์สไตล์แป้นพิมพ์แทนสวิตช์แต่ละตัว การกำหนดค่าสำหรับรุ่น C<=53 ของ Crane รวมอยู่ใน config/c53/config.cpp
ซึ่งทำหน้าที่เป็นตัวอย่างวิธีกำหนดและใช้แหล่งอินพุตเมทริกซ์สวิตช์NunchukInput
- อ่านอินพุตจาก Wii Nunchuk โดยใช้ i2c สามารถใช้กับตัวควบคุมอินพุตแบบผสมได้ (เช่น มือซ้ายใช้ Nunchuk สำหรับการเคลื่อนไหว และมือขวาใช้ปุ่มสำหรับการควบคุมอื่นๆ)GamecubeControllerInput
- คล้ายกับด้านบน แต่อ่านจากคอนโทรลเลอร์ GameCube สามารถสร้างอินสแตนซ์ได้คล้ายกับ GamecubeBackend ปัจจุบันมีการใช้งานสำหรับ Pico เท่านั้น และคุณต้องรันบนอินสแตนซ์ pio อื่น (pio0 หรือ pio1) มากกว่าอินสแตนซ์ใดๆ ของ GamecubeBackend หรือตรวจสอบให้แน่ใจว่าทั้งคู่ใช้ออฟเซ็ตหน่วยความจำคำสั่ง PIO เดียวกัน แหล่งอินพุตแต่ละแหล่งมีค่า "ความเร็วในการสแกน" ซึ่งระบุโดยประมาณว่าต้องใช้เวลานานเท่าใดในการอ่านอินพุต แหล่งอินพุตที่รวดเร็วจะถูกอ่านในช่วงเวลาสุดท้ายที่เป็นไปได้เสมอ (อย่างน้อยบน Pico) ส่งผลให้เวลาแฝงต่ำมาก ในทางกลับกัน โดยทั่วไปแหล่งอินพุตที่ช้ามักจะอ่านค่อนข้างนานก่อนที่จะจำเป็น เนื่องจากช้าเกินไปที่จะอ่านเพื่อตอบสนองต่อการสำรวจความคิดเห็น ด้วยเหตุนี้ จึงเหมาะกว่าที่จะอ่านอินพุตเหล่านั้นบนคอร์ที่แยกจากกันอย่างต่อเนื่อง สิ่งนี้เป็นไปไม่ได้บน AVR MCU เนื่องจากเป็นแกนเดี่ยวทั้งหมด แต่เป็นไปได้ (และง่ายดาย) บน Pico/RP2040 ด้านล่างของ Pico config config/pico/config.cpp
เริ่มต้นจะแสดงสิ่งนี้โดยใช้ core1 เพื่ออ่านอินพุต Nunchuk ในขณะที่ core0 จัดการอย่างอื่นทั้งหมด ดูส่วนถัดไปสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ core1
ในฟังก์ชัน setup()
ของการกำหนดค่าแต่ละรายการ เราจะสร้างอาร์เรย์ของแหล่งอินพุต จากนั้นส่งต่อไปยังแบ็กเอนด์การสื่อสาร แบ็กเอนด์การสื่อสารจะตัดสินใจว่าเมื่อใดที่จะอ่านแหล่งอินพุตใด เนื่องจากอินพุตจำเป็นต้องอ่าน ณ จุดต่างๆ ในเวลาสำหรับแบ็กเอนด์ที่ต่างกัน นอกจากนี้เรายังสร้างอาร์เรย์ของแบ็กเอนด์การสื่อสาร ซึ่งช่วยให้สามารถใช้แบ็กเอนด์ได้มากกว่าหนึ่งรายการในคราวเดียว ตัวอย่างเช่น ในการกำหนดค่าส่วนใหญ่ แบ็กเอนด์ตัวดูอินพุต B0XX จะถูกใช้เป็นแบ็กเอนด์รองทุกครั้งที่ใช้แบ็กเอนด์ DInput ในการวนซ้ำแต่ละครั้ง ลูปหลักจะบอกแบ็กเอนด์แต่ละส่วนให้ส่งรายงานตามลำดับ ในอนาคต อาจมีแบ็กเอนด์เพิ่มเติมสำหรับสิ่งต่างๆ เช่น การเขียนข้อมูลไปยังจอแสดงผล OLED
ในแต่ละการกำหนดค่า จะมีฟังก์ชัน setup()
และ loop()
โดยที่ setup()
จะทำงานก่อน จากนั้น loop()
จะทำงานซ้ำๆ จนกระทั่งอุปกรณ์ปิดอยู่
บน Pico/RP2040 ฟังก์ชัน setup()
และ loop()
จะดำเนินการบน core0 และคุณสามารถเพิ่มฟังก์ชัน setup1()
และ loop1()
เพื่อรันงานบน core1
ตัวอย่างเช่น หากต้องการอ่านอินพุตคอนโทรลเลอร์ GameCube บน core1:
GamecubeControllerInput *gcc = nullptr;
void setup1() {
while (backends == nullptr) {
tight_loop_contents();
}
gcc = new GamecubeControllerInput(gcc_pin, 2500, pio1);
}
void loop1() {
if (backends != nullptr) {
gcc->UpdateInputs(backends[0]->GetInputs());
}
}
while
loop ทำให้แน่ใจว่าเรารอจนกว่า setup()
บน core0 จะเสร็จสิ้นการตั้งค่าแบ็กเอนด์การสื่อสาร จากนั้นเราจะสร้างแหล่งอินพุตคอนโทรลเลอร์ GameCube ด้วยอัตราการโพลที่ 2500Hz นอกจากนี้เรายังรันบน pio1
ซึ่งเป็นวิธีที่ง่ายในการหลีกเลี่ยงการรบกวนแบ็กเอนด์ GameCube/N64 ซึ่งใช้ pio0
เว้นแต่จะระบุไว้เป็นอย่างอื่น ใน loop1()
เราตั้งสมมติฐานว่าแบ็กเอนด์หลักเป็นองค์ประกอบแรกของอาร์เรย์ backends
(ซึ่งมีการกำหนดค่าในไฟล์เดียวกันอยู่แล้ว ดังนั้นเราจึงไม่ได้คาดเดาสิ่งที่เราไม่รู้อย่างแท้จริง) และสแกนคอนโทรลเลอร์ GameCube โดยตรง อินพุตเข้าสู่สถานะอินพุตของแบ็กเอนด์
จากตัวอย่างสมมุติฐานที่บ้ากว่าเล็กน้อย เราสามารถขับเคลื่อนการควบคุมทั้งหมดสำหรับตู้อาร์เคดสำหรับสองคนโดยใช้ Pico ตัวเดียวโดยการสร้างแหล่งอินพุตเมทริกซ์สวิตช์สองตัวโดยใช้พินแต่ละตัวละ 10 พิน และแบ็กเอนด์ GameCube สองตัว ทั้งคู่อยู่บนคอร์ที่แยกจากกัน ความเป็นไปได้ไม่มีที่สิ้นสุด
หากคุณใช้อะแดปเตอร์อย่างเป็นทางการกับคอนโทรลเลอร์ที่ใช้ Arduino คุณจะต้องกด A บนปลั๊กอินซึ่งจะปิดใช้งานการปรับเวลาแฝงในการโพลให้เหมาะสมโดยส่งอัตราการโพลเป็น 0 ไปยังตัวสร้าง GamecubeBackend
หากคุณใช้คอนโทรลเลอร์ที่ใช้ Arduino โดยไม่มีวงจรบูสต์ คุณจะต้องใช้ไฟ 5V ดังนั้นสำหรับอะแดปเตอร์ Mayflash คุณต้องเสียบสาย USB ทั้งสองเส้น และสายดังก้องบนคอนโซลจะต้องไม่เสียหาย Pico ทำงานได้ตามปกติโดยใช้ไฟ 3.3V ดังนั้นจึงไม่ใช่ปัญหา
ฉันยินดีรับการมีส่วนร่วม และหากคุณสร้างโหมดอินพุตที่คุณต้องการแบ่งปัน อย่าลังเลที่จะส่งคำขอ โปรดติดตั้งปลั๊กอินรูปแบบเสียงดังกราวสำหรับ VS Code และใช้เพื่อจัดรูปแบบโค้ดที่คุณต้องการเพิ่ม
เราใช้ SemVer สำหรับการกำหนดเวอร์ชัน สำหรับเวอร์ชันที่มี โปรดดูแท็กบนที่เก็บนี้
ดูรายชื่อผู้ร่วมให้ข้อมูลที่เข้าร่วมโครงการนี้ด้วย
โครงการนี้ได้รับอนุญาตภายใต้ GNU GPL เวอร์ชัน 3 - ดูรายละเอียดในไฟล์ใบอนุญาต