IronPython+PTVS+MonoGameでの環境構築(主にIntellisense)

これは何?

IronPython+PTVS(Python Tools for Visual Studio)+MonoGame(XNAライクなライブラリ)を使ってVS2012でゲームを作ろうとしたらIntellisenseが効かなくて悩んだ話。多分MonoGameに限らずPTVSとdllの連携でIntellisenseが効かないという話に対応すると思う。

どうするの?

とりあえずIronPythonとPTVSが入っていればIronPythonのアプリケーションが作れるはずなので、それを作る。

本題ではないけれど、とりあえずWindowsアプリということで、ソリューションエクスプローラの中でプロジェクトを右クリックして、プロパティを開く。GeneralタブのWindowsApplicationにチェックを入れて、InterpreterIronPythonにしておく。

dllの読みこみは

clr.AddReferenceToFile("MonoGame.Framework.dll")

みたいにやるわけだけど、これだけだとIntellisenseが効かなくて、

import Microsoft.

まで打っても「xna」を補ってくれないので、これが問題になっていた。ちなみにこのとき、IronPython Console(VSやPTVSとは無関係)で補完が効くのは確認していたので、VSかPTVSで問題がおきていることは分かっていた。

結局、先のプロパティページのDebugのSearch Pathのところにdllの在処(私の場合「C:\Program Files (x86)\MonoGame\v3.0\Assemblies\WindowsGL」)を入れて、保存すると、コード中で補完してくれるようになった。DebugのところとIntellisenseが関係あるとは思わなかったので全然思い付かなかったが、PTVSもオープンソースなのだしコードを読む習慣があればもっと早く解決していたのかもしれない。

結局MonoGame+IronPythonのコードがどんな感じになったか。

後述の参考の「MonoGame w/ IronPython Example - doesn't work?」を参考に。

import sys
import os
sys.path.append(os.getcwd() + '\\lib')
 
import clr
clr.AddReferenceToFile("MonoGame.Framework.dll")

from Microsoft.Xna.Framework import *
from Microsoft.Xna.Framework.Graphics import *
from Microsoft.Xna.Framework.Content import *
from Microsoft.Xna.Framework.Storage import *
from Microsoft.Xna.Framework.Input import *

 
class App(Game):
    def __init__(self):
        self.graphics = GraphicsDeviceManager(self)
        RootDirectory = "Content"
 
    def Initialize(self):
        super(App, self).Initialize()
 
    def LoadContent(self):
        self.spriteBatch = SpriteBatch(self.GraphicsDevice)
 
    #TODO: use this.Content to load your game content here
    def Update(self, gameTime):
        if GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed or \
            Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Escape):
            self.Exit()

        super(App, self).Update(gameTime)
 
    def Draw(self, gameTime):
        self.graphics.GraphicsDevice.Clear(Color.CornflowerBlue)

        super(App, self).Draw(gameTime)
 
game = App()
game.Run()

これで無地の青画面が出る。この1ファイル感が好きです。