[D3D] TileImage

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

ToeB

Betreff: [D3D] TileImage

BeitragDo, Jul 31, 2008 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Also da es ja keinen Befehl in Draw3D ginbt, für TimeImage, wollt ich mir selber eine Function schreiben... Das Funzt auch, nur wie kann ich das Bild, was aus dem Bildschirm rausläuft wieder nach vorne gesetzt ? (Ohne Arrays !)

Code: [AUSKLAPPEN]
Function TileImage3D()
   For xx = 0 To WIDTH/256
      For yy = 0 To HEIGHT/256
         DrawImage3D(BACK,(xx*256-WIDTH/2-SXPOS),(yy*256-HEIGHT/2+SYPOS))
      Next
   Next
End Function

Erklärung :
Arrow WIDTH | HEIGHT -> BREITE | HÖHE des Bildschirms
Arrow SXPOS | SYPOS -> X | Y Variablen fürs Scrolling
Arrow Das Bild ist 256^2 groß...

Wie mach ich das ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

coolo

BeitragDo, Jul 31, 2008 11:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh zwar nicht genau, was du machen willst, aber ich würde das hier schreiben:
Code: [AUSKLAPPEN]

Function TileImage3D()
   For xx = 0 To WIDTH step 256
      For yy = 0 To HEIGHT step 256
         DrawImage3D(BACK,xx-SX,yy-SY))
      Next
   Next
End Function
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

ToeB

BeitragDo, Jul 31, 2008 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber dann wird ja auch nicht das Bild auch nicht getiled wie bei TileImage !

Ich will wissen, wie ich das mahcne kann, das das Bild, wenn es z.b.nach links aus dem Feld "rutscht", das es dann wieder auf 0 gesetzt wird, damit man denkt, man befindet sich auf einer unedlichen ebene...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

TimBo

BeitragDo, Jul 31, 2008 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

sry blicke bei den Variablen nicht so durch, aber ich hätte da eine Idee.
Du musst sie nur noch auf dein Spiel übertragen.

X=X Mod Aufloesung_X

wenn X größer ist als deine X Auflösung (also ausm Bildschirm ist) dann
wird sie an der anderen Seite gemalt. ^^

X = Die Kordinate eines Tiles

Viele Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 31, 2008 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst es auch sehr viel schneller und einfacher mit DrawRect3D machen. Vorraussetzung ist hier aber, dass die Textur alleine - also keine Teilbilder beinhaltet - für sich steht.

Hier ein Beispielcode mit scrolling:

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
CameraClsColor Camera,96,80,64

Include "Includes\Draw3D.bb"
DrawInit3D(Camera)
Origin3D(800,600)

Local Image=LoadImage3D("Data\Image.png",2,2,0)
Local X,Y




While Not KeyHit(1)
   
   DrawRect3D(Image,0,0,MouseX3D,-MouseY3D,800,600)
   
   WaitTimer(Timer)
   RenderWorld
   Clear3D()
   Flip 0
Wend
End


Mit anderen Worten: Die doppelt verschahtelten Schleifen werden überflüssig und man schreibt nur noch:

Code: [AUSKLAPPEN]
DrawRect3D(Image,0,0,XScroll,YScroll,Breite,Höhe)


Es wird also immer nur ein Quad (zwei Triangles) eingezeichnet, der Rest geht dann über UV-Koordination aus der Draw3D.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 31, 2008 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke !!

Das habe ich gesucht Wink

mfg ToeB

Edit : Ich hab nochmal ne Frage :
Bei meinem Programm läuft die Figur jetzt die Ganze zeit mittem im Bildschirm (Pos 0|0). Wie kann ich die Absolute Raumkoordinate anhand der ScrollX und ScrollY Variablen herausfinden ? Also dass ich weiß, an welcher Position der Spieler sich in der MAP befinden würde...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 31, 2008 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
So lange keine Skallierung beim einzeichnen angewendet wird, ist es immer genau entgegengesetzt der Mapposition. Also:

XSpielerPos = -XScroll


Allerdings ist hier die Y-Achse gespiegelt, da die UV-Koordinaten dann wieder wie bei 2D angeordnet sind. Also Y=0 ist Oben und nicht unten wie bei 3D.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 31, 2008 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Also irgentwie stimmt das nicht so ganz :
Code: [AUSKLAPPEN]
;// Schleife :
Repeat
   ;// STEUERUNG:
   If KeyDown(17) Then SYPOS = SYPOS- 1.0*SPEED
   If KeyDown(31) Then SYPOS = SYPOS+ 1.0*SPEED
   If KeyDown(30) Then SXPOS = SXPOS- 1.0*SPEED
   If KeyDown(32) Then SXPOS = SXPOS+ 1.0*SPEED
   ;// MALEN
   TileImage3D()
   DrawImage3D SMILE,0,0,0,0,2 ;Normaler
   DrawImage3D SMILE,xPos()-SXPOS,yPos()-SYPOS,0,0,4 ;Auf der MAP
   WaitTimer( TIMER )
   RenderWorld( )
   Clear3D()
   Text 1,20,"YPOS :"+(Y-SYPOS)+"/"+SYPOS
   Text 1,1,"XPOS :"+(X)+"/"+SXPOS
   Flip
Until KeyHit(1)
;// Schleifen Ende
End ;//Programm Ende

;//FUNCTIONEN :
Function TileImage3D()
   DrawRect3D(BACK,0,0,SXPOS,SYPOS,WIDTH,HEIGHT)
End Function

Function XPos#()
   Local xx# = -SXPOS
   Return xx
End Function

Function YPos#()
   Local yy# = SYPOS
   Return yy
End Function


Was habe ich jetzt wieder falsch verstanden ^^ ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 31, 2008 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Die UV-Koordinaten sind so wie bei 2D auch. Also in der Y-Achse gespiegelt. Daher muß dieses auch so angegeben werden. Beispiel:

DrawRect3D(Back,0,0,SXPos,-SYPos,WIDTH,HEIGHT)

Der Rest sollte wie gehabt sein. Allerdings geht man mit der Taste ''W'' nach Oben und ''S'' nach unten. Daher sollte das hier auch so angegeben werden. Also:

If KeyDown(17) Then SYPos = SYPos + 1.0 * Speed
If KeyDown(31) Then SYPos = SYPos - 1.0 * Speed


- - -

Wenn die Spielerposition in der Mitte von Bildschirm ist, dann hat man doch das Zeil erreicht, da sich ja die Map unter einem bewegt.

- - -

In der Regel werden nur KONSTANTE=1 komplett groß geschrieben.

Variable=1 dagegen ''normal'' bzw. bei (von mir aus) Java ichBin=1, wobei meine Vorzüge eher nach IchBin=1 unter Blitz tendieren.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 31, 2008 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja okay das weiß ich auch.... Soweit war ich ja auch schon nur wenn ich schreibe :
Code: [AUSKLAPPEN]
Function XPos#()
   Local xx# = -SXPOS
   Return xx
End Function

Function YPos#()
   Local yy# = SYPOS
   Return yy
End Function


Und dann
Code: [AUSKLAPPEN]
DrawImage3D SMILE,xPos()-SXPOS,yPos()+SYPOS,0,0,4 ;Auf der MAP


Dann ist das Bild immer doppelt so schnell wie das in der Mitte.... Ich blik net mehr durch Sad

---

Die Varaiblen schreib ich eigl. immer so groß... Kann ich besser mit umgehen...

---

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 31, 2008 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann dir leider nicht 100%ig helfen, da ich nicht genau weiß was du vor hast. Ich gehe aber davon aus, dass du einfach ein Hintergrundbild als 'Map' rumscrollen willst. Auf dieser kann man natürlich weitere Tiles einzeichnen. Ich habe allerdings erstmal ein Beispiel erstellt, wie man so etwas wie ein Paralaxscrolling erstellen kann. Einfach mit dreimal DrawRect3D. Der folgende Code funktioniert von selbst, wenn man ihn in das Verzeichnis rein kopiert, wo auch die Draw3D-Beispieldateien liegen.

Code: [AUSKLAPPEN]
Const WIDTH=800
Const HEIGHT=600

Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
CameraClsColor Camera,80,80,64

Include "Includes\Draw3D.bb"
DrawInit3D(Camera)
Origin3D(WIDTH,HEIGHT)

Local Back=LoadImage3D("Data\Blitz3D.png",2,2,0)
Local Smile=LoadImage3D("Data\Schiff.png",2,2,0)
Local Speed#=5
Local SXPos#=100
Local SYPos#=100
Local Winkel




While Not KeyHit(1)
   Winkel=Winkel+1
   
   If KeyDown(30) Then SXPos = SXPos - 1.0 * Speed
   If KeyDown(32) Then SXPos = SXPos + 1.0 * Speed
   If KeyDown(17) Then SYPos = SYPos + 1.0 * Speed
   If KeyDown(31) Then SYPos = SYPos - 1.0 * Speed
   
   DrawRect3D(Back,0,0,SXPos/4.0,-SYPos/4.0,WIDTH*4,HEIGHT*4,0,0,0.25)
   DrawRect3D(Back,0,0,SXPos/2.0,-SYPos/2.0,WIDTH*2,HEIGHT*2,0,0,0.50)
   DrawRect3D(Back,0,0,SXPos/1.0,-SYPos/1.0,WIDTH*1,HEIGHT*1,0,0,1.00)
   DrawImage3D(Smile,0,0,0,Winkel,1) ;Spieler (AUF DER MAP)
   
   WaitTimer(Timer)
   RenderWorld
   Clear3D()
   
   Text 20,20,"Die tatsächliche Mapposition:"
   Text 20,40,"X = "+SXPos
   Text 20,60,"Y = "+SYPos
   
   Flip 0
Wend
End


Nur so als Tipp:

Die Mapposition vom Player sollte die Zahl sein, die bei der Tastaturabfrage manipuliert wird. Der Rest - wie Mapscrolling - sollte dann entsprechend umgerechnet werden. Somit bleibt die Spielfigur immer in der Mitte vom Bildschirm, da sich aber der Hintergrund bewegt, bewegt sich praktisch auch die Figur auf der Map. Das Umrechnen über DrawRect3D geschieht lediglich mit der Negation der Y-Achse aus der Spieler-Y-Position.

- - -

Weitere Tipps:

Funktionen sind gut, aber nicht zu empfehlen, wenn in diesen nur eine Zeile Code drin steht. Man sollte Funktionen erst dann anwenden, wenn häufig immer wiederkehrende Sachen benötigt werden und entsprechende Anzahl von Codezeilen vorhanden sind. Das gilt nicht, wenn man einen Wrapper schreibt.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 31, 2008 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke erstmal.. Ich stand heute nur so aufem Schlauch... Muss das heiße wetter sein Wink

Ich habe nämlich festgestllt, das meine Functionen richtig waren, ich das nur nicht erkannt habe... Man muss halt manchmal um die Ecke denken Wink

Danke aber das du für mich extra einen Code geschrieben hast !Sehr Nett von dir Wink !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group