Добрый день, сегодня я расскажу Вам о о такой незаменимой вещи, как коллизия изображений в Blitz3D. Сама по себе коллизия - это столкновение, в данном случае будут сталкиваться 2 графических объекта. Лично я часто спользую коллизию изображений ( далее КИ ) для реализации меню и выбора чего либо. В отичии от коллизии моделей, коллизия картинок гораздо менее "прожорлива" по отношению к ресурсам. Для начала нужно создать режим графики : Graphics 800,600,32,0 Это означает, то я создал графическое окно с разрешением 800 на 600 пикселов, глубиной цвета 32 бита и что программа запустится в окне. Далее нужно установить задний буфер, всё что мы будем делать будет помещаться в него, до момента смены буфера. SetBuffer BackBuffer() Теперь можно приступать к самим картинкам. Давайте загрузим каждую из них в память. Image1 - LoadImage ( " image1.bmp" ) Image2 - LoadImage ( " Image2.bmp" ) Изображения должны быть заранее помещены в папку с файлом программы .bb В противном случае появится окно с ошибкой : " Memory Acces Violation ". Далее нужно создать цикл, который будет выполняться до нажатия клавиши Ecs. While Not KeyDown (1) .... wend Далее нужно очистить экран от предыдущего кадра и вывести картинки на экран. While Not KeyDown (1) Cls DrawImage image1,300,400 DrawImage image2,MouseX(),MouseY() wend Теперь наши картинки загружены, одна примерно в центре эерана, а вторая является курсором мышки. Теперь нужно добавить команду Flip в конце цикла, без неё не будут менься буферы While Not KeyDown (1) Cls DrawImage image1,300,400 DrawImage image2,MouseX(),MouseY() Flip wend Теперь, если все сделано правильно, на экране должны повиться 2 картинки. Но они проходят друг через друга. Точнее, накладываются. Давайте сделаем коллизию для картинок, чтоб при столковении программа заканчивалась. Есть 2 варианта создания коллизию, и оба они похожи. 1.ImagesCollide (картинка 1,х1,y1,кадр1,картинка2,x2,y2,кадр2) Эта функция хороша тем, что можно сделать коллизию на определённый кадр анимированного изображения. Минус её в том, что она более ресурсоёмкая, чем второй вариант. При коллизии проверяется каждый пиксел, даже прозрачные. Поэтому точность проверки очень высока. 2.ImagesOverlap (картинка,x1,y1,картинка2,x2,y2) Эта команда менее требовательна к ресурсам, но не очень точная. С другой стороны, очень часто это и нужно. В ней нельзя сделать проверку на кадр. Так что для каждого случая своя команда. Выглядит это всё примерно так : If ImagesCollide ( Image1,300,400,0,image2,MouseX(),MouseY(),0) End endif Аналогично и с ImageOverlap, только параметр кадра упускается. Получается вот что : Graphics 800,600,32,0 SetBuffer BackBuffer() Image1 - LoadImage ( " image1.bmp" ) Image2 - LoadImage ( " Image2.bmp" ) While Not KeyDown (1) Cls DrawImage image1,300,400 DrawImage image2,MouseX(),MouseY() If ImagesCollide ( Image1,300,400,0,image2,MouseX(),MouseY(),0) End endif Flip wend Вот таким несложным оказалась коллизия картинок. Всем удачного кода, пока.
|