Einzelne Tiles ansprechen?
Übersicht

DarthshootBetreff: Einzelne Tiles ansprechen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
Ich will ne TileEngine machen.. Also meine Map soll sich von rechts nach links bewegen. Immer um einen Pixel. Das klappt auch wunderbar. Mein Player kann sich allerdings frei bewegen. Das klappt auch ![]() Jetzt müsste ich aber die einzelnen Tiles in einer IF Abfrage ansprechen können, damit ich gegebene Kollisionen programmieren kann. Wie geht das? Mein Player bewegt sich nämlich FREI und nicht immer ein Tile weiter... Danke im Voraus. MfG Darthshoot |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab vor langer zeit mal was dazu gefunden:
Ein RPG-Tut, dass sich hauptsächlich mit Maps und Kolisionen beschäftigt Edit: Nochmal hochgeladen, neuer Download (25kb): http://www.rogepost.com/n/2488299485 |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
- Zuletzt bearbeitet von Eingeproggt am Fr, Dez 29, 2006 15:37, insgesamt einmal bearbeitet
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Download funzt net ![]() |
||
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jetz geht er aber das ist genau das Tut was ich nicht verwenden kann, da mein Player sich FREI bewegt und nicht auf einzelne Tiles herum hüpft. | ||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also bei meiner Tileengine habe ich ausgerechnet, auf welchem Feld (im Array) meine Figur stand, und um alle drum herum mit ImagesCollide auf Kollision geprüft. | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm also das stimmt schon man könnte mit IF Abfragen dann so ne Art PlayerTileAufenthaltsort erstellen. Aber wie hast du das ausgerechnet? o.O | ||
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kuckst Du >>>HIER<<< und >>>HIER<<< und das nächste mal vielleicht am besten >>>HIER<<<. | ||
Play Satyr! |
![]() |
Smokie |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du dividierst die Playerposition durch die Teilchengrößen (oda Tilesize^^) und schaust, welches Tile am nächsten liegt. Wenn dir das zu viele Mühe ist, zu schauen auf welchem tile dein Spiler gerade GENAU ist, kannst du einfach bei den Qutienten die KOmmastelle weglassen, und dann hast du auch ein ungefäres Ergibnis, was nicht zu 100% stimmt.
Dann könnte man statt jedes Tilebild abzufragen auch eine Kollissionsmap erstellen, die die selbe Größe wie die map hat und statt den "Bildercodes" so nenn ich es ma 1 und 0 verwendet wobei 1 kollission ist und 0 eben nicht. Da belegst du jedes Tile einfach mit einer von den beiden Zahlen. Grüße Smokie[/code] |
||
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer. Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet |
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genau sowas wollte ich machen! Also erstnochma danke für die Antworten.
Also mein Hauptproblem ist ja immer noch wie ich die Tiles einzelnd anspreche (ich mein net Tile 3, 4) sondern TileBild 1 (kollision) oder TileBild 0 (keine kollision). Wenn ich so ein Feld hier habe: Code: [AUSKLAPPEN] Data 1,1,1,1,1,1,1
Data 1,0,0,0,0,0,1 Data 1,0,0,0,0,0,1 Data 1,0,0,0,0,0,1 Data 1,1,1,1,1,1,1 Wie sage ich dem Player, dass er nur mit Tile1 nicht kollidieren darf? Ich bin total durcheinander oO dazu kommt ja noch das sich mein Player frei bewegt. Ehm jo. hilfe.. ![]() |
||
Rubber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hm...
du müsstest etwa: die bedingung, wenn die taste runter gedrückt ist und das feld unter dir nciht 1 (wenn du auf allen feldern außer eins laufen willst)aufstellen und erst dann die bewegung ausführen... Code: [AUSKLAPPEN] ;player_x , player_y = player koordinaten ;map(player_x,player_y) = position des spieler in der tielemap If KeyDown(208) Then ;is kalr - oder? ;-) If 1 != map(player_x, player_y + 1) Then ;wenn das ;Feld unter map (player_x,player_y) nicht eins ist player_y = player_y + 1;versetze den player EndIf EndIf ich hoffe, ich hab das alles richtig gemacht und auch die frage verstanden ![]() |
||
Wenn Gott mich schon liebt, dann dich erstrecht... |
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke das hilft mir schon ungemein weiter ![]() Aber ganz verstanden habe ich die Formel zum Errechnen vom Feld, wo sich der Player befindet, nicht. Also Playerposition durch Tilesize oO da würde immer das selbe rauskommen, da alle Tiles gleichgroß sind <.< oder wie jetzt? |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
es würde immer dasselbe rauskommen, wenn die Spielerposition gleich bleiben würde. (Klingt doch verdammt logisch^^) | ||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hä? Wenn die Position vom Player beispielsweise X: 2 und Y: 2 wäre, dann würde was völlig anderes rauskommen, als wenn sie X: 20 Y: 20 wäre, obwohl das noch im selben Feld liegt. Also wie errechnet man das denn jetz :/ | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nehmen wir mal an deine Tiles wären 32 pixel breit.
2 /32 -> 0.0625 20 / 32 ->0.625 32/ 32 = 1.000 Da die ersten beiden Ergebnisse <1 sind werden sie wenn sie in einer Ganzzahl gespeichert werden (INT) auf 0 gerundet ab 32 wird das Ergebnis auf 1 gerundet, ab 64 auf 2 etc. Also ergibt Position in Pixeln / Tilegrösse die Nummer des Tiles. EDIT: Rubber, ich möchte dich bitten keine Codes zu posten die Du nicht auf Lauffähigkeit geprüft hast. Die Syntax die Du da verwendest ist nicht mal im ansatz BB-Konform. Helfen wollen ist schön, aber so schadest Du mehr als dass Du nutzt. |
||
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 |
- Zuletzt bearbeitet von BladeRunner am Mo, Jan 01, 2007 16:39, insgesamt einmal bearbeitet
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Rubber, das ist doch ein Haufen Müll was Du geschrieben hast ![]() Darthshoot, hast Du Dir die Links durchgelesen die ich Dir postete, da steht doch alles drin. Hier ist nochmal die Position des Spieler Handles auf einer Tilemap. Code: [AUSKLAPPEN] Map(SpielerPositionX / TileBreite, PlayerPositionY / TileHoehe)
|
||
Play Satyr! |
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah ok danke. Aber mein nächstes Problem ist, dass wenn der Player sich z.B. auf Feld 5 / 5 befindet.. dann müsste das ja.. ehm X: 32 * 5 Pixel und Y: 32 * 5 Pixel groß sein laut deiner Rechnung. Das wären 160 Pixel. Also zurück zu meinem Problem:
XPlayer = 2 (z.B.) XPlayer2 = 20 (z.B.) XPlayer / 160 = 80 XPlayer2 / 160 = 8 Also der Player befindet sich noch NICHT auf Feld 5. Er befindet sich auf X: 2 oder 20. Jetzt kann ich nicht mehr errechnen lassen, ob er auf Feld 5 hinkann. Ehrlich gesagt bin ich gerade voll durcheinander oO normalerweise bitte ich nicht darum, aber kann mir das mal einer in einem funktionierendem Beispiel schreiben? Büüüüüüte ![]() Code: [AUSKLAPPEN] ; Map 1
Global TileSet = LoadAnimImage("Images/Map1.bmp",40,40,0,2) Global WieGross = 40 ; Wie groß soll die Map sein? Global ScrollMap = 0 Dim Map(WieGross, 14) Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 Data 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 For YMap = 0 To 13 For XMap = 0 To WieGross Read Map(XMap, YMap) Next Next Code: [AUSKLAPPEN] ; Map 1 rendern...
For Y2Map = 0 To 13 For X2Map = 0 To WieGross DrawImage TileSet, X2Map * 40 - ScrollMap, Y2Map * 40, Map(X2Map, Y2Map) Next Next ScrollMap = ScrollMap + 1 EDIT: Hmm also wenn ich SpielerX / Tilegröße nehme.. und das auch mit SpielerY ehm wie lässt sich das in BBCode realisieren oO ? Muss ich dafür ein Dim Feld anlegen und das ständig aktualisieren oder wie? Das hier steht jetzt in der Bufferschleife und bringt so noch garnichts: Code: [AUSKLAPPEN] .. Dim PlayerMap(WieGross, 14)
For YMap = 0 To 13 For XMap = 0 To WieGross PlayerMap(XMap, YMap) = XPlayer / Map(XMap, YMap) Next Next |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube du verwechselst hier Spielerposition (x/y) in Pixeln mit SpielerPosition (x/y) in Tiles.
Mit dem oben angegebenem Weg findest Du anhand der Tilegrösse aus der Pixelposition die Tileposition. Natürlich musst du diese Rechnung für X und Y getrennt vornehmen. Und in deinem Beispiel darfst du nicht durch 160 teilen, sondern du teilst immer durch die Tilegrösse- und die ist 32. ab einem Pixel-X von 160 befindet sich der Spieler im 5. Tile. Das ist nicht 160 Pixel breit, jedes Tile ist ja gleich groß. es beginnt nur bei Pixel 160. |
||
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 |
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oh danke! Jetzt hab ich es. Er errechnet schonma die Tileposition vom Player.. aber jetzt zur Abfrage: Ich will, dass wenn er auf ein Feld geht, das 1 ist und nicht 0, dann soll ein Sound gespielt werden:
Code: [AUSKLAPPEN] TileXPlayer = XPlayer / 40
TileYPlayer = YPlayer / 40 If Map(TileXPlayer, TileYPlayer) = 1 Then PlaySound(Gun1Sound) Ja ich weiß.. sehr schön deutsch ausgedrückt.. egal. Irgendwie klappt das aber nicht. |
||
Darthshoot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hab ein neues Problem: Die Collisionsabfrage geht jetzt, aber sie bleibt stehen. Ganz im Gegensatz zu meiner Map, die sich pro Bufferdurchlauf um einen Pixel nach links bewegt :/
Wie kann ich die Kollisionsabfrage mit nach hinten bewegen lassen? ; Map 1 rendern... Code: [AUSKLAPPEN] For Y2Map = 0 To 13
For X2Map = 0 To WieGross DrawImage TileSet, X2Map * 40 - ScrollMap, Y2Map * 40, Map(X2Map, Y2Map) Next Next ScrollMap = ScrollMap + 1 Der Player: Code: [AUSKLAPPEN] TileXPlayer = XPlayer / 40
TileYPlayer = YPlayer / 40 If Map(TileXPlayer, TileYPlayer) = 1 Then Delay 1000 |
||
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
moin,
ich denke mal es liegt daran: TileXPlayer = ( XPlayer + ScrollMap ) / 40 mfg PS: Das Delay würde ich da auf jeden fall noch rausnehemen... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group