forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Как работать с массивом? (http://forum.boolean.name/showthread.php?t=2707)

Fant 15.02.2007 13:48

Как работать с массивом?
 
Код:


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) Нарисовать линии (или как-то спрайтами) ... что бы было видно, что террайн разделен на клетки...

Может я что-то не так описал, но я правда не очень понимаю как работает массив, но не прочь это усвоить!

Спасибо за внимание.

HolyDel 16.02.2007 01:45

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


Fant 16.02.2007 18:20

Re: Как работать с массивом?
 
Сейчас сидел и разбирался в коде. К сожалению без комментов ничего не помнятно. Конечно я могу переделать этот код, но я так и не понял по какому принципу в примере движется квадрат и как он "понимает" что клетка, где синий квадрат - занята

HolyDel 17.02.2007 01:29

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

обратии внимание, что здесь стоит KeyHit.
px, py - позиция (от 1 до 16)
потом при нажатии определенной клавиши проверяется соседняя клетка, например при нажатии кномпи влево - проверяется левая соседняя клетка.

Fant 22.02.2007 15:09

Re: Как работать с массивом?
 
Опять по поводу массива.

Вот до сих пор не могу понять, как его "применять" на практике.

Создал я массив.
А дальше, как я понял, его нужно чем-то или как-то заполнить:4to:

Мне нужно что бы как-то это поле (32 на 32) было разделено на квадратики (условно конечно) . То есть 1 единице массива соовтесвует отпред. Координата данного поля + что бы кубик ходил при нажатии на 1 единицу и "знал" что если клетка пустая, туда можно идти, а если занята (другим кубиком) ну или "выход за предел" то идти никак нельзя...

Проклятые массивы или я...но пока я никак не могу с ними подружиться:wallbash:

Код:

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


Vyacheslav 22.02.2007 21:54

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


HolyDel 23.02.2007 01:22

Re: Как работать с массивом?
 
;это не знаю, зачем, спросите у HolyDel, я не очень вникал
For i=0 To 17
m(i,0)=1
m(0,i)=1
m(i,17)=1
m(17,1)=1
Next
чтоб куб за границу карты не уезжал.

Fant 23.02.2007 13:13

Re: Как работать с массивом?
 
Огормное спасибо!


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

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