Веб блог и не только | Знания недостаточно, необходимо применение

Фев/10

21

Пишем арканоид на флэше

Вот решил написать свою первую игру арканоид.

arcanoid

Я изначально думал написать на 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

RSS Feed

Комментарии (3) для поста Пишем арканоид на флэше

Алекс | 22.05.2010 в 18:43

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

Иван | 10.08.2011 в 13:40

а как сделать, чтобы «бита» управлялась плавно? или мышью – тоже плавно.

Комментировал Andrey | 10.08.2011 в 22:18

Мышью конечно не плавно. Нужно ракетке добавить параметр скорость. Если мишкой клацнули то плавно добавить скорость. Если ничего не нажимаем то скорость падает к нулю.
Вобщем это мой старый AS2 код на котором я учился. Советую юзать AS3 и учится ООП.

Оставте комментарий!

<< VMware player – Unity mode

Кеширование и Flash >>

Поиск

Theme Design by devolux.org