forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Score (http://forum.boolean.name/showthread.php?t=11589)

KingMaks 28.12.2009 22:11

Score
 
Вот создаються двадцать кубиков:

Global bonus = CreateCube()
EntityType bonus,Typebonus
HideEntity bonus


For x=1 To 20
s.score = New score
s\obj = CopyEntity (bonus)
PositionEntity bonus,Rand(-20,20),0,Rand(-20,20)
Next

затем нужно чтобы при столкновении с определенным кубиком,
удалялся имено тот кубик с которым игрок столкнулся:

If EntityCollided (player,Typebonus) Then
bonuses = bonuses +1
FreeEntity s\obj
End If

оно чот выдает что нету такого обьекта,
как зделать чтобы удалялся тот кубик с которым сталкуеться игрок?

Android 28.12.2009 22:21

Ответ: Score
 
Если не ошибаюсь, надо делать так.

Добавь в тип еще поле hp(ну или что-то свое)

s\hp=1

If EntityCollided (player,Typebonus) Then
bonuses = bonuses +1
s\hp=0
End If

If s\hp=0
FreeEntity s\obj
Delete s
End If

Писал по памяти, и в браузере. Но ты все-таки попробуй.

KingMaks 28.12.2009 23:49

Ответ: Score
 
когда происходит столкновение

та же ошибка :

s\hp = 0 - object does not exist

ABTOMAT 29.12.2009 00:11

Ответ: Score
 
У тебя s при удалении - фиксированная ссылка, не факт, что на тот объект, который столкнулся.
Надо перебрать все объекты score
Сравнить s\obj с коллизнувшимся
Если совпадают - удалить сначала s\obj, потом s
Разве не очевидно?
Есть кстати способ уйти от полного перебора, но пока с этим разберись.

KingMaks 29.12.2009 00:22

Ответ: Score
 
перебрал
теперь оно удаляет все кубики.

как Сравнить s\obj с коллизнувшимся ?
чтобы удалило именно тот который столкнулся

Android 29.12.2009 00:30

Ответ: Score
 
А, ну да, затупил :)
Встречаем еще порцию говнокода :)

s\hp=1

For s.название_типа = Each название_типа

If EntityCollided (player,Typebonus) Then
bonuses = bonuses +1
s\hp=0
End If

If s\hp=0
FreeEntity s\obj
Delete s
End If

Next


Вроде должно работать.

BlackOut 29.12.2009 01:03

Ответ: Score
 
Код:

Graphics3D 800,600,0,2
SetBuffer BackBuffer() : SeedRnd (MilliSecs())

;типы колизий
Const TypeMegaBonus = 1
Const TypePoint = 2

;обьявляю тип для кубиков
Type TMegaCube
Field cub
End Type

Global point = CreateCube()
EntityType point,TypePoint

Global cam = CreateCamera(point)
PositionEntity cam, 0, 10, -15

;создаем 20 мега кубиков
pos=0
For i=1 To 20
        pos=pos+15
       
        c.TMegaCube = New TMegaCube
        c\cub = CreateCube()
        EntityType c\cub,TypeMegaBonus
       
        EntityColor c\cub,Rand(0,255), Rand(0,255), Rand(0,255)
        PositionEntity c\cub,Rand(-20,20),0,pos
Next

Collisions TypePoint,TypeMegaBonus,2,3
;ОСНОВНОЙ ЦИКЛ
While Not KeyDown(1)

PointEntity cam,point
UpdateMove ()

coll = EntityCollided (point,TypeMegaBonus)
If coll Then ;с чем то столкнулись...перебираем список на совпадение "хендлов", и херим нужный
        For c.TMegaCube = Each TMegaCube
                If coll=c\cub Then
                  FreeEntity c\cub : Delete c
                  Exit ;уже нашли нужный останавливаем перебор зачем нам перебирать другие?
                EndIf
        Next
EndIf

UpdateWorld ()
RenderWorld ()
Flip
Delay 25
Wend

End

;ФУНКЦИИ
Function UpdateMove ()
        If KeyDown(200) Then MoveEntity point,0,0,1
        If KeyDown(208) Then MoveEntity point,0,0,-1
        If KeyDown(203) Then TurnEntity point,0,1.5,0
        If KeyDown(205) Then TurnEntity point,0,-1.5,0
End Function

держи...примерно так. можно еще вогнать кубики в массив, смотри как тебе удобней.

Цитата:

Есть кстати способ уйти от полного перебора, но пока с этим разберись.
а ну ка раскажи, чет недогоняю...

BlackOut 29.12.2009 01:05

Ответ: Score
 
а все догнал, херить сразу полученный хендл (командой EntityCollided) собственно =) чет ступил

ABTOMAT 29.12.2009 01:16

Ответ: Score
 
Цитата:

перебрал
теперь оно удаляет все кубики.
Сначала сравнить
Потом удалять (при условии что сравнение совпало, естественно)

KingMaks 29.12.2009 01:33

Ответ: Score
 
всё, работает правильно. всем пасиба:-D

shyrikkk 30.12.2009 09:30

Ответ: Score
 
посмотрел выше код ,зачем вот это выражение For i=1 To 20 ?

Randomize 30.12.2009 09:32

Ответ: Score
 
Цитата:

Сообщение от shyrikkk (Сообщение 131621)
посмотрел выше код ,зачем вот это выражение For i=1 To 20 ?

В цикле создаются 20 кубиков, ваш покорный слуга КО.

shyrikkk 30.12.2009 11:04

Ответ: Score
 
я пoнимаю что двадцать кубиков мы создаём .И что i=1 To 20 . Но i нигде потом не встречается в программе , i даже кагбудто к кубикам не принадлежит.

NitE 30.12.2009 12:25

Ответ: Score
 
а ты напиши без i и посмотри что будет.

Hurrit 30.12.2009 13:44

Ответ: Score
 
Shyrikk, RTFM и не задавай глупых вопросов

KingMaks 30.12.2009 15:49

Ответ: Score
 
Цитата:

Сообщение от shyrikkk (Сообщение 131626)
я пoнимаю что двадцать кубиков мы создаём .И что i=1 To 20 . Но i нигде потом не встречается в программе , i даже кагбудто к кубикам не принадлежит.

это допустим ,если ты хочеш какойто кубик отличить от других:

if i=13 then
EntityColor cub,128,255,0
end if

в результате все кубы будут серые, а 13 зеленым

BlackOut 30.12.2009 16:01

Ответ: Score
 
учите синтаксис мать вашу!!! цикл for next исполняется для тех пор пока какая то определенная заданная переменная (в нашем случае это i) не будет больше допустимого значение (здсь. это 20)

Randomize 30.12.2009 16:58

Ответ: Score
 

а ещё цыкол полезен тем шо можно многа деладь одно что нужно нам щас. цыкол хоршо с масивом это удобно.(c)


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

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