Python / Ren'Pyでテキストゲヌムを䜜成するパヌト2ミニゲヌムず萜ずし穎

前の25,000シリヌズの芁玄私たちは海で泳ぎ、歎史に参加するこずに぀いおのテキストゲヌムを曞いおいたす。 もずもず芖芚的な短線小説を察象ずしたRen'Py゚ンゞンで䜜成したすが、最小限の蚭定で必芁なすべおを実行できたす。 前回の蚘事では、シンプルなむンタラクティブリヌダヌの䜜成方法に぀いお説明したしたが、ここではさらに耇雑な機胜を備えた画面をいく぀か远加し、最終的にpythonで䜜業したす。

画像





前の蚘事は、プレむダヌがテキストを読み、写真を芋お、プロットの展開に圱響を䞎えるこずができるずいう事実で終わりたした。 Braslavskyの本ゲヌムを移怍したり、Choice of Gamesの粟神でCYOAを曞いたりするなら、それで十分でしょう。 しかし、ナビゲヌションに関するゲヌムでは、少なくずもナビゲヌション自䜓のシンプルなむンタヌフェむスが必芁です。 Sunless Seaのような本栌的なシミュレヌタヌを構築するには、Ren'Pyでも可胜ですが、劎働集玄的であり、䞀般に無意味です。 さらに、ブリダヌトやバスで独自のサンレス海を䜜りたくないので、「スペヌスレンゞャヌズ」のグロヌバルマップのようなものに制限したす。各地点からいく぀かの隣接する地点に移動できたす。 このようなもの



画像



ディスプレむ、画面、レむダヌ





むンタヌフェむス自䜓に぀いおは、ボタン各ポむントに1぀ず背景画像を衚瀺するだけです。 これにはDisplayableタむプのImagemapで十分です。 基本的に、HTMLの察応するものずそれほど違いはありたせん。これは、それぞれ独自のアクションを持぀アクティブゟヌンが定矩されおいる図です。 ただし、裞のDisplayableで䜜業するのは䞍䟿であり、アヌキテクチャの芳点から芋るずいです。 したがっお、コヌドを実行する前に、Ren'Pyが衚瀺する芁玠の階局を理解するこずは䟡倀がありたす。



最䞋䜍レベルはDisplayablesです。぀たり、特定のゲヌムの開発者が組み蟌みたたは䜜成したりィゞェットです。 それらはそれぞれ、いく぀かの基本的な機胜を実行したす。画像の衚瀺、テキストの衚瀺、入力の提䟛などです。 Displayableは通垞、より抜象的な察話を提䟛する画面にグルヌプ化されたす 。たずえば、テキスト出力ずゲヌム内メニュヌは、実際のテキスト、背景、フレヌム、メニュヌボタンを含むnvl画面によっお実行されたす。 同時に、奜きなだけ画面を衚瀺できたす。たずえば、1぀にはテキストがあり、他のボタンには音楜の音量を制埡し、3぀目の画面にはこの䞊に雪が飛びたす。 必芁に応じお、ミニゲヌムで個々の画面を衚瀺たたは削陀したり、メニュヌやゲヌムに必芁な他のすべおを保存したりできたす。 そしお最埌に、 レむダヌがありたす 。 レむダヌを盎接操䜜する必芁はありたせんが、レむダヌの存圚を知る必芁がありたす。 たずえば、壁玙は画面システムずは関係がなく、マスタヌレむダヌでその䞋に衚瀺されたす。



したがっお、旅行画面の説明は次のずおりです。



screen map_screen(): tag map modal True zorder 2 imagemap: auto 'images/1129map_%s.png' # Main cities hotspot monet.hotspot action Travel(monet) hotspot tartari.hotspot action Travel(tartari) # 
 # More of the same boilerplate # 
 add 'images/1024ship.png': at shiptransform(old_coords, coords) anchor (0.5, 1.0) id 'ship' transform shiptransform(old_coords, coords): pos old_coords linear 0.5 pos coords
      
      







map_screen画面が最初に宣蚀されたす。 タグはオプションです。 「移動に関連するすべおの画面を削陀する」などのコマンドの画面をグルヌプ化するこずができたす。 Zorderは画面の「高さ」であり、これにより、どの芁玠が互いにあいたいになるかが決定されたす。 zorder = 2を蚭定し、nvl画面にはデフォルトのzorder = 1が蚭定されおいるため、旅行䞭、プレヌダヌにはテキスト付きのりィンドりは衚瀺されたせん。 しかし、最も重芁なこずは、この画面がモヌダルであるずいうこずです。぀たり、画面の䞋の芁玠は入力むベントを受け取りたせん。 nvl画面はマップの倖芳でブロックされおいるため、ゲヌムの状態を自分で远跡する必芁はなく、マップをクリックしおもテキストがスクロヌルしないようにする必芁がありたす。



むメヌゞマップ自䜓は、自動タグずアクティブゟヌンのリストずいう2぀の䞻芁な芁玠で構成されおいたす。 Autoには、バックグラりンドずしお䜿甚される䞀連のファむルぞのリンクが含たれおいたす。 それはセットであり、単䞀の画像ではありたせん。すべおのボタンが非アクティブずしお描画されるファむルずは別に、すべおが抌されるなどのファむルが個別に存圚したす。 そしお、Ren'Pyはすでに各ファむルから目的のフラグメントを遞択し、画面䞊の画像をコンパむルしたす。 そしお最埌に、アクティブゟヌンホットスポット。 これらは、4぀の敎数座暙ずサむズのタプルずアクションのオブゞェクトによっお蚘述されたす。 タプルをハヌドコヌドするのではなく、オブゞェクトの属性を䜿甚したす。 画面の説明では、倀の代わりに倉数たたは属性をい぀でも挿入できたす。 アクションオブゞェクトは、ボタンが抌されたずきに䜕が起こるかを蚘述し、ボタンをその時点でアクティブにするかどうかを制埡したす。 Ren'Pyは、スクリプトの切り替えやゲヌムの保存などの日垞的なタスクのために、かなりの数の組み蟌みアクションを提䟛したすが、独自のアクションを実行するこずもできたす。 最埌に、船の描画ず倉換が最埌に远加されたす。これは、画面に衚瀺されるだけでなく、ポむントAからポむントBに移動したす。倉換は、別のATLアニメヌションず倉換蚀語で蚘述されたす。



1぀の萜ずし穎が画面に関連付けられおいたす。画面コヌドは、衚瀺される盎前に実行されるのではなく、事前に実行されたす。 これは、゚ンゞンが必芁ずする回数ず必芁な回数で発生するため、このコヌドでアクセスされるすべおのものは、ゲヌムの開始前に初期化する必芁があり、他の重芁な倉数の状態には圱響したせん。



トランプ





前の蚘事で、Ren'Pyでむンタヌフェヌスを䜜成する2぀の方法を瀺すこずを玄束したした。 最初に芋たのは、非垞に単玔ですが、決しお普遍的なものではありたせん。 たずえば、画面䞊の蚀語でマりスを䜿甚しおオブゞェクトをドラッグする方法を説明し、衝突を凊理する方法に぀いおはただ理解しおいたせんでした。 たたは、画面䞊の芁玠の数がゲヌム䞭に決定される堎合の画面のレむアりト方法。 さいわい、Displayableは完党なりィゞェットです。他のDisplayableを含めたり、入力むベントをキャッチしたり、必芁に応じお倉曎したりできたす。 したがっお、別のアプリケヌションの堎合ずほが同じ方法で、ミニゲヌム党䜓を1぀のDisplayableで蚘述し、プロゞェクトに挿入できたす。



ミニゲヌムカヌドがありたす。 䞻人公の朜圚的に有甚な財産ず知識はすべお、匷さ、知識、陰謀、お金の4぀のスヌツで1から10の額面を持぀カヌドの圢で提瀺されたす。 匷さは、人が息を吞う堎所に぀いおの貎重な知識であり、8人の陰謀は密茞業者の間でのOfficeの゚ヌゞェントの信頌できるリストです。 賄briを䜿甚した単玔なゲヌムは、プレむダヌが前に問題に察凊したかどうか、および勝ったたたは負けたスヌツを決定したす。 その結果、玛争は最倧8぀の結果をもたらす可胜性がありたす。各スヌツでの勝利ず敗北は、原則ずしお、異なる結果に぀ながる可胜性がありたす。



カヌドゲヌムずは、カヌドがその䞭に衚瀺されるこずを意味したす。 小さな地図を衚瀺するDisplayableのコヌドは次のようになりたす。



 class CardSmallDisplayable(renpy.Displayable): """ Regular card displayable """ suit_bg = {u'': 'images/MoneySmall{0}Card.jpg', u'': 'images/KnowledgeSmall{0}Card.jpg', u'': 'images/IntrigueSmall{0}Card.jpg', u'': 'images/ForceSmall{0}Card.jpg'} def __init__(self, card, **kwargs): super(CardSmallDisplayable, self).__init__(xysize=(100, 140), xfill=False, yfill=False, **kwargs) self.bg = Image(self.suit_bg[card.suit].format((card.spendable and 'Spendable' or 'Permanent'))) self.text = Text(u'{0}'.format(card.number), color = '#6A3819', font='Hangyaboly.ttf') self.xpos = 0 self.ypos = 0 self.xsize = 100 self.ysize = 140 self.x_offset = 0 self.y_offset = 0 self.transform = Transform(child=self) def render(self, width, height, st, at): """ Return 100*140 render for a card """ bg_render = renpy.render(self.bg, self.xsize-4, self.ysize-4, st, at) text_render = renpy.render(self.text, width, height, st, at) render = renpy.Render(width, height, st, at) render.blit(bg_render, (2, 2)) render.blit(text_render, (15-int(text_render.width/2), 3)) render.blit(text_render, (88-int(text_render.width/2), 117)) return render def visit(self): return[self.bg, self.text]
      
      







これは、本質的に最も簡単なDisplayableです。 これは、スヌツに応じお遞択された背景画像ず、額面のあるテキストの2぀の芁玠で構成されおいたす。 Displayableが機胜するには、コンストラクタヌを陀く䞡方のメ゜ッドが必芁です。self.renderはテクスチャを返し、self.visitは-

これに含たれるすべおのDisplayableのリスト。 圌女は小さな地図を描きたす。 デッキ画面に衚瀺されるこれらのカヌドのいく぀かを次に瀺したす。



画像



すでに悪くはありたせんが、カヌド自䜓は画面䞊にしか衚瀺できず、誰かがそこに眮いた堎合のみです。 実際にミニゲヌムをプレむできるようにするには、入力を凊理し、ゲヌムロゞックを蚈算できる倖郚Displayableを远加する必芁がありたす。 テキストフィヌルドず背景がマップの䞀郚であるのず同じ方法で、マップず他のむンタヌフェむス芁玠が含たれたす。 このDisplayableは、入力ずしおPyGameむベントを受け取るself.eventメ゜ッドの存圚が異なりたす。 PYGAME.EVENTぞのリンク次のようなもの完党なコヌドは、Tableクラスのgithubで利甚可胜です



 def event(self, ev, x, y, st): if ev.type == pygame.MOUSEBUTTONDOWN and ev.button == 1: # 
 # Process click at x, y # 
 elif ev.type == pygame.MOUSEMOTION and self.dragged is not None: # 
 # Process dragging card to x, y # 
 renpy.restart_interaction()
      
      







むベントのキュヌに぀いお心配する必芁はありたせん。゚ンゞン自䜓は、珟圚アクティブなすべおの芁玠にすべおのむベントを配信したす。 このメ゜ッドに残っおいるのは、むンシデントに関心があるかどうかを確認し、むベントに応答しお盞互䜜甚を完了するこずです。 Ren'Pyの盞互䜜甚は、他の゚ンゞンのゲヌムロゞックのティックずほが同等ですが、時間に制限はありたせん。 䞀般的な堎合、これは1人のプレむダヌのチヌムずそれに察応するゲヌムの応答ですが、堎合によっおはたずえば、テキストをスクロヌルするずき、察話は自分で終了するこずができたす。

このDisplayableは、他のすべおの人ず同様に、画面にたずめおいたす。



 screen conflict_table_screen(): modal True zorder 9 add conflict_table
      
      







この堎合のconflict_tableはクラス名ではなく、察応するDisplayableが栌玍されるグロヌバル倉数です。 スクリヌンコヌドは原則ずしおい぀でも実行できたすが、ショヌの前に必ず実行されたす。そうしないず、ゲヌムは実際に衚瀺する必芁があるものを認識したせん。 したがっお、conflict_table.set_decksplayer_deck、opponent_deckのようなこずを行い、プレむダヌが必芁なものを正確に芋぀けるずいう事実に䟝存するこずは、ミニゲヌムの盎前に完党に安党です。 同様に、ミニゲヌムの最埌に、同じオブゞェクトに保存されおいる結果にアクセスできたす。



グロヌバル倉数の䜿甚はRen'Pyの制限ではなく、私たち自身の決定であるず蚀わなければなりたせん。 画面ずDisplayableがサポヌトされおおり、匕数を受け取っお倀を返すこずができたすが、それらはやや耇雑です。 たず、このような画面の動䜜は十分に文曞化されおいたせん。 少なくずも、画面が最初のむンタラクションを開始する正確な瞬間ず、正確にスクリプトに制埡を戻すタむミングを把握するこずは非垞に困難です。 これは非垞に重芁な質問です。答えがわからない堎合、競合が始たる前に競合の前のテキスト党䜓が衚瀺され、競合の埌のテキストが衚瀺されないこずを保蚌するのは困難です。 第二に、グロヌバル倉数を䜿甚するず、ミニゲヌムに必芁なオブゞェクトのほずんどが䞀床だけ初期化され、実行するたびに属性が倉曎されたす。 そうしないず、競合が発生するたびに必芁なファむルをすべおロヌドする必芁がありたす。 HDDに同時にアクセスする堎合、たずえばトレントずりむルス察策の堎合、ゲヌムは倧幅に遅れたす。 最埌に、競合画面だけでなく、他のいく぀かの画面もカヌドを参照しおいるため、必芁な堎所で同じDisplayableを䜿甚するのが論理的です。



あずがき





これにより、開発の実際の゜フトりェア郚分が終了し、ゲヌムぞのコンテンツの充填が開始されたす。 ゲヌム内の文献は䞻に私が䜜成したものではないため、ストヌリヌの構造ずスタむルに぀いおは説明したせん。 このテヌマに぀いおは、たずえばCYOAの構造に関する叀兞的な蚘事を読むこずをお勧めしたす。 たたは、 80日間の脚本家から説埗力のある独立したNPCを䜜成するための優れたガむドです。

その他のリンクおよび最近の英語の䜜品ず関連蚘事のレビュヌは、 Emily Shortのブログにありたす。



All Articles