2D RPG - Personen ansprechen

  • GM 7

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 2D RPG - Personen ansprechen

    Hi Leute!

    Ich wollte mal so ein 2D RPG wie Pokémon erstellen! Naja... Nicht WIE Pokémon, eher

    so das Movement und das Leute ansprechen! Und das ist auch mein Problem!

    Wie kann man das coden das wenn man neben einer Person steht und sagen wir mal <ENTER> drückt sich keine

    Message Box sondern unten ein Fenster zeigt wo der Text dann abgerollt wird! Wenn der Text fertig ge"schrieben" wurde soll das Fenster wieder verschinden (Fonts habe ich schon eingestellt)! Wie kann man das coden?



    Danke im Voraus! MFG Pancake Games
  • xXTechmanXx schrieb:

    Mh... vllt mit place_metting oder so weiß den code nicht genau

    GML-Quellcode

    1. if place_meeting(x,y,obj_npc) ....


    das weiß er aber glaube ich schon, die frage ist wie man die textbox coden kann.
    ich weiß es auch nicht allerdings habe ich einen tipp:
    befasse dich mal mit einem Spiel und mach das erstmal fertig bevor du ein neues anfängst ;)
  • Die Abfrage könnte so aussehen:

    GML-Quellcode

    1. if place_meeting(x,y,obj_npc) && keyboard_check(vk_enter)==true then { ... }

    Ich habs nicht getestet, sollte aber funktionieren.. Ansonsten probier mal keyboard_check_pressed
    Jetzt kannst du entweder eine Messagebox als Objekt mit einem Sprite erstellen lassen:

    GML-Quellcode

    1. instance_create(view_xview+zahl,view_yview+zahl,obj);

    oder du drawst das ganze mit:

    GML-Quellcode

    1. draw_rectangle(x1,y1,x2,y2,outline);

    Zeichnet ein Rechteck. outline gibt an, ob nur die Außenlinie gezeichnet werden soll(true) oder es gefüllt sein soll(false).

    Zum Schluss musst du noch den Text drawen:

    GML-Quellcode

    1. draw_text(view_xview+zahl,view_yview+zahl,string);

    Mit view_xview und view_yview ist die x und y Koordinate des Views gemeint, somit geht die Messagebox mit dem View mit, falls du's nicht brauchst, kannst du es ja einfach weglassen^^

    ____
    Adventskalender 2010: Blue Smiley
  • Wow cool! Danke für die Hilfe! Ja... Ich arbeite auch erstmal an einem Spiel Terra :D!

    Naja okay... Gibt es nicht auch eine gecodete Variante wo man genau bestimmen kann wo man Enter drückt? Also ein object wo man erst enter drücken kann, wenn man auf dem object steht?
  • naja ich würde sagen zb einfach so:

    GML-Quellcode

    1. if place_meeting(other.x+16,other.y+16,obj_blabla)
    aber das müssteste doch wissen oda ?( (ich weiß nicht ob ich dich richtig verstanden habe)
    Meine Spiele:
    - Mission A
    - Mission B
    - The Virus 1, 2, 3
    - The Virus 4: The Excision
    - Blur melts Snow
    - Blur melts Snow: 2nd Version
    - Cave Jumper

    Hauptrojekt: Party Mania(Arbeitstitel) - große Multiplayer-Minispielsammlung
    In Planung: Planet Jumper(Nachfolger von Cave Jumper)
  • @Pancake Games
    Falls ich dich richtig verstanden habe, kannst du einfach ein Kollision-Event erstellen ("NPC und Spieler" oder "Enter_obj und Spieler") und da fragst du:

    GML-Quellcode

    1. keyboard_check(vk_enter)==true then { Deine Aktion }

    ____
    Adventskalender 2010: Blue Smiley
  • da ich jetzt nicht genau rauslesen konnte wo dein problem liegt zeig ich dir einfach mal wie ich das in meinem aktuellen RPG gelöst hab.

    ansprechen der NPCs:
    zuerst wird ständig überprüft in welche richtung dein spieler schaut. dies passiert beim drücken der einzelnen richtungstasten
    dir = "right", "left",usw.
    dann steht im step event ungefähr das hier

    GML-Quellcode

    1. if keyboard_check_pressed(key_use) // vorher definiert..
    2. {
    3. if dir = "right" && place_meeting(x+use_dist,y,npc_par) //use_dist = aus welcher entfernung du gegner ansprechen kannst; npc_par = klar.. parent der NPCs
    4. {nNPC = instance_place(x+use_dist,y,npc_par) // der einfachheit wegen wird der angesprochene NPC in einer variablen gespeichert
    5. status = "talk" // damit du unterscheiden kannst, ob dein spieler gerade im gespräch ist, denn dann darf er nichtmehr laufen können.
    6. // nun springen wir über with() in den von uns angesprochenen NPC:
    7. with(nNPC)
    8. {
    9. dir = "left" // damit er uns auch anschaut
    10. talk = 1 // NPC ist nun auch im zustand "gespräch"
    11. talk_t += 1 // die textabschnitte die der NPC erzählt werden mitgezählt.
    12. talk_w_txt = "" //diese variale enthält ein wenigen augenblicken den vom NPC gesprochenen text.
    13. } // with()
    14. }// if dir = "right" ..
    15. // dann noch das gleiche für die anderen drei blickrichtungen. hier ändert sich dann nur die funktion place_meeting() und der NPC schaut halt in andere richtungen.
    16. //...
    17. //...
    18. //...
    19. // immer noch im step-event..
    20. if keyboard_check_pressed(key_use) && nNPC.talk_t >= nNPC.talk_max // wieder tastendruck und anschließend wird geschaut, wieviele textabschnitte (talk_t) der NPC von seinem
    21. // gesamttext (talk_max) schon erzählt hat. und das soll nun der fall sein, dass der NPC alles erzählt hat, was er zu erzählen hat.
    22. {
    23. status = "stand" // spieler ist nun nichtmehr im gespräch mit dem NPC
    24. with(nNPC) // wieder sprichen wir kurz ein den von uns angesprochenen NPC
    25. {
    26. talk = 0 // und entlassen ihn zuerst ebenfalls aus dem gespräch
    27. talk_t = 0 // und setzen auch seinen textabschnitt-zähler zurück, damit er beim nächstenmal seine geschichte auch schön brav wieder von anfang an erzählen kann
    28. } // with() wird geschlossen
    29. } // if geschlossen
    30. }
    Alles anzeigen


    so, das wars jetzt erstmal im spieler selbst. fehlt nurnoch der NPC.
    die NPCs müssen mit einem parent objekt ausgestattet sein, sonst müsste man ja die obige abfrage für jeden NPC erstellen.. könnte viel code werden ;)

    aber erst in den NPC selbst, also noch nicht das parent.

    im create-event:

    GML-Quellcode

    1. // zuerst mal die nötigen variablen anlegen:
    2. talk = 0 // NPC ist nicht in ein gepräch vertieft
    3. talk_t = 0 // wie gehabt. von anfang an erzählen und so..
    4. talk_w_txt = "" // was er später sagen wird kommt nachher hier rein
    5. // jetzt legen wir gleich noch die farben für textbox und schrift fest
    6. b = c_white // farbe für text
    7. c = c_blue // für textbox
    8. // so. nun kommt eine liste, die wir z.b. text_list nennen
    9. text_list = dx_list_create()
    10. // nun die einzelnen textabschnitte.
    11. txt0 = "" // diesen abschnitt brauchen wir. der kann leer sein. warum weiß ich nicht, aber ohne den hier, funktioniert das ganze nicht so wie es soll..
    12. // jetzt also die richtigen texte:
    13. txt1 = "bla bla bla 1"
    14. txt2 = "irgendwas anderes"
    15. txt3 = "was ganz anderes"
    16. // das sind die einzelnen abschnitte nach denen wir durch tastendruck des "use_key" im spieler dem NPC den befehl geben seinen nächsten abschnitt zu erzählen
    17. // das ganze geht bis 15, da soweit ich weiß listen auf 16 einträge beschränkt sind. stimmt das?!?! meine NPC haben bisher nie mehr als 9 textabschnitte erhalten, daher weiß ich das nicht.
    18. // so.. nun tragen wir die einzelnen abschnitte in die liste ein.
    19. ds_list_add(text_list,txt0)
    20. ds_list_add(text_list,txt1)
    21. ds_list_add(text_list,txt2)
    22. ds_list_add(text_list,txt3)
    23. // je nachdem wieviele wir eben haben.
    24. // jetzt noch die maximale anzahl an textabschnitten festlegen:
    25. talk_max = ds_list_size(txt_list)-1 // -1 weil du sonst nach dem text nochmal ne 0 angezeigt bekommst.
    Alles anzeigen


    create-event des NPCs fertig. nicht vergessen dem NPC ein parent zuzuweisen, das unserem fall jetzt npc_par heißt

    nun folgt der letzte schritt. wir öffnen das draw_event des npc_par objektes

    GML-Quellcode

    1. // als erstes müssen wir das sprite zeichen lassen, da es sonst nicht gezeichnet wird, da wir ja nun den draw event benutzen.
    2. draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha)
    3. // nun zur textbox und dem text
    4. if talk = 1 && talk_w_txt != "" // also wenn der NPC mit uns spricht und sein zu erzählender text nicht leer ist
    5. {
    6. talk_w_txt = ds_list_find_value(text_list,talk_t) // aus der liste wird nun der gepeicherte textabschnett an der stelle talk_t (in unserem fall jetzt 1, da vorhin im spieler festgelegt)
    7. // jetzt zeichnen wir die textbox. mit rahmen.
    8. draw_roundrect_color(x-string_width_ext(talk_w_txt,-1,250)/2-10,y-string_height_ext(talk_w_txt,-1, 250)/2-10-35,x+string_width_ext(talk_w_txt,-1,250)/2+10,y+string_height_ext(talk_w_txt,-1,250)/2+10-50,c,c,0) // dies ist die textbox die nun in abhängigkeit der länge und höhe des strings talk_w_txt im abstand von -10 px nach rechts und links und oben und
    9. //unten gezeichnet wird
    10. draw_roundrect_color(x-string_width_ext(talk_w_txt,-1,250)/2-10,y-string_height_ext(talk_w_txt,-1, 250)/2-10-35,x+string_width_ext(talk_w_txt,-1,250)/2+10,y+string_height_ext(talk_w_txt,-1,250)/2+10-50,b,b,1) // das gleiche nochmal. unterschied: die farbe ist nun b für textfarbe (weiß) und outline ist 1, also haben wir hier den rahmen der textbox in textfarbe
    11. // nun noch den text
    12. draw_text_ext(x-string_width_ext(talk_w_txt,-1,250)/2,y-string_height_ext(talk_w_txt,-1,250)/2-35-7,talk_w_txt,-1,250) // -1 steht für den zeilenabstand. 250 ist die maximale
    13. // länge des strings, bevor ein automatischer zeilenumbruch vorgenommen wird.
    14. // jetzt kann man noch einen hinweis darauf geben, dass der NPC noch nicht fertig mit sprechen ist.
    15. if talk_t < talk_max && current_second mod 2 = 1 // also wenn noch nicht alles vom NPC gesagt wurde. current_second mod 2 = 1 bewirkt in dem fall dass das sprite im sekundentakt blinkt
    16. {
    17. draw_sprite(txt_continue_spr,0,x+string_width_ext(talk_txt,-1,250)/2+2,y-50+string_height_ext(talk_txt,-1,250)/2) // die possition ist nun hinter dem letzen
    18. //buchstaben der letzen zeile. und das sprite ist bei mir z.b. ein kleiner pfeil der nach unten zeigt.
    19. }
    Alles anzeigen


    so, das wars eigentlich. sollte was nicht funktionieren, dann sagt mir einfach bescheid und ich schau nochmal nach ob ich irgendwo was falsch abgeschrieben habe.
    natürlich versteht es sich ja von selbst, dass diese text-engine nicht 100%ig so aus meinem aktuellen projekt stammt. ein paar kleine feinheiten behalte ich mir vor hier nicht
    preis zu geben. aber dennoch sollte es so durchaus brauchbare ergebnisse geben.

    ich hoffe ich konnte helfen. und die 50 minuten die ich hier mit schreiben verbracht habe, haben sich gelohnt.

    mfg
    HIM666
  • Jetzt hast du ihm praktisch alles vorgekaut... wollt du ihm vielleicht noch den Rest des Spiels schreiben? Wär vielleicht hilfreich ;)

    Pancake: Du solltest vielleicht erstmal kleine "Arcade Games" machen, wie z.B. Vertical Shooter / Sidescrolling Shooter (Sowas wie R-Type und co). Das is ein ganzes stück unkomplizierter und hilft ungemein beim Üben. Dann setzt du dich mal mit der Hilfe auseinander und lernst gleichzeitig die ganzen Befehle.

    Wenn du all das gemacht hast, solltest du das Meiste in deinem Spiel hinkriegen. Wenn du mal aufm Schlauch stehst, und ein Problem nicht lösen kannst, dann frag nochmal nach, konsultier aber vorerst lieber die Hilfe, es könnte nur ein simpler Befehl sein, den der GameMaker schon hat. Danach frag die Forensuche und dann poste hier, falls es nicht hilft ;)

    Grundsätzlich finde ich: Vorerst üben, mit allen möglichen leichten Spielen (Pong? Pac Man?) und dann was neues versuchen ;)


    PS: Is nix böse gemeint, dachte nur ich sags nochmal, vielleicht hilft es dir ja auch.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Benutzer online 2

    2 Besucher