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

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

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

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

Ответ
 
Опции темы
Старый 05.01.2008, 17:51   #1
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Type in Type

В лабораторных условиях после 20-тиминутного мозгового штурма (аж самому смешно) был взращен код, реализующий конструкцию "тип в типе". Люди, использую(овав)ши(/щи)е BlitzMax поймут, насколько это может быть удобно. Так вот, в Blitz3D это все возможно, но вот по поводу удобства... В общем, все как всегда (;

Воть кодь:

; Надеюсь, _здесь_ комментарии не нужны?
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

cam = CreateCamera()
lit = CreateLight()
RotateEntity lit, 0,80,34
PositionEntity cam, 0,0,-30
;----------------
; Главный тип, содержащий поле из типа "coords"
Type player
    Field img
    Field pos.coords
    Field ID#
End Type

; Подтип. ID-поля нужны для "синхронизации" главного типа и подтипа.
Type coords
    Field ID#
    Field x#
    Field y#
End Type
;----------------
; Генерим 30 спрайтов, и объектов соответственно
For c=1 To 30
    p.player = New player
    p\img = CreateSprite()
    ; выбираем ID... Как видно, шансы совпадения ID->0. Для чего? А сами поразмыслите...
    ; Можно конечно было сделать все через счетчик, но данный метод довольно надежен
    p\ID = Rnd(-2^31,2^31)
        p\pos.coords = New coords    ; Обращаемся непосредственно к подтипу
        p\pos\x = Rand(-40,40)
        p\pos\y = Rand(-40,40)
        p\pos\ID = p\ID
    ; Начальная расстановка
    PositionEntity p\img,p\pos\x,p\pos\y,0
    EntityColor p\img,Rand(255),Rand(255),Rand(255)
Next
;----------------
While Not KeyDown(1)=True
;----------------
; Обращаемся к типу и его подтипу, вычисляем новые значения а также применяем их...
; не забыв "синхронизировать" (;
For p.player = Each player
For p\pos.coords = Each coords
    p\pos\x = p\pos\x-0.003*Sgn(p\pos\x)
    p\pos\y = p\pos\y-0.003*Sgn(p\pos\y)
    If p\ID = p\pos\ID Then
        PositionEntity p\img,p\pos\x,p\pos\y,0
    EndIf
Next
Next
;----------------
RenderWorld()
Flip
Wend
End    ; no comments for this block. . .
;----------------
Прощения прошу, если я открываю Америку. Лично мне кажется подобная вещь весьма полезной. Могу и ошибаться.
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
tormoz (03.03.2008)
Старый 05.01.2008, 18:00   #2
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Type in Type

да это полезно, даже очень !!
полный перебор !! это -1 !!
я воть вчера курил связанные списки...
(Offline)
 
Ответить с цитированием
Старый 05.01.2008, 18:01   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Type in Type

Идея хорошая. реализация отчасти правильна. только есть несколько "но".
1) Почему вещественный ID?
2) вот вариант через handle, во первых удобнее, во вторых нет поля ID у родительского объекта (точнее нет пользовательского поля, мы пользуемся "неявным"), ну и наконец, мы отбрасываем ту мизерную вероятность возникновения дублирующего ID.
; Надеюсь, _здесь_ комментарии не нужны?
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

cam = CreateCamera()
lit = CreateLight()
RotateEntity lit, 0,80,34
PositionEntity cam, 0,0,-30
;----------------
; Главный тип, содержащий поле из типа "coords"
Type player
    Field img
    Field pos.coords
End Type

; Подтип. ID-поля нужны для "синхронизации" главного типа и подтипа.
Type coords
    Field ID
    Field x#
    Field y#
End Type
;----------------
; Генерим 30 спрайтов, и объектов соответственно
For c=1 To 30
    p.player = New player
    p\img = CreateSprite()
          p\pos.coords = New coords    ; Обращаемся непосредственно к подтипу
        p\pos\x = Rand(-40,40)
        p\pos\y = Rand(-40,40)
        p\pos\ID = Handle(p) ; присваиваем ID подобъекта настоящий ID родителя
    ; Начальная расстановка
    PositionEntity p\img,p\pos\x,p\pos\y,0
    EntityColor p\img,Rand(255),Rand(255),Rand(255)
Next
;----------------
While Not KeyDown(1)=True
;----------------
; Обращаемся к типу и его подтипу, вычисляем новые значения а также применяем их...
; не забыв "синхронизировать" (;
For p.player = Each player
For p\pos.coords = Each coords
    If Handle(p) = p\pos\ID Then ;ето лучше перенисти сюда, если ребенок не связан с текущим объектом, то вообще забудем про него
    p\pos\x = p\pos\x-0.003*Sgn(p\pos\x)
    p\pos\y = p\pos\y-0.003*Sgn(p\pos\y)

        PositionEntity p\img,p\pos\x,p\pos\y,0
    EndIf
Next
Next
;----------------
RenderWorld()
Flip
Wend
End    ; no comments for this block. . .
;----------------
остались проблемы с полным перебором, но ето хз как обойти на блице. даже через "хитрозакрученну жопу"©Билл Гейтс ето не сделать
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
DeadElf (18.09.2009), Taugeshtu (05.01.2008)
Старый 05.01.2008, 18:10   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Type in Type

а вот и черезжопное решение (оказывается можно сделать):
1.ето работает
2. код абсолютно не читаем. идея аффтора не сохранена.
3. зато всего один перебор
; Надеюсь, _здесь_ комментарии не нужны?
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

cam = CreateCamera()
lit = CreateLight()
RotateEntity lit, 0,80,34
PositionEntity cam, 0,0,-30
;----------------
; Главный тип, содержащий поле из типа "coords"
Type player
Field img
Field pos.coords
End Type

; Подтип. ID-поля нужны для "синхронизации" главного типа и подтипа.
Type coords
Field ID
Field x#
Field y#
End Type
;----------------
; Генерим 30 спрайтов, и объектов соответственно
For c=1 To 30
p.player = New player
p\img = CreateSprite()
; выбираем ID... Как видно, шансы совпадения ID->0. Для чего? А сами поразмыслите...
; Можно конечно было сделать все через счетчик, но данный метод довольно надежен
p\pos.coords = New coords ; Обращаемся непосредственно к подтипу
p\pos\x = Rand(-40,40)
p\pos\y = Rand(-40,40)
p\pos\ID = Handle(p)
; Начальная расстановка
PositionEntity p\img,p\pos\x,p\pos\y,0
EntityColor p\img,Rand(255),Rand(255),Rand(255)
Next
;----------------
While Not KeyDown(1)=True
;----------------

;Хитрозакрученное черезжопное решение
For ps.coords = Each coords
ps\x = ps\x-0.003*Sgn(ps\x)
ps\y = ps\y-0.003*Sgn(ps\y)

p.player=Object.player(ps\ID)
PositionEntity p\img,ps\x,ps\y,0
Next

;----------------
RenderWorld()
Flip
Wend
End ; no comments for this block. . .
;----------------
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
DeadElf (18.09.2009), tormoz (03.03.2008)
Старый 05.01.2008, 18:37   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Type in Type

Отстустующий ООП в Б3Д можно компенсировать ситемой произвольной иерерахии, построенной на пивотах и их чайлдах-пивотах
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
tormoz (03.03.2008)
Старый 03.03.2008, 19:54   #6
Leito
Танчики Developer
 
Регистрация: 29.01.2007
Сообщений: 539
Написано 16 полезных сообщений
(для 23 пользователей)
Re: Type in Type

ничего не понял><
наверное к лучшему
(Offline)
 
Ответить с цитированием
Старый 05.03.2008, 12:18   #7
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Type in Type

При создании к примеру функции создания, можно использовать такую форму:
Function CreateCoords.Coords(x#,y#)
   c.Coords=New Coords
   c\x=x
   c\y=y
   Return c
End Function
Таким образом мы избавляемся от Хэндла и напрямую передаём указатель на эллемент.
Но при присваивание, приходится объявлять переменную с типом данных класса, что весьма неудобно, если её юзать много где.
(Offline)
 
Ответить с цитированием
Старый 18.09.2009, 08:36   #8
Blitz3d_god
AnyKey`щик
 
Регистрация: 16.11.2008
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Type in Type

;Хитрозакрученное черезжопное решение
For ps.coords = Each coords
....
как я понял из это части кода видно что к подтипу можно обратится используя несколько переменный (pos - от главного типа к подтипа, ps- напрямую к подтипу) это так или а чёто упустил?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Type and etc... ELIAS 2D-программирование 8 05.02.2009 19:34
Вопросик про TYPE TEHb08 Blitz3D 15 09.01.2009 23:06
Type - вопросы zheland BlitzMax 8 20.04.2008 19:10
Type, Function и т.д. Тарас Шевченко 2D-программирование 14 12.02.2007 17:09
Dim vs Type HolyDel 3D-программирование 13 08.10.2006 14:30


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


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