Einzelne Tiles ansprechen?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Darthshoot

Betreff: Einzelne Tiles ansprechen?

BeitragFr, Dez 29, 2006 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz

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

BeitragFr, Dez 29, 2006 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 29, 2006 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Download funzt net Sad
 

Darthshoot

BeitragFr, Dez 29, 2006 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 29, 2006 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 29, 2006 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 29, 2006 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Kuckst Du >>>HIER<<< und >>>HIER<<< und das nächste mal vielleicht am besten >>>HIER<<<.
Play Satyr!

Smokie

BeitragFr, Dez 29, 2006 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 31, 2006 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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.. Very Happy
 

Rubber

BeitragSo, Dez 31, 2006 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Wenn Gott mich schon liebt, dann dich erstrecht...
 

Darthshoot

BeitragSo, Dez 31, 2006 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke das hilft mir schon ungemein weiter Very Happy

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

BeitragMo, Jan 01, 2007 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 01, 2007 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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 :/

BladeRunner

Moderator

BeitragMo, Jan 01, 2007 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 01, 2007 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Rubber, das ist doch ein Haufen Müll was Du geschrieben hast Rolling Eyes

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

BeitragMo, Jan 01, 2007 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing hier schonmal mein Code:

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

BladeRunner

Moderator

BeitragMo, Jan 01, 2007 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 01, 2007 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jan 02, 2007 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jan 02, 2007 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
moin,

ich denke mal es liegt daran:

TileXPlayer = ( XPlayer + ScrollMap ) / 40

mfg

PS: Das Delay würde ich da auf jeden fall noch rausnehemen...

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group