我正在用C++(SFML 2.0)開發我的第一款遊戲,我正在儘可能地做到這一點。經過一段代碼擺弄之後,我將把它轉換爲面向對象的代碼,但運動讓我思考。遊戲編程最佳實踐,課內外動作?
我在考慮將sf::Event
傳遞給更新函數來讀取按鈕按下並在課堂上進行移動。但我不確定這是一個明智的舉動。代碼將是乾淨的,但我記得在某個地方閱讀某些按鈕按鈕不應該在課堂內完成的地方。事情是,我不知道爲什麼,如果它是真的。
有沒有人可以給我一些提示呢?
我正在用C++(SFML 2.0)開發我的第一款遊戲,我正在儘可能地做到這一點。經過一段代碼擺弄之後,我將把它轉換爲面向對象的代碼,但運動讓我思考。遊戲編程最佳實踐,課內外動作?
我在考慮將sf::Event
傳遞給更新函數來讀取按鈕按下並在課堂上進行移動。但我不確定這是一個明智的舉動。代碼將是乾淨的,但我記得在某個地方閱讀某些按鈕按鈕不應該在課堂內完成的地方。事情是,我不知道爲什麼,如果它是真的。
有沒有人可以給我一些提示呢?
你的問題有點寬泛,但這裏有一個提示,我認爲人們會很難不同意。獨立的輸入設備(鍵盤,鼠標等)不受操作的影響。你的遊戲對象不應該回應,也不應該知道鍵盤上的左鍵。相反,他們應該回應,例如,「走出去」命令。在單獨的代碼中(可能是一個ObjectController類),您將Left鍵綁定到「Go Left」命令。這使得控件更具可配置性,因爲您可以輕鬆地綁定A
鍵或左側操縱桿按鈕。或者,您可以通過插入發出「Go Left」命令的AI來將玩家控制的對象切換到計算機控制的對象。
是的,正如Benjamin Lindley所說的那樣,最明智的選擇是將輸入存儲在一個容器中(爲鍵輸入隊列,列表或布爾映射),然後在遊戲邏輯中根據輸入調用你的對象更新方法。 短SFML爲例:
sf::Clock timer; sf::Event Event; bool isRunning = true; while (isRunning) { Window.clear(sf::Color(255, 255, 255)); while (Window.pollEvent(Event)) { switch(Event.type) { case sf::Event::Closed: isRunning = false; break; case sf::Event::KeyPressed: if (Event.key.code == sf::Keyboard::Up) keys[WK] = true; [...] case sf::Event::KeyReleased: if (Event.key.code == sf::Keyboard::Up) keys[WK] = false; [...] } } if (keys[WK]) MyCharacter.move(0, -100 * timer.getElapsedTime().asSeconds()); Window.draw(MyCharacter); Window.display(); timer.restart(); }
這是我如何處理在一場比賽中我取得了輸入的爲例。 「keys」是一個布爾數組,我根據它們是否被按下來將不同的鍵設置爲true或false。然後事件輪詢和密鑰更新完成後,我有我的遊戲邏輯(這裏我刪除了所有行,以簡化示例)。請記住使用計時器來保持一個不變的遊戲玩法。 希望這可以幫助你。
謝謝,我將它與我的代碼進行比較,看看我能否改進任何內容,謝謝代碼! – Gideon 2013-05-13 07:23:12
你需要解釋好得多。有這麼多不同的設計模式,您的問題在這裏是無法解析的。如果我說「這樣做」,我會收到垃圾郵件的人說這是錯誤的。給我們一些東西,告訴我們更多,也許有一些代碼,以便我們可以幫助你在你的具體情況。 – CharlesW 2013-05-12 13:58:43
您可以安全地處理任何* X不應在班級建議內完成。類(和一般的OOP)提供了一種特定的方式讓你組織你的邏輯並允許編譯器執行一些你自己的組織規則。這本身並不是一件壞事。 – 2013-05-12 14:07:57
@CharlesW是的,我嘗試了一些代碼,但我正在將它轉換爲OOP代碼,所以這是一個巨大的混亂。 – Gideon 2013-05-12 14:30:18