CoRサンプル集: CoRでゲームをつくってみよう / 第04回
プレー:12
(人数:8)
クリア:0
評価: 0 (0回)
#---------------------------------------
#シューティングサンプルゲーム(新CoR)
#---------------------------------------
#_/_/_/_/_/_/ 外部ソースファイルの読み込み _/_/_/_/_/_/
#_/_/_/_/_/_/ グローバル変数の定義 _/_/_/_/_/_/
#_/_/_/_/_/_/ ユーザ関数の定義 _/_/_/_/_/_/
#オブジェクトのアニメーションを変更
def setChangeAnime(obj, old_anime, new_anime)
if old_anime != new_anime
obj.start_animation(new_anime)
end
return new_anime
end
#画像オブジェクトの透明度を設定
def setAlpha(obj, a)
wrk_obj = obj.instance_variable_get('@js_sprite')
wrk_obj.alpha = a
end
#********** startシーン ここから **********
scene 'start' do
#_/_/_/ ローカル変数の定義 _/_/_/
#キー入力用のフラグ
key_flg_up_st = nil; key_flg_up_do = nil; key_flg_up_en = nil
key_flg_down_st = nil; key_flg_down_do = nil; key_flg_down_en = nil
key_flg_left_st = nil; key_flg_left_do = nil; key_flg_left_en = nil
key_flg_right_st = nil; key_flg_right_do = nil; key_flg_right_en = nil
#メイン背景オブジェクト
obj_bg_00_spr = nil; obj_bg_01_spr = nil
obj_bg_pos_x = nil; obj_bg_pos_y = nil
obj_bg_speed = nil
#プレイヤーキャラクターオブジェクト
obj_char_spr = nil
obj_char_pos_x = nil; obj_char_pos_y = nil
obj_char_size_w = nil; obj_char_size_h = nil
obj_char_pos_x_old = nil; obj_char_pos_y_old = nil
obj_char_speed = nil
obj_char_speed_r_x = nil; obj_char_speed_r_y = nil
obj_char_w_max = nil; obj_char_h_max = nil
obj_char_hit_time = nil
obj_char_invincible_time = nil
obj_char_hit_x = nil; obj_char_hit_y = nil
obj_char_hit_w = nil; obj_char_hit_h = nil
obj_char_anime = nil
obj_char_flg_up = nil; obj_char_flg_down = nil
obj_char_flg_left = nil; obj_char_flg_right = nil
#敵キャラクターオブジェクト
obj_enemy_spr = []
obj_enemy_pos_x = []; obj_enemy_pos_y = []
obj_enemy_size_w = nil; obj_enemy_size_h = nil
obj_enemy_speed = nil; obj_enemy_speed_rnd = nil
obj_enemy_pos_x_old = []; obj_enemy_pos_y_old = []
obj_enemy_speed_r_x = []; obj_enemy_speed_r_y = []
obj_enemy_w_max = nil; obj_enemy_h_max = nil
obj_enemy_hit_x = nil; obj_enemy_hit_y = nil
obj_enemy_hit_w = nil; obj_enemy_hit_h = nil
obj_enemy_anime = []
obj_enemy_max = nil
obj_enemy_next = nil
obj_enemy_next_rnd = nil
obj_enemy_next_time = nil
preload do
#----- ゲームロード時に実行される処理 -----
#_/_/_/ 素材のロード _/_/_/
#メイン背景
image 'img_bg_00', id: 76800
#プレイヤーキャラクター
image 'img_char', id: 76793, frame_size: [64, 64]
#敵キャラクター
image 'img_enemy', id: 77127, frame_size: [64, 64]
end
create do
#----- シーンロード時に実行される処理 -----
#_/_/_/ 変数の初期化 _/_/_/
#キー入力用のフラグ
key_flg_up_st = false; key_flg_up_do = false; key_flg_up_en = false
key_flg_down_st = false; key_flg_down_do = false; key_flg_down_en = false
key_flg_left_st = false; key_flg_left_do = false; key_flg_left_en = false
key_flg_right_st = false; key_flg_right_do = false; key_flg_right_en = false
#メイン背景オブジェクト
obj_bg_pos_x = 0; obj_bg_pos_y = 0
obj_bg_speed = 1.5
#プレイヤーキャラクターオブジェクト
obj_char_size_w = 64; obj_char_size_h = 64
obj_char_pos_x = (800 - obj_char_size_w) / 2; obj_char_pos_y = 500
obj_char_pos_x_old = obj_char_pos_x; obj_char_pos_y_old = obj_char_pos_y
obj_char_speed = 5
wrk_r = 45 * Math::PI / 180
obj_char_speed_r_x = Math.cos(wrk_r) * obj_char_speed
obj_char_speed_r_y = Math.sin(wrk_r) * obj_char_speed
obj_char_w_max = (800 - obj_char_size_w)
obj_char_h_max = (600 - obj_char_size_h)
obj_char_hit_time = (-1)
obj_char_invincible_time = (60 * 2)
obj_char_hit_x = 25; obj_char_hit_y = 20
obj_char_hit_w = 39; obj_char_hit_h = 50
obj_char_anime = 'neutral'
obj_char_flg_up = false; obj_char_flg_down = false
obj_char_flg_left = false; obj_char_flg_right = false
#敵キャラクターオブジェクト
obj_enemy_size_w = 64; obj_enemy_size_h = 64
obj_enemy_w_max = (800 - obj_enemy_size_w)
obj_enemy_h_max = (600 + obj_enemy_size_h)
obj_enemy_speed = 3; obj_enemy_speed_rnd = 2
obj_enemy_hit_x = 20; obj_enemy_hit_y = 20
obj_enemy_hit_w = 44; obj_enemy_hit_h = 55
obj_enemy_max = 5
obj_enemy_next = (60 * 4)
obj_enemy_next_rnd = 60
obj_enemy_next_time = (60 * 3)
i = 0; ilen = obj_enemy_max
while i < ilen do
obj_enemy_pos_x[i] = 0; obj_enemy_pos_y[i] = ((-64) * 2)
obj_enemy_pos_x_old[i] = obj_enemy_pos_x[i]
obj_enemy_pos_y_old[i] = obj_enemy_pos_y[i]
obj_enemy_speed_r_x[i] = 0; obj_enemy_speed_r_y[i] = 0
obj_enemy_anime[i] = 'wait'
i += 1
end
#_/_/_/ 素材の初期化 _/_/_/
#メイン背景
obj_bg_00_spr = put_sprite 'spr_bg_00' do
position obj_bg_pos_x, obj_bg_pos_y
src_rect 0, 0, 800, 600
end
obj_bg_01_spr = put_sprite 'spr_bg_00' do
position obj_bg_pos_x, (obj_bg_pos_y - 600)
src_rect 0, 0, 800, 600
end
#プレイヤーキャラクター
obj_char_spr = put_sprite 'spr_char' do
position obj_char_pos_x, obj_char_pos_y
frame_index 0
end
#アニメーションの開始
obj_char_spr.start_animation('neutral')
#敵キャラクター
i = 0; ilen = obj_enemy_max
while i < ilen do
obj_enemy_spr[i] = put_sprite 'spr_enemy' do
position obj_enemy_pos_x[i], obj_enemy_pos_y[i]
frame_index 0
end
#アニメーションの開始
obj_enemy_spr[i].start_animation('wait')
i += 1
end
end
update do
#----- シーンのメインループ処理 -----
#_/_/_/ 入力の判定 _/_/_/
#キー入力判定
if keyboard.down?('UP')
key_flg_up_st = true
else
key_flg_up_st = false
key_flg_up_do = false
end
if keyboard.down?('DOWN')
key_flg_down_st = true
else
key_flg_down_st = false
key_flg_down_do = false
end
if keyboard.down?('LEFT')
key_flg_left_st = true
else
key_flg_left_st = false
key_flg_left_do = false
end
if keyboard.down?('RIGHT')
key_flg_right_st = true
else
key_flg_right_st = false
key_flg_right_do = false
end
#_/_/_/ メイン処理 _/_/_/
#--- キー入力処理 ---
#上
if (key_flg_up_st && !key_flg_up_do)
key_flg_up_do = true
#--- 押された時に実行する処理 ---
obj_char_flg_up = true
elsif key_flg_up_do
key_flg_up_en = true
#--- 押されつづけている時に実行する処理 ---
obj_char_flg_up = true
elsif key_flg_up_en
key_flg_up_en = false
#--- 離された時に実行する処理 ---
obj_char_flg_up = false
end
#下
if (key_flg_down_st && !key_flg_down_do)
key_flg_down_do = true
#--- 押された時に実行する処理 ---
obj_char_flg_down = true
elsif key_flg_down_do
key_flg_down_en = true
#--- 押されつづけている時に実行する処理 ---
obj_char_flg_down = true
elsif key_flg_down_en
key_flg_down_en = false
#--- 離された時に実行する処理 ---
obj_char_flg_down = false
end
#左
if (key_flg_left_st && !key_flg_left_do)
key_flg_left_do = true
#--- 押された時に実行する処理 ---
obj_char_flg_left = true
elsif key_flg_left_do
key_flg_left_en = true
#--- 押されつづけている時に実行する処理 ---
obj_char_flg_left = true
elsif key_flg_left_en
key_flg_left_en = false
#--- 離された時に実行する処理 ---
obj_char_flg_left = false
end
#右
if (key_flg_right_st && !key_flg_right_do)
key_flg_right_do = true
#--- 押された時に実行する処理 ---
obj_char_flg_right = true
elsif key_flg_right_do
key_flg_right_en = true
#--- 押されつづけている時に実行する処理 ---
obj_char_flg_right = true
elsif key_flg_right_en
key_flg_right_en = false
#--- 離された時に実行する処理 ---
obj_char_flg_right = false
end
#--- プレイヤーキャラクター ---
#プレイヤーキャラクター移動方向のフラグによって処理を分岐
if (obj_char_flg_up && obj_char_flg_left)
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'left')
#プレイヤーキャラクターの座標を変更
obj_char_pos_x -= obj_char_speed_r_x; obj_char_pos_y -= obj_char_speed_r_y
elsif (obj_char_flg_down && obj_char_flg_left)
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'left')
#プレイヤーキャラクターの座標を変更
obj_char_pos_x -= obj_char_speed_r_x; obj_char_pos_y += obj_char_speed_r_y
elsif (obj_char_flg_up && obj_char_flg_right)
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'right')
#プレイヤーキャラクターの座標を変更
obj_char_pos_x += obj_char_speed_r_x; obj_char_pos_y -= obj_char_speed_r_y
elsif (obj_char_flg_down && obj_char_flg_right)
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'right')
#プレイヤーキャラクターの座標を変更
obj_char_pos_x += obj_char_speed_r_x; obj_char_pos_y += obj_char_speed_r_y
elsif obj_char_flg_up
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'neutral')
#プレイヤーキャラクターの座標を変更
obj_char_pos_y -= obj_char_speed
elsif obj_char_flg_down
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'neutral')
#プレイヤーキャラクターの座標を変更
obj_char_pos_y += obj_char_speed
elsif obj_char_flg_left
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'left')
#プレイヤーキャラクターの座標を変更
obj_char_pos_x -= obj_char_speed
elsif obj_char_flg_right
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'right')
#プレイヤーキャラクターの座標を変更
obj_char_pos_x += obj_char_speed
else
#プレイヤーキャラクターのアニメーションを変更
obj_char_anime = setChangeAnime(obj_char_spr, obj_char_anime, 'neutral')
end
#プレイヤーキャラクターの移動範囲制限
if obj_char_pos_x < 0
obj_char_pos_x = 0
end
if obj_char_pos_x > obj_char_w_max
obj_char_pos_x = obj_char_w_max
end
if obj_char_pos_y < 0
obj_char_pos_y = 0
end
if obj_char_pos_y > obj_char_h_max
obj_char_pos_y = obj_char_h_max
end
#プレイヤーキャラクターのオブジェクトを移動する
if (obj_char_pos_x_old != obj_char_pos_x) ||
(obj_char_pos_y_old != obj_char_pos_y)
obj_char_pos_x_old = obj_char_pos_x
obj_char_pos_y_old = obj_char_pos_y
obj_char_spr.position obj_char_pos_x, obj_char_pos_y
end
#プレイヤーキャラクターの無敵時間をカウント
if obj_char_hit_time > (-1)
obj_char_hit_time -= 1
#無敵時間の場合プレイヤーキャラクターを点滅表示する
if obj_char_hit_time == 0
setAlpha(obj_char_spr, 1)
elsif ((obj_char_hit_time % 10) == 0)
setAlpha(obj_char_spr, 1)
elsif ((obj_char_hit_time % 5) == 0)
setAlpha(obj_char_spr, 0)
elsif ((obj_char_hit_time % 3) == 0)
setAlpha(obj_char_spr, 0.5)
end
end
#--- 敵キャラクター ---
#敵キャラクターの出現カウントダウン
obj_enemy_next_time -= 1
#カウントダウンが0以下になったら敵を出現させる
if obj_enemy_next_time < 0
obj_enemy_next_time = obj_enemy_next + rand(obj_enemy_next_rnd)
i = 0; ilen = obj_enemy_max
while i < ilen do
#待機状態の敵キャラクターを探す
if obj_enemy_anime[i] == 'wait'
#敵キャラクターを行動状態にする
obj_enemy_pos_x[i] = rand(obj_enemy_w_max)
obj_enemy_pos_y[i] = (obj_enemy_size_h * (-2))
obj_enemy_speed_r_x[i] = obj_enemy_speed * (1 + ((-2) * rand(1)))
obj_enemy_speed_r_y[i] = obj_enemy_speed - obj_enemy_speed_rnd + rand(obj_enemy_speed_rnd)
#アニメーションの開始
obj_enemy_anime[i] = setChangeAnime(obj_enemy_spr[i], obj_enemy_anime[i], 'move')
#ループを終了させる
i = ilen
end
i += 1
end
end
#敵キャラクターの行動ループ
i = 0; ilen = obj_enemy_max
while i < ilen do
#移動状態の敵キャラクターを探す
if obj_enemy_anime[i] == 'move'
#敵キャラクターの座標値を移動させる
obj_enemy_pos_x[i] += obj_enemy_speed_r_x[i]
obj_enemy_pos_y[i] += obj_enemy_speed_r_y[i]
#敵キャラクターの移動範囲制限
if obj_enemy_pos_x[i] < 0
obj_enemy_pos_x[i] = 0
#移動方向を反転させる
obj_enemy_speed_r_x[i] = obj_enemy_speed_r_x[i] * (-1)
end
if obj_enemy_pos_x[i] > obj_enemy_w_max
obj_enemy_pos_x[i] = obj_enemy_w_max
#移動方向を反転させる
obj_enemy_speed_r_x[i] = obj_enemy_speed_r_x[i] * (-1)
end
if obj_enemy_pos_y[i] > obj_enemy_h_max
#画面外まで移動したら待機状態に戻す
obj_enemy_anime[i] = setChangeAnime(obj_enemy_spr[i], obj_enemy_anime[i], 'wait')
obj_enemy_speed_r_x[i] = 0; obj_enemy_speed_r_y[i] = 0
end
#敵キャラクターのオブジェクトを移動する
if (obj_enemy_pos_x_old[i] != obj_enemy_pos_x[i]) ||
(obj_enemy_pos_y_old[i] != obj_enemy_pos_y[i])
obj_enemy_pos_x_old[i] = obj_enemy_pos_x[i]
obj_enemy_pos_y_old[i] = obj_enemy_pos_y[i]
obj_enemy_spr[i].position obj_enemy_pos_x[i], obj_enemy_pos_y[i]
end
#プレイヤーキャラクターとの当たり判定
if (obj_char_hit_time < 0) &&
((obj_char_pos_x + obj_char_hit_x) < (obj_enemy_pos_x_old[i] + obj_enemy_hit_w)) &&
((obj_char_pos_x + obj_char_hit_w) > (obj_enemy_pos_x_old[i] + obj_enemy_hit_x)) &&
((obj_char_pos_y + obj_char_hit_y) < (obj_enemy_pos_y_old[i] + obj_enemy_hit_h)) &&
((obj_char_pos_y + obj_char_hit_h) > (obj_enemy_pos_y_old[i] + obj_enemy_hit_y))
#プレイヤーキャラクターに無敵時間を設定
obj_char_hit_time = obj_char_invincible_time
end
end
i += 1
end
#--- 背景 ---
#背景のスクロール
obj_bg_pos_y += obj_bg_speed
#背景のスクロールをループさせる
if obj_bg_pos_y > 600
obj_bg_pos_y -= 600
end
#背景のオブジェクトを移動する
obj_bg_00_spr.position obj_bg_pos_x, obj_bg_pos_y
obj_bg_01_spr.position obj_bg_pos_x, (obj_bg_pos_y - 600)
end
render do
#----- シーンのメイン描画処理 -----
#_/_/_/ 描画の変更 _/_/_/
end
end
#********** startシーン ここまで **********
#_/_/_/_/_/_/ 素材の定義 _/_/_/_/_/_/
#メイン背景
sprite 'spr_bg_00' do
image 'img_bg_00'
origin :left_top
end
#プレイヤーキャラクター
sprite 'spr_char' do
image 'img_char'
origin :left_top
animation 'neutral', [0, 3], 10, true
animation 'left', [1, 4], 10, true
animation 'right', [2, 5], 10, true
end
#敵キャラクター
sprite 'spr_enemy' do
image 'img_enemy'
origin :left_top
animation 'wait', [0], 60, true
animation 'move', [0, 1, 2, 1], 10, true
animation 'damage', [3], 60, true
end
#_/_/_/_/_/_/ ゲームロード後最初のシーンを開始する _/_/_/_/_/_/
start_scene 'start'
コード一覧
- start.rb
プレー内容を公開する
プレー履歴
プレー履歴はありません。
新着レビュー
レビューはまだ投稿されていません。 作品の感想を作者に伝えるためにレビューを投稿してみませんか?
フォロー/シェア