デモプロジェクト - 2D ゲームエンジン — プログラミング言語 Ring 1.14 取扱説明書

Skip to content

# デモプロジェクト - 2D ゲームエンジン

シンプルな 2D ゲームエンジンの作成を通じて、多種多様なプログラミングパラダイムをプロジェクトで併用する方法です。

これでデスクトップ、またはモバイル用 2D ゲームを作成できます。

## プロジェクトの階層

このような階層をプロジェクトで使用しています。

- ゲームの階層 (宣言型プログラミング)

- ゲームエンジンのクラス (オブジェクト指向プログラミングのパラダイム)

- グラフィックスライブラリへのインタフェース (手続き型プログラミング)

- グラフィックスライブラリへのバインディング (RingAllegro と RingLibSDL)

## グラフィックスライブラリのバインディング

Allegro ゲームプログラミング・ライブラリ用の RingAllegro と LibSDL ゲームプログラミング・ライブラリ用の RingLibSDL があります。

RingAllegro と RingLibSDL は Ring コード生成器の支援により C による拡張機能として作成されています。

RingAllegro と RingLibSDL はシンプルな設定ファイルを記述した後に生成される 10,000 行以上の C コードからなります (コード生成器による処理)。

RingAllegro と RingLibSDL の設定ファイルで関数名、構造体情報、および定数を決定後、 この設定ファイルを生成器で処理して C コードと Ring コードから読み込み可能なライブラリを生成します。

RingAllegro と RingLibSDL の使用は同一関数を有する C コードから Allegro および LibSDL の使用と非常に類似していますが Ring の機能で構築できます。

- RingAllegro のソースコード : https://github.com/ring-lang/ring/tree/master/extensions/ringallegro

- RingLibSDL のソースコード : https://github.com/ring-lang/ring/tree/master/extensions/ringsdl

## グラフィックスライブラリへのインタフェース

この階層には gl_allegro.ring および gl_libsdl.ring があります。

グラフィックスライブラリとの相互作用により、ライブラリ間で同一関数を使えます。

この階層は RingAllegro と RingLibSDL の詳細と差異を吸収します。

同一関数で Allegro と LibSDL を何時でも切り替えて使えます。

なぜですか？

Allegro は非常に単純明快であり Windows, Linux および macOS 用の 2D ゲームを手軽に作成できます。

Ring 1.0 から Allegro へ対応しました。

また LibSDL は非常に強力かつ普及しており、モバイル開発では非常に簡単に使えます。

Ring 1.1 から LibSDL へ対応しているため、モバイル用のゲームを手軽に作成できます。

注釈

このライブラリだけで、デスクトップとモバイル開発ができます。

- gl_allegro.ring のソースコード : https://github.com/ring-lang/ring/blob/master/libraries/gameengine/gl_allegro.ring

- gl_libsdl.ring のソースコード : https://github.com/ring-lang/ring/blob/master/libraries/gameengine/gl_libsdl.ring

## ゲームエンジンのクラス

このクラスがエンジンにあります。

- GameBase クラス

- Resources クラス

- Game クラス

- GameObject クラス

- Sprite クラス

- Text クラス

- Animate クラス

- Sound クラス

- Map クラス

- ソースコード : https://github.com/ring-lang/ring/blob/master/ringlibs/gameengine/gameengine.ring

## ゲームの階層

この階層では、ゲームエンジンのクラスを使用してゲームを作成します。

宣言型プログラミングでクラスの設計を行っています。

このクラスをゲームで使用しています。

- Game クラス

- Sprite クラス

- Text クラス

- Animate クラス

- Sound クラス

- Map クラス

注釈

エンジンに実装されている上記以外のクラスは、エンジンの内部処理用です。

三種類のゲームと用例を紹介します:

- Stars Fighter ゲーム

- Flappy Bird 3000 ゲーム

- Super Man 2016 ゲーム

## Game クラス

この表はクラスの属性です。

属性 | 説明
--- | ---
FPS | 数値により毎秒ごとの draw() メソッドの呼び出し回数を決定します。
FixedFPS | 数値により毎秒ごとの animate() メソッドの呼び出し回数を決定します。
Title | 文字列によりゲームのウィンドウタイトルを決定します。
Icon | 文字列によりゲームのウィンドウアイコンを決定します (ファイル名)。
aObjects | ゲーム内の全てのオブジェクトを有するリストです。
shutdown | True/False 値によりゲームのループを終了します。

この表はクラスのメソッドです。

メソッド | 説明
--- | ---
refresh() | オブジェクトを削除します。
settitle(cTitle) | 文字列による仮引数でウィンドウのタイトルを設定します。
shutdown() | アプリケーションを閉じます。
find(cName) | オブジェクト名でオブジェクトを検索します。
remove(nID) | オブジェクト ID でオブジェクトを削除します。

この表はクラスで定義されているキーワードのグループです。

キーワード | 説明
--- | ---
sprite | 新しい Sprite オブジェクトを作成後に Game オブジェクトへ追加します。
text | 新しい Text オブジェクトを作成後に Game オブジェクトへ追加します。
animate | 新しい Animate オブジェクトを作成後に Game オブジェクトへ追加します。
sound | 新しい Sound オブジェクトを作成後に Game オブジェクトへ追加します。
map | 新しい Map オブジェクトを作成後に Game オブジェクトへ追加します。

## GameObject クラス

この表はクラスの属性です。

属性 | 説明
--- | ---
enabled | True/False によりオブジェクトの状態 (活動または休止) を決定します
x | オブジェクトの x 位置を数値で決定します。
y | オブジェクトの y 位置を数値で決定します。
width | オブジェクトの幅を数値で決定します。
height | オブジェクトの高さを数値で決定します。
nIndex | 数値によりオブジェクトの ID を決定します。
name | 文字列によりオブジェクト名を決定します。
animate | True/False によりオブジェクトのアニメーションを行うか決定します。
move | True/False によりキーボードでオブジェクトの画像を移動するか決定します。
Scaled | True/False によりオブジェクトの画像の寸法を変更するか決定します。
draw | オブジェクトの描画時に呼び出される関数です。
state | オブジェクトのアニメーションで呼び出される関数です。
keypress | キーが押し下げられた時に呼び出される関数です。
mouse | マウスイベント発生時に呼び出される関数です。

この表はクラスのメソッドです。

メソッド | 説明
--- | ---
keyboard(oGame,nkey) | キーボードイベントを返します。
mouse(oGame,nType,aMouseList) | マウスイベントを確認します。
rgb(r,g,b) | RGB (赤色、緑色、および青色) 値で新しい色を返します。

## Sprite クラス

親クラス : GameObject クラス

この表はクラスの属性です。

属性 | 説明
--- | ---
image | 画像ファイル名を文字列で決定します。
point | 数値によりオブジェクトにおける自動移動の制限を決定します。
direction | 数値により移動方向を決定します。
nstep | 数値により移動中の増分または減分を決定します。
type | 数値によりゲームでのオブジェクトの種類を決定します (オプション扱い)。
transparent | True/False の値により画像の透過を決定します。

この表はクラスのメソッドです。

メソッド | 説明
--- | ---
Draw(oGame) | オブジェクトを描画します。

## Text クラス

親クラス : Sprite クラス

この表はクラスの属性です。

属性 | 説明
--- | ---
size | 数値によりフォントの寸法を決定します。
font | 文字列によりフォントのファイル名を決定します。
text | 文字列により表示されるテキストを決定します。
color | 数値により色を決定します。

この表はクラスのメソッドです。

メソッド | 説明
--- | ---
Draw(oGame) | オブジェクトを描画します。

## Animate クラス

親クラス : Sprite クラス

この表はクラスの属性です。

属性 | 説明
--- | ---
frames | 数値によりフレーム数を決定します。
frame | 数値により有効なフレームを決定します。
framewidth | 数値によりフレームの幅を決定します。
animate | True/False によりアニメーションの使用を決定します。
scaled | True/False により画像の尺度変更を決定します。

この表はクラスのメソッドです。

メソッド | 説明
--- | ---
Draw(oGame) | オブジェクトを描画します。

## Sound クラス

親クラス : GameObject クラス

この表はクラスの属性です。

属性 | 説明
--- | ---
file | 音声ファイル名を文字列で決定します。
once | True/False によりファイルを一回またはループ再生するか決定します。

この表はクラスのメソッドです。

メソッド | 説明
--- | ---
playsound() | 音声ファイルを再生します。

## Map クラス

親クラス : Sprite クラス

この表はクラスの属性です。

属性 | 説明
--- | ---
aMap | 数値でマップの中身をリストで決定します。
aImages | マップの各番号で使用されている画像をリストで決定します。
BlockWidth | ブロックの幅を数値で決定します (デフォルト = 32)。
BlockHeight | ブロックの高さを数値で決定します (デフォルト = 32)。
Animate | アニメーションの状態を True/False で決定します。

この表はクラスのメソッドです。

メソッド | 説明
--- | ---
getvalue(x,y) | 項目の値でマップの可視部分を返します。

## ゲームエンジンの用法 - ゲームウィンドウの作成

    Load "gameengine.ring"  # ゲームエンジンへ制御権を与えます。

    func main               # ゲームエンジンから呼び出されます。

            oGame = New Game        # Game オブジェクトの作成
            {
                    title = "My First Game"
            }                       # イベントループの開始

注釈

この命令でゲームエンジンに制御権を委譲します。よって、グローバル変数の定義は "gameengine.ring" を読み込む前に行う必要があります。

スクリーンショット:

## ゲームエンジンの用法 - テキストの描画

    Load "gameengine.ring"  # ゲームエンジンへ制御権を与えます。

    func main               # ゲームエンジンから呼び出されます。

            oGame = New Game        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    text {
                            x = 10  y=50
                            animate = false
                            size = 20
                            file = "fonts/pirulen.ttf"
                            text = "game development using ring is very fun!"
                            color = rgb(0,0,0)
                    }
            }               # イベントループの開始

スクリーンショット:

## ゲームエンジンの用法 - テキストの移動

    Load "gameengine.ring"  # ゲームエンジンへ制御権を与えます。

    func main               # ゲームエンジンから呼び出されます。

            oGame = New Game        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    text {
                            x = 10  y=50
                            animate = false
                            size = 20
                            file = "fonts/pirulen.ttf"
                            text = "game development using ring is very fun!"
                            color = rgb(0,0,0)      # 配色 = 黒色
                    }
                    text {
                            x = 10  y=150
                            # アニメーション部分 =================================
                            animate = true                  # アニメーションの使用
                            direction = GE_DIRECTION_INCVERTICAL    # y の増分
                            point = 400                     # y=400 になるまで継続
                            nStep = 3                       # 毎回 y+= 3 を行う
                            #=====================================================
                            size = 20
                            file = "fonts/pirulen.ttf"
                            text = "welcome to the real world!"
                            color = rgb(0,0,255)            # 配色 = 青色
                    }
            }                                       # イベントループの開始

スクリーンショット:

## ゲームエンジンの用法 - 音声の再生

    Load "gameengine.ring"  # ゲームエンジンへ制御権を与えます。

    func main               # ゲームエンジンから呼び出されます。

            oGame = New Game        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    text {
                            x = 10  y=50
                            animate = false
                            size = 20
                            file = "fonts/pirulen.ttf"
                            text = "game development using ring is very fun!"
                            color = rgb(0,0,0)      # 配色 = 黒色
                    }
                    text {
                            x = 10  y=150
                            # アニメーション部分 ======================================
                            animate = true                          # アニメーションの使用
                            direction = GE_DIRECTION_INCVERTICAL    # y の増分
                            point = 400             # y=400 になるまで継続
                            nStep = 3               # 毎回 y+= 3 を行う
                            #==========================================================
                            size = 20
                            file = "fonts/pirulen.ttf"
                            text = "welcome to the real world!"
                            color = rgb(0,0,255)    # 配色 = 青色
                    }
                    Sound {                                 # 音声の再生
                            file = "sound/music1.wav"       # イベントループの開始
                    }
            }                                       # イベントループの開始

## ゲームエンジンの用法 - アニメーション

    Load "gameengine.ring"  # ゲームエンジンへ制御権を与えます。

    func main               # ゲームエンジンから呼び出されます。

      oGame = New Game      # Game オブジェクトの作成
      {
            title = "My First Game"

            animate {
              file = "images/fire.png"
              x = 100
              y = 200
              framewidth = 40
              height = 42
              nStep = 3      # ディレイで使用
              transparent = true
              state = func oGame,oSelf {  # エンジンの各フレームで呼び出されます
                    oSelf {
                      nStep--
                      if nStep = 0
                            nStep = 3
                            if frame < 13      # 13 フレームから構成されるアニメーション
                              frame++   # 次のフレームへ移動
                            else
                              oGame.remove(oself.nIndex)   # オブジェクトの削除
                            ok
                      ok
                    }
              }
             }

      }          # イベントループの開始

## ゲームエンジンの用法 - アニメーションと関数

    Load "gameengine.ring"  # ゲームエンジンへ制御権を与えます。

    func main               # ゲームエンジンから呼び出されます。

      oGame = New Game      # Game オブジェクトの作成
      {
            title = "My First Game"
            for x = 70 to 700 step 50
              for y = 70 to 500 step 50
                    showfire(oGame,x,y)
              next
            next

      }          # イベントループの開始

    func showfire oGame,nX,nY
      oGame {
            animate {
              file = "images/fire.png"
              x = nX
              y = nY
              framewidth = 40
              height = 42
              nStep = 3      # ディレイで使用
              transparent = true
              state = func oGame,oSelf {  # エンジンの各フレームで呼び出されます
                    oSelf {
                      nStep--
                      if nStep = 0
                            nStep = 3
                            if frame < 13      # 13 フレームから構成されるアニメーション
                              frame++   # 次のフレームへ移動
                            else
                              frame=1
                            ok
                      ok
                    }
              }
             }
      }

## ゲームエンジンの用法 - スプライト - キーボードによる自動移動

    Load "gameengine.ring"                          # ゲームエンジンへ制御権を与えます。

    func main                                       # ゲームエンジンから呼び出されます。

            oGame = New Game                        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    sprite
                    {
                            type = GE_TYPE_PLAYER           # 用法
                            x=400 y=400 width=100 height=100
                            file = "images/player.png"
                            transparent = true
                            Animate=false
                            Move=true       # キーボードの矢印キーで移動できます。
                            Scaled=true
                    }
            }                                       # イベントループの開始

## ゲームエンジンの用法 - スプライト - キー入力イベント

    Load "gameengine.ring"                          # ゲームエンジンへ制御権を与えます。

    func main                                       # ゲームエンジンから呼び出されます。

            oGame = New Game                        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    sprite
                    {
                            type = GE_TYPE_PLAYER           # 用法
                            x=400 y=400 width=100 height=100
                            file = "images/player.png"
                            transparent = true
                            Animate=false
                            Move=false                      # カスタム移動
                            Scaled=true
                            keypress = func oGame,oSelf,nKey {
                                    oSelf {
                                            Switch nKey
                                            on KEY_LEFT
                                                    x -= 10
                                            on KEY_RIGHT
                                                    x += 10
                                            on KEY_UP
                                                    y -= 10
                                            on KEY_DOWN
                                                    y += 10
                                            off
                                    }
                            }
                    }
            }                                       # イベントループの開始

## ゲームエンジンの用法 - スプライト - マウスイベント

    Load "gameengine.ring"                          # ゲームエンジンへ制御権を与えます。

    func main                                       # ゲームエンジンから呼び出されます。

            oGame = New Game                        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    sprite
                    {
                            type = GE_TYPE_PLAYER           # 用法
                            x=400 y=400 width=100 height=100
                            file = "images/player.png"
                            transparent = true
                            Animate=false
                            Move=false                      # カスタム移動
                            Scaled=true
                            keypress = func oGame,oSelf,nKey {
                                    oSelf {
                                            Switch nKey
                                            on KEY_LEFT
                                                    x -= 10
                                            on KEY_RIGHT
                                                    x += 10
                                            on KEY_UP
                                                    y -= 10
                                            on KEY_DOWN
                                                    y += 10
                                            off
                                    }
                            }
                            mouse = func oGame,oSelf,nType,aMouseList {
                                    if nType = GE_MOUSE_UP
                                            oSelf {
                                                    x = aMouseList[GE_MOUSE_X]
                                                    y = aMouseList[GE_MOUSE_Y]
                                            }
                                    ok
                            }
                    }
            }                                       # イベントループの開始

## ゲームエンジンの用法 - スプライト - ステートイベント

    Load "gameengine.ring"                          # ゲームエンジンへ制御権を与えます。

    func main                                       # ゲームエンジンから呼び出されます。

            oGame = New Game                        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    sprite
                    {
                            type = GE_TYPE_PLAYER           # 用法
                            x=400 y=400 width=100 height=100
                            file = "images/player.png"
                            transparent = true
                            Animate=false
                            Move=false                      # カスタム移動
                            Scaled=true
                            keypress = func oGame,oSelf,nKey {
                                    oSelf {
                                            Switch nKey
                                            on KEY_LEFT
                                                    x -= 10
                                            on KEY_RIGHT
                                                    x += 10
                                            on KEY_UP
                                                    y -= 10
                                            on KEY_DOWN
                                                    y += 10
                                            off
                                    }
                            }
                            mouse = func oGame,oSelf,nType,aMouseList {
                                    if nType = GE_MOUSE_UP
                                            oSelf {
                                                    x = aMouseList[GE_MOUSE_X]
                                                    y = aMouseList[GE_MOUSE_Y]
                                            }
                                    ok
                            }
                            state = func oGame,oSelf {
                                    oself {
                                            if x < 0 x = 0 ok
                                            if y < 0 y = 0 ok
                                            if x > ogame.width-width
                                                    x= ogame.width - width ok
                                            if y > ogame.height-height
                                                    y=ogame.height - height ok
                                    }
                            }
                    }
            }                                       # イベントループの開始

## ゲームエンジンの用法 - アニメーション - イベント

    Load "gameengine.ring"                          # ゲームエンジンへ制御権を与えます。

    func main                                       # ゲームエンジンから呼び出されます。

            oGame = New Game                        # Game オブジェクトの作成
            {
                    title = "My First Game"

                    animate {

                            file = "images/fbbird.png"
                            x = 10
                            y = 10
                            framewidth = 20
                            scaled = true
                            height = 50
                            width = 50
                            nStep = 3
                            transparent = true

                            state = func oGame,oSelf {
                                    oSelf {

                                            # アニメーション
                                                    nStep--
                                                    if nStep = 0
                                                            nStep = 3
                                                            if frame < 3
                                                                    frame++
                                                            else
                                                                    frame=1
                                                            ok
                                                    ok

                                            # 下へ移動
                                                    y += 3
                                                    if y > 550 y=550 ok

                                    }

                            }

                            keypress = func ogame,oself,nKey {
                                    oself {
                                            if nkey = key_space
                                                    y -= 55
                                                    if y<=0 y=0 ok
                                            ok
                                    }
                            }

                            mouse = func ogame,oself,nType,aMouseList {
                                    if nType = GE_MOUSE_UP
                                            cFunc = oself.keypress
                                            call cFunc(oGame,oSelf,Key_Space)
                                    ok
                            }
                    }
            }                                       # イベントループの開始

スクリーンショット:

## ゲームエンジンの用法 - マップ

    Load "gameengine.ring"        # ゲームエンジンへ制御権を与えます。

    func main          # ゲームエンジンから呼び出されます。

    oGame = New Game      # Game オブジェクトの作成
    {
      title = "My First Game"

      Map {

            blockwidth = 80
            blockheight = 80

            aMap = [
                    [0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
                    [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
                    [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0],
                    [0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0],
                    [0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0],
                    [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
                    [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
                    [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
            ]

            aImages = ["images/fbwall.png",
                     "images/fbwallup.png",
                     "images/fbwalldown.png"]

            state = func oGame,oSelf {
              oSelf {
                    x -= 3
                    if x < - 2100  x = 0  ok
              }
            }

      }
    }          # イベントループの開始

スクリーンショット:

## ゲームエンジンの用法 - マップイベント

    Load "gameengine.ring"        # ゲームエンジンへ制御権を与えます。

    func main          # ゲームエンジンから呼び出されます。

      oGame = New Game      # Game オブジェクトの作成
      {
            title = "My First Game"

            Map {

              blockwidth = 80
              blockheight = 80

              aMap = [
                       [0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0],
                      [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
              ]

              aImages = ["images/fbwall.png",
                             "images/fbwallup.png",
                             "images/fbwalldown.png"]

              state = func oGame,oSelf {
                    oSelf {
                      x -= 3
                      if x < - 2100  x = 0  ok
                    }
              }

              mouse = func ogame,oself,nType,aMouseList {
                    if nType = GE_MOUSE_UP
                      oSelf {
                            mX = aMouseList[GE_MOUSE_X]
                            mY = aMouseList[GE_MOUSE_Y]
                            nValue = GetValue(mX,mY)
                            nRow = GetRow(mX,mY)
                            nCol = GetCol(mX,mY)
                            Switch nValue
                            On 1  aMap[nRow][nCol] = 0
                            On 2  aMap[nRow][nCol] = 0
                            On 3  aMap[nRow][nCol] = 0
                            On 0  aMap[nRow][nCol] = 1
                            Off
                      }
                    ok
              }

            }
      }          # イベントループの開始

スクリーンショット:

## ゲームエンジンの用法 - オブジェクトと描画処理

GameObject クラスからオブジェクトを作成するには、 Object キーワード (ゲームエンジンで定義済み) を使用します。

用例:

    Load "gameengine.ring"                          # ゲームエンジンへ制御権を与えます。

    func main                                       # ゲームエンジンから呼び出されます。

            oGame = New Game                        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    Object {
                            x = 0 y=300 width = 200 height=200
                            draw = func oGame,oSelf {
                                    oSelf {
                                            for t = 1 to 210
                                                    gl_draw_circle(x,y,t,
                                                    gl_map_rgb(t*random(255),
                                                    t*2,t*3),1)
                                            next
                                    }
                            }
                            state = func oGame,oSelf {
                                    oSelf {
                                            if x <= 800
                                                    x+= 3
                                            else
                                                    x=0
                                            ok
                                    }
                            }
                            keypress = func oGame,oSelf,nKey {
                                    oSelf {
                                            Switch nKey
                                            on KEY_LEFT
                                                    x -= 10
                                            on KEY_RIGHT
                                                    x += 10
                                            on KEY_UP
                                                    y -= 10
                                            on KEY_DOWN
                                                    y += 10
                                            off
                                    }
                            }
                    }

            }                                       # イベントループの開始

スクリーンショット:

用例:

    Load "gameengine.ring"                          # ゲームエンジンへ制御権を与えます。

    func main                                       # ゲームエンジンから呼び出されます。

            oGame = New Game                        # Game オブジェクトの作成
            {
                    title = "My First Game"
                    Object {
                            x = 400 y=300 width = 200 height=200
                            draw = func oGame,oSelf {
                                    oSelf {
                                            for t = 1 to 210
                                                    gl_draw_rectangle(x+t,y+t,
                                                    x+t*2,y+t*2,
                                                    gl_map_rgb(t*random(255),
                                                    t*2,t*3),1)
                                                    gl_draw_rectangle(x+t*2,y+t*2,
                                                    x-t*2,y-t*2,
                                                    gl_map_rgb(t*random(255),
                                                    t*2,t*3),1)
                                            next
                                    }
                            }
                            keypress = func oGame,oSelf,nKey {
                                    oSelf {
                                            Switch nKey
                                            on KEY_LEFT
                                                    x -= 10
                                            on KEY_RIGHT
                                                    x += 10
                                            on KEY_UP
                                                    y -= 10
                                            on KEY_DOWN
                                                    y += 10
                                            off
                                    }
                            }
                    }

            }                                       # イベントループの開始

スクリーンショット:

## Stars Fighter ゲーム

Stars Fighter ゲームのソースコード

    # Ring 標準ライブラリ
    # 2D ゲームエンジン
    # 2016, Mahmoud Fayed <msfclipper@yahoo.com>

    oGameState = NULL

    load "gameengine.ring"

    func main

      oGame = New Game

      while true

              oGameState = new GameState

              oGame {
                    title = "Stars Fighter!"
                    sprite
                    {
                      file = "images/menu1.jpg"
                      x = 0 y=0 width=800 height = 600 scaled = true animate = false
                      keypress = func ogame,oself,nKey {
                            if nkey = key_esc or nKey = GE_AC_BACK
                              ogame.shutdown()
                            but nKey = key_space
                              oGameState.startplay=true
                              ogame.shutdown=true
                            ok
                      }
                      mouse = func ogame,oself,nType,aMouseList {
                            if nType = GE_MOUSE_UP
                              oGameState.startplay=true
                              ogame.shutdown=true
                            ok
                      }
                    }
                    text {
                      animate = false
                      size = 35
                      file = "fonts/pirulen.ttf"
                      text = "Stars Fighter"
                      x = 10  y=50
                    }
                    text {
                      animate = false
                      size = 25
                      file = "fonts/pirulen.ttf"
                      text = "Version 1.0"
                      x = 80  y=100
                    }
                    text {
                      animate = false
                      size = 16
                      file = "fonts/pirulen.ttf"
                      text = "(C) 2016, Mahmoud Fayed"
                      x = 45  y=140
                    }

                    text {
                      animate = false
                      size = 25
                      file = "fonts/pirulen.ttf"
                      text = "Press Space to start"
                      x = 190  y=470
                    }
                    text {
                      animate = false
                      size = 20
                      file = "fonts/pirulen.ttf"
                      text = "Press Esc to Exit"
                      x = 260  y=510
                    }
                    Sound {
                      file = "sound/music1.wav"
                    }
              }

              if oGameState.startplay
                    oGame.refresh()
                    playstart(oGame)
                    oGame.refresh()
              ok

      end

    func playstart oGame

      oSound = New Sound {
            file = "sound/music2.wav"
      }

      while true
            play(oGame)
            if ogame.shutdown = true and oGameState.value = 0
              exit
            ok
            ogame.refresh()
      end

      oSound.Delete()

    func play oGame

      oGame
      {
            FPS = 60
            FixedFPS = 120
            title = "Stars Fighter!"
            sprite
            {
              file = "images/stars.jpg"
              x = 0
              y = 0
              point = -370
              direction = ge_direction_dec
              type = ge_type_background
              state = func ogame,oself {
                      oself {
                            if x < -350
                              direction = ge_direction_inc
                              point = 370
                            but x = 0 and direction = ge_direction_inc
                              direction = ge_direction_dec
                              point = -370
                            ok
                      }
                    }
            }
            sprite
            {
              file = "images/player.png"
              transparent = true
              type = ge_type_player
              x = 400 y =400 width=100 height=100
              animate=false move=true Scaled=true
              mouse = func ogame,oself,nType,aMouseList {

                    if not ( aMouseList[GE_MOUSE_X] >= oSelf.x and
                                     aMouseList[GE_MOUSE_X] <= oSelf.x+oSelf.width and
                                     aMouseList[GE_MOUSE_Y] >= oself.y and
                                     aMouseList[GE_MOUSE_Y] <= oSelf.y+oSelf.height )

                      if nType = GE_MOUSE_DOWN
                            if aMouseList[1] < oSelf.X  # 左
                              oSelf.X -= 100
                            else
                              oSelf.X += 100
                            ok
                            if aMouseList[2] < oSelf.Y  # 上
                              oSelf.Y -= 100
                            else
                              oSelf.Y += 100
                            ok
                      ok

                    else
                      if nType = GE_MOUSE_UP
                            cFunc = oself.keypress
                            call cFunc(oGame,oSelf,Key_Space)
                      ok
                    ok
              }
              keypress = func oGame,oself,nkey {
                    if nkey = key_space
                      ogame {
                            sprite {
                              type = ge_type_fire
                              file  = "images/rocket.png"
                              transparent = true
                                    x = oself.x + 30
                              y = oself.y - 30
                              width = 30
                              height = 30
                              point = -30
                              nstep = 20
                              direction = ge_direction_decvertical
                              state = func oGame,oSelf {
                                    for x in oGame.aObjects
                                      if x.type = ge_type_enemy
                                            if oself.x >= x.x and oself.y >= x.y and
                                              oself.x <= x.x + x.width and
                                              oself.y <= x.y + x.height
                                              showfire(oGame,x.x+40,x.y+40)
                                              ogame.remove(x.nindex)
                                              oGameState.score+=10
                                              oGameState.enemies--
                                              checkwin(oGame)
                                              exit
                                            ok
                                      ok
                                    next
                              }
                            }
                      }
                    but nkey = key_esc or nKey = GE_AC_BACK ogame.shutdown()
                    ok
              }
              state = func oGame,oSelf {
                    oself {
                      if x < 0 x = 0 ok
                      if y < 0 y = 0 ok
                      if x > ogame.screen_w-width  x= ogame.screen_w - width ok
                      if y > ogame.screen_h-height y=ogame.screen_h-height ok
                    }
              }
            }
            for g = 1 to oGameState.enemies
              sprite
              {
                    type = ge_type_enemy
                    file = "images/enemy.png"
                    transparent = true
                    x = g*random(50) y =g width=100 height=100
                    animate=true Scaled=true
                    direction = ge_direction_random
                    state = func oGame,oSelf {
                      oself {
                            if x < 0 x = 0 ok
                            if y < 0 y = 0 ok
                            if x > ogame.screen_w-width  x= ogame.screen_w - width ok
                            if y > ogame.screen_h-height y=ogame.screen_h-height ok
                      }
                      if random(100) = 1
                            ogame {
                              sprite {
                                    type = ge_type_fire
                                    file  = "images/rocket2.png"
                                    transparent = true
                                    x = oself.x + 30
                                    y = oself.y + oself.height+ 30
                                    width = 30
                                    height = 30
                                    point = ogame.screen_h+30
                                    nstep = 10
                                    direction = ge_direction_incvertical
                                    state = func oGame,oSelf {
                                      x =  oGame.aObjects[oGameState.playerindex]
                                      if oself.x >= x.x and oself.y >= x.y and
                                             oself.x <= x.x + x.width and
                                             oself.y <= x.y + x.height
                                             if oGameState.value > 0
                                               oGameState.value-=10
                                             ok
                                             ogame.remove(oself.nindex)
                                             checkgameover(oGame)
                                      ok
                                    }
                              }
                            }
                      ok
                    }
              }
            next
            text {
              size = 30
              file = "fonts/pirulen.ttf"
              text = "Destroy All Enemies!"
              nstep = 3
              color = GE_COLOR_GREEN
              x = 100  y=50
              direction = ge_direction_incvertical
              point = 500
            }
            text {
              animate = false
              point = 400
              size = 30
              file = "fonts/pirulen.ttf"
              text = "Score : " + oGameState.score
              x = 500  y=10
              state = func oGame,oSelf { oSelf { text = "Score : " + oGameState.score } }
            }
            text {
              animate = false
              point = 400
              size = 30
              file = "fonts/pirulen.ttf"
              text = "Energy : " + oGameState.value
              x = 500  y=50
              state = func oGame,oSelf { oSelf { text = "Energy : " + oGameState.value } }
            }
            text {
              animate = false
              point = 400
              size = 30
              file = "fonts/pirulen.ttf"
              text = "Level : " + oGameState.level
              x = 500  y=90
            }
      }

    func checkwin ogame
      if oGameState.gameresult  return ok
      if oGameState.enemies = 0
            oGameState.gameresult = true
            oGame {
              if oGameState.level < 30
              text {
                    point = 400
                    size = 30
                    file = "fonts/pirulen.ttf"
                    text = "Level Completed!"
                    nStep = 3
                    x = 500  y=10
                    state = func ogame,oself {
                      if oself.y >= 400
                            ogame.shutdown = true
                            oGameState.level++
                            oGameState.enemies = oGameState.level
                            oGameState.gameresult = false
                      ok
                    }
              }
              else
              text {
                    point = 400
                    size = 30
                    nStep = 3
                    file = "fonts/pirulen.ttf"
                    text = "You Win !!!"
                    x = 500  y=10
                    state = func ogame,oself {
                      if oself.y >= 400
                            ogame.shutdown = true
                            oGameState.value = 0
                      ok
                    }
              }
              ok
            }
      ok

    func checkgameover ogame
      if oGameState.gameresult  return ok
      if oGameState.value <= 0
            oGameState.gameresult = true
            oGame {
              text {
                    point = 400
                    size = 30
                    nStep = 3
                    file = "fonts/pirulen.ttf"
                    text = "Game Over !!!"
                    x = 500  y=10
                    state = func ogame,oself {
                      if oself.y >= 400
                            ogame.shutdown = true
                      ok
                    }
              }
            }
            showfire(oGame,oGame.aObjects[oGameState.PlayerIndex].x+40,
                             oGame.aObjects[oGameState.PlayerIndex].y+40)
            oGame.aObjects[oGameState.PlayerIndex].enabled = false
            oGame.remove(oGameState.PlayerIndex)
      ok

    func showfire oGame,nX,nY
      oGame {
            animate {
              file = "images/fire.png"
              x = nX
              y = nY
              framewidth = 40
              height = 42
              nStep = 3
              transparent = true
              state = func oGame,oSelf {
                    oSelf {
                      nStep--
                      if nStep = 0
                            nStep = 3
                            if frame < 13
                              frame++
                            else
                              frame=1
                              oGame.remove(oself.nIndex)
                            ok
                      ok
                    }
              }
            }
      }

    class gamestate
      score = 0
      level = 1
      enemies = 1
      value = 100
      playerindex = 2
      gameresult = false
      startplay=false

スクリーンショット:

## Flappy Bird 3000 ゲーム

Flappy Bird 3000 ゲームのソースコード

    # Ring 標準ライブラリ
    # 2D ゲームエンジン
    # 2016, Mahmoud Fayed <msfclipper@yahoo.com>

    oGameState = NULL

    Load "gameengine.ring"

    func main

      oGame = New Game

      while true

            oGameState = New GameState

            oGame {
              title = "Flappy Bird 3000"
              sprite
              {
                    file = "images/fbback.png"
                    x = 0 y=0 width=800 height = 600 scaled = true animate = false
                    keypress = func ogame,oself,nKey {
                      if nkey = key_esc or nKey = GE_AC_BACK
                            ogame.shutdown()
                      but nKey = key_space
                            oGameState.startplay=true
                            ogame.shutdown=true
                      ok
                    }
                    mouse = func ogame,oself,nType,aMouseList {
                      if nType = GE_MOUSE_UP
                            cFunc = oself.keypress
                            call cFunc(oGame,oSelf,Key_Space)
                      ok
                    }
              }
              text {
                    animate = false
                    size = 35
                    file = "fonts/pirulen.ttf"
                    text = "Flappy Bird 3000"
                    x = 150  y=50
              }
              text {
                    animate = false
                    size = 25
                    file = "fonts/pirulen.ttf"
                    text = "Version 1.0"
                    x = 280  y=100
              }
              text {
                    animate = false
                    size = 16
                    file = "fonts/pirulen.ttf"
                    text = "(C) 2016, Mahmoud Fayed"
                    x = 245  y=140
              }

              text {
                    animate = false
                    size = 25
                    file = "fonts/pirulen.ttf"
                    text = "To Win Get Score = 3000"
                    x = 150  y=270
              }

              text {
                    animate = false
                    size = 25
                    file = "fonts/pirulen.ttf"
                    text = "Press Space to start"
                    x = 190  y=470
              }
              text {
                    animate = false
                    size = 20
                    file = "fonts/pirulen.ttf"
                    text = "Press Esc to Exit"
                    x = 260  y=510
              }

              animate {
                    file = "images/fbbird.png"
                    x = 200
                    y = 200
                    framewidth = 20
                    scaled = true
                    height = 50
                    width = 50
                    nStep = 3
                    transparent = true
                    animate = true
                    direction = ge_direction_random
                    state = func oGame,oSelf {
                      oSelf {
                            nStep--
                            if nStep = 0
                              nStep = 3
                              if frame < 3
                                    frame++
                              else
                                    frame=1
                              ok
                            ok
                            if x <= 0 x=0 ok
                            if y <= 0 y=0 ok
                            if x >= 750 x= 750 ok
                            if y > 550 y=550 ok
                      }
                    }
              }

              Sound {
                    file = "sound/music2.wav"
              }
            }
            if oGameState.startplay
              oGame.refresh()
              playstart(oGame)
              oGame.refresh()
            ok

      end

    func playstart oGame

      oGame {
            FPS = 60
            FixedFPS = 120
            Title = "Flappy Bird 3000"
            Sprite {
              file = "images/fbback.png"
              x = 0 y=0 width=800 height = 600 scaled = true animate = false
              keypress = func ogame,oself,nKey {
                    if nkey = key_esc or nKey = GE_AC_BACK
                      ogame.shutdown()
                    ok
              }
            }

            Map {
              blockwidth = 80
              blockheight = 80
              aMap = [
                       [0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0],
                      [0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0],
                      [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
                    ]
              newmap(aMap)
              aImages = ["images/fbwall.png","images/fbwallup.png",
                      "images/fbwalldown.png"]
              state = func oGame,oSelf {
                    if oGameState.gameresult = false
                      px = oGame.aObjects[3].x
                      py = oGame.aObjects[3].y
                      oSelf {
                            x -=  3
                            if x < - 2100
                              x = 0
                              newmap(aMap)
                            ok
                            nCol =  getcol(px,0)
                            if nCol=11 or nCol=15 or nCol=19 or nCol=23 or nCol=27
                              if nCol != oGameState.lastcol
                                    oGameState.lastcol = nCol
                                    oGameState.Score += 100
                                    oGame { Sound {
                                      once = true
                                      file = "sound/sfx_point.wav"
                                    } }
                                    checkwin(oGame)
                              ok
                            ok
                      }
                      if  oSelf.getvalue(px+40,py) != 0 or
                              oSelf.getvalue(px+40,py+40) != 0 or
                              oSelf.getvalue(px,py) != 0 or
                              oSelf.getvalue(px,py+40) != 0
                            oGameState.gameresult = true
                            oGame {
                              text {
                                    point = 550
                                    size = 30
                                    nStep = 3
                                    file = "fonts/pirulen.ttf"
                                    text = "Game Over !!!"
                                    x = 500  y=10
                                    state = func ogame,oself {
                                      if oself.y >= 550
                                              ogame.shutdown = true
                                      ok
                                            if oself.y = 90
                                            ogame {
                                              Sound {
                                                    once = true
                                                    file = "sound/sfx_die.wav"
                                              }
                                            }
                                      ok
                                    }
                              }
                              Sound {
                                    once = true
                                    file = "sound/sfx_hit.wav"
                              }
                            }
                      ok
                    ok
              }
            }

            animate {
              file = "images/fbbird.png"
              x = 10
              y = 10
              framewidth = 20
              scaled = true
              height = 50
              width = 50
              nStep = 3
              transparent = true
              state = func oGame,oSelf {
                    oSelf {
                      nStep--
                      if nStep = 0
                            nStep = 3
                            if frame < 3
                              frame++
                            else
                              frame=1
                            ok
                      ok
                    }

                    if not oGameState.playerwin
                      oGameState.down --
                      if oGameState.down = 0
                            oGameState.down = 3
                            oself {
                              y += 25
                              if y > 550 y=550 ok
                            }
                      ok
                    ok

              }
              keypress = func ogame,oself,nKey {
                    if oGameState.gameresult = false
                      oself {
                            if nkey = key_space
                              y -= 55
                              oGameState.down = 60
                              if y<=0 y=0 ok
                            ok
                      }
                    ok
              }
              mouse = func ogame,oself,nType,aMouseList {
                    if nType = GE_MOUSE_UP
                      cFunc = oself.keypress
                      call cFunc(oGame,oSelf,Key_Space)
                    ok
              }
            }

            text {
              animate = false
              point = 400
              size = 30
              file = "fonts/pirulen.ttf"
              text = "Score : " + oGameState.score
              x = 500  y=10
              state = func oGame,oSelf {
                    oSelf { text = "Score : " + oGameState.score }
              }
            }

      }

    func newmap aMap
      aV = [
      [1,1,3,0,0,2,1,1],
      [1,3,0,0,0,2,1,1],
      [1,1,1,3,0,2,1,1],
      [1,1,1,3,0,0,0,0],
      [0,0,0,0,2,1,1,1],
      [0,0,2,1,1,1,1,1],
      [0,0,0,2,1,1,1,1],
      [1,1,1,3,0,2,1,1],
      [1,1,1,1,1,3,0,0],
      [3,0,0,2,1,1,1,1],
      [3,0,0,2,3,0,0,2]
      ]
      for x = 10 to 24 step 4
            aVar = aV[ (random(10)+1) ]
            for y = 1 to 8
              aMap[y][x] = aVar[y]
            next
      next

    func checkwin ogame
      if oGameState.score = 3000
            oGameState.gameresult = true
            oGameState.playerwin = true
            oGame {
              text {
                    point = 400
                    size = 30
                    nStep = 3
                    file = "fonts/pirulen.ttf"
                    text = "You Win !!!"
                    x = 500  y=10
                    state = func ogame,oself {
                      if oself.y >= 400
                            ogame.shutdown = true
                            oGameState.value = 0
                      ok
                    }
              }
            }
      ok

    Class GameState
      down = 3
      gameresult = false
      Score = 0
      startplay=false
      lastcol = 0
      playerwin = false

スクリーンショット:

## Super Man 2016 ゲーム

Super Man 2016 ゲームのソースコード

    # Ring 標準ライブラリ
    # 2D ゲームエンジン
    # 2016, Mahmoud Fayed <msfclipper@yahoo.com>

    oGameState = NULL

    Load "gameengine.ring"

    func main

      oGame = New Game

      while true

            oGameState = new GameState

            oGame {
              title = "Super Man 2016"
              sprite
              {
                    file = "images/superman.jpg"
                    x = 0 y=0 width=800 height = 600 scaled = true animate = false
                    keypress = func ogame,oself,nKey {
                      if nkey = key_esc or nKey = GE_AC_BACK
                            ogame.shutdown()
                      but nKey = key_space
                            oGameState.startplay=true
                            ogame.shutdown=true
                      ok
                    }
                    mouse = func ogame,oself,nType,aMouseList {
                      if nType = GE_MOUSE_UP
                            oGameState.startplay=true
                            ogame.shutdown=true
                      ok
                    }
                    state = func ogame,oself {
                      oself {
                            if x > -500
                              x-=1
                              y-=1
                              width +=1
                              height +=4
                            ok
                      }
                    }
              }
              text {
                    animate = false
                    size = 35
                    file = "fonts/pirulen.ttf"
                    text = "Super Man 2016"
                    x = 20  y=30
              }
              text {
                    animate = false
                    size = 25
                    file = "fonts/pirulen.ttf"
                    text = "Version 1.0"
                    x = 20  y=80
              }
              text {
                    animate = false
                    size = 16
                    file = "fonts/pirulen.ttf"
                    text = "(C) 2016, Mahmoud Fayed"
                    x = 20  y=120
              }

              text {
                    animate = false
                    size = 25
                    file = "fonts/pirulen.ttf"
                    text = "Press Space to start"
                    x = 190  y=470
              }
              text {
                    animate = false
                    size = 20
                    file = "fonts/pirulen.ttf"
                    text = "Press Esc to Exit"
                    x = 260  y=510
              }

              animate {
                    file = "images/superman.png"
                    x = 200
                    y = 200
                    framewidth = 68
                    scaled = true
                    height = 86
                    width = 60
                    nStep = 10
                    transparent = true
                    animate = true
                    direction = ge_direction_random
                    state = func oGame,oSelf {
                      oSelf {
                            nStep--
                            if nStep = 0
                              nStep = 10
                              if frame < 1
                                    frame++
                              else
                                    frame=1
                              ok
                            ok
                            if x <= 0 x=0 ok
                            if y <= 0 y=0 ok
                            if x >= 750 x= 750 ok
                            if y > 550 y=550 ok
                      }
                    }
              }

              Sound {
                    file = "sound/music2.wav"
              }
            }
            if oGameState.startplay
              oGame.refresh()
              playstart(oGame)
              oGame.refresh()
            ok

      end

    func playstart oGame

      oGame {
            FPS = 60
            FixedFPS = 15
            Title = "Super Man 2016"
            Sprite {
              file = "images/supermancity.jpg"
              x = 0 y=0 width=800 height = 600 scaled = true animate = false
            }
            Map {
              blockwidth = 80
              blockheight = 80
              aMap = [
                      [0,0,0,4,4,4,0,0,0,1,0,0,0,1,4,4,0,1,0,0,0,0,4,4,0,1,4,
    4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,1,0,0,0,1,0,3,3,3,5,3,3,3,3,0],
                      [0,0,4,0,4,0,4,0,0,1,0,0,0,3,4,4,4,1,0,0,0,0,4,4,0,1,4,
    4,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,1,4,1,0,0,0,1,0,0,0,1,0,4,4,4,4,4,4,4,4,0],
                      [0,0,0,4,4,4,0,0,0,1,0,0,0,4,4,4,4,1,0,0,0,0,0,0,0,3,4,
    4,4,0,0,4,0,0,0,0,0,0,4,2,0,0,4,1,4,1,4,2,4,1,0,2,0,1,0,4,4,4,4,4,4,4,4,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
    0,0,0,0,4,4,4,4,4,4,4,4,1,0,0,4,1,4,1,4,1,4,1,0,1,0,1,0,2,2,2,2,2,2,2,2,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
    0,0,0,0,2,0,0,0,0,0,2,0,3,0,0,0,1,4,1,4,1,4,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,0,0,
    0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,4,3,4,1,4,3,0,1,0,3,0,1,0,0,0,0,0,0,0,0],
                      [0,0,2,0,0,2,0,0,2,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,
    0,0,0,0,1,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0],
                      [0,0,1,0,0,1,0,0,1,3,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,
    0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0]
                    ]
              aImages = ["images/smwall.png","images/smwallup.png",
                      "images/smwalldown.png","images/smstar.png",
                      "images/smkey.png","images/smstar2.png"]
            }

            sprite {
              type = ge_type_enemy
              animate = false
              file  = "images/smhome.png"
              x = 5000
              y = 400
              width = 290
              height = 200
              transparent = true

              state = func oGame,oSelf {
                    oself {
                      x = 5000 +  oGame.aObjects[2].x
                      if x < 0 or x > SCREEN_W return ok
                    }
                    if oGameState.gameresult or oGameState.DoorKey = false  return ok
                    if oGame.aObjects[oGameState.playerindex].x > oself.x + 100 and
                      oGame.aObjects[oGameState.playerindex].y > oself.y + 50
                      oGameState.gameresult = true
                      oGame {
                            sprite {
                              file = "images/smwin.jpg"
                              x=0 y=0 width=800 height=600
                              scaled = true animate=false
                              state = func ogame,oself {
                                    oself {
                                      x-=5
                                      y-=5
                                      width +=10
                                      height +=10
                                      if x = -300
                                            ogame.shutdown = true
                                      ok
                                    }
                              }
                            }
                      }
                    ok
              }

            }

            animate {
              file = "images/superman.png"
              x = 0
              y = 0
              framewidth = 60
              scaled = true
              height = 86
              width = 60
              nStep = 3
              transparent = true
              state = func oGame,oSelf {

                    checkstarskeycol(oGame,oSelf)

                    if not oGameState.playerwin
                            oself {
                              file = "images/superman.png"
                              height = 86
                              width = 60
                              for t=1 to 8
                                    if checkwall2(oGame,oSelf,0,5,[2,1])
                                      y += 5
                                    else
                                      exit
                                    ok
                              next
                              if y > 500 y=500 ok
                            }
                    ok

              }
              keypress = func ogame,oself,nKey {
                    if oGameState.gameresult = false

                      oself {
                            if nkey = key_up  and checkwall(oGame,oSelf,0,-40)
                              oGameState.value -= 1
                              checkgameover(oGame)
                              file = "images/supermanup.png"
                              height = 123
                              dotransparent()
                              y -= 40
                              oGameState.down = 10
                              if y<=0 y=0 ok
                            but nkey = key_down and checkwall(oGame,oSelf,0,40)
                              file = "images/supermandown.png"
                              dotransparent()
                              y += 40
                              if y>=500 y=500 ok
                            but nKey = key_right and checkwall(oGame,oSelf,10,0)
                              file = "images/supermanright.png"
                              dotransparent()
                              x += 10
                              if x >= 440
                                    if oGame.aObjects[2].x > -4500
                                      oGame.aObjects[2].x -= 50
                                      callenemystate(oGame)
                                    else
                                      if x <= 750
                                            if  checkwall(oGame,oSelf,10,0)
                                              x += 10
                                            ok
                                      else
                                            if  checkwall(oGame,oSelf,-10,0)
                                              x -= 10
                                            ok
                                      ok
                                      return
                                    ok
                                    x=400
                              ok
                            but nKey = key_left and checkwall(oGame,oSelf,-10,0)
                              file = "images/supermanleft.png"
                              dotransparent()
                              x -= 10
                              if x <= 0
                                    x += 10
                                    if oGame.aObjects[2].x != 0
                                      oGame.aObjects[2].x += 50
                                      callenemystate(oGame)
                                      x += 50
                                    ok
                              ok
                            but nkey = key_esc or nKey = GE_AC_BACK
                              ogame.shutdown()
                            ok
                      }
                    ok
              }
              mouse = func ogame,oself,nType,aMouseList {
                    if nType = GE_MOUSE_DOWN
                      oGameState.moveplayer = TRUE
                    But nType = GE_MOUSE_UP
                      oGameState.moveplayer = FALSE
                    ok
                    if oGameState.moveplayer = TRUE
                      if aMouseList[GE_MOUSE_X] < oSelf.X  # 左
                            cFunc = oself.keypress
                            call cFunc(oGame,oSelf,Key_left)
                      else
                            cFunc = oself.keypress
                            call cFunc(oGame,oSelf,Key_right)
                      ok
                      if aMouseList[GE_MOUSE_Y] < oSelf.Y  # 上
                            cFunc = oself.keypress
                            call cFunc(oGame,oSelf,Key_up)
                      else
                            cFunc = oself.keypress
                            call cFunc(oGame,oSelf,Key_down)
                      ok
                    ok
              }
            }

            addenemy(oGame,600)
            addenemy(oGame,900)
            addenemy(oGame,1550)
            addenemy(oGame,2350)
            addenemy(oGame,3350)
            addenemy(oGame,3500)
            addenemy(oGame,3670)
            addenemy(oGame,3840)

            text {
              animate = false
              point = 400
              size = 30
              file = "fonts/pirulen.ttf"
              text = "Score : " + oGameState.score
              x = 500  y=0
              state = func oGame,oSelf {
                    oSelf { text = "Score : " + oGameState.score }
              }
            }

            text {
              animate = false
              point = 400
              size = 30
              file = "fonts/pirulen.ttf"
              text = "Energy : " + oGameState.value
              x = 10  y=0
              state = func oGame,oSelf { oSelf { text = "Energy : " + oGameState.value } }
            }
      }

    func inlist nValue,aList
      for x in aList
            if x = nValue
              return true
            ok
      next
      return false

    func checkwall oGame,oself,diffx,diffy
      alist = [1,2,3]
      return checkwall2(oGame,oself,diffx,diffy,aList)

    func checkwall2 oGame,oself,diffx,diffy,aList
      xPos = oSelf.x + diffx
      yPos = oSelf.y + diffy
      nValue = oGame.aObjects[2].getvalue(xPos,yPos)
      nValue = inlist(nValue,aList)
      nValue = not nValue
      if nValue = 0 return nValue ok

      xPos = oSelf.x + diffx
      yPos = oSelf.y + diffy + oSelf.height
      nValue = oGame.aObjects[2].getvalue(xPos,yPos)
      nValue = inlist(nValue,aList)
      nValue = not nValue
      if nValue = 0 return nValue ok

      xPos = oSelf.x + diffx + oSelf.width
      yPos = oSelf.y + diffy
      nValue = oGame.aObjects[2].getvalue(xPos,yPos)
      nValue = inlist(nValue,aList)
      nValue = not nValue
      if nValue = 0 return nValue ok

      xPos = oSelf.x + diffx + oSelf.width
      yPos = oSelf.y + diffy + oSelf.height
      nValue = oGame.aObjects[2].getvalue(xPos,yPos)
      nValue = inlist(nValue,aList)
      nValue = not nValue
      if nValue = 0 return nValue ok

      return nValue

    func checkopenwall oGame
      if oGameState.score = 900
            oGame.aObjects[2].aMap[3][10] = 3
            oGame.aObjects[2].aMap[4][10] = 0
            oGame.aObjects[2].aMap[5][10] = 0
            oGame.aObjects[2].aMap[6][10] = 0
            oGame.aObjects[2].aMap[7][10] = 0
            oGame.aObjects[2].aMap[8][10] = 0
      but oGameState.score = 1800
            oGame.aObjects[2].aMap[3][18] = 3
            oGame.aObjects[2].aMap[4][18] = 0
            oGame.aObjects[2].aMap[5][18] = 0
            oGame.aObjects[2].aMap[6][18] = 0
            oGame.aObjects[2].aMap[7][18] = 0
            oGame.aObjects[2].aMap[8][18] = 0
      but oGameState.score = 5500
            oGame.aObjects[2].aMap[1][44] = 0
            oGame.aObjects[2].aMap[2][44] = 0
            oGame.aObjects[2].aMap[3][44] = 2
      ok

    func checkgameover ogame
      if oGameState.gameresult  return ok
      if oGameState.value <= 0
            oGameState.value = 0
            oGameState.gameresult = true
            oGame {
              text {
                    point = 400
                    size = 30
                    nStep = 9
                    file = "fonts/pirulen.ttf"
                    text = "Game Over !!!"
                    x = 500  y=10
                    state = func ogame,oself {
                      if oself.y >= 400
                            ogame.shutdown = true
                      ok
                    }
              }
            }
            showfire(oGame,oGame.aObjects[oGameState.PlayerIndex].x+40,
                     oGame.aObjects[oGameState.PlayerIndex].y+40)
            oGame.aObjects[oGameState.PlayerIndex].enabled = false
            oGame.remove(oGameState.PlayerIndex)
      ok

    func showfire oGame,nX,nY
      oGame {
            animate {
              file = "images/fire.png"
              x = nX
              y = nY
              framewidth = 40
              height = 42
              nStep = 3
              transparent = true
              state = func oGame,oSelf {
                    oSelf {
                      nStep--
                      if nStep = 0
                            nStep = 3
                            if frame < 13
                              frame++
                            else
                              frame=1
                              oGame.remove(oself.nIndex)
                            ok
                      ok
                    }
              }
            }
      }

    func addenemy oGame,xPos
      oGame {
            lbraceend = false
            sprite {
                    type = ge_type_enemy
                    file = "images/smenemy.png"
                    transparent = true
                    x = xPos y =10 width=100 height=100
                    animate=true Scaled=true
                    direction = GE_DIRECTION_NOMOVE
                    temp = xPos
                    state = func oGame,oSelf {
                      oself {
                            x = oSelf.temp +  oGame.aObjects[2].x
                            if y < 0 y = 0 ok
                            if y > 100 y=100 ok
                            if x > SCREEN_W or x < 0 return ok
                      }

                      if random(10) = 1
                            if oGameState.gameresult return ok
                            ogame {
                              sprite {
                                    type = ge_type_fire
                                    file  = "images/smrocket.png"
                                    scaled  = true
                                    transparent = true
                                    x = oself.x + 30
                                    y = oself.y + oself.height+ 30
                                    width = 30
                                    height = 30
                                    point = ogame.screen_h+30
                                    nstep = 30
                                    direction = ge_direction_incvertical
                                    xvalue =  oGame.aObjects[2].x
                                    temp = oself.x + 30 - xvalue
                                    state = func oGame,oSelf {
                                      oself { x = oSelf.temp +  oGame.aObjects[2].x  }
                                      x =  oGame.aObjects[oGameState.playerindex]
                                      if oself.x >= x.x and oself.y >= x.y and
                                             oself.x <= x.x + x.width and
                                             oself.y <= x.y + x.height
                                             if oGameState.value > 0
                                               oGameState.value-=1000
                                             ok
                                             ogame.remove(oself.nindex)
                                             checkgameover(oGame)
                                      ok
                                    }
                              }
                            }
                      ok
                    }
              }
      }
      ogame.lbraceend = true

    func checkstarskey oGame,oSelf,nValue,nRow,nCol
      switch nValue
            on 4
              oGame.aObjects[2].aMap[nRow][nCol] = 6
              oGameState.Score += 100
              checkopenwall(oGame)
              oGame { Sound {
                    once = true
                    file = "sound/sfx_point.wav"
              } }
            on 5
              oGame.aObjects[2].aMap[nRow][nCol] = 0
              oGameState.DoorKey = true
              oGameState.Score += 500
              checkopenwall(oGame)
              oGame { Sound {
                    once = true
                    file = "sound/sfx_point.wav"
              } }
      off

    func checkstarskeycol oGame,oSelf
      nValue = oGame.aObjects[2].getvalue(oSelf.x,oSelf.y)
      nRow = oGame.aObjects[2].getrow(oSelf.x,oSelf.y)
      nCol = oGame.aObjects[2].getcol(oSelf.x,oSelf.y)
      checkstarskey(oGame,oSelf,nValue,nRow,nCol)

      nValue = oGame.aObjects[2].getvalue(oSelf.x+oSelf.width,oSelf.y+oSelf.height)
      nRow = oGame.aObjects[2].getrow(oSelf.x+oSelf.width,oSelf.y+oSelf.height)
      nCol = oGame.aObjects[2].getcol(oSelf.x+oSelf.width,oSelf.y+oSelf.height)
      checkstarskey(oGame,oSelf,nValue,nRow,nCol)

      nValue = oGame.aObjects[2].getvalue(oSelf.x+oSelf.width,oSelf.y)
      nRow = oGame.aObjects[2].getrow(oSelf.x+oSelf.width,oSelf.y)
      nCol = oGame.aObjects[2].getcol(oSelf.x+oSelf.width,oSelf.y)
      checkstarskey(oGame,oSelf,nValue,nRow,nCol)

      nValue = oGame.aObjects[2].getvalue(oSelf.x,oSelf.y+oSelf.height)
      nRow = oGame.aObjects[2].getrow(oSelf.x,oSelf.y+oSelf.height)
      nCol = oGame.aObjects[2].getcol(oSelf.x,oSelf.y+oSelf.height)
      checkstarskey(oGame,oSelf,nValue,nRow,nCol)

    func callenemystate oGame
      for t in oGame.aObjects
            t {
              if type = GE_TYPE_ENEMY
                    call state(oGame,t)
              ok
            }
      next

    Class GameState

      down = 3
      gameresult = false
      Score = 0
      startplay=false
      lastcol = 0
      playerwin = false
      DoorKey = false
      playerindex = 4
      value = 1000
      moveplayer = false

スクリーンショット: