Tilemap verschoben(scrollen)!?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Animator

Betreff: Tilemap verschoben(scrollen)!?

BeitragDi, Jul 26, 2011 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute, ich brauche mal wieder eure Hilfe:

Ich arbeite im Moment an einem Spiel namens Dragonsouls und die Welt besteht aus einer Tilemap. Ich dachte ich lasse die ganze Karte jetzt mal einfach Scrollen: Pustekuchen, seit gestern Abend macht mich das Programm echt fertig: Ja, die Karte Scrollt, aber die Kollisionen sind verschoben und das "Array Index out of bounds" kommt viel weiter oben als sonst( ausserhalb der Tilemap, unten natürlich umgekehrt) daraus schließe ich das mein Code zwar das tileset verschiebt, aber nicht die map(x,y). Aber wie soll ich es dann machen?

das ist der ganze Code:
Code: [AUSKLAPPEN]
AppTitle "Dragonsouls"

Graphics 860,650,16,2

tileset = LoadAnimImage("tileset.bmp",32,32,0,5)

Musik_1 = LoadSound
Player = LoadAnimImage("Charakter_2.bmp",32,32,0,12)
Drache_1 = LoadImage("Drache_1.bmp")

MaskImage Drache_1, 255,255,255
MaskImage Player, 255,255,255
MaskImage tileset, 255,255,255

Type Drachen

Field Bild
Field Drachen_X
Field Drachen_Y
Field Schaden
Field spezial_Angriff_Grafik
Field speziel_Angriff_Schaden
Field Frame
Field Leben

End Type

Global D.Drachen

For Drachen_Generierung = 0 To 2
D = New Drachen

D\Bild = Drache_1
D\Drachen_X = 200
D\Drachen_Y = 200
D\Schaden = 10
D\spezial_Angriff_Grafik = 0
D\speziel_Angriff_Schaden = Schaden * 2
D\Frame = 1
D\Leben = 200

Next

Player_X# = 13
Player_Y# = 10

Dim Map(40,40)

Data 0,0,0,0,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,2,0,0,0,0,0,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0
Data 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

For y = 0 To 40
For x = 0 To 40
Read Map(x,y)
Next
Next

SeedRnd MilliSecs()

Repeat
SetBuffer BackBuffer()

Cls

Zufall = Rand(1,10)

If Zufall = 1 Then

EndIf

For y = 0 To 40
For x = 0 To 40

DrawBlock tileset,X*32 + X2,Y*32 + Y2,map(x,y)
Next
Next

If KeyDown(208)
    If map(Player_X#,Player_Y#+0.5) < 4 Then ;Unten
        Y2 = Y2 - 3 Player_Y# = Player_Y# + 0.1
        If Player_Frames > 1 Then Player_Frames = 1
        If Frames = 0 And Frame_Timer > 1 Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        Frame_Timer = Frame_timer + 1
    EndIf
EndIf

If KeyDown(200)
    If map(Player_X#,Player_Y#-0.1) < 4 Then ;Oben
        Y2 = Y2 + 3 Player_Y# = Player_Y# - 0.1
        If Player_Frames > 4 Then Player_Frames = 4
        If Frames = 0 And Frame_Timer > 1  Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        Frame_Timer = Frame_timer + 1
    EndIf
EndIf

If KeyDown(205)
    If map(Player_X#+0.2,Player_Y#) < 4 Then ;Rechts
        X2 = X2 - 3 Player_X# = Player_X# + 0.1
        If Player_Frames > 7 Then Player_Frames = 7
        If Frames = 0 And Frame_Timer > 1  Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        Frame_Timer = Frame_timer + 1
    EndIf
EndIf

If KeyDown(203)
    If map(Player_X#-0.3,Player_Y#) < 4 Then ;Links
        X2 = X2 + 3 Player_X# = Player_X# - 0.1
        If Player_Frames > 10 Then Player_Frames = 10
        If Frames = 0 And Frame_Timer > 1  Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        Frame_Timer = Frame_timer + 1
    EndIf
EndIf

Frames = 0

;If D.Drachen <> Null Then
For D = Each Drachen
DrawImage D\Bild, D\Drachen_X, D\Drachen_Y
;D\Drachen_X = D\Drachen_X - 1
Next
;EndIf

If Player_Frames > 11 Then Player_Frames = 0

DrawImage Player,Player_X * 32,Player_Y * 32, Player_Frames ;x = Player_X# * 32 - Scroll_X : y = Player_Y * 32 - Scroll_Y :DrawImage Player,X,Y, Player_Frames

Flip

Until KeyDown(1)

End


das sind die wichtigen Stellen:
Code: [AUSKLAPPEN]
If KeyDown(208)
    If map(Player_X#,Player_Y#+0.5) < 4 Then ;Unten
        Y2 = Y2 - 3 Player_Y# = Player_Y# + 0.1
        If Player_Frames > 1 Then Player_Frames = 1
        If Frames = 0 And Frame_Timer > 1 Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        Frame_Timer = Frame_timer + 1
    EndIf
-------------------------------------------------------------------------------

For y = 0 To 40
For x = 0 To 40

DrawBlock tileset,X*32 + X2,Y*32 + Y2,map(x,y)
Next
Next

EndIf


Verbesserungen am Code sind erwünscht, gerade im Bereich Tilemap bin ich Anfänger!
Wink

danke im vorraus

MFG Animator

Xeres

Moderator

BeitragDi, Jul 26, 2011 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du mit Float Koordinaten auf ein Array zugreifst, musst du sehr sicher sein, das die automatische Rundung so funktioniert, wie du das erwartest. Sicherheitsabfragen wären da vielleicht sinnvoll.
Bitte vermeide Zeilen wie die:
Code: [AUSKLAPPEN]
Y2 = Y2 - 3 Player_Y# = Player_Y# + 0.1

Das ist unleserlich und schreit nach Fehlern. Du hast genug Platz, nimm eine neue Zeile! Wenn es unbedingt alles in einer Zeile stehen muss, benutzte wenigstens einen Doppelpunkt um das ganze Regel konform von einander zu trennen.
Genauso verzichtest du besser nicht auf Then.

Wenn die Kollisionen verschoben sind, wirst du deine Scroll Variablen irgendwo nicht beachtet haben. Am besten wäre es, wenn du alle Variablen Local deklarierst - dann stechen falsch geschriebene in der richtigen IDE heraus.

BlitzBasic lässt einem (zu) viel durchgehen - so wird das debuggen schwerer als es sein muss.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Animator

BeitragDi, Jul 26, 2011 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Tiles werden ja verschoben, nur die map(x,y) nicht und eigentlich sollten beide mit den gleichen Parametern aufgerufen werden!?

Xeres

Moderator

BeitragDi, Jul 26, 2011 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Was in der Map steht ist für's Scrollen irrelevant. Du Zeichnest die Tiles wo anders hin, du änderst keine Kartendaten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ZEVS

Betreff: Type-Design / Normalisierungsformen

BeitragDi, Jul 26, 2011 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir fällt das Design des Types Drachen negativ auf. Types sollte man genauso normalisieren wir Datenbanken.
(http://de.wikipedia.org/wiki/N...tenbank%29). Die konkrete Verbesserung schlage ich so vor:
BlitzBasic: [AUSKLAPPEN]

Type Drachen

Field Art.DrachenArt ;<- ein Datenbanktheoretiker nennt das Fremdschlüssel
Field Drachen_X ;<-+--Diese Felder sind ungünstig benannt, macht aber nichts
Field Drachen_Y ;<-+
Field Frame
Field Leben

End Type

Type DrachenArt
Field Bild
Field Schaden
Field spezial_Angriff_Grafik
Field speziel_Angriff_Schaden

End Type


Des weiteren ist es unpraktisch, Tilemaps mit Data-Blöcken zu speichern. Der entsprechende Thread ist https://www.blitzforum.de/foru...hp?t=37365. Schau ihn dir doch mal an!

Der Sinn der Variable Zufall und der folgenden If-Abfrage verschließt sich mir leider.

Die relevanten Code-Teile sehen furchtbar aus, außerdem vermisse ich einige Variablendeklarationen.

Die Bedeutung der Variablen hätte mich auch mal interessiert.

Ich bitte dich daher um einen ordentlichen (Einrücken ist toll!) und ausreichend kommentierten Code bzw. eine kurze Erläuterung der Variablen. Ich habe nämlich keine Lust, mir das selbst zusammenzusuchen und viele andere wohl auch.
 

Animator

BeitragDi, Jul 26, 2011 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die kritik =) mit dem Drachen hast du vollkomen recht, aber den hab ich auch nur geschrieben um etwas zu testen(dieser "Fremdschlüssel" ist ne tolle sache, danke!). Das ich sie nicht extern speichere ist soweit absicht Wink. (EDIT:)Die If Abfrage habe ich angefangen bevor mir eingefallen ist dass das nicht so einfach geht und ich habe vergessen sie wieder zu löschen.

so, jetzt nochmal etwas ordentlicher:

Kompletter Code:
Code: [AUSKLAPPEN]
AppTitle "Dragonsouls"

Graphics 860,650,16,2

tileset = LoadAnimImage("tileset.bmp",32,32,0,5)

Player = LoadAnimImage("Charakter_2.bmp",32,32,0,12)
Drache_1 = LoadImage("Drache_1.bmp")

MaskImage Drache_1, 255,255,255
MaskImage Player, 255,255,255
MaskImage tileset, 255,255,255

;Types

Type Drache
  Field Art.DrachenArt
  Field Drachen_X
  Field Drachen_Y
  Field Frame
  Field Leben
End Type

Type DrachenArt
  Field Bild
  Field Schaden
  Field spezial_Angriff_Grafik
  Field speziel_Angriff_Schaden
End Type

Global D.Drachen

For Drachen_Generierung = 0 To 2
D = New Drachen

D\Bild = Drache_1
D\Drachen_X = 200
D\Drachen_Y = 200
D\Schaden = 10
D\spezial_Angriff_Grafik = 0
D\speziel_Angriff_Schaden = Schaden * 2
D\Frame = 1
D\Leben = 200

Next

Player_X# = 13
Player_Y# = 10

;ich lasse es vorerst in einer Data ;).

Dim Map(40,40)

Data 0,0,0,0,2,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,2,0,0,0,0,0,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0
Data 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2
Data 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

For Y = 0 To 40
For X = 0 To 40
Read Map(x,y)
Next
Next

Repeat
SetBuffer BackBuffer()

Cls

;X und Y sind die Koordinaten der Tilemap.

For Y = 0 To 40
For X = 0 To 40

;X2 und Y2 sind quasi die Scrollvariable(irgendwo hier in der Gegend muss der Fehler sein!?).

DrawBlock tileset, X * 32 + X2, Y * 32 + Y2, map(x,y)
Next
Next

;hier kommt jetzt die Bewegung des Spielers(eine Menge Gewirr das ich sicher besser hätte lösen können(das ganze bewirkt dass die Frames besser abgespielt werden)

If KeyDown(208)
    If map(Player_X#,Player_Y#+0.5) < 4 Then ;Unten
        Y2 = Y2 - 3 ;: Player_Y# = Player_Y# + 0.1
        If Frames = 0 And Frame_Timer > 20 And Taste = 1 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 1 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 2 Then Player_Frames = 1
        Frame_Timer = Frame_timer + 1
        Taste = 1
    EndIf
EndIf

If KeyDown(200)
    If map(Player_X#,Player_Y#-0.1) < 4 Then ;Oben
        Y2 = Y2 + 3 ;: Player_Y# = Player_Y# - 0.1
        If Frames = 0 And Frame_Timer > 20 And Taste = 2 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 2 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 5 Then Player_Frames = 4
        Frame_Timer = Frame_timer + 1
        Taste = 2
    EndIf
EndIf

If KeyDown(205)
    If map(Player_X#+0.2,Player_Y#) < 4 Then ;Rechts
        X2 = X2 - 3 ;: Player_X# = Player_X# + 0.1
        If Frames = 0 And Frame_Timer > 20 And Taste = 3 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 3 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 7 Then Player_Frames = 6
        Frame_Timer = Frame_timer + 1     
        Taste = 3
    EndIf
EndIf

If KeyDown(203)
    If map(Player_X#-0.3,Player_Y#) < 4 Then ;Links
        X2 = X2 + 3 ;: Player_X# = Player_X# - 0.1
        If Player_Frames > 10 Then Player_Frames = 10
        If Frames = 0 And Frame_Timer > 20 And Taste = 4 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 4 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 10 Then Player_Frames = 9
        Frame_Timer = Frame_timer + 1
        Taste = 4
    EndIf
EndIf

Frames = 0

;Spielfigur zeichnen ;)

DrawImage Player,Player_X# * 32,Player_Y# * 32, Player_Frames ;x = Player_X# * 32 - Scroll_X : y = Player_Y * 32 - Scroll_Y :DrawImage Player,X,Y, Player_Frames

Flip

Until KeyDown(1)

End


(EDIT:) Wichtige Teile:
Code: [AUSKLAPPEN]
For Y = 0 To 40
For X = 0 To 40

;X2 und Y2 sind quasi die Scrollvariable(irgendwo hier in der Gegend muss der Fehler sein!?).

DrawBlock tileset, X * 32 + X2, Y * 32 + Y2, map(x,y)
Next
Next

If KeyDown(208)
    If map(Player_X#,Player_Y#+0.5) < 4 Then ;Unten
        Y2 = Y2 - 3 ;: Player_Y# = Player_Y# + 0.1
        If Frames = 0 And Frame_Timer > 20 And Taste = 1 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 1 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 2 Then Player_Frames = 1
        Frame_Timer = Frame_timer + 1
        Taste = 1
    EndIf
EndIf

;und für die anderen Tasten...

If KeyDown(200)
    If map(Player_X#,Player_Y#-0.1) < 4 Then ;Oben
        Y2 = Y2 + 3 ;: Player_Y# = Player_Y# - 0.1
        If Frames = 0 And Frame_Timer > 20 And Taste = 2 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 2 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 5 Then Player_Frames = 4
        Frame_Timer = Frame_timer + 1
        Taste = 2
    EndIf
EndIf

If KeyDown(205)
    If map(Player_X#+0.2,Player_Y#) < 4 Then ;Rechts
        X2 = X2 - 3 ;: Player_X# = Player_X# + 0.1
        If Frames = 0 And Frame_Timer > 20 And Taste = 3 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 3 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 7 Then Player_Frames = 6
        Frame_Timer = Frame_timer + 1     
        Taste = 3
    EndIf
EndIf

If KeyDown(203)
    If map(Player_X#-0.3,Player_Y#) < 4 Then ;Links
        X2 = X2 + 3 ;: Player_X# = Player_X# - 0.1
        If Player_Frames > 10 Then Player_Frames = 10
        If Frames = 0 And Frame_Timer > 20 And Taste = 4 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Frames = 0 And Frame_Timer > 0 And Taste <> 4 Then Player_Frames = Player_Frames + 1 : Frames = 1 : Frame_timer = 0
        If Player_Frames <> 10 Then Player_Frames = 9
        Frame_Timer = Frame_timer + 1
        Taste = 4
    EndIf
EndIf


Ich hoffe doch dass es so besser ist!? Sonst sagt es mir bitte ich will ja etwas dabei lernen Wink

MFG Animator
 

BBPro2

BeitragSa, Jul 30, 2011 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
was mir direkt auffällt ist die auflösung.

860x650 ist keine standardauflösung und wir nicht von jeder grafikkarte
im vollbildschirm unterstützt (wird sie überhaupt von einer unterstützt ?)
solltest du also vorhaben dein spiel jemals im vollbild zu spielen wähle lieber
gleich eine andere auflösung, so dass du am ende aus der 2 nur eine 1 machen
musst und es kann direkt losgehen Wink

naheliegende beispiele sind 800x600 und 1024x768

ZEVS

BeitragSa, Jul 30, 2011 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Du zeichnest ja jedes mal die gesamte map, obwohl nur ein Teil davon angezeigt wird.
Außerdem kannst du For-Schleifen auch einrücken. Das gleiche gilt für If-Abfragen, diese nehmen auch mehrere Anweisungen entgegen, wenn du nach dem Then einen Zeilenumbruch machst.
BlitzBasic: [AUSKLAPPEN]
If cond Then
Anweisung1
Anweisung2
etc.
EndIf


Wegen der map probiere doch mal das:
BlitzBasic: [AUSKLAPPEN]
For X = X2 To X2+GraphicsWidth()/32
For Y = Y2 To Y2+GraphicsWidth()/32
DrawImage tileset, (X-X2)*32, (Y-Y2)*32, map(X, Y)
Next
Next

(ungetestet)

Wegen der Kollisionen musst du X2 bzw. Y2 immer mit einbeziehen.
Die Variablen finde ich sowieso unpraktisch benannt, scrollX und scrollY wären passender.
Dass "Array Index out of bounds" vermeidest du, indem du die Variablen zwischen 0 und 40 - sichtbarer Teil hälst.

Ich hoffe, dass ich dir helfen konnte.

P.S. Die Variable D müsste etwas anders intalisiert werden

Midimaster

BeitragSa, Jul 30, 2011 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde es eher "andersherum" gestalten:

Die Maps() bleiben immer, wo sie sind und der Spieler auch. d.h wenn der Spieler auf Player_X=70 Player_Y=40 steht, dann steht er immer auf dem Map-Feld(2,1), egal welche Scrolls aktuell den Bildschirmausschnitt verschieben.

Die Scroll-Werte X2 und Y2 werden nur unmittelbar vor dem Zeichnen in alle DRAW...-Befehle addiert:

BlitzBasic: [AUSKLAPPEN]
DrawImage Tileset , (X-X2)*32, (Y-Y2)*32, map(X, Y)
DrawImage Player , (Player_X-X2)* 32 , (Player_Y -Y2)* 32, Player_Frames


so musst du dir in den Spiel-Logiken und Kollisionen keine Gedanken um das akt. Scrolling machen
 

Animator

BeitragSa, Jul 30, 2011 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die vielen Antworten (ich war ne Weile weg, deswegen kommt das erst so spät!) ich werde das ganze sofort mal testen Wink

MFG Animator

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group