forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на BlitzMax (http://forum.boolean.name/forumdisplay.php?f=106)
-   -   Vivo (http://forum.boolean.name/showthread.php?t=16218)

Nikich 16.03.2012 16:57

Ответ: Vivo
 
Кажется понял почему есть проблемы. Оказывается я до сих пор ничего не знал о банках, а они как оказалось полезны.

Nikich 17.03.2012 01:43

Ответ: Vivo
 
Код:

Global rc=CountGfxModes()
Global R1=GfxModeWidth(rc)
Global R2=GfxModeHeight(rc)

Graphics R1,R2
Global fnt1=LoadFont("Arial",24)
SetFont fnt1
SetBuffer BackBuffer()
Dim TileImg(50)
TileImg(0)=LoadImage("ground.bmp")
TileImg(1)=LoadImage("grass.bmp")
Global cx#,cy#,plx#,ply#,tdst,tfps,fps
Global lfps=60
Type tl
 Field x,y,z,id
End Type
Dim tld(10000,10000)
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim ObjImg(50)
For i=0 To 2
ObjImg(i)=LoadImage("rock"+(i+1)+".bmp")
MaskImage ObjImg(i),255,255,255
HandleImage ObjImg(i),48,32
Next

Type obj
 Field x,y,z,id,life
End Type
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim pl(2,2)
For i=-1 To 1
For i1=-1 To 1
pl(i+1,i1+1)=LoadImage("pl"+i+","+i1+".bmp")
MaskImage pl(i+1,i1+1),255,255,255
MidHandle pl(i+1,i1+1)
Next
Next

Global dx,dy
CreateWorld()


Function CreateWorld()
For i=0 To 100
 For j=0 To 100
 tld(i,j)=Rnd(0,1)
 DebugLog i
 Next
Next
End Function


Function UpdateTiles()

For i=Int((R1/2-cx-R1/2-32)/32) To Int((R1/2-cx+R1/2+32)/32)
For j=Int((R2/2-cy-R2/2-16)/16) To Int((R2/2-cy+R2/2+16)/16)


DrawImage TileImg(tld(i*32,j*16)),i*32,j*16


Next
Next
End Function

Function UpdatePlayer()
If KeyDown(17) Then
cy=cy+2.5
dy=1
dx=0
EndIf
If KeyDown(31) Then
cy=cy-2.5
dy=-1
dx=0
EndIf
If KeyDown(30) Then
cx=cx+5
dx=-1
If KeyDown(31)=0 And KeyDown(17)=0 Then 
dy=0
EndIf
EndIf
If KeyDown(32) Then
cx=cx-5
dx=1
If KeyDown(31)=0 And KeyDown(17)=0 Then
dy=0
EndIf
EndIf

Origin cx,cy

plx=R1/2-cx
ply=R2/2-cy
DrawImage pl(dx+1,dy+1),plx,ply
End Function

Function ClObj(x,y)
For o.obj=Each obj
If Int(o\x/64)=x And Int(o\y/32)=y Then
Return True
EndIf
Next
Return False

End Function

Function UpdateFPS()
If MilliSecs()-tfps<1000 fps=fps+1
If MilliSecs()-tfps>1000 Then
lfps=fps
tfps=MilliSecs()
fps=0
EndIf
Color 0,0,0
Text -cx,-cy,lfps
End Function

While Not KeyHit(1)


UpdateTiles()

UpdateFPS()
UpdatePlayer()



Flip
Cls
Wend

Тайлы 64(ширина) на 32. Помогите найти ошибку. Ругается на UpdateTiles( ничего удивительного, скорее всего я как-то не так написал формулу для вычисления x и y).

Markova 17.03.2012 07:33

Ответ: Vivo
 
Вы это, бросайте там перемножать =) зачем эти коды выкладывать, у тебя массив в минуса уходит =))

Код:

For i=0 To Int((R1/2-cx+R1/2+32)/32)
For j=0 To Int((R2/2-cy+R2/2+16)/16)


For i=Int((R1/2-cx-R1/2-32)/32) To Int((R1/2-cx+R1/2+32)/32)
For j=Int((R2/2-cy-R2/2-16)/16) To Int((R2/2-cy+R2/2+16)/16)

If KeyDown( 2 )=True Then x#=x#-0.1
If KeyDown( 3 )=True Then x#=x#+0.1

Text 10,10*i+(x#),"i:"+i*32
Text 50,10*j+(x#),"j:"+j*16

Next
Next

Проверь Text 10,10,TileImg(-1)


Блин ни как кодек подобрать не могу =))

Nikich 17.03.2012 14:19

Ответ: Vivo
 
Код:

Global rc=CountGfxModes()
Global R1=GfxModeWidth(rc)
Global R2=GfxModeHeight(rc)

Graphics R1,R2
Global fnt1=LoadFont("Arial",24)
SetFont fnt1
SetBuffer BackBuffer()
Dim TileImg(50)
TileImg(0)=LoadImage("ground.bmp")
TileImg(1)=LoadImage("grass.bmp")
Global cx#,cy#,plx#,ply#,tdst,tfps,fps
Global lfps=60
Type tl
 Field x,y,z,id
End Type
Dim tld(10000,10000)
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim ObjImg(50)
For i=0 To 2
ObjImg(i)=LoadImage("rock"+(i+1)+".bmp")
MaskImage ObjImg(i),255,255,255
HandleImage ObjImg(i),48,32
Next

Type obj
 Field x,y,z,id,life
End Type
For i=0 To 1
MaskImage TileImg(i),255,255,255
MidHandle TileImg(i)
Next
Dim pl(2,2)
For i=-1 To 1
For i1=-1 To 1
pl(i+1,i1+1)=LoadImage("pl"+i+","+i1+".bmp")
MaskImage pl(i+1,i1+1),255,255,255
MidHandle pl(i+1,i1+1)
Next
Next

Global dx,dy
CreateWorld()


Function CreateWorld()
For i=0 To 500
 For j=0 To 500
 tld(i,j)=Rnd(0,1)
 Next
Next
End Function


Function UpdateTiles()

For i=0 To 500
For j=0 To 500

If (i-j)*32+32>-cx And (i-j)*32-32<R1-cx And (i+j)*16+32>-cy And (i+j)*16-32<-cy+R2
DrawImage TileImg(tld(i,j)),(i-j)*32,(i+j)*16
EndIf

Next
Next
End Function

Function UpdatePlayer()
If KeyDown(17) Then
cy=cy+2.5
dy=1
dx=0
EndIf
If KeyDown(31) Then
cy=cy-2.5
dy=-1
dx=0
EndIf
If KeyDown(30) Then
cx=cx+5
dx=-1
If KeyDown(31)=0 And KeyDown(17)=0 Then 
dy=0
EndIf
EndIf
If KeyDown(32) Then
cx=cx-5
dx=1
If KeyDown(31)=0 And KeyDown(17)=0 Then
dy=0
EndIf
EndIf

Origin cx,cy

plx=R1/2-cx
ply=R2/2-cy
DrawImage pl(dx+1,dy+1),plx,ply
End Function

Function ClObj(x,y)
For o.obj=Each obj
If Int(o\x/64)=x And Int(o\y/32)=y Then
Return True
EndIf
Next
Return False

End Function

Function UpdateFPS()
If MilliSecs()-tfps<1000 fps=fps+1
If MilliSecs()-tfps>1000 Then
lfps=fps
tfps=MilliSecs()
fps=0
EndIf
Color 255,0,255
Text -cx,-cy,lfps
End Function

While Not KeyHit(1)


UpdateTiles()

UpdateFPS()
UpdatePlayer()



Flip
Cls
Wend

В предыдущем коде вам вряд ли многое понятно, так что выкладываю нормальную версию. В общем, нужна помощь в определении i,j ячейки массива зная его координаты.

Жека 18.03.2012 05:16

Ответ: Vivo
 
В тайловой карте вычислять индексы по координатам нет надобности; вот если наоборот то можно.
Всем объектам карты задай индексы cellX, cellX. Игроку конечно тоже.
При перемещении игрока изменяй индексы, пошел вверх - сделал cellY = cellY-1 и т.д.

Сейчас ты проходишь по всему массиву, как делал в for each, но можно только ближние к игроку клетки брать

Local startX% = player\cellX-viewCountX
If(startX < 0) startX = 0
Local endX% = player\cellX+viewCountX
If(endX >= fieldDimX) endX = fieldDimX-1
Local startY% = player\cellY-viewCountY
If(startY < 0) startY = 0
Local endY% = player\cellY+viewCountY
If(endY >= fieldDimY) endY = fieldDimY-1
Local xx%, yy%
For xx=startX to endX
For yy=startY to endY
; здесь только ближние к игроку
Next
Next

Nikich 18.03.2012 12:58

Ответ: Vivo
 
только viewcount_x и viewcount_y еще на два поделить нужно. Большое спасибо!

Nikich 21.03.2012 23:49

Ответ: Vivo
 
Вложений: 1
Сейчас со мной произошла довольно странная вещь. Решив ещё потренироваться в работе с камерой, решил сделать 2D платформер с скроллингом. Возникли трудности, но когда я написал код, я ВНЕЗАПНО задумался, а почему он работает?:) Это повергло меня в шок: я не понял как работает мой же код. Когда я его писал, всё выходило машинально и я даже не думал что я делаю, просто делал и всё.
Код:

Function UpdWorld()
Color 50,100,255
Rect cx,cy,R1,R2,1
DrawImage road(1),cx,R2-100+cy
End Function

Function UpdPl()
cx=R1/2-px
cy=R2/2-py
a=KeyDown(57)
b=KeyDown(32)-KeyDown(30)


If a>0 And air=0 Then
acv#=5
Else
acv#=acv#-0.3
EndIf
If acv#<-6 Then acv#=-6
If acv#>3 Then acv#=3
If b=0 ach=0




speedh#=ach#*5

speedv#=acv#*2.5


pny#=py#-speedv#
px#=pnx#

If pny<R2-100 Then

py#=pny#

Else
acv=0

EndIf

If b<>0 And air=0 And ach=0 Then
ach#=1
ElseIf b<>0 And air=1 And ach=0
ach#=0.5
EndIf
If air=0 And b<>0 ach=1

If b>0 Then
pnx=px+speedh
ElseIf b<0
pnx=px-speedh
EndIf




DrawImage player_image,R1/2,R2/2

Color 0,0,0
Text 0,0,px
Text 0,25,py
Text 0,50,acv
Text 0,75,ach
Text 0,100,air

If acv<>0 Then
air=1
Else
air=0
EndIf
Color 255,255,255
Rect px-5,py-5,10,10,1
End Function

Решив проверить все переменные я вообще запутался. Оказывается, переменные px,py двигаются быстрее игрока, что ли. То есть, они двигаются в каком-то масштабе относительно игрока: когда квадратик с px;py находится в начале экрана, то и игрок находится в начале карты, когда в конце - игрок в конце и тд. , но визуально кажется что игрок медленнее квадратика. Это оптическая иллюзия, или вообще что это за такое и как это происходит?

Hurrit 22.03.2012 02:46

Ответ: Vivo
 
Используй TAB, Люк!

Жека 22.03.2012 11:44

Ответ: Vivo
 
Игрок рисуется в центре экрана; пол рисуется в cx,cy; нижний кубик в px,py.

Названия переменных "человеческие" сделай, и яснее станет что и как у тебя.

Nikich 23.03.2012 09:49

Ответ: Vivo
 
я знаю где что рисуется и что эти переменные значат( cx - camera_x, px - player_x), но я не знаю почему так происходит, что квадрат в рх ру быстрее игрока:(

Markova 23.03.2012 18:41

Ответ: Vivo
 
Rect R1/2-(200),R2/2+(200),10,10,1 ne? =)) вот а так Rect px/5,py/2,10,10,1=) ) медленнее :ok: а что нужно получить:dontknow:

Nikich 23.03.2012 19:15

Ответ: Vivo
 
ничего получать не нужно, все хорошо работает, но я не понимаю как:)

Markova 23.03.2012 19:51

Ответ: Vivo
 
Ну так дело не в квадрате, а в плеере, который привязан к курсору то есть стоящему в середине экрана DrawImage player_image,R1/2,R2/2 =) ) DrawImage player_image,R1/2+px,R2/2+py/3

Nikich 23.03.2012 21:29

Ответ: Vivo
 
Я не понимаю почему px,py двигается быстрее чем игрок( если можно так выразится).

Nikich 22.04.2012 14:07

Ответ: Vivo
 
Пока моделлер работает, заняться мне нечем, поэтому решил-ка я позаниматься этим проектам. По-сколько кроме быдлокода я ничего в исходниках не нашёл, решил писать всё заново, отказавшись от экранов. Они были удобны, но многие говорили что это убивает геймлей. В общем, помогите с выбором:
1). Делать 9 чанков размером с экран, чтобы они окружали текущий экран.
2). Делать уйму маленьких чанков.
3). Послать всех и оставить экраны:)
P.S. в первых двух случаях игрок находится всегда в центре экрана.
И ещё, вдруг у кого завалялась инфа по данной теме, поделитесь, буду признателен( тоже к двум первым случаям относится).


Часовой пояс GMT +4, время: 08:27.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot