アクションつくってみる2
投稿者:
rurun9
投稿日:2012/04/11 23:50
ハイ、こんにちわー。
前回から日が経ってしまい、既に勢いさえも無くなった感がありますががが。
えーとステージの作成方法を効率的にしつつ、床や壁となるブロックとの衝突判定をつける、という所まで進めてみました。
全体的に激変しているのですが、とりあえず全スクリプトはこちら
どこに配置するかわからないブロックの衝突判定の為、端の座標がいくつか、を上下左右管理する事に。
尚、多次元配列は処理が少し重くなる事を踏まえて使わない方向で…
ユーザー定義関数登場。
makeblock()でスプライト作成と上下左右の端の座標を一気に決定するので、ブロック配置は単純にしてみたつもり。
尚、この端がいくつか、という方法だとナナメ坂の衝突判定をとるのが難しい為に、坂は無しw
衝突判定といっても、現在位置からどっちがわが壁になってるかどうか、を調べるだけの処理
めり込み防止には各方向について2点で判断すべきなんだろうけど、当初は地形に坂を入れる予定があった為に、足元が1点で判定…4方向全部1点でいいや、と。
初期値をセットするだけなのでココはコレだけ
と、いう事で真上撃ちは廃止
ブロックに乗れるようになるとアクションな感じがしてくるね!
つーか、この段階で処理が激重なんですけど…まだ弾の衝突判定もしてないのに…
Windows_Vistaの力はこんなものなのかッ
7だと軽~く動いたものの、ちょっと設計を見直そうかと思ったりなんかして。。。
そろそろ行数も増えてきた挙句の俺ルールが謎過ぎて、読むだけではサッパリ理解不能な域に突入です
それでもコピペして実際に動くのを確認すると「お、進んだな」てなる筈
ともかく今日はこの辺で。
ツイート
前回から日が経ってしまい、既に勢いさえも無くなった感がありますががが。
えーとステージの作成方法を効率的にしつつ、床や壁となるブロックとの衝突判定をつける、という所まで進めてみました。
全体的に激変しているのですが、とりあえず全スクリプトはこちら
#chapter0
setVariable("e",118038) #スプライト用の素画像番号
def sv(a,b)
setVariable(a,b)
end
def gv(a)
return getVariable(a)
end
sv("x",createArray()); sv("y",createArray()) #スプライトの位置(x,y)
sv("j",createArray()) #スプライトの状態、向きや種類の番号を入れる
sv("a",createArray()); sv("b",createArray()) #スプライトの上端、下端
sv("c",createArray()); sv("d",createArray()) #スプライトの左端、右端
sv("dx",createArray()); sv("dy",createArray()) #スプライトの移動量(dx,dy)
sv("stage",0) #何画面目か
#◆スプライトの作成
deleteAllSprite(); drawCanvas() #最初に使う前にキャンバスをキレイにしておく
sv("h",createArray()) #スプライト表示番号 0=宇宙人, 1~4=弾, 5=敵, 6~9=敵弾, 10~19=床など
n=0
while n<20
gv("h")[n]=createSprite(gv("e"))
n=n+1
end
setSpriteRect(gv("h")[0], 0,0,32,32, -32,-32,64,64) #宇宙人
setSpriteZOrder(gv("h")[0], 2)
setSpriteRect(gv("h")[5], 64,0,32,32, -32,-32,64,64) #敵
setSpriteZOrder(gv("h")[5], 4)
n=1
while n<=4
setSpriteRect(gv("h")[n], 0,96,32,32, -16,-16,32,32) #弾
setSpriteZOrder(gv("h")[n], 1)
setSpriteRect(gv("h")[n+5], 32,96,32,32, -16,-16,32,32) #敵弾
setSpriteZOrder(gv("h")[n+5], 3)
n=n+1
end
尚、多次元配列は処理が少し重くなる事を踏まえて使わない方向で…
#setstageチャプター
def makeblock( i, j, w,h, x,y)
# i=何番のスプライトか10~19, j=ブロックの種類番号, w=表示幅, h=表示高さ, 位置(x,y)
gv("j")[i]=j #種類をセット
case j
when 0 #固定の緑色
setSpriteRect(gv("h")[i], 96,96,1,1, 0,0,w,h)
gv("dx")[i]=0; gv("dy")[i]=0
when 1 #移動式の土色
setSpriteRect(gv("h")[i], 48,102,1,1, 0,0,w,h)
#移動式はdx,dyを個別に設定する
end
gv("x")[i]=x; gv("y")[i]=y
gv("a")[i]=y; gv("b")[i]=y+h; gv("c")[i]=x; gv("d")[i]=x+w # a=上端, b=下端, c=左端, d=右端
end #makeblock()終
def setstage() #画面切り替え時にステージ床&壁&敵を配置する処理
setCanvasVisible(false) #一度、全スプライトを見えなくする
n=0
while n<=4
gv("x")[n]=0; gv("y")[n]=640 #弾は最初、見えない位置に置く
gv("j")[n]=0 #弾は出てない状態にする
gv("dx")[n]=0; gv("dy")[n]=0 #宇宙人と弾の初期移動量は(0,0)
gv("x")[n+5]=0; gv("y")[n+5]=640 #敵弾も見えない位置に
gv("j")[n+5]=0 #敵弾出てない状態に
n=n+1
end
gv("j")[0]=2 #宇宙人は右向きでスタート
case gv("stage")
when 0
sv("max",14)
makeblock(10, 0, 800,100, 0,500) #床
makeblock(11, 0, 80,500, 0,0) #左の壁
makeblock(12, 0, 80,500, 720,0) #右の壁
makeblock(13, 0, 100,32, 460,380)
makeblock(14, 1, 200,32, 200,320); gv("dx")[14]=0; gv("dy")[14]=0
end #case stage終
n=0
while n<=gv("max")
setSpritePosition(gv("h")[n], gv("x")[n],gv("y")[n]) #スプライト全てを位置(x,y)に配置
n=n+1
end
drawCanvas() #スプライトを載せたキャンバスを更新
setCanvasVisible(true) #【重要】キャンバスを見えるようにしている
end #setstage()終
makeblock()でスプライト作成と上下左右の端の座標を一気に決定するので、ブロック配置は単純にしてみたつもり。
尚、この端がいくつか、という方法だとナナメ坂の衝突判定をとるのが難しい為に、坂は無しw
#wallcheckチャプター
def wallcheck(i) # i 番のキャラと床や壁との衝突判定
#結果をwx,wyに入れる
# wx 0=壁に接していない, -1=左壁に接している, 1=右壁に接している
# wy 0=床天井に接していない, -1=天井に接している, 1=床に接している(ジャンプが可能)
x=gv("x")[i]+gv("dx")[i]; y=gv("y")[i]+gv("dy")[i]
sv("wx",0); sv("wy",0)
n=10 #10~maxまでの床パーツの数だけ確認
while n<=gv("max")
if gv("a")[n]<y+32 && y+32<gv("b")[n] && gv("c")[n]<x && x<gv("d")[n] #下側の判定
sv("wy",1)
elsif gv("a")[n]<y-16 && y-16<gv("b")[n] && gv("c")[n]<x && x<gv("d")[n] #上側の判定
sv("wy",-1)
elsif gv("a")[n]<y && y<gv("b")[n] && gv("c")[n]<x+4 && x+4<gv("d")[n] #右側の判定
sv("wx",1)
elsif gv("a")[n]<y && y<gv("b")[n] && gv("c")[n]<x-4 && x-4<gv("d")[n] #左側の判定
sv("wx",-1)
end
n=n+1
end
end #wallcheck()終
めり込み防止には各方向について2点で判断すべきなんだろうけど、当初は地形に坂を入れる予定があった為に、足元が1点で判定…4方向全部1点でいいや、と。
#chapter1
setstage() #ステージを作成&設置
gv("x")[0]=100; gv("y")[0]=100 #ゲーム開始時のステージ0内の宇宙人初期位置
speak("stage ",gv("stage"))
#chapter2
z=createText(0,0,800,600)
p=createArray(); p[0]=400; p[1]=300 #マウス位置用、最初は画面ド真ん中という事にしておく
anime=0 #アニメ用カウント
tama=0 #何番の弾を出すか
startInput() #入力受付
key=true
while key
while hasInput()
takeInput()
if isMouseMove()
p=getMousePosition()
elsif isMouseDown() && gv("wy")==1 #歩いてるときにクリックしたら、ジャンプ
gv("dy")[0]=-24
elsif isKeyUp("ESC")
key=false
end
end #hasInput終
gv("dy")[0]=gv("dy")[0]+2 #重力による自由落下
if p[0]<gv("x")[0]-32 #プレイヤーキャラ宇宙人の横移動
gv("dx")[0]=-4; gv("j")[0]=1 #左向き
elsif gv("x")[0]+32<p[0]
gv("dx")[0]=4; gv("j")[0]=2 #右向き
else
gv("dx")[0]=0
end
wallcheck( 0 ) #宇宙人と、床壁との衝突判定
# wy 0=上下に床天井がない状態, 1=床に接している, -1=天井に接している
# wx 0=左右に壁がない状態, 1=右壁に接している, -1=左壁に接している
if gv("wx")==-1 && gv("dx")[0]<0
gv("dx")[0]=0
elsif gv("wx")==1 && 0<gv("dx")[0]
gv("dx")[0]=0
end
if gv("wy")==-1 && gv("dy")[0]<0
gv("dy")[0]=0
elsif gv("wy")==1 && 0<gv("dy")[0]
gv("dy")[0]=0
end
gv("x")[0]=gv("x")[0]+gv("dx")[0]; gv("y")[0]=gv("y")[0]+gv("dy")[0] #座標の更新
if 800<gv("y")[0] #もしもの壁抜けに対応
speak("画面外に落ちた"); gv("x")[0]=100; gv("y")[0]=-100
end
anime=anime+1 #◆アニメカウントが一定になったら絵を切り替える
if anime==6
if gv("dx")[0]==0 #横移動してたらそっちを向く
m=0
elsif gv("dx")[0]<0
m=32
else #0<gv("dx")[0]
m=64
end
setSpriteRect(gv("h")[0], 32,m,32,32, -32,-32,64,64)
elsif anime==12
if gv("dx")[0]==0 #横移動してないときは正面向き
mm=0
elsif gv("dx")[0]<0 #横移動してたらそっちを向く
m=32
else #0<gv("dx")[0]
m=64
end
setSpriteRect(gv("h")[0], 0,m,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 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]<-40
gv("j")[n]=0 #画面外に来たら出てない状態にする
end
when 2 #右向き移動中
gv("x")[n]=gv("x")[n]+12
if 840<gv("x")[n]
gv("j")[n]=0 #画面外に来たら出てない状態にする
end
end #case終
setSpritePosition(gv("h")[n], gv("x")[n],gv("y")[n])
n=n+1
end
setText(z, "wx=",gv("wx"),"\nwy=",gv("wy"),"\n\nx0=",gv("x")[0],"\ny0=",gv("y")[0] )
drawCanvas(); waitTime(20) #忘れずに入れる
end #keyループ終
endInput() #入力終
goBadEnding()
ブロックに乗れるようになるとアクションな感じがしてくるね!
つーか、この段階で処理が激重なんですけど…まだ弾の衝突判定もしてないのに…
Windows_Vistaの力はこんなものなのかッ
7だと軽~く動いたものの、ちょっと設計を見直そうかと思ったりなんかして。。。
そろそろ行数も増えてきた挙句の俺ルールが謎過ぎて、読むだけではサッパリ理解不能な域に突入です
それでもコピペして実際に動くのを確認すると「お、進んだな」てなる筈
ともかく今日はこの辺で。
コメントする
コメントするには、ログインする必要があります。
コメント一覧
コメントはありません。