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=8227)

ARTMAN 29.04.2009 17:55

Застрял на ровном месте...
 
Что имеется:

обьект(загрузил меш), тип: палка(например), в типе b\ent=copyentity(обьект (вышеуказанный))

Вырезка из моего кода:

Код:

picked=CameraPick(cam,MouseX(),MouseY())

If picked>0
If EntityDistance(cam,picked)<10 And picked=b\ent And KeyHit( 18 ) Then
(что-то=что-то+1)
HideEntity picked
EndIf
EndIf

Ошибка: Variable must be a Type!
Вопрос: Что не так?:4to:

impersonalis 29.04.2009 18:00

Ответ: Застрял на ровном месте...
 
как ты заполняешь b?
чуть выше?

ARTMAN 29.04.2009 18:04

Ответ: Застрял на ровном месте...
 
Код:

Type palk
 Field ent
End Type

Function Create_palka()
 b.palk = New palk
 b\ent = CopyEntity(vetka)
 PositionEntity b\Ent,Rnd(-10,10),0,Rnd(-10,10)
 RotateEntity b\Ent,0,Rnd(360),0
 EntityPickMode b\ent,3
End Function


IGR 29.04.2009 18:12

Ответ: Застрял на ровном месте...
 
нада юзать For Each !!

ABTOMAT 29.04.2009 18:14

Ответ: Застрял на ровном месте...
 
b - глобальная переменная?
Если нет то и работать в д. случае не будет.
А вообще алгоритм надо основательно пересмотреть.
Смотри тутор Type валяется где-то в разделе переводов faq

ARTMAN 29.04.2009 18:16

Ответ: Застрял на ровном месте...
 
Спасибо, посмотрю, попробую.

impersonalis 29.04.2009 20:07

Ответ: Застрял на ровном месте...
 
Именно то, что написал АВТОМАТ я имел в виду.
Как заполняется b перед его использованием (т.е. сравненеим поля)

ARTMAN 29.04.2009 23:55

Ответ: Застрял на ровном месте...
 
Вроде что-то намудрил). Теперь (я дал номера каждому обьекту типа от 1 до 10) и когда жму клавишу при этом камера пик стоит на первом (обьектом под номером 1) действие происходит если же 2,3,4 и т.д. выбираю то ничего вообще не происходит.
Вот такая хрень(

"заполняется" - всмысле?

b- и глобал и неглобал, всё пробовал...

impersonalis 30.04.2009 01:11

Ответ: Застрял на ровном месте...
 
код - телепаты в отпуску

ARTMAN 30.04.2009 01:43

Ответ: Застрял на ровном месте...
 
Весь код:

Код:

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

Type palk
 Field ent
End Type

Global vetka=LoadMesh("vetka.b3d")
ScaleEntity vetka,0.1,0.1,0.1
EntityTexture vetka,wood
EntityPickMode vetka,3
PositionEntity vetka,0,0,30

For i=1 To 10
 b.palk = New palk
 b\ent = CopyEntity(vetka)
 PositionEntity b\ent,Rnd(-20,20),0,Rnd(-20,20)
 RotateEntity b\ent,0,Rnd(360),0
NameEntity b\ent,"palka "+i
Next

Const pl=1,zem=2,obj=3

light=CreateLight()

zemla=CreatePlane()
EntityTexture zemla,dirt
EntityType zemla,zem

Global cam=CreateCamera()
EntityRadius cam,3
PositionEntity cam,0,5,0
CameraRange cam,1,3000
EntityType cam,pl

ograda=LoadMesh("ograda.b3d")
EntityTexture ograda,wood
ScaleEntity ograda,0.1,0.1,0.1
PositionEntity ograda,0,0,10
EntityType ograda,obj

palki=0

Repeat

picked=CameraPick(cam,MouseX(),MouseY())

For b.palk=Each palk
If picked>0
If EntityDistance(cam,picked)<10 And picked=b\ent And KeyHit(18) Then
palki=palki+1
FreeEntity picked
EndIf
EndIf
Next

Collisions pl,zem,2,2
Collisions pl,obj,2,2

move()

If Not EntityCollided (cam,zem) Then TranslateEntity cam,0,-1,0

UpdateWorld : RenderWorld

Text 10,10,palki

If picked>0
 SetFont (font)
        Text MouseX(),MouseY()-12,EntityName(picked),True,True
EndIf

Flip
Until KeyHit(1)
End

;;;END;;;

Function move()

If KeyDown(17) MoveEntity cam,0,0,0.3
If KeyDown(31) MoveEntity cam,0,0,-0.3

TurnEntity cam,0,-MouseXSpeed()/2,0,True
TurnEntity cam,MouseYSpeed()/2,0,0

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

End Function


ABTOMAT 30.04.2009 01:59

Ответ: Застрял на ровном месте...
 
Дебаггером пользоваться умеешь?
Краткий инструктаж:
После строки
picked=CameraPick(cam,MouseX(),MouseY())
Вставь
If MouseHit(1) then Stop
Проверь, включён ли дебаг (галка Program->Debug Enabled)
И запусти. Когда нажмёшь на лев.кнопку мыши (в тот момент когда, на твой взгляд, что-то пикается) то программа свернётся и в окошке дебаггера справа смотри значение переменной Picked - если там 0 то ничего не пикнулось.
Если там цифра то значит пикнулось, но проблема в другом.
Я думаю:
1. Не пикается поэтому ничего не происходит
2. Не пикается потому что ты выставил EntityPickMode 3 а размеры прямоугольного параллелепипеда указать забыл.
Если ты выяснишь, что не пикается, попробуй EntityPickMode 2

ARTMAN 30.04.2009 02:01

Ответ: Застрял на ровном месте...
 
значение пикед=1609... много цифр.
ентити пик уже поставил но ничего не стало...
b.palk=(null)

Подведу итоги:
Из всей етой каши получается, что создаётя 10 обьектов обьединённых типом,
наважу камеру(мышь если так угодно) на !1!(первый) обьект - всё почемуто прекрасно работает, тоесть этот обьект удаляется и значение прибавляется если же камера наведена на 2-10ый обьекты, то ничего не происходит будто бы их прсто не существует хотя я проверил камера пик=1

....

tormoz 30.04.2009 11:05

Ответ: Застрял на ровном месте...
 
Поменяй кусок кода на это:

Код:

Collisions pl,zem,2,2
Collisions pl,obj,2,2


Repeat

If KeyHit(1)
picked=CameraPick(cam,MouseX(),MouseY())

If picked
For b.palk=Each palk
If picked=b\ent
If EntityDistance(cam,picked)<10
palki=palki+1
FreeEntity b\ent
Delete b
EndIf
EndIf
Next
EndIf
EndIf

Потом проанализируй в чем ты допустил ошибки и почему этот код намного эффективнее ;)

ARTMAN 30.04.2009 15:25

Ответ: Застрял на ровном месте...
 
tormoz, rак же я тебе благодарен, спасибо тебе большое!!!:super:

Всем кто отозвался также спасибо!

Тема закрыта...


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

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