Arkanoid на 39 строк
Всем привет. Данная статья (или даже заметка, обзор кода), будет интересна как опытному, так и начинающему программисту.
Ещё хотелось бы отметить, что я не знаю основную аудиторию и не могу изложить материал так, чтобы было интересно всем. Иными словами это мой первый пост в этом блоге на сайте gamin.me.
Арканоид на 39 строк - согласитесь, звучит многообещающе; некоторым, наверное, даже не верится. Но такое возможно.
Ну, все по порядку: как-то давно я просматривал работы с конкурса «игр из 50 строк» и увидел этот арканоид; тогда я на него не обратил никакого внимания, наверное, просто не заметил, но сейчас, не занимаясь панорамированием уже продолжительное время, увидел его вновь, и, скажем так, он меня действительно удивил. Нет, не бойтесь, в нем нету команд, перечисленных через запятую. Вполне такой адекватный арканоид. В общем, смотрим:
OpenScreen 800,600,16,2
ScreenVsync On
Dim bl(200)
r=255
a#=400
b#=550
c#=0.02
d#=0.02
Do
Cls rgb(0,0,0)
If n=200 Then n=0
m=MouseX()
LockBuffer
For y=100 To 280 Step 20
For x=0 To 760 Step 40
If bl(n)=0
Col1=RGB(r,12*y-r,0)
If PointInBox(a#,b#,x,y,x+38,y+18)And bl(n)=0
bl(n)=1
d#=-d#
Col1=rgb(100,250,50)
Score=Score+5
EndIf
Col2=rgbfade(Col1,75)
ShadeBox x,y,x+38,y+18,col1,col2,col1,col2
endif
Inc n
a#=a#-c#
b#=b#-d#
Next
Next
UnLockBuffer
If a#<0 Or a#>800 Then c#=-c#
If b#<0 Or (PointInBox(a#, b#,m,556,m+80,560)And d#<0)Or b#>600 Then d#=-d#
BoxC m,560,m+80,570,1,RGB(0,0,r)
CircleC a#,b#,8,1,RGB(r,r,r)
Print "Score: "+Str$(Score)
Sync
Loop
Написан он на PlayBasic, для запуска кода можно скачать бесплатную версию по этой ссылке и самим убедиться, что он работает:
http://www.playbasic.com/files/Demos/PlayBasicLearningEdition.exe
Ну и главное, что хотелось бы сказать, а точнее, пояснить, чем же он так мне понравился. Вот этим блоком, точнее, тем как он работает.
For y=100 To 280 Step 20
For x=0 To 760 Step 40
If bl(n)=0
Col1=RGB(r,12*y-r,0)
If PointInBox(a#,b#,x,y,x+38,y+18)And bl(n)=0
bl(n)=1
d#=-d#
Col1=rgb(100,250,50)
Score=Score+5
EndIf
Col2=rgbfade(Col1,75)
ShadeBox x,y,x+38,y+18,col1,col2,col1,col2
endif
Inc n
a#=a#-c#
b#=b#-d#
Next
Next
Пару слов наперед, основной цикл программы содержится между do и Loop, то есть построение карты происходит постоянно, когда цикл заканчивается, массив bl() содержит информацию о блоке т. е. он по сути говорит стоит ли сейчас рисовать блок или нет, и если блок активный, то проверяем столкновения. Стоит заметить одну особенность: столкновения просчитываются не сразу, то есть если наш мяч только задел блок, но в цикле For до него не дошли, то ничего не произойдет. Из этого следует, что наш мяч в худшем случае может уйти в блок на 2 пикселя. Вот эта маленькая ошибка и дала сделать арканоид на 39 строк.
Ой, забыл упомянуть ещё о самом важном: LockBuffer/UnLockBuffer - это говорит о том, что карта выводится на экран сразу же, иными словами, одним объектом. В принципе, этого можно было избежать, но для того, чтобы программа выводила изображение быстрее, нужно закрывать буфер.
И ещё пару слов напоследок, физика мяча достаточно примитивная, но тут она особой роли не играет, т. к. целью было сделать меньше код.
Для лентяев прикрепил ещё исходник с игрой:
http://technos-world.ucoz.ru/blog_temp/BreakOut.rar
Если есть какие то вопросы - пишите.
P.S. Код можно было сделать ещё меньше, если бы убрать ненужные операторы, ну а если быть ёще честнее, то можно было бы не использовать стандартные функции столкновений, а прописать самому - на это бы ушло 2-4 строки, которые как раз бы бы окупили те, что убрали.
- 29 марта 2012, 21:21
- 01
26 комментариев