|
[Ver0.03]
・index2に隣り合うブロックがくっつくバージョンを用意。
・ゲームオーバー時に画面のブロックが邪魔ブロックに変化するように
・バグ修正06-06-24 22:43 by
ラディ
|
|
バグ多数発見。
(マップ縦横を変更すると拡張したところが表示されないバグ(flame))
↓修正
function onBeforeMove() {
//ブロック表示
for (yy=1;yy<=$rows;yy++) {
for (xx=1;xx<=$cols;xx++) {
//drawDxSpriteなので回転・拡大縮小・半透明表示など動きのあるブロックが可能
if ($field.get(xx,yy)!=null) drawDxSprite($width/2+xx*$width,$height/2+yy*$height,$field.get(xx,yy),0,0,0,255,1,1);
}
}(以下省略)
(スペースキーのキーリピートが変更されない(block))
↓修正
if ((getkey(38)==1 || (getkey(38)>=$re*3 && getkey(38)%$re==0)) && $field.get(floor((x+$width*cos(a*90+90))/$width),floor((y+$height*sin(a*90+90))/$height))==null && $map.getAt(x+$width*cos(a*90+90),y+$height*sin(a*90+90))==$pat_map+8) a=amod(a+1,4);
//↑90度(回転先が壁でないとき)
else if ((getkey(38)==1 || (getkey(38)>=$re*3 && getkey(38)%$re==0)) && $field.get(floor((x+$width*cos(a*90+180))/$width),floor((y+$height*sin(a*90+180))/$height))==null && $map.getAt(x+$width*cos(a*90+180),y+$height*sin(a*90+180))==$pat_map+8) a=amod(a+2,4);
//↑180度(回転先が壁で、反対側が壁でないとき)
else if ((getkey(38)==1 || (getkey(38)>=$re*3 && getkey(38)%$re==0)) && $field.get(floor((x+$width*cos(a*90+270))/$width),floor((y+$height*sin(a*90+270))/$height))==null && $map.getAt(x+$width*cos(a*90+270),y+$height*sin(a*90+270))==$pat_map+8) a=amod(a+3,4);
//↑270度(回転の逆方向が壁でないとき)
else if ((getkey(38)==1 || (getkey(38)>=$re*3 && getkey(38)%$re==0)) && $map.getAt(x,y-$height)==$pat_map+8) {y-=$height;a=amod(a+2,4);}
//↑2つ目のブロックで回転(最終回転手段)
(以下省略)
(ブロックが一瞬消える & ブロックの大きさを変えると着地が変になる(fall))
修正↓
//着地
if ($field.get(floor(x/$width),floor((y+16)/$height))!=null || $map.getAt(x,y+16)==$pat_map) {
$field.set(floor(x/$width),floor(y/$height),p);
wait(1);
die();
}
ついでに改造スプリクトを1つ
(ゲームオーバーでブロックをすべて邪魔ブロックに(flame))
if($Gover!=1){
for (yy=1;yy<=$rows;yy++) {
for (xx=1;xx<=$cols;xx++) {
//drawDxSpriteなので回転・拡大縮小・半透明表示など動きのあるブロックが可能
if ($field.get(xx,yy)!=null) $field.set(xx,yy,$jama);
}
}
$Gover=1;
}
また、高速落下の速度、自動落下の速度、キーリピート開始までの時間($re*3のところ)もflameクラスで設定できるようにしてもいいとおもいます。
最後に、わかりやすい設定のヘルプ
$screenWidth=450; //画面横幅
$screenHeight=420; //画面縦幅
$cols=6; //フィールド横幅
$rows=12; //フィールド縦幅
$width=30; //ブロック横幅
$height=30; //ブロック縦幅
$color=6; //通常ブロックの色数(2以上)
$num=4; //最低消去数(2以上)
$jama=$pat_block+6; //邪魔ブロックのパターン番号
$v=1; //落下速度
$re=6; //キーリピート時間(押しっぱなしで何フレームごとにキー反応を起こすか)
$tuki=30; //着地猶予時間(着地してから何フレームで固定するか)
$wait=30; //ウェイト(完全着地から止めるフレーム数)
$map.setBGColor($clWhite); //背景色(color,colorHSLなどで設定)
長文で申し訳ありませんorz06-06-23 20:31 by
LefTonbo
|
|
バグ報告ありがとうございます。修正しておきました。
ゲームオーバー時のブロック変化も追加させてもらいました。
そしてUmintyu-さんばかりに改造させる訳にも行かないので、自分でも改造しました。
これからもよろしくお願いします。
06-06-24 22:40 by
ラディ
|
|
[Ver0.02]・ブロック部分のUmintyu-さんのプログラムを取り入れた
・それに伴い設定する変数増加
・気づいたバグを修正
ブロック部分のプログラムが良いものになった分、少しややこしくなってるので簡単なほうが良い人はver. 0.01をどうぞ。ただしバグあり。06-06-22 22:41 by
ラディ
|
|
とりあえずここに改造したものをおいておきます。
ダメだったら削除します
改良点
・キーを押したままでも動けるようにした(回転も)
・回転の種類を4種類用意。壁に隣り合っていても回転できるように。
・床についてもしばらくはうごけるようにしています
while(1) {
//横移動
if ((getkey(37)==1 || (getkey(37)>=18 && getkey(37)%6==0)) && y>=$height*3/2 && $field.get(floor((x-(1+(a==2))*$width)/$width),floor(y/$height))==null && $map.getAt(x-(1+(a==2))*$width,y)==$pat_map+8) x-=$width;
if ((getkey(39)==1 || (getkey(39)>=18 && getkey(39)%6==0)) && y>=$height*3/2 && $field.get(floor((x+(1+(a==0))*$width)/$width),floor(y/$height))==null && $map.getAt(x+(1+(a==0))*$width,y)==$pat_map+8) x+=$width;
//回転
if ((getkey(38)==1 || (getkey(38)>=18 && getkey(38)%6==0)) && $field.get(floor((x+$width*cos(a*90+90))/$width),floor((y+$height*sin(a*90+90))/$height))==null && $map.getAt(x+$width*cos(a*90+90),y+$height*sin(a*90+90))==$pat_map+8) a=amod(a+1,4);
//↑90度(回転先が壁でないとき)
else if ((getkey(38)==1 || (getkey(38)>=18 && getkey(38)%6==0)) && $field.get(floor((x+$width*cos(a*90+180))/$width),floor((y+$height*sin(a*90+180))/$height))==null && $map.getAt(x+$width*cos(a*90+180),y+$height*sin(a*90+180))==$pat_map+8) a=amod(a+2,4);
//↑180度(回転先が壁で、反対側が壁でないとき)
else if ((getkey(38)==1 || (getkey(38)>=18 && getkey(38)%6==0)) && $field.get(floor((x+$width*cos(a*90+240))/$width),floor((y+$height*sin(a*90+240))/$height))==null && $map.getAt(x+$width*cos(a*90+240),y+$height*sin(a*90+240))==$pat_map+8) a=amod(a+3,4);
//↑240度(回転の逆方向が壁でないとき)
else if ((getkey(38)==1 || (getkey(38)>=18 && getkey(38)%6==0))) {y-=$height;a=amod(a+2,4);}
//↑2つ目のブロックで回転(最終回転手段)
//着地(ついてしばらくしたら
if(tuki>=60) {
if ($field.get(floor(x/$width),floor((y+$height/2)/$height))!=null || $map.getAt(x,y+$height/2)==$pat_map+11) {
$field.set(floor(x/$width),floor(y/$height),p);
appear(new fall(x+$width*cos(a*90),y+$height*sin(a*90),pp,f,zOrder,angle,alpha,scaleX,scaleY));
die();
} else if ($field.get(floor(((x+$width*cos(a*90))/$width)),floor((y+$height*sin(a*90)+$height/2)/$height))!=null || $map.getAt(x+$width*cos(a*90),y+$height*sin(a*90)+$height/2)==$pat_map+11) {
$field.set(floor((x+$width*cos(a*90))/$width),floor((y+$height*sin(a*90))/$height),pp);
appear(new fall(x,y,p,f,zOrder,angle,alpha,scaleX,scaleY));
die();
}
} else if ($field.get(floor(x/$width),floor((y+$height/2)/$height))!=null || $map.getAt(x,y+$height/2)==$pat_map+11) {
tuki++;
} else if ($field.get(floor(((x+$width*cos(a*90))/$width)),floor((y+$height*sin(a*90)+$height/2)/$height))!=null || $map.getAt(x+$width*cos(a*90),y+$height*sin(a*90)+$height/2)==$pat_map+11) {
tuki++;
} else {
y+=vy; //落下
if (getkey(40)) y+=vy*5; //高速落下
tuki=0;
}
//右ブロックの表示
drawDxSprite(x+$width*cos(a*90),y+$height*sin(a*90),pp,f,zOrder,angle,alpha,scaleX,scaleY);
update();
}06-06-22 12:10 by
LefTonbo
|
|
お、手を抜き気味だったブロック部分の改良ありがとうございます。
このプログラムを組み込んだ&バグ潰しver.アップしときます。
ただ個人的にはブロックの回転に違和感が無いでもないです。まぁ慣れれば問題無しなんですが。06-06-22 22:35 by
ラディ
|
|
[Ver0.01]初期バージョン
解り辛い様だったらもう少し注釈なんかを強化します。06-06-19 23:42 by
ラディ
|
|