Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 15.02.2007, 13:48   #1
Fant
Бывалый
 
Регистрация: 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
HolyDel
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Как работать с массивом?

Сейчас сидел и разбирался в коде. К сожалению без комментов ничего не помнятно. Конечно я могу переделать этот код, но я так и не понял по какому принципу в примере движется квадрат и как он "понимает" что клетка, где синий квадрат - занята
(Offline)
 
Ответить с цитированием
Старый 17.02.2007, 01:29   #4
HolyDel
 
Регистрация: 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
обратии внимание, что здесь стоит KeyHit.
px, py - позиция (от 1 до 16)
потом при нажатии определенной клавиши проверяется соседняя клетка, например при нажатии кномпи влево - проверяется левая соседняя клетка.
(Offline)
 
Ответить с цитированием
Старый 22.02.2007, 15:09   #5
Fant
Бывалый
 
Регистрация: 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
Vyacheslav
ПроЭктировщик
 
Регистрация: 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
HolyDel
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Как работать с массивом?

Огормное спасибо!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как работать с тхт файлами? uairat Основной форум 32 27.06.2009 15:39
Как работать с функциями? gost6681 Основной форум 1 16.03.2009 16:59
Как работать с софт-клавишами Skythrone Основной форум 9 20.08.2008 15:46


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com