アクションつくってみる1

投稿者:Nyan mini rurun9 投稿日:2012/03/31 16:28

ハイ、こんにちわー。続きですよ~

爆走少女らんと同じで、記事を読んでる人はいても画像素材クリップ数が0w
こっそりスプライト素画像を差し替えたりもしちゃったり

前回はひとつしかない床より下に行かないようにy<=400の制限をつけてたけど、コレを床毎に位置大きさが異なる場合にも判定を調べるような処理をつくりたい

平らなら縦方向y位置が大きくならないように戻せば、それ以上宇宙人が下に落ちなくなる
同様に壁をつくるなら、横方向x位置がめり込まないように戻せば、壁に入らなくなる
つまりナナメ坂も同じ方法でめり込まないように戻せばいい!

という事で、ナナメ坂をステージ床に置く場合は、その置いた位置からy=ax+bの式を把握してこれより下に行かないようにy位置を戻せば良いだけ
流石に曲線にすると式が複雑で計算処理が重くなるだろうし、この衝突判定はループ1回毎に壁床パーツの数だけチェックする事になるので、あまり画面内設置数が多くても重くなると予想…
他に敵キャラや弾の衝突判定も行う事を考えると、要素を増やすほどゲームスピードが落ちて行くかも?

そこで、今回は超単純にする為にステージのスクロールはなし
1画面毎に表示を切り替えれば、スプライト数(衝突判定処理の数)を極力減らせるので、かなり自由に配置できる筈
宇宙人の動きに合わせて画面をスクロールさせないので、酔う事はないしスプライトカメラも不要なのでつくるのは簡単になる
…全部で何画面分のゲームになるかは未定

と方向性が決まった所で、ステージ作成に入ろうかと思ったけどその前に、ジャンプの高さを決めておこうかな~
チャプター1に書き足してクリックでジャンプできるようにしてみた
#◆◆◆chapter1
p=createArray(); p[0]=400; p[1]=300 #マウス位置用、最初は画面ド真ん中という事にしておく
anime=0 #アニメ用カウント
tama=0 #何番の弾を出すか
walk=true #歩いているか
dx=4; dy=0 #移動量


startInput() #入力受付
key=true
while key

while hasInput()
takeInput()

if isMouseMove()
 p=getMousePosition()
elsif isMouseDown() && walk #歩いてるときにクリックしたら、ジャンプ
 walk=false; dy=-24
elsif isKeyUp("ESC")
 key=false
end

end #hasInput終

dy=dy+2 #重力による自由落下
gv("y")[0]=gv("y")[0]+dy
if 400<gv("y")[0]
 gv("y")[0]=400; dy=0; walk=true
end

if p[0]<gv("x")[0]-32 #プレイヤーキャラ宇宙人の表示
 gv("x")[0]=gv("x")[0]-dx; gv("j")[0]=1 #左向き
 if gv("x")[0]<32+16
  gv("x")[0]=32+16 #画面端めり込み防止
 end
elsif gv("x")[0]+32<p[0]
 gv("x")[0]=gv("x")[0]+dx; gv("j")[0]=2 #右向き
 if 800-32-16<gv("x")[0]
  gv("x")[0]=800-32-16 #画面端めり込み防止
 end
else
 gv("j")[0]=0 #正面向き
end

anime=anime+1 #◆アニメカウントが一定になったら絵を切り替える
if anime==6
 setSpriteRect(gv("h")[0], 32,gv("j")[0]*32,32,32, -32,-32,64,64)
elsif anime==12
 setSpriteRect(gv("h")[0], 0,gv("j")[0]*32,32,32, -32,-32,64,64)
 anime=0; tama=tama+1 #一定の間隔で、自動で弾がひとつ出る
 if tama==5
  tama=1
 end
 if gv("j")[tama]==0 #今回の弾番号が出てない状態なら、位置と飛ぶ方向を決める
  gv("x")[tama]=gv("x")[0]; gv("y")[tama]=gv("y")[0]
  case gv("j")[0]
  when 0 gv("j")[tama]=3
  when 1 gv("j")[tama]=1
  when 2 gv("j")[tama]=2
  end #case終
 end
end

setSpritePosition(gv("h")[0], gv("x")[0], gv("y")[0]) #宇宙人位置更新

n=1
while n<=4 #◆弾位置更新
 case gv("j")[n]
 when 1 #左向き移動中
  gv("x")[n]=gv("x")[n]-12
  if gv("x")[n]<-32
   gv("j")[n]=0 #画面外に来たら出てない状態にする
  end
 when 2 #右向き移動中
  gv("x")[n]=gv("x")[n]+12
  if 832<gv("x")[n]
   gv("j")[n]=0 #画面外に来たら出てない状態にする
  end
 when 3 #上向き移動中
  gv("y")[n]=gv("y")[n]-12
  if gv("y")[n]<-32
   gv("j")[n]=0 #画面外に来たら出てない状態にする
  end
 end #case終
 setSpritePosition(gv("h")[n], gv("x")[n],gv("y")[n])
n=n+1
end
drawCanvas(); waitTime(20) #忘れずに入れる

end #keyループ終
endInput() #入力終


goBadEnding()
歩いているかフラグwalkを用意してコレがtrueの時だけジャンプ可能にする
自由落下の重力の大きさdy=dy+aと、ジャンプした瞬間にdyをマイナスいくつにするか、を調整するだけでジャンプの高さと滞空時間が決まるので、ココは後からいじる可能性も…
あれ?それじゃ何もしてなくね?

さて、ステージ作成しないと。
コレは少し考えて配置しないとゲームにならないので、時間かかると予想
全然作業が進んでない気がするけど今日はココまで

コメントする

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

コメント一覧

User icon mini 退会したユーザー(投稿日:2012/04/02 01:01, 履歴)
こういうところに数学で習った1次関数とかが活きてくるんですね。
Nyan mini rurun9(投稿日:2012/04/02 12:42, 履歴)
四角い床壁なら幅1,高さ1を拡大するだけなので
素材の床を▲にして、コレを拡大して置けば坂の傾きも調整できるかな~、と思って坂を導入する事に。
しかしステージ仕込みに激しく手間がかかる罠