極座標変換でブロック崩し
カーソルで移動
* スペースで発射
// forked from Kay's DisplacementMapFliterで極座標変換
// forked from Kay's 四角いBitmapを極座標変換する
// forked from Kay's 四角いBitmapを三角にする
/*
* カーソルで移動
* スペースで発射
*/
package
{
import flash.display.*;
import flash.geom.*;
import flash.filters.*;
import flash.events.*;
[SWF(width="300", height="300", frameRate="30", backgroundColor="0x201828")]
public class Take12 extends Sprite
{
private const SW:Number = stage.stageWidth;
private const SH:Number = stage.stageHeight;
private var map:BitmapData;
private var buffer:BitmapData;
private var screen:Bitmap;
public function Take12():void
{
map = new BitmapData(SW,SH,false,0x808080);
var radius:Number = (SH+SW)/4;
var stageCenter :Point = new Point(SW/2, SH/2);
for (var v:int=0; v < SH; v++) {
for (var h:int=0; h <= SW; h++) {
var p:Point = new Point(h,v);
var distance:Number = Point.distance(stageCenter,p);
var radian:Number = Math.atan2(p.y-stageCenter.y, p.x-stageCenter.x)+Math.PI;
var target:Point = new Point();
target.x = radian / (Math.PI*2) * SW;
target.y = distance / radius * SH;
var ratioX:Number = (target.x-h) / SW;
var ratioY:Number = (target.y-v) / SH;
var colorX:uint = Math.round(ratioX*0x7f)+0x80;
var colorY:uint = Math.round(ratioY*0x7f)+0x80;
var nColor:uint = 0 << 16 | colorX << 8 | colorY;
map.setPixel(h,v, nColor);
}
}
var xyFilter:DisplacementMapFilter = new DisplacementMapFilter();
xyFilter.mapBitmap = map;
xyFilter.mapPoint = new Point(0,0);
xyFilter.componentX = BitmapDataChannel.GREEN;
xyFilter.componentY = BitmapDataChannel.BLUE;
xyFilter.scaleX = SW*2;
xyFilter.scaleY = SH*2;
xyFilter.mode = DisplacementMapFilterMode.COLOR;
xyFilter.color = 0x201828;
xyFilter.alpha = 1;
stage.quality = StageQuality.LOW;
buffer = new BitmapData(SW,SH,false,0);
screen = new Bitmap(buffer);
screen.filters = [xyFilter];
addChild(screen);
init();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, Key.onKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, Key.onKeyUpHandler);
}
private function onEnterFrame(e:Event):void
{
main();
draw();
}
private var racket_x:Number, racket_y:Number, racket_vx:Number;
private var ball_x:Number, ball_y:Number, ball_vx:Number, ball_vy:Number;
private var ball_wait:Boolean;
private var blocks:Vector.<Vector.<Boolean>> = new Vector.<Vector.<Boolean>>(6, true);
private function init():void
{
racket_x = 225;
racket_y = 260;
racket_vx = 0;
ball_wait = true;
for(var y:int = 0; y < blocks.length; y++)
{
blocks[y] = new Vector.<Boolean>(15, true);
for(var x:int = 0; x < blocks[y].length; x++)
{
blocks[y][x] = true;
}
}
}
private function main():void
{
if(Key.isLeft) {racket_vx -= 1.8;}
if(Key.isRight) {racket_vx += 1.8;}
racket_vx /= 1.3;
racket_x = MathEx.loop(0, racket_x + racket_vx, SW);
if(ball_wait == true)
{
if(Key.isShot)
{
ball_vx = (Math.random() * 2 - 1) + racket_vx / 4;
ball_vy = -3;
ball_wait = false;
}
else {
ball_x = racket_x;
ball_y = racket_y - 20;
return;
}
}
ball_x = MathEx.loop(0, ball_x + ball_vx, SW);
ball_y += ball_vy*2.5;
if(ball_x+4 > racket_x-16 && ball_x-4 < racket_x+16 && ball_y+8 > racket_y && ball_y-8 < racket_y+20)
{
ball_y = racket_y-8;
ball_vy *= -1;
//ball_vx += (ball_x - racket_x) / 8;
ball_vx -= (ball_x - racket_x) / 15;
ball_vx += racket_vx / 8;
}
if(ball_y < 40+8)
{
ball_y = 40+8;
ball_vy *= -1;
}
if(ball_y > SH)
{
ball_wait = true;
return;
}
var hit_7:Boolean = false;
var hit_9:Boolean = false;
var hit_1:Boolean = false;
var hit_3:Boolean = false;
var clear:Boolean = true;
for(var y:int = 0; y < blocks.length; y++) {
for(var x:int = 0; x < blocks[y].length; x++) {
if(blocks[y][x] == true)
{
if(hitcheck(ball_x - 4, ball_y - 8, x, y) == true)
{
hit_7 = true;
blocks[y][x] = false;
}
if(hitcheck(ball_x + 4, ball_y - 8, x, y) == true)
{
hit_9 = true;
blocks[y][x] = false;
}
if(hitcheck(ball_x - 4, ball_y + 8, x, y) == true)
{
hit_1 = true;
blocks[y][x] = false;
}
if(hitcheck(ball_x + 4, ball_y + 8, x, y) == true)
{
hit_3 = true;
blocks[y][x] = false;
}
clear = false;
}
}
}
if(clear == true)
{
init();
return;
}
if((hit_7 == true && hit_9 == true)||(hit_1 == true && hit_3 == true))
{
ball_vy *= -1;
}
else if((hit_7 == true && hit_1 == true)||(hit_9 == true && hit_3 == true))
{
ball_vx *= -1;
}
else if(hit_7 == true || hit_9 == true || hit_1 == true || hit_3 == true)
{
var temp:Number = ball_vx;
ball_vx = ball_vy;
ball_vy = temp;
}
if(ball_vy >= 0 && ball_vy < 2) {ball_vy = 2;}
if(ball_vy < 0 && ball_vy > -2) {ball_vy = -2;}
}
private function hitcheck(x:int, y:int, bx:int, by:int):Boolean
{
return (x > bx*20 && x < bx*20+20 && y > by*15+40 && y < by*15+15+40);
}
private function draw():void
{
buffer.fillRect(buffer.rect, 0x000000);
buffer.fillRect(new Rectangle(racket_x-16, racket_y, 32, 20), 0xFFFF00);
buffer.fillRect(new Rectangle(racket_x-16-SW, racket_y, 32, 20), 0xFFFF00);
buffer.fillRect(new Rectangle(racket_x-16+SW, racket_y, 32, 20), 0xFFFF00);
buffer.fillRect(new Rectangle(ball_x-4, ball_y, 8, 16), 0xFFFF00);
buffer.fillRect(new Rectangle(ball_x-4-SW, ball_y, 8, 16), 0xFFFF00);
buffer.fillRect(new Rectangle(ball_x-4+SW, ball_y, 8, 16), 0xFFFF00);
for(var y:int = 0; y < blocks.length; y++) {
for(var x:int = 0; x < blocks[y].length; x++) {
if(blocks[y][x] == true) {
buffer.fillRect(new Rectangle(x*20+1, y*15+1+40, 18, 13), 0xFFFF00);
}
}
}
buffer.fillRect(new Rectangle(0, 0, SW, 40), 0xFFFF00);
}
}
}
import flash.events.*;
import flash.ui.*;
class Key
{
public static var isLeft:Boolean = false;
public static var isRight:Boolean = false;
public static var isShot:Boolean = false;
public static function onKeyDownHandler(e:KeyboardEvent):void
{
switch(e.keyCode) {
case Keyboard.LEFT: Key.isLeft = true; break;
case Keyboard.RIGHT: Key.isRight = true; break;
case Keyboard.SPACE: Key.isShot = true; break;
}
}
public static function onKeyUpHandler(e:KeyboardEvent):void
{
switch(e.keyCode) {
case Keyboard.LEFT: Key.isLeft = false; break;
case Keyboard.RIGHT: Key.isRight = false; break;
case Keyboard.SPACE: Key.isShot = false; break;
}
}
}
class MathEx
{
public static function loop(min:Number, target:Number, max:Number):Number
{
var range:Number = max - min;
if(min < 0 && target < min) {
target = range - (-target % range);
}
target = (target + max) % range + min;
return target;
}
}