Blockschatten

  • GM 8

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

  • Blockschatten

    Hi, alle zusammen,

    Also ich stehe vor folgendem Problem: Ich möchte in einem spiel in 2d ansicht einen Schatten erzeugen der etwa so wie auf dem Bild aussieht.

    Sollte also so ein wenig wie der schatten der alten minecraft version aussehen. Ich weiss nur nicht so recht wie ich dies anstellen soll. Mit surfaces hab ich keine ahnung; Und wenn ich den view mit objekten fülle, die sich im 16*16 Raster mitbewegen, wüsste ich einerseits nicht, wie ich das so hinbekomme, das sie die bedingung testet ob es irgendein kollisionsobjekt mit ihrem x aber irgendeinem y gibt und es wäre sehr performancelastig.

    Vllt stehe ich auch nur auf dem Schlauch, andererseits habe ich schon was in der SuFu gefunden nur will ich doch die guten alten lichtobjekte in meinem Game nicht vernachlässigen und wüsste auch in dem Fall nicht, wie ich es machen müsste.

    Also, kann mir wer helfen, der mehr ahnung in solchen dingen hat?
    MFG Biochemic
    ////////////////////////////////////////////////////////////////////////////////////////////////
  • Danke dir. Ich hab ein wenig mit surfaces herumprobiert, das will aber nicht funktionieren. kann mir jemand sagen, wie das gescheit geht. Das tut von DAG ist zwar einfach zu verstehen nur geht das example nicht (liegt wahrscheinlich daran dass ich gm8 hab)
    Edit: Ich glaube, ich habs...
    Als erstes zeichne ich einen einen langen schatten, der so lang ist wie die höhe des Raumes.
    Dann setze ich auf den substraktiven Blendmode und zeichne das Licht der Fackeln.
    Das tue ich alles in Blöcken, und draw es zu guter letzt mit alpha auf den view[0].
    ... so müsste es gehen!
    ////////////////////////////////////////////////////////////////////////////////////////////////

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Biochemic ()

  • Aaaalso, ich habe es so weit schon geschafft:
    siehe anhang das Bild

    mit surfaces habe ich jetzt die schatten für die Blöcke gemacht und wüsste jetzt nur noch gerne, wie man diese abstufungen (wie im oberen bild) reinbekommt. das mit dem Licht wird kein großes Problem. Meine Theorie wäre mit den Abstufungen, dass ich noch ein zweites surface anlege, welches vom Block aus checkt, ob der pixel rechts und links auf dem surface 1 auch schwarz ist, dann zeichnet er auch noch einen schatten in surface 2. nur ist dieser Weg seeeehr performancelastig und deswegen stehe ich grade sozusagen am Abgrund.
    Bilder
    • Schatten 2.jpg

      4,22 kB, 200×200, 440 mal angesehen
    ////////////////////////////////////////////////////////////////////////////////////////////////
  • Probier' doch einfach zu checken, ob links / rechts ein Block-Objekt liegt.
    Also

    GML-Quellcode

    1. var chk;
    2. chk = (place_free (x, y + 16)) * ((!place_free (x - 16, y)) + !place_free ((x + 16, y)))
    3. if chk == 0 { exit; }
    4. draw_set_alpha (0.25 * chk)
    5. //Schatten malen lassen.
    6. //Vielleicht solltest du den chk-Wert eher einmalig im Create-Event zuweisen, da es sonst bei sehr vielen Blöcken leicht auf die Performance gehen kann.

    Sollte funktionieren.
  • Hmmm...
    Also wenn du nur prüfen willst an welcher stelle die Sonne nicht durscheinen kann um drunter dann eine nSchatten hinzuklatschen, gehst du einfach mithilfe 2 For-Schleifen (eine geht von links nach rechts durch level, und jedesmal führt sie eine 2te For-Schleife aus die von oben nach unten geht.) Sobald die 2te forschleife beim gang nach unten ein Objekt trifft, soll sie einfach einen schatten "zeichnen" Wie du das zeichnen löst kommt grundsätzlich drauf an wie dein Spiel aufgebaut ist.
    Ich würde für den Anfang u.a. Tiles empfehlen (komplett schwarzer Block) dann man einfach mit einer Tranparenz (0.3 oder 0.4) zeichnet.

    mfg

    LEWA

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • @LEWA: Danke für deinen Tipp, habe aber halt jetzt schon mit surfaces angefangen (was sonderlich gut geht :D ) und mit Hilfe von Phoenix' Idee könnte ich das sogar hinbekommen. Ich hab mir folgendes überlegt:
    Erst erstelle ich ein Surface (fertig)
    dann zeichne ich drauf:
    ich checke also die blöcke nach Phoenix' Prinzip in einem bestimmten Event
    dann zeichne ich die Blöcke auf das Surface entweder mit alpha 0.5 oder mit alpha 1

    wobei ich bei 0.5 die fläche mit blend_mode(bm_subtract) vorbereite und dann erst
    mit alpha zeichne um übergänge zu vermeiden.


    also: danke euch
    ich melde mich noch demnächst und sage bescheid obs geklappt hat. :)
    ////////////////////////////////////////////////////////////////////////////////////////////////
  • So, nach einer langen Pause melde ich mich mal wieder:

    Ich habs hinbekommen. Aber anstatt die Schattenfläche mit bm_subtract vorzubereiten (was sowieso schwachsinn war),
    hab ich mich entschlossen mit bm_add zu arbeiten; und siehe da, es funktioniert so wie ichs wollte mit der Ausnahme, dass der Randschatten (also der Schatten rechts und links) je nach höhe der blöcke da drunter mal heller und mal dunkler ist.
    das dies aber Kleinigkeiten sind, habe ich das Problem gelöst. Und ich hab das alles in einem Surface gemacht.
    Das Licht war auch einfach; Sprites in Alpha am ende aufs Surface zeichnen.

    Danke für eure Hilfe
    ////////////////////////////////////////////////////////////////////////////////////////////////