forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Type and etc... (http://forum.boolean.name/showthread.php?t=7766)

ELIAS 03.02.2009 23:14

Type and etc...
 
Код:

Type My
Field entity
Field scalex#, scaley#, scalez#
End Type

Type Enemy
Field entity
Field scalex#, scaley#, scalez#
End Type

Type Other
Field entity
Field scalex#, scaley#, scalez#
End Type

Type Flow
Field entity
Field scalex#, scaley#, scalez#
End Type

///////Цикл//////////////////////////////////////////
selecting = выделенный объект
seltype$ = название типа(именно название - текстовая переменная)
num = номер объкта в типе

if seltype="My"
    for i.my=each my
      if selecting=i\entity then i\scalex=i\scalex+1 : scaleentity selecting, i\scalex, i\scaley, i\scalez
    next
elseif seltype="Enemy"
    for i.enemy=each enemy
      if selecting=i\entity then i\scalex=i\scalex+1 : scaleentity selecting, i\scalex, i\scaley, i\scalez
    next
elseif seltype="Other"
    for i.other=each other
      if selecting=i\entity then i\scalex=i\scalex+1 : scaleentity selecting, i\scalex, i\scaley, i\scalez
    next
elseif seltype="Flow"
    for i.flow=each flow
      if selecting=i\entity then i\scalex=i\scalex+1 : scaleentity selecting, i\scalex, i\scaley, i\scalez
    next
endif
///////Цикл//////////////////////////////////////////

Ну вот примерно такой код у меня сейчас... И если с четырмя типами это ещё терпимо, то с например если будет 50 типов, это никуда не годится!!!... Как то надо приспособить по сути ОДИНАКОВЫЙ код ко всем типам, к тому же как видно и типы тоже однотипны:) клмбр... :)
Как мне быть??? Заранее спасибо! :)
Уверен вариантов решения проблемы или не одного или несколько...во втором случае хотелось бы узнать хотябы вкратце про каждый :). лучше кодом конечно, но и на словах если будет, тоже хорошо!:)

HolyDel 03.02.2009 23:30

Ответ: Type and etc...
 
Код:

type MyObject
field strtp$
Field entity
Field scalex#, scaley#, scalez#
end type

Код:

    for i.myObject=each myObject
if strtp = seltype
      if selecting=i\entity then i\scalex=i\scalex+1 : scaleentity selecting, i\scalex, i\scaley, i\scalez
endif
    next


ELIAS 04.02.2009 22:48

Ответ: Type and etc...
 
Я об этом тоже думал;)... нуууууу...ну это не решение проблемы впринципе в моём случае((( Понимаешь, HolyDel, у типов по сути только свойство scale и совпадают, а потом масса различных свойств у каждого типа... Так что это нехорошо всё объединять в один тип, нехорошо...

ЗЫ: админы, извиняюсь, а нельзя мне ник поменять на ILIONSE ???

ABTOMAT 04.02.2009 23:02

Ответ: Type and etc...
 
Холидел верно тебе всё написал. Незачем копировать тонны одинакового в создании и обновлении - надо стремиться к объединению. Вообще в чистом виде твоя задача решается с помощью ООП, которого в Блитз3Д нет (есть в БМакс) - там наследовать надо от базового типа все остальные. НУ а тут я бы рекомендовал объединять всё что можно. Но не в один тип, а лучше в несколько - Player - все игроки и враги, GameObjects - всякие там осколки и т.п. - ну короче смотри по ситуации.
Да, и _не_используй_ строковые переменные, если их не видит игрок (ибо хоть при нынешних объёмах ОЗУ ощутимого различия не будет но всё же строки жрут намного больше интов и обрабатываются медленнее). В данном случае seltype можно сделать целочисленной и прописать константы
Const My = 1, Enemy = 2 и т.д. а далее проверять на равенство константам - If seltype = Enemy then...

HolyDel 04.02.2009 23:12

Ответ: Type and etc...
 
ELIAS, тогда никак. в блице шаблонов нет, препроцессора нет, виртуальных функций нет, наследования нет :)

ffinder 04.02.2009 23:50

Ответ: Type and etc...
 
Цитата:

Сообщение от HolyDel (Сообщение 96890)
ELIAS, тогда никак. в блице шаблонов нет, препроцессора нет, виртуальных функций нет, наследования нет.

и самое ужасное - нет pattern matching'a, а без него сейчас ну просто никуда:-D

H@NON 05.02.2009 10:49

Ответ: Type and etc...
 
можно попробовать так:
Код:

Type Object
    Field Tip
    Field p.player, b.bot, t.thing
End Type
Const OBJ_PLAYER=1, OBJ_BOT=2, OBJ_THING=3

Type Player
    Field mesh, healph, power...
End Type

Type Bot
    Field mesh, healph, power, level
End Type

Type Thing
    Field mesh, tip
End Type

For o.object = each Object
    Select o\Tip
        case OBJ_PLAYER
              UpdatePlayer(o\p.player)
        case OBJ_THING
              UpdateThing(o\t.Thing)
        case OBJ_BOT
              UpdateBot(o\b.Bot)
    End Select
Next

пусть и лишний тип создается, зато все навиду и компактно.

IGR 05.02.2009 19:19

Ответ: Type and etc...
 
H@NON, спасибо !!
Это можно сказать некий вариант реализации наследия !! :)

impersonalis 05.02.2009 19:34

Ответ: Type and etc...
 
Во-первых, используете служебные имена в кач-ве имён переменных - так нельзя.
Во-вторых:
Код:

Type Object_
    Field Tip
  Field Handle_%
End Type

Const OBJ_PLAYER=1, OBJ_BOT=2, OBJ_THING=3

Type Player
    Field mesh, healph, power
End Type

Type Bot
    Field mesh, healph, power, level
End Type

Type Thing
    Field mesh, tip
End Type

For o.Object_ = Each Object_
    Select o\Tip
        Case OBJ_PLAYER
                Local Plr.Player=Object.Player(Handle_)
              UpdatePlayer(Plr)
        Case OBJ_THING
                Local Thi.Thing=Object.Thing(Handle_)
              UpdateThing(Thi)
        Case OBJ_BOT
                Local Bt.Bot=Object.Bot(Handle_)
              UpdateBot(Bt)
    End Select
Next

вывод - размер струкутры-интерфейса Object_ имеет константный sizeof для лбого кол-ва типов; внедрение новых объектов хранения реализуется в двух,а не в тёрх местах кода (1 - добавить константу - код_типа, 2- дописать ещё один case в селекторе).
Минус - за счёт type cast`а int->ptr* (разумеется - это условность, аналогия) тратится немного больше времени.


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

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