Tile Engine: Spielfigur nur 1/2 Tile bewegen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

4pac

Betreff: Tile Engine: Spielfigur nur 1/2 Tile bewegen

BeitragDo, Apr 22, 2004 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi liebe Coderz!

Ich bräuchte mal einen Ansatz für die Tile-Engine, die ich gerade bastele. Ich hab mit Tile Engines noch nichts gemacht, aber der Ansatz erscheint mir an sich recht leicht zu verstehen. Also hab ich mir das Pacman-Framework aus Rene Meyers letztem BB-Buch angeschaut ("pac4.bb"), ein Bisschen damit herumprobiert und es an mehreren Enden aufgebohrt und umgebogen nach meinen Bedürfnissen. Da mir der Code durch und durch und durch verständlich ist, habe ich keine Sorge, ihn weitestgehend zu übernehmen, er wird im Verlauf des Projektes (erfahrungsgemäß) ohnehin soweit umgebogen, daß am Ende von Original kaum noch was über ist.

Eine Sache will mir allerdings nicht einleuchten, und zwar - wie bekomme ich es hin, daß sich der Spieler nicht immer ein ganzes Tile weiterbewegt, sondern nur ein halbes, oder gar nur ein Viertel pro Flip? Ist in Rene´s Buch leider nur ganz ganz grob angerissen (da steht halt in etwa, daß es geht, indem man Zwischenframes einbaut), und ich selbst habe gestern den ganzen Abend dran rumgeschraubt und nur Mist, bestenfalls Belustigendes herausbekommen. War auch mehr Try and Error, die Grundidee fehlt. Kann mir jemand was von Euch dazu sagen / posten?

Grüße,
Thomas

Slayer

BeitragDo, Apr 22, 2004 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, ich hab das bei OutbreakX so gemacht das nur die sachen im Hintergrund und die blöcke in der Tileengine laufen.
bzw. nur der start punkt vom Hero in der engine ist.

Danach steuer ich Ihn ganz normal pixel für pixel dorthin wo er soll.

Die kollision ist dan wieder in der Tileengine/for next schleife als
imagesoverlap drin und wenn die erst aktiviert ist prüfe ich auf pixelkollision mit imagescollide.

Ist ein bisschen blöd zu beschreiben aber ich hoffe Du kappierst was ich meine Wink

Ansonsten schreib ich heut abens mal ein beispiel.

Cu,
Fabio
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version

Jan_

Ehemaliger Admin

BeitragDo, Apr 22, 2004 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
So ungefähr?

Code: [AUSKLAPPEN]
If keydown (200) then AktY = -1
If keydown (208) then AktY = 1
if keydown (203) then AktX = -1
if keydown (205) then AktX = 1

X = X + AktX
Y = Y + AktY
if Ceil#(X/32) = Floor#(X/32) aktX=0
if Ceil#(Y/32) = Floor#(Y/32) aktY=0
drawimage Pacman,X,Y
between angels and insects
 

Omenaton_2

BeitragDo, Apr 22, 2004 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Du zeichnest die Figur an die Position entspechend der Koordinate + "PixelVerschieberWert X und Y".
Die Figur soll das alte Feld offiziell nicht verlassen, solange das neue Feld nicht ganz erreicht ist.

Die Verschiebervariable wird alle ca. 250 Millisecs um 1 erhöht (auch mit Minus Vorzeichen) und wenn es sagen wir 32 (pixel) ist, dann wird das neue Feld offiziell erreicht, das alte freigegeben und die PixelVerschieber Variablen auf Null zurückgesetzt. Das ist eigentlich so ähnlich wie beim "pixelweise" Scrollen.

soli

BeitragDo, Apr 22, 2004 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ich kenn das Buch von Renee nicht,
*geizigbin*

aber ich mach das auch so ähnlich wie Slayer.
Die Tileengine ist zum scrollen, und dient als
Map für die Koordinaten.
Ich prüf ob die Spielfigur das nächste
Tile betreten darf, und bewege sie dann
Pixel für Pixel dort hin.
solitaire

4pac

BeitragDo, Apr 22, 2004 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm... Sad ist mir nicht klar, wo die Abfrage stattfinden soll, die verhindert, daß der Spieler in die Mauern läuft, und wo die Zwischenframes gesetzt werden sollen...vielleicht kann´s mir jemand an meinem Codegerüst zeigen?

Code: [AUSKLAPPEN]
; simple tile engine

Const zeilenzahl = 30
Const spaltenzahl = 30
Const tile_size = 24

Graphics 1024,768,16,2

timer = CreateTimer(20)
tile_way = LoadImage("gfx/tile_way.png")
tile_noway = LoadImage("gfx/tile_noway.png")
playerpic = LoadImage("gfx/player.png")
enemypic = LoadImage("gfx/enemy.png")


; read level from hard drive

Dim Level$(zeilenzahl,spaltenzahl)
leveldatei = ReadFile("level1.dat")
For Zeile=0 To (zeilenzahl-1)
 A$ = ReadLine(leveldatei)
 For Spalte=0 To (spaltenzahl-1)
  Level$(Zeile,Spalte) = Mid$(A$,Spalte+1,1)

  If Level$(Zeile,Spalte) = "S" Then
   SpielerStartS = Spalte
   SpielerStartZ = Zeile
  EndIf
  If Level$(Zeile,Spalte) = "G" Then
   GegnerStartS = Spalte
   GegnerStartZ = Zeile
  EndIf

 Next
Next
CloseFile leveldatei
leben = 5

; main loop -----------------------------------------------------------

Repeat

; draw level

 For Zeile=0 To (zeilenzahl-1)
  For Spalte=0 To (spaltenzahl-1)
   Select Level$(Zeile,Spalte)
    Case "1"
     DrawImage tile_way, Spalte*tile_size, Zeile*tile_size
    Case " "
     DrawImage tile_noway, Spalte*tile_size, Zeile*tile_size
    Case "S"
     DrawImage tile_way, Spalte*tile_size, Zeile*tile_size
     DrawImage playerpic, Spalte*tile_size, Zeile*tile_size
     SpielerS = Spalte
     SpielerZ = Zeile
    Case "G"
     DrawImage tile_way, Spalte*tile_size, Zeile*tile_size
     DrawImage enemypic, Spalte*tile_size, Zeile*tile_size
     GegnerS = Spalte
     GegnerZ = Zeile
   End Select
  Next
 Next

 Flip


; move player

 If KeyDown(203) And ( Level$(SpielerZ,SpielerS-1) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerS = SpielerS - 1
  Level$(SpielerZ, SpielerS) = "S"
 EndIf

 If KeyDown(205) And ( Level$(SpielerZ,SpielerS+1) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerS = SpielerS + 1
  Level$(SpielerZ, SpielerS) = "S"
 EndIf

 If KeyDown(200) And ( Level$(SpielerZ-1,SpielerS) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerZ = SpielerZ - 1
  Level$(SpielerZ, SpielerS) = "S"
 EndIf

 If KeyDown(208) And ( Level$(SpielerZ+1,SpielerS) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerZ = SpielerZ + 1
  Level$(SpielerZ, SpielerS) = "S"
 EndIf

 
 WaitTimer timer
Until KeyHit(1)
; main loop end -------------------------------------------------------

End

; program end

Slayer

BeitragDo, Apr 22, 2004 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab nu kurz zeit, Arbeit Arbeit....


Die abfrage muss in der for schleife statfinden bevor Du zeichnest.
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version

4pac

BeitragDo, Apr 22, 2004 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Slayer - heißt das, ich frage weiter unten in der Schleife die Cursortasten ab, und erst beim nächsten Schleifendurchlauf wird oben gecheckt, ob dies zu einer Kollision geführt hat, und wenn ja, werden die Koordinaten des Spielers wieder zurückgesetzt auf den Stand von vor der Tastaturabfrage? Confused Ich glaube coden ist doch nicht so mein Ding, ich fang lieber an mit Ministeck oder Makramé...

Slayer

BeitragDo, Apr 22, 2004 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, im noch beim Malochen Wink

Ich mach das immer so,


Steuerung()

Tile berechnen, Kollisionen,

zeichnen()


So verhindere ich das ein Bild in das Andere, 1,2,3.. pixel eintaucht und
dann wieder zurück springt.
Das würde Passiern wenn du zuerst zeichnest und dann kollision überprüfst.

Die steuerung könnte aber auch erst nach dem zeichnen gemacht werden, wichtig ist eigendlich nur das die kollision vorher ist.

las mich aber gern eines besseren belehren.
AMD2500XP, SB5.1, DX9, 512MB DDR333,
XPPro SP1a,ATI 9800SE 256bit 128MB,B3B, B+ immer die neue Version

4pac

BeitragFr, Apr 23, 2004 9:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi liebe Coderz,

danke für Eure Gedankenanstöße. Ich habe nochmal eine Nacht drüber geschlafen und weiß jetzt glaube ich, wie ich das angehen muss. Ich werd´s nochmal neu schreiben.

Grüße,
Thomas

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group