Неделя вторая - Тетрис

» опубликован
Наступило 3 октября, теперь я понимаю, что мне категорически не хватает времени на конкурс.
Неудобно по времени начался, для меня, на полмесяца-месяц раньше бы.. (сейчас много всего IRL на голову свалилось, некогда заниматься, но я стараюсь выкроить время.)
Начнём с того что я переделал модели как планировал, теперь с помощью
call SetUnitVertexColor(Юнит,Красный,Зеленый,Синий,Непрозрачность)
можно устанавливать цвет юнитам. Для установки цвета я написал небольшую функцию которая красит юнита в соответствии с его CustomValue.
(цвета пока криво подобраны, позже исправлю на точные...)
» функция
//color update, красит юнита в зависимости от его CustomValue
// 1 white 255 255 255
// 2 blue 96 208 224
// 3 darkblue 96 160 255
// 4 brown 255 160 0
// 5 darkgreen 112 224 112
// 6 yellow 255 216 160
// 7 orange 255 120 48
// 8 purple 160 112 255
// 9 green 112 240 64
// 10 pink 224 176 255
// 11
function cu takes unit u returns nothing
local integer color = GetUnitUserData(u)
if (color==1)
call SetUnitVertexColor(u,255,255,255,255)
endif
if (color==2)
call SetUnitVertexColor(u,96,160,255,255)
endif
if (color==3)
call SetUnitVertexColor(u,96,160,255,255)
endif
if (color==4)
call SetUnitVertexColor(u,255,160,0,255)
endif
if (color==5)
call SetUnitVertexColor(u,112,224,112,255)
endif
if (color==6)
call SetUnitVertexColor(u,255,216,160,255)
endif
if (color==7)
call SetUnitVertexColor(u,255,120,48,255)
endif
if (color==8)
call SetUnitVertexColor(u,160,112,255,255)
endif
if (color==9)
call SetUnitVertexColor(u,112,240,64,255)
endif
if (color==10)
call SetUnitVertexColor(u,224,176,255,255)
endif
if (color==11)
call SetUnitVertexColor(u,255,255,255,255)
endif
endfunction
Так же вчера уже начал писать алгоритмы генерации фигуры/движения и т.д
Для юнитов создал массив 8192шт и с помощью двумерного индекса обращаюсь к ним, карта 32х32, почему нет).
» подробнее
//Двумерный массив внутри 1 массива, например: X 19 и Y 65 - число 1965
function mx takes integer x, integer y returns integer
return 100*x+y
endfunction
первые 2 цифры индекса использую как X юнита, вторые 2 как Y юнита
Пока что сделал только генерацию фигуры и движение вниз.
Выглядит это всё примерно так на данном этапе:
На функциях движения влево/вправо я застрял и багу найти пока что не могу в своей помойке :D.. Очень не хватает времени/мозгов, что-бы разобраться со этим всем.
Если кто-то может помочь с кодом/алгоритмами - буду крайне благодарен. (добавить меня в скайпе)
Надеюсь что к концу конкурса успею доделать хотя бы тетрис, вообще проект можно развивать и после конкурса в принципе, но тогда мне определённо понадобится кодер, а то всё туго идёт... :).
Пожалуй это всё, из того чем я хотел бы поделиться на сегодня, но, как обычно, помимо WIP'ов прикладываю к новости очередную вкусняшку:
(в прошлый раз был эмуль с ромом)
» Вкусняшка
Про random в тетрисе:

 

Просмотров: 996

Buulichkaa #1 - 5 лет назад (отредактировано ) 1
Годнота, мой фаворитик ^^
а что это за лолокостыль с колор апдейтом?? про базы данных слышали?

и вообще, нафиг бд, юзай эту магию, она хорошая, годная

и двумерный массив не так эмулируешь, зачем этот костыль с умножением на 100
вот тебе норм вброс
таким образом тебе хватит формально и массива в 1024 элемента, но в джассе же статик массивы, так что все тлен

в конце лорд догнал фишку тетриса
awesomesk1ll #2 - 5 лет назад (отредактировано ) 0
про базы данных слышали?
Про варкрафтовские дб - не, не слышал. Цвет переделаю под xgm.guru/p/wc3/divide-int-by-3-bytes , ок).
Массив юнитов переделал), вообще все функции переписываю сижу. Такой трэшак там..
Сам понимаю что стрёмно составил, но что-то нормальное в голову не приходит, как написать). Я без образования в этой сфере, помог бы кто :D.
Если кто подскажет как правильно написать, я только рад буду научиться)...
» мои тугие функции
//Двумерный массив внутри 1 массива.
//X от 1 до 32
//Y от 1 до 32
function mx takes integer x, integer y returns integer
return 32*(x-1)+(y-1)
endfunction

//Игровая система координат, принимает INT, возвращает реальный X или Y на середину тайла
//X 1 Y 1 - самый нижний левый тайл на карте
function xy takes integer x returns real
//call DisplayTextToForce( GetPlayersAll(), R2S(-1856+(I2R(x)*128)))
return -2112+(I2R(x)*128)
endfunction

//Спавн блок-юнита
function spawnblockunit takes integer x, integer y, integer ut, integer color returns nothing
        local integer id = mx(x,y)
        call DisplayTextToForce( GetPlayersAll(), "ID - "+I2S(id))
        set udg_Unit[id] = CreateUnit(Player(0), udg_BlockType[ut], xy(x), xy(y), 270)
        call SetUnitUserData( udg_Unit[id], color )
        call cu(udg_Unit[id])
endfunction

//спавн next-фигуры
function NextFigure takes integer p returns nothing
    call DisplayTextToForce( GetPlayersAll(), "NEXT FIGURE player - "+I2S(p))
    set udg_NextFigure[p] = GetRandomInt(1, 7)
    if ( udg_NextFigure[p] == 1 ) then
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p],4,7)
        call spawnblockunit(udg_NextX[p],udg_NextY[p],3,7)
        call spawnblockunit(udg_NextX[p]+1,udg_NextY[p],3,7)
        call spawnblockunit(udg_NextX[p]+2,udg_NextY[p],2,7)
    else
    endif
    if ( udg_NextFigure[p] == 2 ) then
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p],4,4)
        call spawnblockunit(udg_NextX[p],udg_NextY[p],9,4)
        call spawnblockunit(udg_NextX[p]+1,udg_NextY[p],2,4)
        call spawnblockunit(udg_NextX[p],udg_NextY[p]-1,6,4)
    else
    endif
    if ( udg_NextFigure[p] == 3 ) then
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p],11,8)
        call spawnblockunit(udg_NextX[p],udg_NextY[p],14,8)
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p]-1,13,8)
        call spawnblockunit(udg_NextX[p],udg_NextY[p]-1,12,8)
    else
    endif
    if ( udg_NextFigure[p] == 4 ) then
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p],4,6)
        call spawnblockunit(udg_NextX[p],udg_NextY[p],3,6)
        call spawnblockunit(udg_NextX[p]+1,udg_NextY[p],14,6)
        call spawnblockunit(udg_NextX[p]+1,udg_NextY[p]-1,6,6)
    else
    endif
    if ( udg_NextFigure[p] == 5 ) then
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p],11,10)
        call spawnblockunit(udg_NextX[p],udg_NextY[p],3,10)
        call spawnblockunit(udg_NextX[p]+1,udg_NextY[p],2,10)
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p]-1,6,10)
    else
    endif
    if ( udg_NextFigure[p] == 6 ) then
        call spawnblockunit(udg_NextX[p],udg_NextY[p],11,9)
        call spawnblockunit(udg_NextX[p]+1,udg_NextY[p],2,9)
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p]-1,4,9)
        call spawnblockunit(udg_NextX[p],udg_NextY[p]-1,12,9)
    else
    endif
    if ( udg_NextFigure[p] == 7 ) then
        call spawnblockunit(udg_NextX[p]-1,udg_NextY[p],4,2)
        call spawnblockunit(udg_NextX[p],udg_NextY[p],14,2)
        call spawnblockunit(udg_NextX[p],udg_NextY[p]-1,13,2)
        call spawnblockunit(udg_NextX[p]+1,udg_NextY[p]-1,2,2)
    else
    endif
endfunction

//движение юнита с точки xy в точку xy
function MyMoveUnitXY takes integer xold, integer yold, integer xnew, integer ynew returns nothing
local integer oldid = mx(xold, yold)
local integer newid = mx(xnew, ynew)
SetUnitX(udg_Unit[oldid], xy(xnew))
SetUnitY(udg_Unit[oldid], xy(ynew))
set udg_Unit[newid] = udg_Unit[oldid]
set udg_Unit[oldid] = null
endfunction

//сдвиг юнита по оси X
function MyMoveUnitX takes integer xold, integer yold, integer offset returns nothing
local integer oldid = mx(xold, yold)
local integer newid = mx(xold+offset, yold)
SetUnitX(udg_Unit[oldid], xy(xold+offset))
set udg_Unit[newid] = udg_Unit[oldid]
set udg_Unit[oldid] = null
endfunction

//сдвиг юнита по оси Y
function MyMoveUnitY takes integer xold, integer yold, integer offset returns nothing
local integer oldid = mx(xold, yold)
local integer newid = mx(xold, yold+offset)
SetUnitY(udg_Unit[oldid], xy(yold))
set udg_Unit[newid] = udg_Unit[oldid]
set udg_Unit[oldid] = null
endfunction

//Перенос блока с положения Next на место Start
function MoveBlockToStart takes integer p, integer figa returns nothing
call MyMoveUnitXY(udg_NextX[p],udg_NextY[p],udg_StartX[p],udg_StartY[p])
if (figa == 1 )
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p],udg_StartX[p]-1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]+1,udg_NextY[p],udg_StartX[p]+1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]+2,udg_NextY[p],udg_StartX[p]+2,udg_StartY[p])
endif
if (figa == 2 )
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p],udg_StartX[p]-1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]+1,udg_NextY[p],udg_StartX[p]+1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p],udg_NextY[p]-1,udg_StartX[p],udg_StartY[p]-1)
endif
if (figa == 3 )
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p],udg_StartX[p]-1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p]-1,udg_StartX[p]-1,udg_StartY[p]-1)
call MyMoveUnitXY(udg_NextX[p],udg_NextY[p]-1,udg_StartX[p],udg_StartY[p]-1)
endif
if (figa == 4 )
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p],udg_StartX[p]-1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]+1,udg_NextY[p],udg_StartX[p]+1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]+1,udg_NextY[p]-1,udg_StartX[p]+1,udg_StartY[p]-1)
endif
if (figa == 5 )
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p],udg_StartX[p]-1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]+1,udg_NextY[p],udg_StartX[p]+1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p]-1,udg_StartX[p]-1,udg_StartY[p]-1)
endif
if (figa == 6 )
call MyMoveUnitXY(udg_NextX[p]+1,udg_NextY[p],udg_StartX[p]+1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p]-1,udg_StartX[p]-1,udg_StartY[p]-1)
call MyMoveUnitXY(udg_NextX[p],udg_NextY[p]-1,udg_StartX[p],udg_StartY[p]-1)
endif
if (figa == 7 )
call MyMoveUnitXY(udg_NextX[p]-1,udg_NextY[p],udg_StartX[p]-1,udg_StartY[p])
call MyMoveUnitXY(udg_NextX[p],udg_NextY[p]-1,udg_StartX[p],udg_StartY[p]-1)
call MyMoveUnitXY(udg_NextX[p]+1,udg_NextY[p]-1,udg_StartX[p]+1,udg_StartY[p]-1)
endif
endfunction

//задача функции перевести фигуру "некст" в состояние "текущая"
function NextToCurrent takes integer p returns nothing
set udg_CurrentFigure[p] = udg_NextFigure[p]
set udg_CurrentID[p] = mx(udg_StartX[p],udg_StartY[p])
set udg_CurrentTurn[p] = 1

call MoveBlockToStart(p, udg_CurrentFigure[p])
endfunction

//проверка юнита в оффсетах от Current по X,Y
function NullCheck takes integer p, integer x, integer y returns boolean
if udg_Unit[mx(tx(udg_CurrentID[p])+x,ty(udg_CurrentID[p])+y)]==null
return true
endif
return false
endfunction
С цветами тоже загвоздка выходит..
Содержание чёрного в перепадах цветов не одинаковое, поэтому цвет, получающийся при смешении альфы с самым ярким в наборе местами даёт не тот результат.
Похоже что этим способом не получится сделать 1 в 1. Только похоже..
прикреплены файлы
Это сообщение удалено