Вот решил написать свою первую игру арканоид.
Я изначально думал написать на C# с использованием OpenGL: установил Tao framework, сделал пару примеров с туториалов, да много свободы дает, но я понял что оно того не стоит,
Когда начинал писать на флэше даже не подозревал сколько времени мне понадобиться, но в итоге все затянулось всего лишь на 4 часа.
Программа далеко от идеала, но для общего понимания подойдет. Также семантичность кода желает лучшего.
Работа с двумерными массивами в action script после php мне показалась не такой удобной, поэтому я обошелся без них. Удаление элемента с массива тоже по-моему не очень красиво, сделал через Array.splice(3,1).
Читал что правильно с помощью векторов делать перемещение шарика, но я сделал проще. Также в коде я добавил переменную b_angle, использование которой можно доработать чтобы достичь большей реалистичности.
Вот итоговый код, некоторые комментарии добавлял для себя:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | var frame=0; var bat_x=0; var speed_x=20; var boxes = []; var g=0; //// for ball var b_speed=0; var b_angle=0.5; var b_k=-1; var b_k2=-1; /////////////// init add_boxes(); // Add ball var ball =_root.attachMovie('ball','ball'+ _root.getNextHighestDepth(), _root.getNextHighestDepth() ); ball._x=320; ball._y=240; Key.addListener(this); onKeyDown = function () { //move bat if(bat_x==0) { if(Key.isDown(Key.LEFT) && _root.bat._x>=0 ) { bat_x=60; } if(Key.isDown(Key.LEFT) && _root.bat._x>=0 ) { bat_x=60; } if(Key.isDown(Key.RIGHT) && _root.bat._x<=570 ) { bat_x=-60; } } // start if(Key.isDown(Key.SPACE) ) { if(b_speed==10) b_speed=0; else b_speed=10; } }; // Start onEnterFrame = function () { step_bat(); step_ball(); frame++; } // Functions function add_boxes() { g=0; for(ii=0;ii<50;ii++) { var box =_root.attachMovie('brick','brick'+ _root.getNextHighestDepth(), _root.getNextHighestDepth() ); _root.boxes.push(box); } for(ii=0;ii<10;ii++){ for(jj=0;jj<5;jj++){ _root.boxes[g]._x=60*ii+20; _root.boxes[g]._y=20*jj+20; g++; } } trace(_root.boxes.length); } function step_bat(){ if(bat_x!=0) { if(bat_x>0) { _root.bat._x-=speed_x; bat_x-=speed_x; } if(bat_x<0) { _root.bat._x+=speed_x; bat_x+=speed_x; } } } function step_ball() { if(b_speed>0) { // Hittest if(_root.ball.hitTest(_root.bat)) { trace('tick'); b_k2=-1; } // -- for(var i in _root.boxes) { if(_root.ball.hitTest(_root.boxes[i])) { _root.boxes[i].removeMovieClip(); b_k2*=-1; _root.boxes.splice(i,1); trace(_root.boxes.length);} } // Move if(ball._y<0) b_k2=1; if(ball._y>480 ) { b_k2=-1; b_speed=0; ball._x=320; ball._y=240; trace('lose'); } if(_root.boxes.length==0 ) { b_k2=-1; b_speed=0; ball._x=320; ball._y=240; trace('win ))'); add_boxes();} if(ball._x<0) b_k=1; if(ball._x>640) b_k=-1; ball._x+=(b_speed*b_k); b_angle =1; ball._y+=b_angle*(b_speed*b_k2); } } |
Попробовать сыграть (клавиша пробел – старт).
Исходный код.
Ресурсы, кроме гугла), которые помогли в процессе:
http://xitri.com/
http://techposters.net/uploads/files/1/2a3cff7856.pdf
http://www.kongregate.com/games/Kongregate/shootorial-1
Комментарии (3) для поста Пишем арканоид на флэше
Алекс | 22.05.2010 в 18:43
Иван | 10.08.2011 в 13:40
а как сделать, чтобы «бита» управлялась плавно? или мышью – тоже плавно.



Помню эту игру еще с детства. Но реализации на флэше не видел, все так просто и понятно, классно