Image property vanuit eigen class/eigen property

Status
Niet open voor verdere reacties.

The Mighty Atom

Terugkerende gebruiker
Lid geworden
22 mei 2008
Berichten
1.380
Goed, dit is nogal een lastig uit te leggen probleem. Ik doe mn best om het zo duidelijk mogelijk te omschrijven:

Ik heb een Class:

Code:
Class Gem

Deze Class moet de volgende property hebben:

Code:
GemType

Deze property moet 7 keuzes bevatten, te weten images. Deze images staan in My.Resources.
Deze keuzes zijn:
Blue
Green
Orange
Purple
Red
White
Yellow

Nu is het de bedoeling dat als ik bijvoorbeeld dit doe:

Dim Gem As New Gem
Gem.GemType = Blue
Gem.Location = New Point(100, 100)
Gem.Size = New Size(96, 96)

...er een gem ter groote van 96 bij 96 pixels van het type Blue op het formulier op locatie X 100 en Y 100wordt geplaats.

Blue is de naam van een png image die in My.Resources zit.

De Gem class moet dus ook de Size en Location properties hebben, zodat ik locatie en groote kan bepalen.

Hoe pak ik dit aan?
 
Laatst bewerkt:
Inderdaad een beetje vaag. Misschien een Enum maken van je kleruen:
Code:
Public Enum Kleur
Blue = 0
Green = 1
Orange = 2
Purple = 3
Red = 4
White = 5
Yellow = 6
etc.
Het ligt eraan wat je class precies inhoudt...
 
Nu is het de bedoeling dat als ik bijvoorbeeld dit doe:

Dim Gem As New Gem
Gem.GemType = Blue
Gem.Location = New Point(100, 100)
Gem.Size = New Size(96, 96)

...er een gem ter groote van 96 bij 96 pixels van het type Blue op het formulier op locatie X 100 en Y 100wordt geplaats.

Dat klinkt als een property-procedure, met een get- en set-gedeelte.
De naam GemType lijkt me trouwens een beetje verwarrend, want dat suggereert dat er sprake is van een parent class.
 
In het begin dacht ik het ook zo te doen:

Public Enum Gem
Blue = 0
Green = 1
Orange = 2
Purple = 3
Red = 4
White = 5
Yellow = 6

Maar verder dan dat kwam ik niet. Hoe zet ik nou een blauwe gem (wat gewoon een png image is) op mn form, alsof het een control is.

Ik deed bijvoorbeeld dit:
Public Enum Gem
Blue = My.Resources.Gem_Blue
Green = My.Resources.Gem_Green
Orange = My.Resources.Gem_Orange
Purple = etc
etc
End Enum

Maar dat accepteert tie ook niet op die manier. Dus volgens mij zijn enums alleen niet genoeg, en moet ik dus een klas hebben. Een Gem klas met als property het type gem.


@ Evert: je hebt gelijk, GemType is het type gem, blauw, rood, geel, etc. Ik heb alleen moeite met het correct schijven van die property-procedure.
Want wat ik ook doe, hij lijkt een image uit het My.Resources niet te accepteren, want daar staan de daadwerkelijke gems (gewoon png plaatjes).

Moet toch te doen zijn lijkt me.
 
Laatst bewerkt:
Dit is mn Gem class (Gem.vb):

Code:
Class Gem

    Public Enum GemColors
        Blue = 0
        Green = 1
        Orange = 2
        Purple = 3
        Red = 4
        White = 5
        Yellow = 6
    End Enum

    Private m_Shape As GemColors

    Public Property Shape() As GemColors
        Get
            Return m_Shape
        End Get
        Set(ByVal value As GemColors)

            Select Case value

                Case GemColors.Blue
                    m_Shape = My.Resources.Gem_Blue

                Case GemColors.Green
                    m_Shape = My.Resources.Gem_Green

                Case GemColors.Orange
                    m_Shape = My.Resources.gem_Orange

                Case GemColors.Purple
                    m_Shape = My.Resources.Gem_Purple

                Case GemColors.Red
                    m_Shape = My.Resources.Gem_Red

                Case GemColors.White
                    m_Shape = My.Resources.Gem_White

                Case GemColors.Yellow
                    m_Shape = My.Resources.Gem_Yellow

            End Select
        End Set
    End Property

End Class

Het probleem in de bovenstaande code is dat My.Resources.<resource_name> niet accepteerd.
 
Als dit is wat je bedoelt:

Code:
                Case GemColors.Blue
                    m_Shape = My.Resources.ResourceManager.GetObject(My.Resources.Gem_Blue)

Werkt helaas ook niet. :(

Error 1 Value of type 'System.Drawing.Bitmap' cannot be converted to 'String'.

En met:
Code:
                Case GemColors.Green
                    m_Shape = My.Resources.Gem_Green

Krijg ik deze error:
Error 2 Value of type 'System.Drawing.Bitmap' cannot be converted to 'Bejeweled_Clone.Gem.GemColors'

Je moet toch gewoon kunnen linken naar een image in My.Resources, en die kunnen aanroepen met:

Dim NieuweSteen As Gem
NieuweSteen.Kleur = <Hier 1 van 7 keuzes waar je uit kan kiezen>
NieuweSteen.Size = etc, de groote
NieuweSteen.Location = etc, de locatie op het form
NieuweSteen.Tag = "..."

Me.Controls.Add(NieuweSteen)
 
m_Shape verwijst naar een Class GemColors, hoe kan je daar nou iets uit je resources aan toe kennen. Lijkt mij dat je alleen kan één van de GemColor aan kan geven. Ik snap trouwens niet precies wat je wilt doen, maar als je iets wilt laten teken kun je bij het tekenen een Select m_Shape doen en afhankelijk van welke gekozen is de juiste image tekenen?!
 
Ugh, dit is echt lastig. Terwijl ik toch zeker weet dat het mogelijk moet zijn.

Het is gewoon een control, maar in plaats van dat het een onzichtbaar object is, wil ik het zichtbaar maken door er een plaatje aan vast te maken.

Dus, als ik bijvoorbeeld, onder een button click event, dit schrijf:

Dim EdelSteen As New Gem
EdelSteen.Color = hier dus 1 van de 7 keuzes, Blauw bijvoorbeeld
EdelSteen.Location = New Point(50, 100)

Dan moet dit het resulaat zijn:

gemstone_form.jpg


Wat je daar ziet is dan een Gem, van het type (Color) blauw. Het verschil is dat ik in het voorbeeld screenshot hierboven gebruik heb gemaakt van een panel, met als backgroundproperty de png image zelf.

Maar wil dat zonder een container control doen. Gewoon alleen de gem, alsof de gem zelf een windows control is, waar je verder niks mee kan behalve, de grote en locatie van opgeven.

Een ander voorbeeld is bijvoorbeeld een Car class met als property Merk:

Dim MyCar As New Car
MyCar.Merk = (hier een lijst met merken waar je uit kan kiezen)

En dat is het. Zo maak je een instantie van een Car, met als merk het opgegeven merk. Maar wat als je het nou zichtbaar wilt maken. Als een plaatje op je form. Kies je bijvoorbeld Volvo als merk, dan wil ik dus een plaatje van volvo auto op mn form hebben.

Datzelfde wil ik dus met Gem. De gekozen gem kleur bepaalt dat wat je ziet op je form.

Hopelijk heb ik het zo wat duidelijker uitgelegd. Ik wil gewoon iets visueels aan mn class toekennen (een image dus) en zichtbaar op mn form zetten.
 
Wat heb je liever, dat je een UserControl maakt of zoiets of Gem gewoon als een soort Image houdt?!
 
Code:
Wat heb je liever, dat je een UserControl maakt of zoiets of Gem gewoon als een soort Image houdt?!

Een beetje van beide.

Want ik wil via code de locatie bepalen, en een tag property om vergelijkingen uit te kunnen voeren met andere gems.

Maar wat je als gebruiker te zien krijg is alleen een image van de gem zelf. De user kan er verder niks mee, alleen selecteren (waar ik nog op ga puzzelen).

Het probleem is de property waarmee je instelt wat voor kleur gem ik laat zien op form. Er zijn 7 keuzes mogelijk en het moet niet mogelijk zelf een kleur op te geven. klopt het dat je dan een readonly propery procedure moet hebben?

Het andere probleem is verkrijgen van de gem images. Die zitten in My.Resource.
 
SuperABC, jij schijnt hier net iets meer verstand van te hebben dan ik, dus zou je me misschien kunnen helpen met het schrijven van een geldige property procedure? Als ik het goed begrijp, heeft deze property procedure alleen een Get onderdeel nodig, omdat je als gebruiker zelf geen waarde op kan geven, alleen een keuze maken uit 7tal items (de 7 kleuren).

Als ik dan bijvoorbeeld onder een button clickevent een nieuwe instance van de Gem class maak, en ik roep daarna de GemColor property op, moet er een keuze lijst komen met daarin de 7 beschikbare keuzes, dus zo:

NewInstanceOfGem.png

(Dit plaatje is gefotoshopped en de property GemColor is eigenlijk een Enum, maar het moet een eigenlijk een geldige property zijn, want hij moet de bijbehorende PNG plaatjes uit het My.Resources halen. Als dat niet kan, dan kan ik de plaatjes ook wel op het FileSystem bewaren en los bij het programma gebruiken)

Stel dat ik bijvoorbeeld kies voor GemColor.Blue, dan moet er blauwe gem, en let op: dit is gewoon een PNG plaatje die in My.Resources geladen is, op locatie 100, 50 op het hoofdformulier verschijnen (zie voorbeeld plaatje in post nummer 10).

Dit is mn beste uitleg tot nu toe. Hopelijk is het nu een stuk duidelijker wat ik nou probeer te bereiken. :)
 
Ok, maak iets van een sub die als Parameter het Parent control heeft van je Gem. Of stel een Parent in bij Sub New. Maak dan een sub die iets heet van DrawGem(), daar doe je dan zoiets:
Code:
Select Case GemColor

Case Blue
'Teken hier op je parent je gem plaatje die blauw is
'Iets met CreateGrapichs, en Draw de Image uit je Resources.
'Op de locatie van je Gem.Location.
Case Green

etc

End Select
Als het niet lukt wil ik wel iets voor je in elkaar prutsen:thumb:
 
Ja, en daar loop ik dus op vast, als je zegt "een sub die als Parameter het Parent control heeft van je Gem", of "Of stel een Parent in bij Sub New".

Bedoel je het Form.Load event? Wat is Sub New.

Maar het betekend dus dat ik helemaal geen property procedure met get en/of set dingesen nodig heb?
 
Zie onderstaande voorbeeld:

Class Gem is een aparte class:

Code:
Public Class Gem

    Public Enum GemColors
        Blue = 0
        Green = 1
        Orange = 2
        Purple = 3
        Red = 4
        White = 5
        Yellow = 6
    End Enum

    Public GemColor As GemColors
    Public Location As New Point
    Public Parent As Control

    Public Sub New(ByVal Color As GemColors, ByVal Location_ As Point, ByVal Parent_ As Control)
        GemColor = Color
        Location = Location_
        Parent = Parent_
    End Sub

    Public Sub DrawGem()
        Select Case GemColor
            Case GemColors.Blue
                Parent.CreateGraphics.DrawImage(My.Resources.Gem_Blue, Location.X, Location.Y, My.Resources.Gem_Blue.Width, My.Resources.Gem_Blue.Height)
        End Select
    End Sub

End Class
En een voorbeeld om je gem te tekenen, werkt allen als je DrawGem in de paint event zet, in dit geval komt de Gem in een panel:
Code:
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Gem1 As New Gem(Gem.GemColors.Blue, New Point(25, 25), Panel1)
        Gem1.DrawGem()
    End Sub

    Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        Dim Gem1 As New Gem(Gem.GemColors.Blue, New Point(25, 25), Panel1)
        Gem1.DrawGem()
    End Sub
End Class
 
Kijk, jij snapt het!

Bedankt man!

Ik heb zelf nog een extra field toegevoegd (Size) en dat werkt ook.
Maar nu moet ik een event handler hebben voor het klikken op een gem. Deze moet dan de kleur returnen. Klik ik dus op een gele gem, dan moet tie Geel als string returnen.

Ik heb dit:

Code:
        AddHandler Gem.SelectedGem, AddressOf Gem_Click

        Gem.DrawGem()

En in de Gem class:

Code:
    Public Function SelectedGem(ByVal sender As Object)

        Return sender

    End Function

Maar volgens moet het helemaal niet zo. Het is de correcte syntax die ik niet kan vinden.

Meh.
Ik kap er maar mee, dit Class gedoe gaat gewoon ver boven m'n pet.
 
Als je de Locatie en de Size van je Gem weet, kun je nagaan in de click_event van de Parent van de Gem. Of er op de Gem geklikt is. Wil je enkel de Gem figuur als click-able markeren zie dan dit:thumb:
 
Lastig.

Maar ik stop met effe met dit project. Het uiteindelijke doel was om mijn eigen Bejeweled game te maken, maar daar ben ik nog veel te onervaren in.

Toch bedankt voor al je hulp!
 
Moet opzich wel mogelijk zijn, maar er is natuurlijk meer dan alleen een Gem tekenen. Ik wil je eventueel wel helpen bij het maken ervan!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan