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).
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
Ответ: 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)
Блин ни как кодек подобрать не могу =))
__________________
Острый психоз- это когда вы разговариваете с кошкой.
Острый галлюцинаторный психоз - вы говорите с кошкой, которой не существует.
Паранойя - вы боитесь ляпнуть лишнего при кошке.
Шизофрения - иногда у вас появляется кошка, которая разговаривает.
Неврастения - вы жалуетесь кошке, она молчит, игнорирует вас и это для вас невыносимо!!!
Навязчивый невроз - вы уверены, что кошка не одна и они что-то замышляют!
Последний раз редактировалось Markova, 17.03.2012 в 08:40.
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 ячейки массива зная его координаты.
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
Ответ: 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
Сейчас со мной произошла довольно странная вещь. Решив ещё потренироваться в работе с камерой, решил сделать 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 находится в начале экрана, то и игрок находится в начале карты, когда в конце - игрок в конце и тд. , но визуально кажется что игрок медленнее квадратика. Это оптическая иллюзия, или вообще что это за такое и как это происходит?
я знаю где что рисуется и что эти переменные значат( cx - camera_x, px - player_x), но я не знаю почему так происходит, что квадрат в рх ру быстрее игрока
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
Ответ: Vivo
Rect R1/2-(200),R2/2+(200),10,10,1 ne? =)) вот а так Rect px/5,py/2,10,10,1=) ) медленнее а что нужно получить
__________________
Острый психоз- это когда вы разговариваете с кошкой.
Острый галлюцинаторный психоз - вы говорите с кошкой, которой не существует.
Паранойя - вы боитесь ляпнуть лишнего при кошке.
Шизофрения - иногда у вас появляется кошка, которая разговаривает.
Неврастения - вы жалуетесь кошке, она молчит, игнорирует вас и это для вас невыносимо!!!
Навязчивый невроз - вы уверены, что кошка не одна и они что-то замышляют!
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
Ответ: Vivo
Ну так дело не в квадрате, а в плеере, который привязан к курсору то есть стоящему в середине экрана DrawImage player_image,R1/2,R2/2 =) ) DrawImage player_image,R1/2+px,R2/2+py/3
__________________
Острый психоз- это когда вы разговариваете с кошкой.
Острый галлюцинаторный психоз - вы говорите с кошкой, которой не существует.
Паранойя - вы боитесь ляпнуть лишнего при кошке.
Шизофрения - иногда у вас появляется кошка, которая разговаривает.
Неврастения - вы жалуетесь кошке, она молчит, игнорирует вас и это для вас невыносимо!!!
Навязчивый невроз - вы уверены, что кошка не одна и они что-то замышляют!
Пока моделлер работает, заняться мне нечем, поэтому решил-ка я позаниматься этим проектам. По-сколько кроме быдлокода я ничего в исходниках не нашёл, решил писать всё заново, отказавшись от экранов. Они были удобны, но многие говорили что это убивает геймлей. В общем, помогите с выбором:
1). Делать 9 чанков размером с экран, чтобы они окружали текущий экран.
2). Делать уйму маленьких чанков.
3). Послать всех и оставить экраны
P.S. в первых двух случаях игрок находится всегда в центре экрана.
И ещё, вдруг у кого завалялась инфа по данной теме, поделитесь, буду признателен( тоже к двум первым случаям относится).