- Код: Выделить всё
Dim spr as clsEngine.Sprite
Dim snd as clsEngine.Sound
Dim spr as clsEngine.Sprite
Dim snd as clsEngine.Sound
Dim spr as Sprite
Dim gr as clsEngine.Graphics
Dim snd as clsEngine.Sound
Public sub planet_anim()
Gr.animation " planet.bmp"
Snd.play "plabet.wav"
End sub
Don Leno писал(а):А нельзя ли создать класс clsEngine в нем например написать свойство или метод которые будут создавать новый экземпляр класса Sprite и передавать его ссылку или что то вроде этого.
Но класс Sprite не может быть объявлен внутри класса clsEngine
Dim snd as New seSND 'seSND - класс
Public sub E_Sub()
snd.se_sub
end sub
Public Sub se_sub()
msgbox "SE_SUB"
End
end sub
Dim snd as New seSND
Property Get My() As seSnd
Set My = snd
End Property
Dim e as clsE
e.My.se_sub
Engine.Sound.Play
Engine.Sprite.Draw
Don Leno писал(а):Суть в том не просто красоты ради использовать данную фичу,
Don Leno писал(а):Sound и Sprite будут хранить все необходимые функции и сабы.
Dim Ship as clsShip
Dim Planet as clsPlanet
Ship.move 500,500
Planet.anim()
Dim e as clsEngine
Public sub move(x, y)
E.sprite.x= x+1
E.sprite.y =y+1
E.sound.play "start_move.wav"
End sub
Don Leno писал(а):Итак, если класс является как бы объектом
Dim Ship As Sprite
Set Ship = New Sprite
Dim Ship1 As Sprite
Dim Ship2 As Sprite
Set Ship1 = New Sprite
Set Ship2 = Ship1
Set Ship1 = Nothing
Option Explicit
Dim x As Long
Private Sub Form_Click()
Test x
End Sub
Private Sub Test(ByRef v As Long)
v = 3
MsgBox Str(v) & Str(x)
x = 5
MsgBox Str(v) & Str(x)
End Sub
Dim Ship1 As Sprite
Dim Ship2 As Sprite
Set Ship1 = New Sprite
Set Ship2 = Ship1
Dim snd as seSND
Property Get My() As seSnd
Set My = snd
End Property
Don Leno писал(а):То есть в начале объявления ship1,ship2 ссылается на класс. Но после установки set и new ship1 ссылается уже на новосозданный объект, а не на класс. Так? После ship2=ship1 обе переменные ссылаются на созданный объект. Верно?
Don Leno писал(а):не пойму как сделать свою структуру
Private type
S as long
P as string
End type
Dim e as clsE
e.My.se_sub
Don Leno писал(а):E.sprite.x
Don Leno писал(а):Разве их объявить нельзя?
Don Leno, судя по написанному, пока что выходит, что всё-таки это делается для красоты, причём делается крайне противоестественным и неумелым образом.
Dim spr as Sprite
Dim spr as New Sprite
Dim spr as Sprite
Set spr = New Sprite
Set spr=Nothing
Dim spr as New Sprite
Private mlVar As Long
Public Property Let Var( _
ByVal lValue As Long)
mlVar = lValue
End Property
Public Property Get Var() As Long
Var = mlVar
End Property
Public Sub Show()
MsgBox mlVar
End Sub
Public Property Let Var( _
ByVal lValue As Long)
End Property
Public Property Get Var() As Long
End Property
Public Sub Show()
End Sub
interface CSomeClass : IDispatch {
[propput]
HRESULT Var(long lValue);
[propget]
HRESULT Var([out, retval]long *lValue);
HRESULT Show();
}
Implements CSomeClass
Private mlVal As Long
Private Sub CSomeClass_Show()
MsgBox mlVal * 2
End Sub
Private Property Get CSomeClass_Var() As Long
CSomeObject_Var = mlVal
End Property
Private Property Let CSomeClass_Var( _
ByVal RHS As Long)
mlVal = RHS
End Property
Don Leno писал(а):Как тогда реализовать это умело и естественно? Дайте исходник чтобы увидеть красу эту!)
а. Класс - это файл описания объекта, а точнее его свойств методов событий и тп. Верно?
Option Explicit
Private Sub Form_Click()
Dim f As Form
Set f = New Form1
f.Show
End Sub
б. Класс не может быть создан через слово New в нескольких экземплярах. Класс только один. Правильно?
в. При таком объявлении
Dim spr as Sprite
переменная spr равна Nothing
г. При объявлении
Dim spr as New Sprite
или
Dim spr as Sprite
Set spr = New Sprite
Переменая spr ссылается на созданый объект словом New. Я не ошибся?
д. Чтобы уничтожить созданный объект (по выше описаному объявлению в пункте "г") нужно занулить все ссылающиеся на этот объект переменные:
Set spr=Nothing
е. Могу ли я в классе создать объект:
Например, в классе Engine написать так:
Dim spr as New Sprite
Правильно ли так делать или нет?
ё. Можно ли из класса вызывать функции и сабы из модуля? И как правильно это все делается, коли возможно?
ж. Про типы объясните, не понял я как ими пользоваться в классе. В модуле встречал такие как BITMAPINFOHEADER и ARGB и прекрасно с ними работал. Можно и свои такие же создавать. Но в классах они как то по иному работают, али нет?
Альтернативы для решения моей задачи (создание структуры для удобства программирования процедур и функций) - есть?!
Teranas писал(а):что вроде кода внутри Type
но зачем нужна сущность Engine? Чтобы лишний раз греть себе душу, что ты пишешь движок?
Engine.Sound.
Don Leno писал(а):Еще раз повторюсь пишется мною такая структура чтобы мне было проще в коде разбираться, так сказать по полочкам в голове разложить и знать где что лежит.
Don Leno писал(а):Итак, вот исходник проба по реализации интерфейсов:
Sub Explosion(pos, damage_radius)
For Each obj in AllGameObjects
If Distance(obj.Position, pos) <= damage_radius Then
' Этот объект в зоне поражения: проверяем, способен ли он воспринимать урон
If TypeOf obj Is IDestructable Then DamageByExplosion obj
End If
Next obj
End Sub
Sub DamageByExplosion(ByVal Victim As IDestructable)
Victim.TakeDamage 100
End Sub
' Этот объект в зоне поражения: проверяем, способен ли он воспринимать урон
If TypeOf obj Is IDestructable Then DamageByExplosion obj
Т.е. для класса CSomeClass это выведет 5, а для CSecondClass это выведет 10. Тут как раз и видно всю мощь полиморфизма на основе интерфейсов
Суть была реализовать и испробовать то о чем писал The trick:
The trick писал(а):Теперь мы можем написать Dim c As CSomeClass, а дальше уже писать как Set c = New CSomeClass (в этом случае CSomeClass указывает на класс) так иSet c = New CSecondClass, т.к. у нас оба класса реализуют интерфейс CSomeClass.
Dim ship As clsShip
Dim pirate As clsShip
. . .
Set ship = New clsShip
Set pirate = New clsPirate
. . .
ship.MoveX (...)
pirate.MoveX(...)
. . .
Dim ship As clsShip
Dim pirate As clsShip
. . .
Set ship = New clsShip
Set pirate = New clsPirate
создать отдельный интерфейс и имплементировать его обеими классами.
Don Leno писал(а):Я выложу подправленный пример. Проверите?! Исходник Interface_mod.rar
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26