On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
администратор




Сообщение: 68
Зарегистрирован: 19.05.07
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.05.07 11:18. Заголовок: Уроки по Blitz3D


Моя Первая Программа
После просмотра нескольких прекрасных примеров программ, которые включены в пакет BlitzBasic, вы, наверное, уже сгораете от желания попробовать самому написать код.

BlitzBasic предназначен как для дружественного введения в программирование на компьютере также и для создания элегантных видео игр.

Для начала, традиционная программа приветствия. Простая единственная строчка программы, которая печатает сообщение "hello world" на экран. Выберите меню File-New и введите следующий текст:

Print "Hello World!"


Если вы нажмёте кнопку F5 чтобы скомпилировать и запустить программу, и появится сообщение, которое приветствует мир, то поздравляем вас! Вы только что написали свою первую программу на BlitzBasic.

Следующий код побуждает пользователя ввести какое-либо число.

a=Input("enter a number sweety:")

Print "the value of a is " + a


Кстати: обратите внимание как мы соединили вместе текст и целое число, чтобы напечатать их вместе на одной линии.


--------------------------------------------------------------------------------

Переменные
Переменные используются в Blitz для хранения целых чисел, дробных чисел и строк.

Когда переменная с дробью или строкой используется в вашей программе первый раз, к ней нужно добавить символ # или $.

Если "a=" в программе поменять на "a$=" Blitz будет считать переменную a как строковую, и она затем может содержать любой текст, который введёт пользователь вместо целого числа, в которое обычно конвертировался ответ.

a$=Input("enter a number sweety:")

Print "the value of a is " + a


Задание: поменяйте "a$=" на "a#=" и введите число 22.95. Что происходит?


--------------------------------------------------------------------------------

Моя Первая Игра
Эта программа даёт пользователю 5 ходов, чтобы угадать случайное число.

; guessing game

turnsleft=5

sheep=Rnd(20)

While (turnsleft>0)

turnsleft=turnsleft-1

guess=Input("guess how many sheep I have in my room:")

If guess<sheep Then Print "more than that!"

If guess>sheep Then Print "oh, not that many!

If guess=sheep Then Exit

Wend

If turnsleft=0 Then Print "game over dude" Else Print "good guess!"


В этой программе используются три переменные: turnsleft, sheep и guess.

Для начала, turnsleft равна 5, а sheep установлена как случайное число между 0 и 20. Затем программа входит в цикл "while" прося игрока угадать число, и сравнивает его ответ, который помещается в переменную guess со значением переменной sheep.

После того, как вы несколько раз поиграете в игру, вы можете заметить, что значение переменной sheep не сильно различается. Попробуйте добавить следующую строку в начало программы - сделать генератор случайных чисел зависимым от времени дня (в миллисекундах).

SeedRnd MilliSecs()


Поздравляем, вы только что удвоили играбельность своей игры одной строчкой!


--------------------------------------------------------------------------------

Инициализируем Графику
Вообще-то BlitzBasic не создан для того чтобы делать приложения, основанные на тексте, как наша игра в угадывание числа. Она также не предназначена для создания приложений, демонстрирующих дружественный графический интерфейс пользователя заполненный окошками и полосками прокруток.

Единственное, для чего был разработан BlitzBasic – это очень серьёзный бизнес разработки видео игр.

Эта программа инициализирует графический экран с разрешением 640x480, а затем ставит точки в разных местах, пока пользователь не нажмёт кнопку Esc.

; getting graphic

Graphics 640,480

While Not KeyDown(1)

Plot Rnd(640),Rnd(480)

Wend


Опять мы обращаемся к генератору случайных чисел, чтобы создать интересный результат. Попробуйте добавить следующую команду, работающую с цветом, перед командой Plot чтобы разнообразить цвета точек.

Color Rnd(256),Rnd(256),Rnd(256)


Хотя это кажется простой программой, создание экрана DirectX, как показано здесь, используя традиционные методы, может быть сложной задачей. BlitzBasic делает всё таким простым!


--------------------------------------------------------------------------------

Двойная Буферизация
Следующий код показывает типичный «основной цикл» игры. Чтобы видео игра показывала гладкую анимированную графику, используется техника, называемая «двойная буферизация».

Эта программа показывает один кадр (Передний буфер (FrontBuffer)) рисуя в это время другой (Задний буфер (BackBuffer)).

; double buffering

Graphics 640,480

SetBuffer BackBuffer()

While Not KeyDown(1)

Flip

Cls

Line 320,240,320+100*Cos(a),240+100*Sin(a)

a=a+1

Wend


В BlitzBasic команда Flip совершает двойную буферизацию показывая по очереди передний и задний буфер. Команда Cls очищает экран, а команда Line рисует линию.

Кстати: команда flip также синхронизирует обновление графики, который на стандартных мониторах VGA равен 60 кадрам в секунду.

Программа рисует линию из центра экрана (320,240) под каким-то углом, длиной в 100.

Попробуйте изменить программу, прибавив 6 к значению a. Если ваш монитор показывает 60 кадров в секунду, и a увеличивается на 6 каждый кадр, по теории оно должно увеличиваться на 360 градусов каждую секунду, что в мире градусов означает полный поворот.


--------------------------------------------------------------------------------

Моя Вторая Игра
Следующая часть показывает основной скелет простой видео игры.

Переменная status содержит «статус» игры, которая либо показывает стартовый экран, либо даёт игроку двигаться по экрану. Дополнительные статусы, такие как космический взрыв вселенной, когда игрок умирает, и экран конца игры, чтобы расширить игру, при желании можно добавить позже будут добавлены позже.

Читаем программу, экран инициализирован обычным способом, как в прошлом примере, используя команды Graphics и SetBuffer. Затем, основной цикл использует команду Flip, чтобы осуществлять двойную буферизацию (позволяющую нам рисовать на одном из экранов, пока показывается другой) и затем либо печатает сообщение, просящее пользователя нажать Enter чтобы начать или вызывает функцию UpdatePlayer().

; eat the dots

Graphics 640,480

SetBuffer BackBuffer()

Global status=0,x#=0,y#=0,speed#=1,dir=1

; main loop

While Not KeyHit(1)

; refresh screen

Flip

Cls

Color 255,255,0

Rect 0,0,640,480,0

; select state

Select status

Case 0

Locate 100,100

Print "Press Enter To Start"

If KeyHit(28) InitGame()

Case 1

UpdatePlayer()

End Select

Wend


Что ещё за UpdatePlayer()? - спросите вы. - И если пользователь нажмёт Enter что за функция InitGame()?

В отличии от традиционного языка BASIC где мы бы включили эти функции как подпрограммы и вызывали бы их командой Gosub, BlitzBasic представляет возможность использовать функции, установленные пользователем.

Добавьте две следующие функции в конец программы, чтобы она запустилась.

Первая функция устанавливает переменные, которые нам понадобятся, чтобы передвигать квадрат игрока по экрану. Посмотрите, как эти переменные были описаны в начале программы как общие (Global), что даёт нам доступ к ним из функций, таких как InitGame().

Function InitGame()

x=320

y=240

speed=1

dir=1

status=1

End Function


Эта вторая функция меняет направление игрока, в зависимости от того, какую из стрелок он нажимает, или направления джойстика. Затем, код двигает позицию игрока (x,y), в зависимости от переменной dir, которая принимает значения напралений: вверх(0), вправо(1), вниз(2) и влево(3).

Function UpdatePlayer()

; steer player

If KeyDown(200) Or JoyY()<-0.5 dir=0

If KeyDown(205) Or JoyX()>0.5 dir=1

If KeyDown(208) Or JoyY()>0.5 dir=2

If KeyDown(203) Or JoyX()<-0.5 dir=3

; move player

Select dir

Case 0 y=y-speed

Case 1 x=x+speed

Case 2 y=y+speed

Case 3 x=x-speed

End Select

; draw player

Color 255,255,255

Rect x,y,10,10

End Function


После добавления кодов InitGame() и UpdatePlayer() игра должна запуститься.

Следующее – надо добавить несколько смертельных скал и немного вкусной еды.

Чтобы сделать это, мы создадим новые типы, которые будут хранить нужную информацию о каждой скале и еде. Для начала, мы просто будем хранить x и y координаты каждого элемента скалы и еды, которые мы создадим для нашей игры.

Поместите эти типы в начало нашей программы.

Type food

Field x,y

End Type

Type rock

Field x,y

End Type


Далее нужно добавить следующий код в функцию InitGame(), поместите его после строки «status=1».

Этот код создаёт 20 скал, которые будут убивать игрока, и 20 «квадратов» еды, которые будут увеличивать скорость игрока. Команда New создаёт новый объект, а также добавляет его в список. Мы устанавливаем положение каждой скалы и еды, генерированием случайных чисел, в поля x и y каждого нового созданного объекта, используя символ «косой черты» - «\», чтобы указать на поле.

For i=0 To 20

r.rock=New rock

r\x=Rnd(640)

r\y=Rnd(480)

Next

For i=0 To 20

f.food=New food

f\x=Rnd(640)

f\y=Rnd(480)

Next


Теперь, нам нужна функция, которая будет каждый кадр рисовать всю еду и скалы, и проверять не соприкоснулся ли игрок с ними.

Запомните, что мы можем пробежать через каждый существующий элемент еды и скал, используя команду For..Each. Это ещё одно достоинство BlitzBasic, которое делает программы простыми и лёгкими для прочтения.

Мы используем команду RectsOverlap, чтобы проверить не соприкасаются ли позицию игрока (x,y) с каждым элементом еды и скалы (f \ x , f \ y) или (r \ x , r \ y). Если игрок соприкасается с едой, мы удаляем этот кусок еды и увеличиваем скорость игрока (переменная speed :Scaven). Если игрок соприкасается со скалой, мы заканчиваем игру, сбрасывая переменную status.

Function UpdateRocksandFood()

; draw food and check if eaten

Color 0,255,0

For f.food=Each food

Rect f\x,f\y,10,10

If RectsOverlap(x,y,10,10,f\x,f\y,10,10)

speed=speed+0.2

Delete f

EndIf

Next

; draw rocks and check for roadkill

Color 255,0,255

For r.rock=Each rock

Rect r\x,r\y,10,10

If RectsOverlap(x,y,10,10,r\x,r\y,10,10)

status=0

EndIf

Next

End Function


Опа, последнее - не забудьте вызвать функцию UpdateRocksandFood() из главного цикла - как раз после вызова UpdatePlayer().

UpdateRocksandFood()


Итак, после того, как немного поиграть, становятся очевидными некоторые вещи.

Во-первых, игрок должен умереть, если он ударится о внешнюю стену. Мы можем это сделать проверяя, касается ли он прямоугольника экрана (0,0,640,480) (То есть если он его не касается, то он находится за его пределами). Попробуйте добавить следующий код к функции UpdatePlayer.

If Not RectsOverlap(x,y,10,10,0,0,630,470) status=0


Во вторых, каждый раз, когда начинается игра, появляется всё больше скал и еды. Это потому, что мы никогда не стираем еду и скалы, оставшиеся с прошлой игры. Вставьте этот код перед кодом, который создаёт новую еду и скалы в функции InitGame().

For f.food=Each food Delete f Next

For r.rock=Each rock Delete r Next






Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]


администратор




Сообщение: 69
Зарегистрирован: 19.05.07
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.05.07 11:22. Заголовок: Учимся программировать на Blitz BASIC


Учимся программировать на Blitz BASIC
Вы хотели бы освоить первые шаги, так, чтобы в конечном счёте писать игры? Тогда вы обратились по адресу.


Blitz Basic использует специально разработанный и простой в использовании язык программирования, так что он лёгок в освоении и не требует опыта программирования, всё что нужно - это любовь к играм и ваши идеи.


Итак, добро пожаловать в ОСНОВНОЙ путеводитель по Blitz – где единственное ограничение – ваша фантазия. Основная цель этого раздела научить вас как написать программу на Blitz Basic. Программа – это задание, которое должен исполнить твой компьютер через набор инструкций. Задание описывается компьютеру используя набор инструкций, которые может понять Blitz Basic. Инструкции в вашей программе должны быть написаны используя набор правил, известных как Синтакс. Вы должны следовать этим правилам, когда пишете программу на Blitz Basic. После большого количества практики вы получите твёрдое и конкретное представление об основах BASIC`а и как их использовать как программисту, а когда у вас будут практические знания Blitz Basic, разновидности игр, которые вы будете создавать будут целиком зависеть от вас, и с капелькой фантазии вы могли бы написать следующий игровой хит.


Если вы не знали - BASIC это сокращение от Beginners All-purpose Symbollic Instruction Code (короче код для начинающих широкого использования : Scaven). Это мини курс языка BASIC, который встроен в Blitz, и планирования хороших программных структур.

Hello World Hello Me или Hello sheep! Hello cup of tea!

Хорошо – давайте начнём с команды Print – она просто печатает любой текст на ваш экран вот таким образом:

print "Hello sheep"
print "Hello cup of tea"

просто напечатайте вот так...

...и нажмите на красную ракету чтобы запустить....


Отлично – вы только что написали свою первую программу на Blitz.

Так же вы можете вставлять комментарии/записи в свою программу – это очень рекомендуется, и является хорошей практикой в программировании. Это можно сделать поставив точку с запятой (;) в свою программу, после которой вы можете просто написать свой текст ,например:

Print "George Bray" ; Эта часть кода предназначена для печатания вашего имени на экран

Также вы можете остановить машину командой End – это остановит вашу программу на любой точке, где вы хотите чтобы она завершилась.

Вы можете дать заголовок своему коду написав AppTitle "НазваниеИгры"

Хорошо, теперь давайте узнаем как работает Blitz переводя ваши программы, и что вам нужно знать чтобы писать их...



Данные

Это главные элементы программирования. Данные представлены тремя основными формами. Первое – это целое число, которое называется Integer (лучше запомнить английские названия – потом могут пригодиться: Scaven) н-р. 8,20,100,1000. Следующий тип – действительные числа или Real они позволяют ставить дроби, н-р. 1.2, 48.20, 100.4, 3000.201 (Запомните целая часть числа разделяется от дробной точкой а не запятой: Scaven). Третий тип данных – это строковые или String, которые в общем-то не являются числами. Все строковые состоят из символов, заключённых в кавычки. Строковые могут включать в себя числа, н-р: "A", "1", "Blitz Basic", "Commodore 64", "Sheep".

Переменные

Перемененные используются для того, чтобы хранить данные – чтобы понять это – представьте, что переменная – это одна большая коробка, в которой вы храните элементы, и, если нужно, другие коробки. Пример будет таким:

A = 2 + 2

Также вы можете напечатать с помощью команды print содержимое переменной на экран:

A = 2 + 2
Print A

Другой пример будет таким:

A = 1
B = 2
C = A + B
PRINT C

Разберём это – здесь у нас есть 3 переменных A и B – в которых хранятся два числа, и, наконец переменная C, которая является сложением чисел, находящихся в переменных A и B, так что C = 1 + 2. Затем этот результат помещается в переменную C и печатается на экран.

Переменные также могут хранить Real и String. Чтобы позволить переменной хранить эти типы данных, вы должны убедиться, что сказали компьютеру где находятся переменные с Integer, Real, или String. Чтобы указать переменную с действительным числом (Real), вы должны добавить значок диеза (#) в конце названия переменной. Если вы хотите указать переменную, в которой хранятся строковые данные (String), вы должны добавить значок доллара ($) в конце, н-р:

A# = 1.2
B$ = “vic20”
Print A#:Print B$

Вы также можете использовать математические функции с переменными String н-р:

A$ = "Welcome to "
B$ = "the world "
C$ = "of programming."
D$ = A$ + B$ + C$
Print D$

Когда вы запустите эту программу, она напечатает на экране Welcome to the world of programming.

Легко, не правда ли?

(Scaven: Похоже авторы забыли одну команду – это команда Input. Она нужна для того, чтобы пользователь смог что-нибудь набрать на клавиатуре, а мы смогли это запомнить и сохранить в переменной. Пишется так: Сначала пишем название переменной, затем знак = , потом слово Input, а затем в скобках и в кавычках пишем свой вопрос н-р: A=Input(“Введите какое либо число: “) или name$=Input$(“Введите какое либо слово: “). Вы вряд ли будете её часто употреблять, но она указывается в примерах дальше…)

Массивы

Массивы (или матрицы) очень важны, потому что вы можете хранить большое количество данных под одним именем. Например, если вы хотите хранить названия 7 дней в году, вам пришлось бы создать семь переменных, н-р.

day0$ = "Monday"
day1$ = "Tuesday"
до
day6$ = "Sunday"

Но с массивом вы можете создать другой тип переменной, которая может хранить больше чем один элемент данных. Н-р. Для дней недели вы напишите:

Dim day$(6) ; Обозначаем массив... 7 элементов (от 0 до 6)
day$(0)="Monday" ; устанавливаем первый элемент
day$(1)="Tuesday"

day$(6)="Sunday"

Затем вы просто можете написать команду:

Print day$(3)

которая напечатает на экран Thursday

Чтобы напечатать семь дней недели, мы включим цикл FOR NEXT, н-р:

For loop = 0 to 6
Print day$(loop) ; проходит цикл и печатает данные.
Next ; Это продолжается, пока переменная loop не равняется 6 а затем переходят на следующие строчки программы.

Также вы можете использовать команду STEP (шаг) когда производите цикл FOR/NEXT н-р. Если вы создадите цикл FOR/NEXT после которого идёт команда STEP 2 компьютер будет высчитывать следующий цикл, увеличиваясь на 2 н-р. 2, 4, 6. Так, если бы мы применили это к нашим дням недели, то:

For loop = 0 to 6 step 2

То компьютер напечатает только Monday Wednesday Friday и Sunday.

Также вы можете делать шаги назад, поставив знак минуса (-) после команды, с числом шагов назад, которые вы хотели бы совершить:

For A = 10 To 0 step -2
Print A
Next

На экране будет напечатано: 10 8 6 4 2 0

Последняя заметка по массивам – как написано выше, они очень многосторонни, так как могут хранить много уровней данных, так что написав:

Dim day(6,4)

Мы устанавливаем массив от 0 до 6, но для каждого из них есть ещё 5 «коробок» данных от 0 до 4 в которых может храниться больше данных. Так что если воспринимать их «коробками» - здесь у нас есть 7 коробок с 5 коробками внутри (вообще-то я бы сказал что у нас 5 рядов по 7 коробок в каждом или то что у нас 7 коробок, каждая из которых поделена на 5 секций : Scaven), Так что в целом вы можете хранить 35 данных (7x5) в этом массиве. Итак, вводя данные в массив вы можете написать что-то вроде этого:



Dim day(1,4) ;Устанавливаем массив размером 2 на 5 (от 0 до 1 * от 0 до 4)
day(0,0) = 10
day(0,1) = 20
day(0,2) = 30
day(0,3) = 40
day(0,4) = 50
day(1,0) = 100
day(1,1) = 200
day(1,2) = 300
day(1,3) = 400
day(1,4) = 500

Как видите, массивы должны быть указаны как определённый тип - Integer, Real или String. У вас может быть массив целых, действительных или строковых данных, но у вас не может быть несколько типов в одном и том же массиве.

Математические команды

О эта ужасная математическая сторона компьютера, но НЕ ПАНИКУЙТЕ – я тоже не математик (как и я впрочем: Scaven). Я просто быстро пробегусь по "скучной" стороне вещей – не беспокойтесь – немного терпения и вы будете знакомы со всеми этими функциями не затратив времени, потому что мы заставим компьютер делать всю тяжёлую работу. Просто расслабьтесь – сделайте хорошую горячую кружку чая и читайте дальше…

Итак – давайте начнём с самого лёгкого - Сложение, Вычитание, Деление и Умножение. В компьютерных терминах это (+) (-) (/) (*). Простым примером будет:

A = 2 + 2
B = 2 * 2
C = 2 - 2
D = 2 / 2
Print A: Print B: Print C: Print D

Результатом на экране будет: 4 4 0 1 – но вы это и так знали.... Также вы можете использовать названия переменных в математических командах:

A + B
A - B
A * B
A / B

Тип Boolean

Вот где вам нужно иметь кружку чая в руках, потому что пришло время сконцентрироваться! Когда вы поймёте это – вы будете достаточно знать, чтобы владеть обычной ненавистной математической стороной программирования…

OK - Поехали...Удобно устроились?

Операторы Boolean (это слово тоже придётся запомнить: Scaven) позволяют вашей программе производить логические операции на своих данных.

У нас есть операторы AND и OR – они работают с любыми числами. (And – логическое «и»; Or – логическое «или» : Scaven)

Основа такова (изучите логику в этих примерах – они довольно понятно написаны)
(Scaven: видимо составители очень ленились когда писали этот кусок. Так команда If…Then описана ниже. Для тех кто не поймёт логические операторы, попробуйте вспомнить школьный курс информатики – конъюнкция, дизъюнкция… J)


agecategory$=Input("Каковы ограничения возраста - 15 или 18? ") ; Спросить пользователя об ограничении возраста
age$=Input("Сколько вам лет: ") ; Затем спросить сколько лет
If agecategory$ = 18 And age$<18 Or agecategory$ = 15 and age$< 15 Then Print "Извините вам нельзя смотреть этот фильм" ; использование выражений AND и OR выясняет, что он ещё слишком молод
If agecategory$ = 18 And age$>18 Or agecategory$ = 15 And age$>15 Then Print "Наслаждайтесь фильмом." ; использование выражений AND и Or выясняет, что он уже достаточно взрослый
WaitMouse ; Ждёт, пока не будет нажата кнопка мыши
End ; Когда она будет нажата – закончить программу.

Мы можем сравнивать не только числа, но также и строки (текст). Мы видели '=' который был использован в 'agecategory$ = 18' ,так что же значит `меньше` или `больше` для строковых переменных? Ну, во всяком случае это не значит 'меньше знаков', так что мы не будем допускать такой ошибки. Мы понимаем, что одна строка меньше, чем другая, если она идёт раньше в алфавитном порядке, так что

Smith < Smythe
Smythe > Smith
Sheep < Shop
Shop > Sheep

Дальше, <= значит `меньше или равно`, ну и так далее – так же, как и с числами.

Далее, у нас есть оператор NOT (Логическое «не» :Scaven).

Проще говоря это:

If agecategory$ not <> 18 – значит тоже самое, что и A = B.

Вы убедитесь, насколько эти операторы полезны, когда будете писать условия в своих программах.

Команды хранения (DATA) данных и их чтения (READ)

Хранение данных станет важным и полезным способом содержания и чтения чисел или строковых (текста). Они могут быть использованы для хранения большого количества разных типов данных н-р. Данные об уровне (построения, которыми могут атаковать враги или данные для ландшафта в вашей игре и.т.д.). Вот основной пример команд READ/DATA:

Пример 1

Read a,b,c ;прочитать следующие 3 элемента данных в переменные a, b и c
Print a+","+b+","+c ;напечатать их значения
Data 1,2,3 ;сами элементы данных

Пример 2

Restore second ;начинать читать данные с отметки '.second'
Read a,b,c ;прочитать данные
Print a+","+b+","+c ;напечатать переменные
Restore first ; начинать читать данные с отметки '.first'
Read a,b,c ; прочитать данные
Print a+","+b+","+c ; напечатать переменные
.first
Data 1,2,3 ;элементы данных
.second
Data 4,5,6 ;ещё элементы данных

Вы должно быть заметили, что я подбросил команду RESTORE в Примере 2. Она используется для сброса указателя данных в любое время. Во время программирования игр вам может понадобиться прочитать те же самые данные опять н-р. Если вы хотите очистить экран и перерисовать его, используя свою таблицу данных – сбросив указатель, команда Read переместится на начало списка данных и вы сможете прочитать его опять.

Команда GOTO

OK – пишем следующее:

Print "Emily & Ellis were here today"
Goto goat

.goat
Print "So was George and his furry animals"

Итак, здесь мы печатаем наш текст – затем прыгаем на метку, названную .goat, и затем программа продолжит читать остальную часть команд от метки, которую вы установили.

Подпрограммы

Часто определённые последовательности команд используются в программе несколько раз. Вы можете избежать написания этой последовательности несколько раз, используя команду GOTO; но это не всегда приводит к нужным результатам. Команда GOSUB – это команда GOTO которая помнит откуда её вызвали и возвращается обратно, встретив команду RETURN, на строку после GOSUB продолжая дальше. После GOSUB должна стоять метка н-р. Gosub sheep, здесь программа посылается на серию команд начинающихся строкой .sheep – часть программы, которая лежит между.sheep и командой RETURN называется подпрограммой. Пример команды GOSUB будет таким:

Print "Baa Baa" ; На экран печатается текст
Gosub sheep ; Идёт в подпрограмму .sheep
WaitMouse ; Компьютер возвращается сюда! – и ждёт пока не будет нажата кнопка мышки
End

.sheep ; подпрограмма sheep
Print "Blitz Basic" ; Печатает текст на экран
Return ; возвращается на следующую линию после команды gosub.


Команды FOR NEXT

OK – Я быстро объясню команды FOR...NEXT – эти твари уже использовались в предыдущих примерах, если вы ещё не поняли! Эти две команды создают технику под названием цикл (loop) – так чтобы ваш компьютер выполнял какие либо задания несколько раз. Посмотрите эту программу.

For a = 0 To 100 ; устанавливает цикл с переменной a, использующейся как счётчик, от 0 (начало) до 100 (конец)
Print a ; печатает значение a
Next ; a равно 100? Нет, оно 1. Прибавим 1 к a, чтобы получить 2 и возвратимся к строчке Print a
Your program continues here... ; Когда a станет равным 100 программа закончит цикл (loop) и продолжит выполняться дальше.


Результатом будет то, что компьютер напечатает числа от 0 до 100.

размер шага (STEP)

Когда вы создаёте цикл, вы можете написать таким образом.

For a = 0 To 100 Step 10 ; Это такой же пример, как и предыдущий, только компьютер будет считать шагом (STEP) 10 за раз.
Print a ; Печатает значение a
Next ; Если a не равен 100 то прибавляет 10 к нему и идёт на строку Print
Your program continues here... ; Когда a становится равным 100 программа закончит цикл (loop) и продолжит выполняться дальше.

Результатом программы будет:

0
10
20
30
40
50
60
70
80
90
100

Функции

Использование функций - Часть 1

Итак, вы уже знакомы с "основами" программирования на Basic (н-р. For...Next)! Функция позволяет вам запускать часто используемые части кодов. Например, вот функция, которая печатает "Hello" на экран, когда вы её «вызываете»:

Function PrintHello () ; Начало функции
Print "Hello"
End Function ; Конец функции
For a=1 To 5 ; Давайте напишем "Hello" 5 раз, вызвав функцию PrintHello ():
PrintHello ()
Next

Теперь запустите программу, чтобы увидеть результат.

Использование функций - Часть 2

OK, теперь мы изменим функцию так, чтобы она печатала всё что мы захотим, каждый раз разное, когда мы её будем вызывать.

Функция:

Function PrintSomething (a$)
Print a$
End Function
; В этом случае, мы "проведём" строку (или строковую переменную, например blah$, или часть текста, заключённого в кавычки, н-р. ("Hello there")) в функцию.
PrintSomething ("Эй меня напечатают.")
PrintSomething ("И меня.")
; Использование строковой переменной
sentence$="И это тоже будет напечатано."

PrintSomething (sentence$)


Итак, чтобы ни находилось в скобках (), когда вы вызываете функцию, оно будет «проведено» в неё. Если вы посмотрите на саму функцию, вы увидите, что в скобках у неё находится временная переменная “a$” "PrintSomething (a$)", что значит, что она ожидает ввода строковой переменной, как мы и сделали.

Заметьте, что переменную "a$" можно было назвать хоть как - "b$" "sometext$".

Посмотрите внутрь функции, она записывает то, что в неё «провели» в свой параметр "a$" и использует его в команде Print ("Print a$").

Чтобы поупражняться, попробуйте поменять "a$" на "b$". Убедитесь, что вы поменяли все "a$" на "b$" в функции, или она не будет работать! Сделайте это прежде чем продолжать, и запустите её.

Вот, что у вас должно было получиться:

Function PrintSomething (b$)
Print b$
End Function

Теперь попробуйте поменять строки на что нибудь по вашему желанию (пока она заканчивается на значок $)

Использование функций - Часть 3

Так, Это был вызов очень простой функции, где она в основном используется как любая другая команда. Теперь посмотрим другой способ вызова функций. Мы можем заставить их провести вычисления и вернуть нам результат.

Функция:

Function JoinString$ (a$)
Return "Вы провели: "+a$
End Function


; Опять, мы "проводим" строку в функцию, но в этот раз мы сохраняем то, что возвращает нам функция.

mysentence$=JoinString ("Эй, меня напечатают.")

Print mysentence$

Запустите программу как раньше – что теперь произошло?

Во первых, посмотрев на саму функцию, мы знаем, что возвращаем из неё строковую переменную (присоединяя "Вы провели: " к строке, которую мы туда вводим), так что мы добавляем значок $ (string) к названию функции ("JoinString"), и получаем "JoinString$". Выражение "Return" возвращает объединённую строковую переменную обратно туда, где функция вызывалась. Запомните, вот почему мы добавили "$" к названию; Мы возвращаем эту СТРОКУ (STRING). Вызывая функцию, мы просто «вводим» туда любую строку, которую хотим, и получаем её обратно в нашу строковую переменную (в этом случае, "mysentence$"). Так, переменная mysentence$ станет "Вы провели: Эй меня напечатают." как только мы вызовем функцию.

Некоторые упражнения:

Потренируйтесь изменять имена переменных "mysentence$" на что-нибудь своё, н-р. b$, something$, что угодно. Заметьте, что вам придётся менять их в выражении Print тоже!

Поменяйте строку "Вы провели: " в функции на что-нибудь ещё, и поменяйте строку, которую мы «проводим» ("Эй меня напечатают."). Запустите её.

Использование функций - Часть 4

По умолчанию, функция возвращает либо:

0 - (ноль) для числовых переменных и "" - (пустая строка) для строковых

Function AddOneAndOne ()
a=1+1
End Function ; Здесь будет возвращён 0, потому что мы не сказали возвращать результат 1+1!
Print "Result of AddOneAndOne: "+AddOneAndOne () ; Попробуйте добавить строку "Return a" (без кавычек!) к функции AddOneAndOne, и запустите её заново. ТЕПЕРЬ она возвращает значение!



Упражнение: добавьте необходимую строку в функции, так, чтобы она возвращала a$


Function GimmeString$ ()
a$="If you can read this, you must have fixed this function!"
End Function
b$=GimmeString ()
If b$=""
b$="GimmeString doesn't return a value!"
Else Print b$
EndIf
Print "Result of GimmeString (): "+b$

Команды IF...THEN

Выражение IF (переводится как «если» : Scaven) работает как условие, зависящее от того, правдиво или ложно какое-либо высказывание. Если высказывание – правда, то выполняется выражение после команды THEN, иначе оно пропускается. Самое полезное условие – это сравнение двух чисел или строк. Вы можете проверить равняется ли одно число другому, или является ли одно число больше другого, и является ли одна строка такой же как и другая, или какая из них идёт раньше в алфавитном порядке. Здесь используются отношения =,<,>,<=,>=, и <>. Если вы ещё не встречались с этими знаками, то они обозначают следующее:

Знак Значение

= Равенство
< меньше чем
> больше чем
<= меньше или равно
>= больше или равно
<> Не равно


Взгляните на эти примеры:

.start ;устанавливает метку start
question$ = Input ("Shall I tell you the meaning of life yes/no? ") ; Печатает вопрос – ждёт ответа пользователя
If question$ = "no" Then Print "Alright, Then I won't"; Если (If) введеная строка = «no», то (THEN) напечатать текст
If question$ = "yes" Then Print "42" ;Если (IF) введеная строка = «yes», то (THEN) напечатать текст
If question$ <> "yes" Or "no" Then Goto start ; Если (IF) введеная строка не равна ни «no» ни «yes», то (THEN) идти (GOTO) на start

Мы можем добиться того же эффекта с числами:

number = Input ("How old are you ") ; Печатает вопрос – ждёт ответа пользователя
If number < 18 Then Print "You are under 18" ; Если введеное число < 18, то напечатать текст
If number > 18 Then Print "You are over 18" ; Если введеное число > 18, то напечатать текст
If number = 18 Then Print "you are 18" ; Если введеное число = 18, то напечатать текст


Выражение может быть любой комбинацией чисел, переменных, массивов и операторов, создающих логическое выражение.

Команда IF ENDIF

По такому же принципу работает команда If EndIf , только вместо THEN, команда ENDIF указывает конец списка выполняемых команд – этот пример показывает вам принцип:

commodore = 20 ; устанавливает переменную commodore
atari = 20 ; устанавливает переменную atari
If commodore = atari ; Если обе переменные равны...(выполнить код между этим местом и EndIf)
Print "Welcome to the machine - commodore and atari..." ; код, который должен быть выполнен, если обе переменные равны.

EndIf

Этот код такой же как и тот который написан ниже:

IF commodore = atari THEN PRINT "Welcome to the machine - commodore and atari..."

Также вы можете заставить вашу программу идти по другой цепочке событий, если значения не будут равны. Здесь мы представляем команду ELSE (переводится как «иначе» :Scaven), так, чтобы вы могли указать другой кусок кода, который вы хотите выполнить – вот так:

IF commodore = atari
PRINT "The values are equal to"
ELSE
PRINT "The values are different"
ENDIF

Запомните, что когда не употребляется команда THEN вы должны употреблять команду ENDIF – Заметьте также, что команда ENDIF используется не зависимо от использования команды ELSE.

Типы

Используя нормальные массивы (как написано выше), мы можем хранить важную информацию, например о положении игрока:

player = 3
x = 640
y = 480

Dim players (player, x, y)

players (2, 100, 100) ; так можно поставить игрока на позицию x = 100, y = 100

Это конечно хорошо, но вдруг мы захотим добавить ещё игроков? Нам придётся переустанавливать массив с максимальным количеством игроков! Также довольно сложно запомнить, для чего предназначен каждый элемент, если элементов много, н-р.

Dim playerdata (player, x, y, animframe, weaponselected, lives, rockets, jewelscollected, blah, blah2)

Попробуйте потом изменить количество «ракет», когда вы не будете видеть весь список элементов, без прокручивания обратно!

Способ избежать этой безнравственности – использовать Типы (types). Как мы установили массив "playerdata", так мы и установим тип "playerdata" вместо этого:

Type playerdata
Field player
Field x
Field y
Field animframe
Field weaponselected
Field lives
Field rockets
Field jewelscollected
Field blah
Field blah2
End Type

Думаете это сложно выглядит? Что же, давайте посмотрим:

Type playerdata

Эта линия просто создаёт новый тип (типы также называют "объектами", так что это надо называть "объект playerdata").

Field player
Field whatever

Строка Field просто говорит, какую информацию мы хотим держать в объекте «playerdata».

End Type

Эта строка просто показывает, что установка типа завершена. Не забудьте её!

Так, в примере с массивами мы хотели поменять элемент rocket (дадим ему 1000 ракет), что означало бы примерно столько:

playerdata (player, x, y, animframe, weaponselected, lives, 1000, jewelscollected, blah, blah2)

Ого, сколько текста! И я надеюсь вы запомнили порядок элементов? (ага, и вам пришлось вернуться назад, чтобы вспоминить что эти элементы означают!) Рациональный (читайте: по умному ленивый) программист будет использовать типы. Используя тип «playerdata»:

playerdata\rockets = 1000

Теперь это не только короче, но нам и не нужно запоминать где стоит значение (Теперь мы даже не можем случайно «положить» их неправильно, потому что мы конкретно говорим "сделать значение ракет равным 1000").

Заметьте, что мы добираемся до данных типа через косую черту (backslash) вот так: \

Чтобы прочитать значение jewelscollected во временную переменную, и показать значение, мы делаем так:

temp = playerdata\jewelscollected

Print temp

Конечно, ничто не остановит нас от того, чтобы напечатать значение напрямую:

Print playerdata\jewelscollected

Один важный аспект использования типов – тот, что вы должны указывать Blitz`у, что вы решили назначить переменную заказанному типу. Если мы хотим сделать двух игроков используя тип playerdata, то делаем так:

player1.playerdata = New playerdata
player2.playerdata = New playerdata

Это можно прочитать так: "создать новый объект playerdata под названием player1" и " создать новый объект playerdata под названием player2". Отсюда, мы можем делать что хотим с нашими только что указанными объектами.

Важно это запомнить, потому что нельзя просто написать:

player1.playerdata\rockets = 1000

...без предварительного создания объекта player1 типа playerdata, как написано выше!

Итак, если мы хотим использовать объект под названием "zoolook", типа "whatever", мы делаем так:

; указываем структуру нашего объекта:

Type whatever
Field something
; Столько полей информации, сколько нужно для объектов zoolook
End Type

zoolook.whatever = New whatever

Теперь мы можем использовать свой объект zoolook.

Где типы действительно становятся мощным инструментом – это там, где нам нужно множество схожих объектов (например, инопланетян в клоне "Космических Пришельцев"), и какой может быть более лёгкий способ их указания и изменения?

Type invader
Field x
Field y
End Type

Мы можем указать огромное количество инопланетян обычным циклом:

For a = 1 to 100
alien.invader = New invader
alien\x = Rnd (GraphicsWidth)
alien\y = Rnd (GraphicsHeight)
Next

Кажется, что мы просто перезаписываем один объект снова и снова, но это не так! Необычно в типах, то, что когда мы создаём новый объект, мы на самом деле создаём «указатель» на объект, а не сам объект.

Каждый раз, когда вы пишите:

something.mycustomtype = New mycustomtype ; новый "mycustomtype" под названием "something"

...вы пишите «создать новый объект 'mycustomtype' и дать мне указатель на него; назвать указатель 'something'».

Хотя мы можем обращаться к каждому объекту индивидуально, если мы дадим объектам индивидуальные имена, (н-р player1.playerdata, player2.playerdata), мы также можем совсем игнорировать их. Когда мы даём одно имя нескольким объектам определённого типа, мы просто добавляем их в скрытый список объектов, к которым нам не надо обращаться индивидуально. Чтобы нарисовать всех наших инопланетян, мы просто напишем:

For nasties.invader = Each invader
DrawImage invaderimage, nasties\x, nasties\y
Next<br
...и все наши инопланетяне нарисованы!

Заметьте, что необходимо присваивать нашей переменной-счётчику nasties в For...Next тип "invader", когда мы пролистываем наш список инопланетян.

Итак, для запоминания, когда мы создаём новый объект, мы на самом деле добавляем его в скрытый список объектов этого типа. Когда мы хотим иметь возможность обращаться к каждому индивидуальному объекту, мы даём каждому индивидуальное имя:

Type playerdata
Field x
Field y
End Type

player1.playerdata = New playerdata
player2.playerdata = New playerdata

Компьютер добавляет каждый объект в свой скрытый список объектов "playerdata", который может выглядеть так:

xxxxx1.playerdata [player1]
xxxxx2.playerdata [player2]

... но нас не интересует то, как компьютер хранит свой скрытый список – мы просто ссылаемся на player1 и player2.

Если нам не нужен доступ к каждому элементу в отдельности, мы можем сделать следующее:

Type blah
Field whatever
End Type

For a = 1 to 3
myobject.blah = New blah
myobject\whatever = 5
Next

Этот пример создаёт скрытый список объектов типа "blah", и устанавливает значение "whatever" каждого равным 5. Для компьютера, они могут храниться в какой-нибудь абстрактной форме, которую мы не знаем, н-р:

xxxx1.blah [myobject]
xxxx2.blah [myobject]
xxxx3.blah [myobject]

Очевидно, что мы не можем считывать отдельные объекты из списка, потому что мы дали им одно и тоже имя! Но нас это не беспокоит; Нам это и не надо – мы можем прочитать их «массой» используя цикл For...Each...Next:

For a.blah = Each blah
Print a\whatever
Next

Разбирая это по частям, мы получим:

For a.blah = Each blah

Это прочитывает каждый элемент объекта типа "blah" во временный объект под названием "a", тип которого также "blah" (так что он может хранить такие же данные, как и остальные объекты "blah").

Print a\whatever

Эта строчка печатает содержимое поля "whatever" временной переменной "a".

Next

Это обычная команда "Next" использующаяся в цикле For...Next.

Есть ещё много информации про типы (из-за их изумительной силы!), но это основы, которые помогут вам начать!

OK Теперь, когда вы прошли основу Basic`a, зайдите в мануал Blitz`а чтобы взглянуть на более продвинутые команды :)



Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 1
Зарегистрирован: 03.01.09
Рейтинг: 0
ссылка на сообщение  Отправлено: 03.01.09 20:05. Заголовок: если не трудно скинь..


если не трудно скинь пожалуйста самоучители по BlitzBasic3D на Liga26@list.ru Заранее спасибо

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, опрос нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



WireNet (Phoenomix)

WireNet (Phoenomix)
Клуб профессиональной дрессировки собак Tools of Death - Энциклопедия орудий смерти! Сайт затрагивает тему смерти, и все что с ней связано. Рассматривается все то, что нас убивает. Создай свою игру или скачай готовую Создание сайтов, анимаций, потретов. Уникальные рисованные сайты Мужской форум SmehOff Фан-форум Уилла Смита Обмен кнопочками находится здесь! Заходите и станьте нашим другом!
Первый электротехнический поиск TOPlist минск, поиск информации