Làm cách nào để giao tiếp với thành phần IronPython trong trò chơi C # / XNA?


8

Trò chơi XNA của tôi là định hướng thành phần và có nhiều thành phần khác nhau cho vị trí, biểu diễn vật lý, kết xuất, v.v., tất cả đều mở rộng một Componentlớp cơ sở . Người chơi và kẻ thù cũng có bộ điều khiển hiện được xác định trong C #. Tôi muốn biến chúng thành các tập lệnh Python thông qua IronPython (một triển khai .NET của Python). Vấn đề của tôi là tôi không chắc làm thế nào để tương tác với các tập lệnh đó.

Các ví dụ trong Nhúng IronPython trong Ứng dụng C # đề nghị tôi phải tạo một cái gì đó giống như thành phần Script để biên dịch tập lệnh Python và gọi phương thức Cập nhật của bộ điều khiển thông qua Python - về cơ bản, nó sẽ là lớp trình bao bọc cho C # để giao tiếp với Python .

Tôi cảm thấy rằng tôi đang thiếu một cái gì đó trong nghiên cứu của tôi. Có phải là một cách để tải lên một kịch bản, tạo một đối tượng Python (hoặc trong kịch bản Python hoặc C #) và sau đó thì có một trực tiếp tham chiếu đến đối tượng Python trong C # mã của tôi.

Có cách nào để làm việc trực tiếp với một đối tượng IronPython , hoặc là một trình bao bọc cần thiết?

Câu trả lời:


7

Tôi đã tìm ra cách để làm điều này. Như tôi dự đoán, vì IronPython biên dịch thành CLR, các đối tượng C # và IronPython có thể tương tác với nhau tốt mà không cần điều trị đặc biệt. Tôi đã tạo một tập lệnh thực sự tạo ra một loại Thành phần mới có thể được tham chiếu tốt từ C #.

Một từ ngắn gọn về cấu trúc trò chơi của tôi: Giải pháp của nó có hai dự án: Game và GameEngine. Trò chơi là thứ cuối cùng được biên dịch thành EXE và GameEngine được biên dịch thành một DLL nằm trong cùng thư mục.

Kịch bản

Điều này hiện đang nằm trong dự án nội dung mặc định, không có hành động xây dựng và được sao chép vào thư mục đầu ra.

Lưu ý rằng lớp Thành phần là một phần của GameEngine và do đó được biên dịch thành GameEngine.dll . Nó cũng không liên quan gì đến lớp GameComponent của XNA và các phương thức của nó không cần phải thông qua một đối tượng GameTime.

import clr
clr.AddReferenceToFileAndPath("GameEngine.dll")
from GameEngine import *
# or: from GameEngine import Component

class PyComponent(Component):
    def __new__(self):
        Component.__new__(self)

    def Initialize(self):
        pass

    def Update(self):
        pass

    def Draw(self):
        pass

pc = PyComponent()

Kịch bản được biên dịch và chạy như thế nào

Chỉ một lần trong trò chơi, tôi chạy nó:

// Engine setup stuff. The scope can work with variables in the script by
// adding references, accessing/removing current references, etc.
// Each script COULD have its own scope but I have no reason to do that yet.
ScriptEngine PythonEngine = Python.CreateEngine();
ScriptScope DefaultScope = PythonEngine.CreateScope();

string filename = @"Content\ScriptTest.py";
ScriptSource script = PythonEngine.CreateScriptSourceFromFile(filename, Encoding.ASCII);
script.Execute(scope);

Khi tập lệnh được thực thi, nó tạo ra một thể hiện riêng của PyComponent.

Tất nhiên, bạn sẽ cần tham khảo thư viện IronPython và thời gian chạy Microsoft Dynamic. Tôi đã tìm thấy tôi chỉ cần bốn DLL này từ thư mục gốc của bản tải xuống IronPython:

  • IronPython.dll
  • IronPython.Modules.dll
  • Microsoft.Docate.dll
  • Microsoft.Scripting.dll

Thêm các tham chiếu này vào dự án của bạn, sau đó các usingcâu lệnh này vào mã của bạn (theo Nhúng IronPython trong Ứng dụng C # ):

using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;

Lấy tham chiếu đến đối tượng Python

Tôi không chắc chắn làm thế nào tôi có được một tài liệu tham khảo trực tiếp từ kịch bản, nhưng tôi có cách làm việc đó. Trong thiết kế động cơ của tôi, tất cả các thành phần sẽ tự động đăng ký với bộ sưu tập thành phần của động cơ, vì vậy tôi có thể có được một tham chiếu đến đối tượng thông qua đó. Trong một trường hợp cụ thể hơn, bạn có thể có các đối tượng Python mới tự đăng ký với một hàng đợi ở đâu đó, vì vậy bạn tạo chúng và sau đó lấy chúng ngay lập tức.


Bản cập nhật cuối cùng của tôi cho bài đăng này sẽ là khi tôi tìm ra cách trực tiếp có được một tham chiếu đến đối tượng python.
doppelgreener
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.