Figur hinter Objekte bewegen
Übersicht

![]() |
sky driverBetreff: Figur hinter Objekte bewegen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) ![]() 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 ![]() Hoffe ihr versteht was ich meine ![]() Mfg Sky |
||
Ich weiß das ich nichts weiß und somit weiß ich mehr als ihr weil ihr nicht wisst das ihr nichts wisst. |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
sky driver |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke ![]() 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. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.![]() mfg das_wurgel |
||
1 ist ungefähr 3 |
Quäiny |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich könnt dir helfen, wenn du icq hast adde mich:235933114 | ||
Isoc |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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) |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group