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 и не задавай глупых вопросов


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

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