PythonでCocos2dを使用してゲームを開発する

画像

はじめに


Objective-CでのCocos2dの実装は、iPhone用ゲームの開発に広く使用されています。 公式ウェブサイトによると、このエンジンでのゲーム数はすでに1800を超えています。彼はHabréで複数回言及されました。 他のポート(C ++のcocos2d-xおよびJavaのcocos2d-android)も知られており、人気が高まっています。 ただし、これらのエンジンの先駆者である元のCocos2dは、当然のことながら無視されました。 このギャップを埋めようとします。

Cocos2dは、 pygletライブラリを使用してPythonで記述されています。 Pythonの使用とシンプルなアーキテクチャにより、クロスプラットフォームであり、ゲームコンセプトの迅速なプロトタイピングとテストに適しています。 エンジンは、いくつかの機能の実装に関してはその子孫にやや遅れていますが、実際にはこれは問題を引き起こしません。 エンジンの問題は、ドキュメントの質の低さです。 公式ガイドでは、最も基本的な概念について説明し、その後、永続的なTODOプラグを十分に説明しています。 APIにはコメントもほとんどありません。 それでも、このキットには、基本的なプログラミング手法に慣れるための例とテストが含まれています。

したがって、Cocos2dをインストールして開始してください。

シーンとフロー制御


シーン( cocos.scene.Sceneクラス)は、ゲームの1つのレベルまたは画面です。 特定のレベルに属するすべてのゲームオブジェクトは、対応するシーンに配置されます。 シングルトンディレクター( cocos.director.director )は、シーンの制御に使用されます。

# cocos2d
import cocos

# director; , .
cocos.director.director.init()

# ,
cocos.director.director.run(cocos.scene.Scene())

ゲーム中、監督はシーンのスタックを制御します。 シーンスタックは非常に便利な概念です。 新しいシーンがスタックに配置されると、ディレクターはそれを実行し、前のシーンを一時停止します。 一番上のシーンがスタックから削除されると、ディレクターは前のシーンを再開します。 したがって、たとえば、ネストされたレベルまたはゲーム内メニューを実装できます。 シーンスタックを使用した操作では、directorメソッドのpush()pop()およびreplace()ます。 replace()呼び出しは、 pop()およびpush()の順次呼び出しと同等です。

シーン構造


シーンは、ツリーに編成されたオブジェクト(ノード)のコレクションです。 ツリーのルートはシーン自体です。 このモデルの親の位置(角度、角度)は、子の変換に影響します。 このようにして、複雑な複合オブジェクトを構築し、その表示を簡単に制御できます。 このエンジンは、幅広い既製のノードプリミティブ(たとえば、レイヤー( cocos.layer.Layer )、スプライト( cocos.sprite.Sprite )、テキスト( cocos.text.Label )、パーティクルシステム( cocos.particle.ParticleSystem )などを提供します。 ) cocos.cocosnode.CocosNodeまたは派生クラスから継承して、独自のノードを作成できます。

import cocos
cocos.director.director.init()

#
scene = cocos.scene.Scene()

#
scene.add(cocos.text.Label("Hello world!", position = (100, 200))

#
cocos.director.director.run(scene)

シーン構造は、ノードメソッドadd()remove() 、およびkill()を使用して形成されます。

オブジェクトは、非常に簡単に作成できるコールバック関数を使用して、オブジェクトの状態(だけでなく)を制御できます。 説明のために、回転テキストを含む派生ノードを作成します。

import cocos

class RotatingText(cocos.text.Label):
#
def __init__(self, text = "", position = (0, 0)):
super(RotatingText, self).__init__(text, position)
self.schedule(self.update)

# ,
def update(self, dt):
self.rotation += dt * 20

cocos.director.director.init()
scene = cocos.scene.Scene()
scene.add(RotatingText("Hello world!", (100, 200)))
cocos.director.director.run(scene)

アクション


上記は、オブジェクトを作成して動作を設定することで簡単なデモを作成するのに十分です。 ただし、Cocos2dを非常に柔軟で強力なものにしているのは、そのアクションシステムであるため、これを把握します。

アクションとは、オブジェクトの状態を変更する指示です。

import cocos
cocos.director.director.init()
scene = cocos.scene.Scene()
label = cocos.text.Label("Hello world!", position = (100, 200))
scene.add(label)
# 200 5
label.do(cocos.actions.MoveBy((200, 0), duration = 5))
cocos.director.director.run(scene)

アクションは瞬間的で間隔があります。 さらに、アクションは絶対的および相対的です。 標準アクションのリストは次のとおりです。
再定義された演算子+|おかげで アクションを組み合わせることができます。 合計を使用して結合されたアクションは、順番に実行されます。

# 100 5 3
label.do(cocos.actions.MoveBy((0, 100), 5) + cocos.actions.FadeOut(3))

選言によって結合されたアクションは、並行して実行されます。

# 100 , 90 , 5
label.do(cocos.actions.MoveBy((0, 100), 5) | cocos.actions.RotateBy(90, 5))

さらに、アクションの適用方法に影響を与える修飾子アクションがあります。 標準修飾子アクション:
# - 200 3
action = cocos.actions.MoveBy((200, 0), 3)
label.do(cocos.actions.Repeat(action + cocos.actions.Reverse(action)))

デバッグ


Cocos2dには、Ctrl-Iを押すことでデフォルトで呼び出される組み込みPythonインタープリターが含まれています。 インタープリターを使用すると、ゲームの完全な内観を取得し、インタラクティブに開発を行うことができます。 実行は停止しません。

おわりに


残念ながら、多くの問題(ユーザーインタラクション、イベント処理、シーンの移行、効果など)はこの記事の範囲外です。 ハブロフスク市民がこれらのトピックに興味を持っているなら、次の記事でそれらを紹介しようと思います。

Cocos2d公式ウェブサイト

Source: https://habr.com/ru/post/J120438/


All Articles