|
3D-программирование Вопросы, касающиеся программирования 3D мира |
15.02.2007, 13:48
|
#1
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Как работать с массивом?
Type Camera
Field obj
End Type
Global terrain
Global fontA=LoadFont ("Times new roman",20)
SetFont fontA
Graphics3D 640,480,16,2
SetBuffer BackBuffer()
fnCreateCam1()
fnCreateTerr()
light=CreateLight()
RotateEntity light,90,0,0
cube1=CreateCube()
EntityColor cube1,0,0,255
cube2=CreateCube()
EntityColor cube2,255,0,0
PositionEntity cube2,10,0,0
Dim massiv(32,32)
Global c_x1=0,c_y1=0,c_x2=3,c_y2=0
Repeat
Cls
PositionEntity cube1,c_x1,0,c_y1
PositionEntity cube2,c_x2,0,c_y2
If KeyHit(2)
c_x1=c_x1+1
If(c_x1=c_x2) c_x1=c_x1-1
EndIf
If KeyHit(3)
c_x1=c_x1-1
If(c_x1=c_x2) c_x1=c_x1+1
EndIf
If(c_x1<0) c_x1=0
If(c_x1>32) c_x1=32
If(c_y1<0) c_y1=0
If(c_y1>32) c_y1=32
RenderWorld
Text 0,0,"Use cursor keys to move about the terrain"
For cam1.camera = Each camera
If KeyHit(1)
fnDeleteCam1(cam1)
End
FreeFont fonta
End If
Next
If KeyHit(2) Then freeTerrain()
Flip
Forever
Function fnCreateTerr()
terrain=CreateTerrain(32)
EntityColor terrain,0,128,255
EntityAlpha terrain,.5
End Function
Function freeTerrain()
FreeEntity terrain
End Function
Function fnCreateCam1.camera()
Local cam1.camera
cam1 = New Camera
cam1\obj = CreateCamera()
; CameraClsColor cam1\obj,0,255,0
PositionEntity cam1\obj,15,25,15
RotateEntity cam1\obj,90,0,0
Return cam1
End Function
Function fnDeleteCam1(cam1.camera)
For cam1.camera = Each camera
FreeEntity cam1\obj
Delete cam1
Next
End Function
На этом примере есть террайн 32 на 32
Массив 32 на 32
Дву кубика, один из них движется по нажатию 1 или 2 на клаве.
У меня есть этот семпл, но я никак не могу понять, как можно разбить карту на квадратики, и проверять, если клетка пустая, то кубик может туда идти, а елси там объект, то стоп...то есть так я собираюсь заменить коллизию и сделать удобным перемещение. Рднако я не до конца в этом разобрался + если удалить массив, то разницы никакой! Как мне это реализовать?
1) Что бы квадратик ходил при нажатии на 1 клетку, и, что бы эта клетка была "занята" когда квадратик там стоит
2) Нарисовать линии (или как-то спрайтами) ... что бы было видно, что террайн разделен на клетки...
Может я что-то не так описал, но я правда не очень понимаю как работает массив, но не прочь это усвоить!
Спасибо за внимание.
|
(Offline)
|
|
16.02.2007, 01:45
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Как работать с массивом?
вот, наваял за 5 мин пример с 2д. в 3д сам переведеш.
Graphics 640,480,16,2
SetBuffer BackBuffer()
Dim m(17,17)
SeedRnd MilliSecs()
For i=0 To 17
m(i,0)=1
m(0,i)=1
m(i,17)=1
m(17,1)=1
Next
For i=1 To 16
For j=1 To 16
m(i,j)=Rand(0,1)
Next
Next
m(1,1)=0
px=1:py=1
While Not KeyDown(1)
Cls
Color 255,0,0
Rect px*16,py*16,16,16,1
Color 0,255,0
For i=1 To 16
For j=1 To 16
If m(i,j) Then Rect i*16,j*16,16,16,1
Next
Next
If KeyHit(203) And m(px-1,py)=0 Then px=px-1
If KeyHit(205) And m(px+1,py)=0 Then px=px+1
If KeyHit(208) And m(px,py+1)=0 Then py=py+1
If KeyHit(200) And m(px,py-1)=0 Then py=py-1
Flip
Wend
|
(Offline)
|
|
16.02.2007, 18:20
|
#3
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Как работать с массивом?
Сейчас сидел и разбирался в коде. К сожалению без комментов ничего не помнятно. Конечно я могу переделать этот код, но я так и не понял по какому принципу в примере движется квадрат и как он "понимает" что клетка, где синий квадрат - занята
|
(Offline)
|
|
17.02.2007, 01:29
|
#4
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Как работать с массивом?
If KeyHit(203) And m(px-1,py)=0 Then px=px-1
If KeyHit(205) And m(px+1,py)=0 Then px=px+1
If KeyHit(208) And m(px,py+1)=0 Then py=py+1
If KeyHit(200) And m(px,py-1)=0 Then py=py-1
обратии внимание, что здесь стоит Key Hit.
px, py - позиция (от 1 до 16)
потом при нажатии определенной клавиши проверяется соседняя клетка, например при нажатии кномпи влево - проверяется левая соседняя клетка.
|
(Offline)
|
|
22.02.2007, 15:09
|
#5
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Как работать с массивом?
Опять по поводу массива.
Вот до сих пор не могу понять, как его "применять" на практике.
Создал я массив.
А дальше, как я понял, его нужно чем-то или как-то заполнить
Мне нужно что бы как-то это поле (32 на 32) было разделено на квадратики (условно конечно) . То есть 1 единице массива соовтесвует отпред. Координата данного поля + что бы кубик ходил при нажатии на 1 единицу и "знал" что если клетка пустая, туда можно идти, а если занята (другим кубиком) ну или "выход за предел" то идти никак нельзя...
Проклятые массивы или я...но пока я никак не могу с ними подружиться
Type Camera
Field obj
End Type
Global terrain
Dim masLand(32,6,32)
Graphics3D 640,480,16,2
SetBuffer BackBuffer()
Global fontA=LoadFont ("Arial",24)
SetFont fontA
fnCreateCam1()
fnCreateTerr()
light=CreateLight()
RotateEntity light,90,0,0
cube1=CreateCube()
EntityColor cube1,0,0,255
cube2=CreateCube()
EntityColor cube2,255,0,0
PositionEntity cube2,10,0,0
Repeat
Cls
For cam1.camera = Each camera
If KeyHit(1) Then fnDeleteCam1(cam1):End:FreeFont fonta
Next
UpdateWorld
RenderWorld
Flip
Forever
Function fnCreateTerr()
terrain=CreateTerrain(32)
EntityColor terrain,0,128,255
EntityAlpha terrain,.5
End Function
Function freeTerrain()
FreeEntity terrain
End Function
Function fnCreateCam1.camera()
Local cam1.camera
cam1 = New Camera
cam1\obj = CreateCamera()
; CameraClsColor cam1\obj,0,255,0
PositionEntity cam1\obj,15,25,15
RotateEntity cam1\obj,90,0,0
Return cam1
End Function
Function fnDeleteCam1(cam1.camera)
For cam1.camera = Each camera
FreeEntity cam1\obj
Delete cam1
Next
End Function
|
(Offline)
|
|
22.02.2007, 21:54
|
#6
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
Re: Как работать с массивом?
Буду комментировать только самое интересное
Type Camera
Field obj
End Type
Global terrain
Dim masLand(32,6,32)
Graphics3D 640,480,16,2
SetBuffer BackBuffer()
Global fontA=LoadFont ("Arial",24)
SetFont fontA
fnCreateCam1()
fnCreateTerr()
light=CreateLight()
RotateEntity light,90,0,0
player=CreateCube()
EntityColor player,0,100,255
cube_for_copy=CreateCube()
EntityColor cube_for_copy,0,0,255
HideEntity cube_for_copy
Dim m(17,17)
SeedRnd MilliSecs()
;это не знаю, зачем, спросите у HolyDel, я не очень вникал
For i=0 To 17
m(i,0)=1
m(0,i)=1
m(i,17)=1
m(17,1)=1
Next
; здесь рандомом создаются единицы, чтобы потом знать, где блоки
For i=1 To 16
For j=1 To 16
m(i,j)=Rand(0,1)
Next
Next
; здесь я создал тип для блоков
Type N_Brick
Field mesh
Field x,y,z
End Type
m(1,1)=0
px=1:py=1
PositionEntity player,2.2,0,-2.2
; здесь размещаю блоки, i*2.2,0,-j*2.2 - исходя из i,j массива
For i=1 To 16
For j=1 To 16
If m(i,j)=1
block.N_Brick= New N_Brick
block\mesh=CopyEntity(cube_for_copy)
PositionEntity block\mesh,i*2.2,0,-j*2.2
EndIf
Next
Next
Repeat
; ну и здесь проверяется и двигается главный герой
If KeyHit(203) And m(px-1,py)=0
MoveEntity player,-2.2,0,0
px=px-1
EndIf
If KeyHit(205) And m(px+1,py)=0
MoveEntity player,2.2,0,0
px=px+1
EndIf
If KeyHit(208) And m(px,py+1)=0
MoveEntity player,0,0,-2.2
py=py+1
EndIf
If KeyHit(200) And m(px,py-1)=0
MoveEntity player,0,0,2.2
py=py-1
EndIf
UpdateWorld ()
RenderWorld ()
Flip
Until KeyDown(1)
Function fnCreateTerr()
terrain=CreateTerrain(32)
EntityColor terrain,0,128,255
EntityAlpha terrain,.5
MoveEntity terrain,-.5,0,-38
ScaleEntity terrain,1.2,1.2,1.2
End Function
Function freeTerrain()
FreeEntity terrain
End Function
Function fnCreateCam1.camera()
Local cam1.camera
cam1 = New Camera
cam1\obj = CreateCamera()
; CameraClsColor cam1\obj,0,255,0
PositionEntity cam1\obj,15,35,-20
RotateEntity cam1\obj,90,0,0
Return cam1
End Function
Function fnDeleteCam1(cam1.camera)
For cam1.camera = Each camera
FreeEntity cam1\obj
Delete cam1
Next
End Function
|
(Offline)
|
|
23.02.2007, 01:22
|
#7
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Как работать с массивом?
;это не знаю, зачем, спросите у HolyDel, я не очень вникал
For i=0 To 17
m(i,0)=1
m(0,i)=1
m(i,17)=1
m(17,1)=1
Next
чтоб куб за границу карты не уезжал.
|
(Offline)
|
|
23.02.2007, 13:13
|
#8
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Как работать с массивом?
Огормное спасибо!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:42.
|