Всем Здрасте. Очень рад что нашел сайт с таким хорошим материалом и данный форум. Надеюсь найти на форуме подсказки по реализации разных "мелочей". Я немного знаю бэйсик, изучал его гибрид Блитц3Д. В изучении продвинулся не сильно, но хватило чтоб реализовать волновой алгоритм поиска пути по клеткам и сделать небольшую 3Ддемку игры в стиле Хсом. Это было довольно давно (2008 год вроде). Сейчас решил опять попробовать написать небольшой клеточный варгейм с системой боя аля Кинг Баунти. Сейчас я вроде реализовал отображения поля с клетками, присвоил значения Х, У и статус клетки. Клетки отображаются у меня не спрайтами а примитивами -квадратами. Сначала я сделал Тип клеток, Потом 1 мерный массив из клеток ( Dim shared As cell pole(29) ). Закачал картинку с курсором и вроде все шло неплохо. Теперь незнаю как реализовать выбор клетки курсором. Решил в тип клетки добавить 2 массива для Х и У координат, по задумке эти массивы хранят все Х и У координаты клетки. Но вот беда, немогу правильно присвоить массивам значения, может кто сможет дать дельный совет и помощь кодом?
#include "fbgfx.bi" Using FB ScreenRes 640,480,24,2,0 ' установка режима экрана Setmouse 0,0,0 ' прячем курсор
Dim Shared workpage As Integer Const FALSE = 0 Const TRUE = 1 Const Free=1000 Const soldat=1001
Dim Shared As Integer mouse_x, mouse_y, mouse_bt1 Dim Shared debug As Ubyte = 0 Dim Shared background1 As Any Ptr Dim Shared WarriorSprite (116) As Any Ptr Dim Shared cursor As Any Ptr background1 = ImageCreate(320,200)
BLoad "cursor1.bmp" cursor = ImageCreate(34,34) Get (0,0)-(33,33),cursor Cls
BLoad "backgrnd.bmp",0 Get (0,0)-(319,199),background1 Cls
BLoad "orc_strip.bmp",0 For num As Integer = 0 To 4'загрузка спрайтов WarriorSprite(num) = Imagecreate (40,60) Get (num*40,0)-(num*40+39,59),WarriorSprite(num) Next
'создаем поле Type cell'создаем тип клетки cx As UByte cy As UByte state As Integer rangeX(39) As Integer rangeY(39) As Integer numer As Integer End Type
Dim shared As cell pole(29)'создаем массив клеток
For num As Integer = 0 To 29'Присваиваем значения клеткам pole(num).numer=num For X As Byte = 0 To 4 For Y As Byte = 0 To 5 pole(num).cx = X pole(num).cy = Y pole(num).state=Free Dim range As Byte Do Until range<=39
Loop Next Next Next
Cls
Function draw_debug() As Integer
If MultiKey(SC_1) Then debug=0 If MultiKey(SC_2) Then debug=1 If MultiKey(SC_3) Then debug=2
If debug = 1 Then For kX As UByte =0 To 5 For kY As UByte =0 To 4 Draw String (kx*40+205,ky*40+128),"X:" & kX,1 Draw String (kx*40+205,ky*40+140),"Y:" & kY,1 For xx As Integer = 0 To 29 Draw String (kx*40+205,ky*40+152),"" & pole(xx).state,1 Next Next Next End If
For nm As Integer =0 To 29 For ranx As Integer =0 To 39 For rany As Integer=0 To 39 If mouse_x = pole(nm).rangeX(ranx) And mouse_y = pole(nm).rangeY(rany)Then Draw String (450,40),"kletka X:" & pole(nm).cx,1 Next Next Next
End Function
Function draw_pole () As Integer For kX As UByte =0 To 5 For kY As UByte =0 To 4 Line (kX*40+202,kY*40+122)-(kX*40+240,ky*40+160),,B Next Next draw_debug()
For bgrx As Byte =0 To 1' рисуем бэкграунд For bgry As Byte = 0 To 1 Put (bgrx*320,bgry*200), background1, pset Next Next
draw_pole()'рисуем клетки
Put (mouse_x,mouse_Y),cursor,Trans 'Рисуем курскор workpage Xor = 1 'опять меняем страницу. Screenunlock ' открываем экран, теперь будет отображение на экране. Sleep 10, 1 ' уменьшаем скорость и бережем ресурсы процессора. Loop Until Multikey(SC_Q) Or Multikey(SC_ESCAPE)
Привет! Да в принципе почти все нормально реализовано. Мне не нравится только вывод графики.
1) Если у функции Screen или ScreenRes во параметре depth используется значение больше 8 (в примере 24), то вывод текста нужно производить с реальными значениями цветов. То есть при
2) При работе с буфером с помощью ScreenLock и ScreenUnLock, не нужно использовать функцию ScreenSet , более того все возможные вычисления тоже вынуть оттуда. Функция ScreenSet может пригодится при методе двойной буферизации, а здесь бесполезна, только жрет лишние ресурсы.
Вот код, сильно в координаты не вглядывался (подправишь если что). Определяется расположение курсора над ячейками:
Код
#Include "fbgfx.bi" Using FB ScreenRes 640,480,24,2,0 ' установка режима экрана SetMouse 0,0,0 ' прячем курсор
Dim Shared workpage As Integer Const FALSE = 0 Const TRUE = 1 Const free=1000 Const soldat=1001
Dim Shared As Integer mouse_x, mouse_y, mouse_bt1 Dim Shared debug As UByte = 0 Dim Shared background1 As Any Ptr Dim Shared WarriorSprite (116) As Any Ptr Dim Shared cursor As Any Ptr background1 = ImageCreate(320,200)
BLoad "cur.bmp" cursor = ImageCreate(34,34) Get (0,0)-(33,33),cursor Cls
BLoad "bg.bmp",0 Get (0,0)-(319,199),background1 Cls
BLoad "orc_strip.bmp",0 For num As Integer = 0 To 4'загрузка спрайтов WarriorSprite(num) = ImageCreate (40,60) Get (num*40,0)-(num*40+39,59),WarriorSprite(num) Next
'создаем поле Type cell'создаем тип клетки cx As UByte cy As UByte state As Integer rangeX(39) As Integer rangeY(39) As Integer numer As Integer End Type
Dim Shared As cell pole(29)'создаем массив клеток
For num As Integer = 0 To 29'Присваиваем значения клеткам pole(num).numer=num For X As Byte = 0 To 4 For Y As Byte = 0 To 5 pole(num).cx = X pole(num).cy = Y pole(num).state=free Dim range As Byte Do Until range<=39
Loop Next Next Next
Cls
Function draw_debug() As Integer
If MultiKey(SC_1) Then debug=0 If MultiKey(SC_2) Then debug=1 If MultiKey(SC_3) Then debug=2
If debug = 1 Then For kX As UByte =0 To 5 For kY As UByte =0 To 4 Draw String (kx*40+205,ky*40+128),"X:" & kX,RGB(0,0,255) Draw String (kx*40+205,ky*40+140),"Y:" & kY,RGB(0,0,255) For xx As Integer = 0 To 29 Draw String (kx*40+205,ky*40+152),"" & pole(xx).state,RGB(0,0,255) Next Next Next End If
For nm As Integer =0 To 29 For ranx As Integer =0 To 39 For rany As Integer=0 To 39 If mouse_x = pole(nm).rangeX(ranx) And mouse_y = pole(nm).rangeY(rany)Then Draw String (450,40),"kletka X:" & pole(nm).cx,1 Next Next Next
End Function
Function draw_pole () As Integer For kX As UByte =0 To 5 For kY As UByte =0 To 4 Line (kX*40+202,kY*40+122)-(kX*40+240,ky*40+160),,B Next Next draw_debug()
For bgrx As Byte =0 To 1' рисуем бэкграунд For bgry As Byte = 0 To 1 Put (bgrx*320,bgry*200), background1, PSet Next Next
draw_pole()'рисуем клетки
Put (mouse_x,mouse_Y),cursor,Trans 'Рисуем курскор 'workpage Xor = 1 'опять меняем страницу. ScreenUnLock ' открываем экран, теперь будет отображение на экране. Sleep 10, 1 ' уменьшаем скорость и бережем ресурсы процессора. Loop Until MultiKey(SC_Q) Or MultiKey(SC_ESCAPE)
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
haav, спасибо за полезные советы. Самостоятельно у меня получилось реализовать задуманное только путем введения 2х мерного массива клеток, но мне кажется что разумнее оставить его одномерным.