Figur hinter Objekte bewegen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

sky driver

Betreff: Figur hinter Objekte bewegen

BeitragMi, Jan 30, 2008 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe folgende Frage...
Ich programmier noch nicht lang mit BlitzBasic und habe mich jetzt lnagsam daran gewagt eine Figur aus einer Animation zu nehmen und die über einen Hintergrund laufen zu lassen schön und gut.

Aber:

In meinem benutzten Hintergrund, (Aus Baphomets Fluch)

user posted image

ist zum Beispiel in der linken hälfte des Bildes ein Zaun.

Geht es, dass bei meiner Figur wenn sie am Zaun entlang geht die beine dahinter verschwinden und immer nur noch durch die Lücken des Zauns zu sehen sind wenn sie weiter geht?
Oder ist so etwas mit nur einem Hintergrund nicht möglich?
Wie kann man das sonst machen?
Oder ist das noch zu hoch für mich?

Für mich erscheint es unmöglich in einem Hintergrund eine Figur hinter etwas laufen zu lassen jedoch gibt es sehr viele dinge in der Programmierung die das unmögliche möglich machen Smile <-- meine erfahrung!

Hoffe ihr versteht was ich meine Rolling Eyes

Mfg Sky
Ich weiß das ich nichts weiß und somit weiß ich mehr als ihr weil ihr nicht wisst das ihr nichts wisst.

Dottakopf

BeitragMi, Jan 30, 2008 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm vll wenn man etwas trickst. Sonst fällt mir nichts ein.


Ich weis nicht ob du dem schon gewachsen bis, aber ich erklärs dir trotzdem mal wie man es vll umsetzten könnte.

du machst aus diesem bild eine tile map die in 2 layer(ebenen) aufgeteilt wird.
Der erste layer wird immer hinter dem spieler gemalt und der 2te layer immer vor dem spieler.
So wird der zaun "über den spieler gemalt" und man kann den Spieler zwischen den zaunlücken sehen.

Falls du nicht wissen solltest was eine tile map ist, versuch ichs mit kurzen eigenen worten zu erklären.

Eine tile map besteht aus vielen einzelenen einzelbildern( den tiles ) , welche zusammengesetzt dann ein gesamtes objekt (bild, oder ne karte für ein spiel) ergeben. Eine Tilemap musst du dir wie ein raster vorstellen und in jedem kästchen ist eine grafik.
Diese einzelnen grafiken für das Raster, kommen aus einem großen gesamt bild ( tile_set ), das kann man sich so vorstellen wie du es mit deinen animationen machst, nur das halt hier nix animiert wird sondern bb die einzelen grafiken(tiles) aus der gesamt grafik(tile_set) einliest und dan irgendwo im raster (tile_map) setzt.

Um die ganzen einzelbilder und deren x und y koordinaten zu speichern braucht man nen arry
und diesem arry musst du dan die nummer des frames aus deinem tile_set zuweisen.


Tiefer will ich jetzt nicht einsteigen, da ich nicht weis wie dein wissensstand ist, und es doch recht komplex für den anfang ist.
Wenn du meinst du schafst das locker, dann schau dir mal auf robsite das RPG Tut 1 an, hier wird erklärt wie so eine tile map aufgebaut wird und wie man sich darauf bewegt

http://www.robsite.de/tutorials.php?tut=blitzbasic

mfg Dottakopf

~edit~ etz fällt mir doch noch was ein... Du könntest es auch ganz billig in 2 grafiken unterteilen. also die obere hälfte die hinter dem spieler gemalt werden muss, wird zu erst gezeichnet , und die hälfte wo der zaun drin ist, wird nach dem spieler gezeichnet. Müsste mit etwas fummelei auch klappen. Ist aber so eine "naja" lösung Laughing
Rechtschreibfehler gelten der allgemeinen Belustigung!

sky driver

BeitragMi, Jan 30, 2008 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Smile

Vielleicht nicht die eleganten lösungen aber ich werde es mal versuchen...
Ist ja wie du sagst ein wenig komplizierter aber versuchen-scheitern-weiterversuchen....

Danke
Ich weiß das ich nichts weiß und somit weiß ich mehr als ihr weil ihr nicht wisst das ihr nichts wisst.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jan 30, 2008 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, da sich das Bild an garkeiner Stelle wiederholt, wüsste ich jetzt nicht wozu man eine Tilemap benutzen sollte. Wenn dies die einzige Stelle ist, wo dein Spieler entlanglaufen kann ist, so würde ich das Bild mit einem Grafikprogramm in zwei Teile teilen. Das Hintergrundbild bleibt dabei komplett und dem Vordergrundbild werden alle Bereiche die sich dahinter befinden ausretuschiert und mit Transparenz versehen. Am Ende werden dann in folgender Reihenfolge die Bilder gezeichnet 1.) Hintergrundbild, 2.) Spielfigur, 3.) Vordergrundbild mit Transparenzteilen.

Je mehr Ebenen es gibt, umso mehrmals muss man das ganze aufteilen und umso komplizierter und Zeitaufwendiger wird es für dich.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Bassmaster

BeitragDo, Jan 31, 2008 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ich hab zwar auch noch net so viel Ahnung in Blitz Basic.

Aber vielleicht kann dir das hier weiterhelfen.

http://img-up.net/?up=runnerbildl5THJs.JPG

Da ist ja meine Figur auch hinter einem anderen Bild vielleicht kannst du das Bild von dem Zaun einfach ausschneiden und dann den Zaun als einzelndes Bild auf dein Baphomet Hintergrund Bild setzen.



Hier läuft die Figur hinterdem Fels her der Fels ist also im Vordergrund.
http://img-up.net/?up=runnerbildl5THJs.JPG

Code: [AUSKLAPPEN]

Graphics 800,600

SetBuffer BackBuffer()


;bilder laden

Global runner = LoadAnimImage("runner.png" ,48,56,0,12)
Global sterne = LoadImage ("sterne.png")
Global boden  = LoadImage ("boden.png")
Global felsen = LoadImage ("felsen.png")

MaskImage runner ,255,255,2555
MaskImage felsen ,255,255,255


Global move_runner


controll()

   
;funktionen

Function controll()

SetBuffer BackBuffer()


Repeat

;--------------------------------------------------------------------------------------------------------------------------------------------
If KeyDown(203) Then move_runner=move_runner-2   
If KeyDown(205) Then move_runner=move_runner+2
;--------------------------------------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------------------------------------
If KeyDown(203) Then move_star = move_star +1  If move_star = 200 Then move_star = 1   ;links laufen
If KeyDown(205) Then move_star = move_star -1  If move_star = 200 Then move_star = 1   ;rechts laufen
;--------------------------------------------------------------------------------------------------------------------------------------------

;animation für die figur
;--------------------------------------------------------------------------------------------------------------------------------------------
If KeyDown(203) Then If MilliSecs()-WarteZeit=>100 Then frame=frame+1 If frame=12 Then frame=1  WarteZeit=MilliSecs()
If KeyDown(205) Then If MilliSecs()-WarteZeit=>100 Then frame=frame+1 If frame=12 Then frame=1  WarteZeit=MilliSecs()
;--------------------------------------------------------------------------------------------------------------------------------------------


   Cls

   TileImage sterne,move_star,1
   DrawImage runner,move_runner, 514, frame
   DrawImage felsen, 230,517
   DrawImage boden,0,567


Flip


Until KeyHit(1)
End Function



Hier ist die Figur im Vordergrund und der Felsen im Hintergrund
http://img-up.net/?up=runnerbildYU81c.jpg

Code: [AUSKLAPPEN]

Graphics 800,600

SetBuffer BackBuffer()


;bilder laden

Global runner = LoadAnimImage("runner.png" ,48,56,0,12)
Global sterne = LoadImage ("sterne.png")
Global boden  = LoadImage ("boden.png")
Global felsen = LoadImage ("felsen.png")

MaskImage runner ,255,255,2555
MaskImage felsen ,255,255,255


Global move_runner


controll()

   
;funktionen

Function controll()

SetBuffer BackBuffer()


Repeat

;--------------------------------------------------------------------------------------------------------------------------------------------
If KeyDown(203) Then move_runner=move_runner-2   
If KeyDown(205) Then move_runner=move_runner+2
;--------------------------------------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------------------------------------
If KeyDown(203) Then move_star = move_star +1  If move_star = 200 Then move_star = 1   ;links laufen
If KeyDown(205) Then move_star = move_star -1  If move_star = 200 Then move_star = 1   ;rechts laufen
;--------------------------------------------------------------------------------------------------------------------------------------------

;animation für die figur
;--------------------------------------------------------------------------------------------------------------------------------------------
If KeyDown(203) Then If MilliSecs()-WarteZeit=>100 Then frame=frame+1 If frame=12 Then frame=1  WarteZeit=MilliSecs()
If KeyDown(205) Then If MilliSecs()-WarteZeit=>100 Then frame=frame+1 If frame=12 Then frame=1  WarteZeit=MilliSecs()
;--------------------------------------------------------------------------------------------------------------------------------------------


   Cls

   TileImage sterne,move_star,1
   DrawImage felsen, 230,517
   DrawImage runner,move_runner, 514, frame
   DrawImage boden,0,567


Flip


Until KeyHit(1)
End Function






Ich hoffe das Hilft dir.

das wurgel

BeitragDi, Feb 05, 2008 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich das richtig verstanden hab was hectic geschrieben hat, dann glaub ich, dass sich diese Technik nicht für dieses Bild eignen würde. Weil wenn die Figur vor den Zaun gesteuert wird, wird die Figur dann doch immer noch hinter dem Zaun sein, weil der Zaun ja immer über die Figur drübergemalt wird, egal wo sie ist. Die einigste Lösung, die mir dazu jetzt einfällt ist, alles was vor oder hinter der Figur sein könnte in Objekte aufzuteilen und zwar so, dass jedes Objekt zwei eigene Bilder kriegt. Eins von dem Objekt selbst, was dann angezeigt wird, und eins in der selben Größe wie das erste, nur das dort nur Pixel in zwei verschiedenen Farben drauf sind (wie blau und rot), die eine Farbe für "hinter" und die andere für "vor". Wenn nun die Figur in den Bereich des Objekts kommt, wird geprüft, ob sich die Füße der Figur im zweiten Bild auf der Farbe für "vor" oder ob sie sich auf der Farbe für "hinter" befinden. Und demnach wird dann das erste Bild vor oder hinter die Figur gezeichnet bzw. davor oder danach. Das zweite Bild wird natürlich nicht angezeigt. Also so würde ich das machen.Wink
mfg das_wurgel
1 ist ungefähr 3
 

Quäiny

BeitragSa, Feb 09, 2008 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ich könnt dir helfen, wenn du icq hast adde mich:235933114
 

Isoc

BeitragSo, Feb 10, 2008 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hätte folgende Lösung anzubieten (Achtung erfordert etwas Geschick und Erfahrung im Umgang mit Bildbearbeitungsprogrammen):
Du erstellst ein Graustufen-Bild das genauso groß ist, wie dein Hintergrund,dabei wird die Tiefe jedes Pixels durch seine Helligkeit ausgedrückt (Je heller, desto näher am Betrachter).
In diesem Bild wäre ohne Hindernisse ein Farbverlauf zu sehen(Hinten Schwarz vorne Weiß,Horizont schwarz).
Den Zaun z.B. fügst du jetzt ein,indem du jedem Pixel der zum Zaun gehört, die selbe Farbe gibst, wie dem Fußpunkt des Zauns(siehe Bild)

Beim Zeichnen gehst du jetzt so vor:
1. Du zeichnest den Hintergrund
2. Du zeichnest den Spieler
3. In der Rechteckige Fläche in der das Sprite deines Spielers gezeichnet wurde, musst du jetzt jeden der "Tiefenpixel" durchgehen und schauen ob er näher am Betrachter ist, als die Figur
Wenn das der Fall ist, musst du den entsprechenden Pixel nochmal drüber zeichnen
4. Fertig Smile

Den Abstand der Figur zum Betrachter erhält man übrigens relativ einfach, wenn man davon ausgeht, dass die höchste Entfernung Schwarz ist (bei 8bit-Graustufen also 0) und die niedrigste Weiß (bei Graustufen 255), da man die Entfernung durch eine lineare Interpolation zwischen der Horizontlinie(y-Wert des Horizont) und dem Betrachter(y = Höhe des Bildes)
ausrechnen kann (Perspektivisch zwar nicht ganz korrekt aber es reicht)

BladeRunner

Moderator

BeitragSo, Feb 10, 2008 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hectics Technik ist absolut korrekt, es muss nur von der aktuellen position des Spielers abhängig gemacht werden ob der Zaun vor oder nach dem Spieler gezeichnet wird, d.h. man regelt über die Y-Koordinate die Tiefe im Bild.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group