これは何?
IronPython+PTVS(Python Tools for Visual Studio)+MonoGame(XNAライクなライブラリ)を使ってVS2012でゲームを作ろうとしたらIntellisenseが効かなくて悩んだ話。多分MonoGameに限らずPTVSとdllの連携でIntellisenseが効かないという話に対応すると思う。
どうするの?
とりあえずIronPythonとPTVSが入っていればIronPythonのアプリケーションが作れるはずなので、それを作る。
本題ではないけれど、とりあえずWindowsアプリということで、ソリューションエクスプローラの中でプロジェクトを右クリックして、プロパティを開く。GeneralタブのWindowsApplicationにチェックを入れて、InterpreterをIronPythonにしておく。
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ファイル感が好きです。