PDA

Просмотр полной версии : Алгоритм "вдаль к горизонту"



Destr
18.06.2013, 00:47
Подскажите, плиз, кто знает как реализовать такой алгоритм "земли" как в Moonsweeper.
Т.е. чтоб как-бы вдаль уходила.
Можно на бейсике.
Нарисовать - получается, а вот чтоб двигалось (вперёд-назад) да ещё и рекурсивно (без "прыжков") - не могу сообразить как.

jerri пытался мне втолковать (даже пример давал, но не наглядный), и я всё равно не въехал.

P.S. Во вложении примеры игр (снапшоты) с такой поверхностью.
(два архива, rar и zip, оба с одинаковым содержимым, кому какой нравится)

newart
18.06.2013, 02:47
Подскажите, плиз, кто знает как реализовать такой алгоритм "земли" как в Moonsweeper.
Так игры разные.

Накодить полоски и шахматку, не одно и тоже, не говоря уже о текстурах.

А полноценную текстуру с поворотами натянуть не хочешь?

Destr
18.06.2013, 02:57
Так игры разные.
Ну принцип "движемся к горизонту" один и тот-же.


Накодить полоски и шахматку, не одно и тоже, не говоря уже о текстурах.
Вообще-то полоски в шахматку совсем не трудно превратить.
(рисовать сплошняки через одну, а потом полоски поперек тоже через одну и по XOR - вот тебе и шахматка)


А полноценную текстуру с поворотами натянуть не хочешь?
Не, это пока без надобности.
Если приспичит - буду читать твой трёп с AloneCoder`ом :)

---------- Post added at 02:57 ---------- Previous post was at 02:55 ----------

Кое-что по сабжу кстати начало получатся, но по моему до совершенства далеко.

Пример на purebasic:



Procedure Ris(arg.f)
StartDrawing(CanvasOutput(0))
Box(0,0,256*3,192*3,0)
horiz = 192/2
Box(0, horiz*3, 256*3, 3, RGB(255,255,255))

y.f = 0: ystp.f = arg
Repeat
Box(0, horiz*3+y*3, 256*3, 3, RGB(255,255,255))
y = y + ystp
ystp = ystp + 2
Until y>191
StopDrawing()
ProcedureReturn
EndProcedure

If OpenWindow(0, 0, 0, 256*3, 192*3, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CanvasGadget(0, 0, 0, 256*3, 192*3)
quit.a = 0
yp.f = 0.5
Repeat
Event = WaitWindowEvent(10)

Ris(yp)

yp = yp + 0.3

If yp>2
yp = 0
EndIf


If Event = #PB_Event_CloseWindow
quit = 1
EndIf
quit = quit | GetAsyncKeyState_(#VK_ESCAPE)

Until quit
EndIf
EndIf
End

Hacker VBI
18.06.2013, 09:59
Destr, log x (https://www.google.com.ua/search?q=log+x&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:uk:official&client=firefox-a)

Destr
18.06.2013, 14:30
Destr, log x
Так и что с ним делать?

Destr
18.06.2013, 14:49
Пока что получается вот так:

ORG #8000
DI:LD SP,#8000
CALL INIT ; инициализируем табличку координат
START
HALT
LD BC,#0000
CALL RIS ; затираем старые линии

LD HL,(STP) ; смещаемся
LD DE,(SPD)
ADD HL,DE
RES 2,H
LD (STP),HL

LD BC,#FFFF
CALL RIS ; рисуем новую позицию
JR START

STP DW 0 ; текущий шаг
SPD DW #0040; скорость "полёта"

RIS EXX
LD (RIS0+1),SP
LD HL,0
LD DE,(STP)
RIS1
LD A,H
EXX
CP #60
JR NC,RIS0
ADD A,A
LD L,A
LD H,high TAB_COOR
LD A,(HL)
INC L
LD H,(HL)
LD L,A
LD SP,HL

REPT 16
PUSH BC
ENDR
EXX
ADD HL,DE
INC D
INC D
INC D
INC D

JR RIS1
RIS0 LD SP,0
RET

TAB_COOR EQU #C000

INIT LD DE,#489F
LD HL,TAB_COOR
LD B,#60
INI1 INC DE
LD (HL),E
INC HL
LD (HL),D
INC HL
DEC DE
CALL DINC
DJNZ INI1
RET

DINC
INC D
LD A,D
AND 7
RET NZ
LD A,E
SUB #E0
LD E,A
SBC A,A
AND #F8
ADD A,D
LD D,A
RET


Но в moonsweeper`е всё равно красивше :(
(во вложении два снапшота для сравнения)

Hacker VBI
05.09.2013, 15:22
Destr, вот статейка (http://www.extentofthejam.com/pseudo/) по этому поводу.
спасибо передавай Гоблину.

Destr
05.09.2013, 15:57
Destr, вот статейка по этому поводу.
спасибо передавай Гоблину.
Наверное статья неплохая, но по английски малопонятна, а уж если перевести на русский (сказав "Перевести" в ответ на предложение браузера) - то вообще ей дорога в камеди-клаб.
Одни только "Лешие и данных" (Sprites and Data) чего стоят :)