FreeBasic
Главная
Вход
Регистрация
Понедельник, 30.12.2024, 19:28Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Координаты клеток и прчие мелочи
vicmadДата: Воскресенье, 17.02.2013, 23:00 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Всем Здрасте.
Очень рад что нашел сайт с таким хорошим материалом и данный форум. Надеюсь найти на форуме подсказки по реализации разных "мелочей".
Я немного знаю бэйсик, изучал его гибрид Блитц3Д. В изучении продвинулся не сильно, но хватило чтоб реализовать волновой алгоритм поиска пути по клеткам и сделать небольшую 3Ддемку игры в стиле Хсом. Это было довольно давно (2008 год вроде). Сейчас решил опять попробовать написать небольшой клеточный варгейм с системой боя аля Кинг Баунти.
Сейчас я вроде реализовал отображения поля с клетками, присвоил значения Х, У и статус клетки. Клетки отображаются у меня не спрайтами а примитивами -квадратами. 
Сначала я сделал Тип клеток, Потом 1 мерный массив из клеток ( Dim shared As cell pole(29) ). Закачал картинку с курсором и вроде все шло неплохо. Теперь незнаю как реализовать выбор клетки курсором.
Решил в тип клетки добавить 2 массива для Х и У координат, по задумке эти массивы хранят все Х и У координаты клетки. Но вот беда, немогу правильно присвоить массивам значения, может кто сможет дать дельный совет и помощь кодом? 



 
haavДата: Понедельник, 18.02.2013, 08:54 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Привет! Да в принципе почти все нормально реализовано. Мне не нравится только вывод графики.

1) Если у функции Screen или ScreenRes во параметре depth используется значение больше 8 (в примере 24), то вывод текста нужно производить с реальными значениями цветов. То есть при

Код
ScreenRes 640,480,24,2,0


Вывод текста должен быть примерно таким:

Код
Draw String (20,20),"DEBUG mode: " & debug,RGB(255,0,0)


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

     Draw String (20,20),"DEBUG mode: " & debug,RGB(255,0,0)
     Draw String (20,32),"Mouse X: " & mouse_x,RGB(255,0,0)
     Draw String (20,44),"Mouse Y: " & mouse_y,RGB(255,0,0)
     Draw String (20,52),"Selecting cell_X: " & (mouse_x-202)\40,RGB(255,0,0)
     Draw String (20,60),"Selecting cell_Y: " & (mouse_y-122)\40,RGB(255,0,0)

     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()

End Function

Do
     GetMouse mouse_x, mouse_y,,mouse_bt1
     ScreenLock
     'ScreenSet workpage, workpage Xor 1 ' меняем страницу.
     Cls
         

     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)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
vicmadДата: Понедельник, 18.02.2013, 21:46 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
haav, спасибо за полезные советы. Самостоятельно у меня получилось реализовать задуманное только путем введения 2х мерного массива клеток, но мне кажется что разумнее оставить его одномерным.
 
  • Страница 1 из 1
  • 1
Поиск: