Fertigkeitenbaum für RPG

  • Fertigkeitenbaum für RPG

    Hallo,

    ich programmiere gerade ein RPG, das sich grob an Diablo2 orientiert.

    Mein Problem:

    Der Charakter soll bei Stufenaufstieg die Möglichkeit haben, eine Fertigkeit auf einer Art "Fertigkeitenbaum" auszuwählen, die dann um 1 Stufe erhöht wird.

    Jeder Charaktertyp hat durchschnittlich 6-9 Fertigkeiten - aufgeteilt in 2-3 "Reihen" zu je 3 Fertigkeiten.

    Hat der Spieler nun z.B. in Fertigkeit 1 bereits die Stufe 3 erreicht, so kann er auch die "dahinterliegende" Fertigkeit erlernen (erstmal auf Stufe 1).

    Habe schon verschiedene Versuche gestratet, aber es wurde irgendwann einfach zu kompliziert :(

    Wenn einer von euch eine schöne Lösung für das Problem hat, würde ich mich freuen.

    Danke

    Casi82
  • Du machst ein Controller Objekt und in dessen Step Event das:

    GML-Quellcode

    1. global.fertigkeit_1_level=1 //das level der ersten fertigkeit
    2. global.fertigkeit_2_level=0 //das level der zweiten fertigkeit


    Im MouseButtonPressedLeft Event vom Button der ersten Fertigkeit:

    GML-Quellcode

    1. if global.erfahrung>99 //nur wenn du mit Erfahrungspunkten arbeitest
    2. {
    3. global.fertigkeit_1_level+=1 //level der fertigkeit erhöhen
    4. global.erfahrung=0 //Erfahrungspunkte zurücksetzen
    5. }


    Im MouseButtonPressedLeft Event vom Button der zweiten Fertigkeit:

    GML-Quellcode

    1. if global.erfahrung>99 and global.fertigkeit_1_level>2 //wenn das level der ersten fertigkeit größer als 2 ist...
    2. {
    3. global.fertigkeit_2_level+=1 //level der fertigkeit erhöhen
    4. global.erfahrung=0 //Erfahrungspunkte zurücksetzen
    5. }


    ,-Megamag

    Magical dream time!
  • Megamag schrieb:

    Du machst ein Controller Objekt und in dessen Step Event das:

    GML-Quellcode

    1. global.fertigkeit_1_level=1 //das level der ersten fertigkeit
    2. global.fertigkeit_2_level=0 //das level der zweiten fertigkeit


    Im MouseButtonPressedLeft Event vom Button der ersten Fertigkeit:

    GML-Quellcode

    1. if global.erfahrung>99 //nur wenn du mit Erfahrungspunkten arbeitest
    2. {
    3. global.fertigkeit_1_level+=1 //level der fertigkeit erhöhen
    4. global.erfahrung=0 //Erfahrungspunkte zurücksetzen
    5. }




    Im MouseButtonPressedLeft Event vom Button der zweiten Fertigkeit:

    GML-Quellcode

    1. if global.erfahrung>99 and global.fertigkeit_1_level>2 //wenn das level der ersten fertigkeit größer als 2 ist...
    2. {
    3. global.fertigkeit_2_level+=1 //level der fertigkeit erhöhen
    4. global.erfahrung=0 //Erfahrungspunkte zurücksetzen
    5. }


    ,-Megamag


    vllt noch zur übersicht alles eher in arrays packen bsp. :

    GML-Quellcode

    1. //anstat
    2. global.fertigkeit_2_level+=1
    3. //dann lieber
    4. skill[2] += 1

    dabei bedenke man das es noch übersichtlicher wird wenn man für den skillbaum noch ein eigenes Obj. nimmt z.b. "st" (skilltree)

    dann wäre das ergebnis kurz logisch und direkt:
    st.skill[x]

    ///
    Beachten sollte man das jeder skill der noch nicht aktiv ist auf -1 gesetzt werden sollte
    ///

    sind nur logische tipps nix mit hilfe atm und weiter gehts...

    Also um den skilltree dann noch zu bemalen könntest du das so machen:

    GML-Quellcode

    1. if(st.skill[1]=5 and st.skill[2]=5)
    2. {st.skill[4]=0} //war vorher -1 !


    erfahrungspunkte dann so:

    GML-Quellcode

    1. if(xxxxx) // xxxxx = user benutzt skill
    2. {st.skill_exp[x] += 1} //skill exp += 1
    3. if(st.skill[x]*1.56 > st.skill_exp[x]) //exp faktor ist hier nun 1.56
    4. {
    5. st.skill[x]+=1 //skill wird hochgestuft und die skill exp auf 0 gesetzt
    6. st.skill_exp[x] = 0
    7. }
  • Danke für die Vorschläge.

    Ich sollte aber noch hinzufügen, dass ich eigentlich keinen eigenen "Raum" für den Skilltree zu erstellen. Ich wollte das so machen, dass der Spielfluss möglichst wenig unterbrochen wird. Und das wird auch ein Spiel für 2 Spieler, d.h. wenn der eine ne Stufe aufgestiegen ist und ne Fertigkeit erhöht, soll der andere imn der Zeit möglichst weiterspielen können. (Maussteuerrung ist auch AUS in dem Spiel), ich würde das gerne mit einer kurzen Frafe (z.B. Pop-up-Fenster) erledigen.

    So was wie:

    "

    Stufenaustieg. Welche Fertigkeit möchteest du erhöhen?

    1= Fertigkeit A

    2= Fertigkeit B

    "

    Und wenn dann Fertigkeit A schon auf Stufe 3 ist, soll automatisch die dahinterliegende Fertigkeit C erhöht werden...

    Geht das auch irgendiw?
  • (>Ragnarok like<)
    Mach nee Box in größe des gewünschten fensters und dann darüber noch eine box(wie bei windows der balken an dem man das fenster verschieben kann)das sieht dann ungefair so aus:



    das untere fenster ist in meinem beispiel 0,0 bis 400,178 (alles +obj.x,obj,y)
    und der balken 0,-2 bis 400,-22 (alles +obj.x,obj,y)

    im code:

    GML-Quellcode

    1. draw_set_color(make_color_rgb(50,200,200)) //dies ist exakt die abbildung!!
    2. draw_rectangle(0+x,0+y,400+x,178+y,1)
    3. draw_rectangle(0+x,-2+y,400+x,-22+y,1)


    um dieses fenster nun auf dem bildschirm zu schieben musst du einfach das objekt schieben(deshalb alles wiederum + x,y vom objekt)

    ;;;;;;;;;;;;;;;;;;;;;
    Verschieben

    Um dies ganze per maus verschieben zu können musst du erstmal eine bounding box dafür anlegen:

    Code:

    GML-Quellcode

    1. if(collision_rectangle(0+x,-2+y,400+x,-22+y,self,1,0) and mouse_check_button_pressed(mb_left))
    2. {
    3. setx=mouse_x-x
    4. sety=mouse_y-y
    5. }
    6. if(collision_rectangle(0+x,-2+y,400+x,-22+y,self,1,0) and mouse_check_button(mb_left))
    7. {
    8. x=setx+mouse_x
    9. y=sety+mouse_y
    10. //hoffe das kommt hin wäre nett wenn mir jmd
    11. //bestätigt ob der code funtzt kann GM grade nit nutzen xD
    12. }
    Alles anzeigen


    die BBxe sind nicht geschwindigkeitssparrend nen rein mathematischer coder wäre eig leichter aber dat krieg ich so net hin bin immer verwirrt damit *augenroll*


    ;;;;;;;;;;;;;;;;;;;;
    Objekte

    Obj kannste entweder auch mit BBxs (sprite noch extra zeichnen lassen und dann dort rum eine BBx) machen oder du machst nen extra Object
    und das positioniert sich dann immer an dem Fenster an bsp:

    (Fenster ist das obj mit dem fenster x'D)
    Das obj button1:

    GML-Quellcode

    1. x=x.fenster+3
    2. y=y.fenster+3


    ;;;;;;;;;;;;;;;;;;;;;;
    Kleiner Tipp

    Um speichersparrend zu arbeiten solltest du die Abfrage für das fenster nur dann machen wenn es nötig ist;
    Mach alles nochmal in einer großen BBx also das gesamte Fenster und prüf ob die maus im Feld ist ist sies nicht wird garnicht erst geprüfft ob etwas geklickt wurde,ist die Maus drüber wirds aber überprüft.

    Wenn das Fenster nicht gebraucht wird kannst du es auch ausserhalb des bilds/spiels positionieren und die instancen über geraume zeit deaktivieren



    #########################################
    #Made by benny11112003 xD...
    #
    #######################

    Dies ist noch umformbar auf das was du haben willst wenn dus kapiert hast gehts relativ einfach ; )

    Edit: ein paar wörter korrigiert und kleinigkeiten

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von benny1111200 ()