スクリプト/つくってみよう2-2

最終投稿者:Nyan mini rurun9 更新:2014/01/15 12:08:14
爆走少女らん】を作っています。
スクリプト/つくってみよう2-1 からのつづき。

チャプター1
def anime() #◆◆◆◆◆各キャラをアニメさせる処理◆◆◆◆◆

 girl=0; inu=1; suika=2  #キャラ番号の指定

 case gv("a") #2枚の絵を交互に表示させるためのアニメカウント
 when 0 sv("a",1)
 when 1 sv("a",0)
 end

 if gv("hit") #ぶつかっている場合はダメージ絵にする
  setSpriteRect(gv("h")[girl], 200,300,100,100, -100,-100,200,200)
 elsif #そうでなければ、アニメする
  setSpriteRect(gv("h")[girl], gv("a")*100,300,100,100, -100,-100,200,200)
 end

 setSpriteRect(gv("h")[inu], gv("a")*40+300,300,40,40, -50,-50,100,100) #犬

 n=1
 while n<=2
  gv("x")[n]=gv("x")[n]-gv("s")[n] #犬とスイカの x 位置を速さ s だけ左に進める
  if gv("x")[n]<-100 #画面左端から消えたら、右に出直し&速さをランダムで再設定
   gv("x")[n]=900; gv("s")[n]=rand(64)+8
   if n==suika #スイカの場合は y 位置もランダム再設定
    getVariable("y")[suika]=rand(350)+100
   end
  end
  #位置(x,y)は100*100サイズのキャラのド真ん中の位置を表しているので、スプライト左上角は(x-50,y-50)に置くべき
  #これに加えて回転中心の座標ズレを修正するため、(x-50+50, y-50+50)に置くと丁度良くなる
  setSpritePosition(gv("h")[n], gv("x")[n],gv("y")[n])
 n=n+1
 end

 #スイカは1/16回転ずつ、反時計回りに回転させる。s[3]に何段階目かを入れている
 gv("s")[3]=gv("s")[3]-1
 if gv("s")[3]<-15
  gv("s")[3]=0
 end
 setSpriteRotation(gv("h")[suika], gv("s")[3]*0.3925) #2*3.14/16=0.3925

end #anime()終


def life(n) #◆◆◆◆◆犬またはスイカに衝突していたら、ライフの赤い棒を短くする処理◆◆◆◆◆

 gv("s")[0]=gv("s")[0]-n #残りライフ値s[0]を減らす
 if gv("s")[0]<0 #ライフが無くなったらゲームオーバー
  goBadEnding()
 end #スタート時の最大値800の時が800/800=1倍、つまり減った分だけ横幅が短くなる
 setSpriteScale(gv("h")[6], gv("s")[0]/800,1)

end #life()終


def bg() #◆◆◆◆◆背景をスクロールさせる処理◆◆◆◆◆
 #横3200のうち画面に見えている幅は800、それを少しずつ左にずらしていく
 #素パーツの左端と右端の一画面分が全く同じ柄にしてあるので、いちばん右端に到達したら左端に戻すだけ
 gv("x")[3]=gv("x")[3]-6
 if gv("x")[3]<-2400
  gv("x")[3]=0
 end
 setSpritePosition(gv("h")[3], gv("x")[3],0) #空

 gv("x")[4]=gv("x")[4]-10
 if gv("x")[4]<-2400
  gv("x")[4]=0
 end
 setSpritePosition(gv("h")[4], gv("x")[4],0) #家

end #bg()終


def atari() #◆◆◆◆◆犬とスイカの衝突判定の処理◆◆◆◆◆

 girl=0; inu=1; suika=2  #キャラ番号の指定
 sv("hit",false) #当たっていない状態

 #表示上は 女200*200, 犬100*100, それぞれ位置(x,y)が「表示画像のド真ん中」になるように置いてある
 if 300<=gv("y")[girl] #犬と衝突するのは、高さが地面y=250付近でのみ
  if gv("x")[girl]-50<gv("x")[inu] && gv("x")[inu]<gv("x")[girl]+50
   sv("hit",true); life(10) #当たった状態にして、ライフを削る
  end
 end

 #スイカとの衝突は縦横位置両方でめり込んでるかどうか調べる
 if gv("y")[girl]-80<gv("y")[suika] && gv("y")[suika]<gv("y")[girl]+80
  if gv("x")[girl]-50<gv("x")[suika] && gv("x")[suika]<gv("x")[girl]+50
   sv("hit",true); life(8) #当たり易いスイカの方が、ほんのり優しい
  end
 end

end #atari()終
ユーザー定義関数で各処理をつくっています。
敢えて処理毎にユーザー定義関数で分けるのは、次のキー入力等のチャプターをスッキリさせる事&後から変更調整したい内容が項目毎にまとまっている形になるから、です。
チャプターをまたぐのでローカル変数だけでは動かないとか、実は全体的な処理が遅くなるとか、問題もありますが今回はこんな感じでやってます。

anime()は女、犬、スイカの3キャラを表示し直す処理です。
女と犬は2パターンずつあるので、コレを交互に表示させるためRectで絵を切り替えます。
しかし、女は衝突中は強制的にダメージポーズにしたいので、変数hitで分岐させています。
ついでに犬とスイカを左へ進めておきます。
スイカは1/16回転ずつ転がす為にs[3]=0~15から角度のラジアンを計算しています。

life()は赤いライフゲージを横方向に縮小させる処理です。
カラクリとしては、初期800から減った分だけ倍率が小さくなる、というだけですね。

bg()は見ての通り、スクロールする背景もスクリプトは物凄く簡単な事がわかると思います。

atari()の衝突判定の方は、単純に座標を比較しているだけです。
位置(x,y)が各スプライトのド真ん中なので、絵的に重なっている程度の範囲に調整します。
これを広くするか狭くするかで難易度が変わってくる事になります。

つづく⇒ スクリプト/つくってみよう2-3 爆走少女らんchap2

スクリプト/つくってみよう0 基礎
スクリプト/つくってみよう1 配列
スクリプト/つくってみよう2-0 キー入力とスプライト
スクリプト/つくってみよう2-1 爆走少女らんchap0

コメントする

コメントするには、ログインする必要があります。

コメント一覧

コメントはありません。