Zu viel vorm Bildschirm gesessen?
Ist zwar schon was länger her ... aber wegen Zeit und auch Lust hats was
länger gedauert ... und wo ich den Code schon hab ^_^
Also hab mal einen funktionsfähigen Code programmiert, der das
Zoomen vernünftig in Echtzeit realisiert. Nen etwas besserer PC ist aber
vorraussetzung
Ganz Fehlerfrei isses aber auch nicht, aber irgend wann muss gut sein
, vielleicht findet von euch ja auch einer ne Lösung
... bei Sprite3DQuality = 1 ists gekachelt -.-
... und wenn die Sprite3D-Breite/-Höhe auf z.b. 1024 gesetzt wird, springt
die Karte bei Zoom 1190% auf 1192% -.- ... vermutlich seh ich den Wald
vor lauter Bäumen nicht
... ExamineMouse() gibt #False zurück bei geringer FPS
Zoomen durch gedrückter rechter Maustaste (auf und ab)
Bewegen auf der Karte durch gedrückter linker Maustaste
MFG PMV
länger gedauert ... und wo ich den Code schon hab ^_^
Also hab mal einen funktionsfähigen Code programmiert, der das
Zoomen vernünftig in Echtzeit realisiert. Nen etwas besserer PC ist aber
vorraussetzung
Ganz Fehlerfrei isses aber auch nicht, aber irgend wann muss gut sein
, vielleicht findet von euch ja auch einer ne Lösung
... bei Sprite3DQuality = 1 ists gekachelt -.-
... und wenn die Sprite3D-Breite/-Höhe auf z.b. 1024 gesetzt wird, springt
die Karte bei Zoom 1190% auf 1192% -.- ... vermutlich seh ich den Wald
vor lauter Bäumen nicht
... ExamineMouse() gibt #False zurück bei geringer FPS
Zoomen durch gedrückter rechter Maustaste (auf und ab)
Bewegen auf der Karte durch gedrückter linker Maustaste
Code: Alles auswählen
; © 2007 by PMV
EnableExplicit
;Startkoordinaten der Map
#StartX = 000
#StartY = 000
;Angabe des Pfades zu den Sprites
;[iii] ist Platzhalter für die Grafiken bei 001 - 400 (mit führenden Nullen)
;[i] ist Platzhalter für die Grafiken bei 1 - 400 (ohne führende Nullen)
#Path = "Pic\[iii].png"
;Quialität der Sprite3D (AA) ein oder aus
#Sprite3DQuality = 0 ;eingeschalet
;größe der genutzten Tiles
;da Sprite3D genutzt wird, sollte Breite und Höhe gleich sein und ein Wert aus 2^X.
#Sprite3DWidth = 2048
#Sprite3DHeight = 2048
;extreme der Zoom-Möglichkeiten
#MaxZoom = 1276
#MinZoom = 5
;Auflösung
#ScreenWidth = 1024
#ScreenHeight = 768
;Tilegröße der Origniale
#OTileWidth = 500
#OTileHeight = 500
Global Dim Tile.l(19, 19)
Global Dim MapSprite.l(1,1)
Global Dim MapSprite3D.l(1,1)
Structure TileNumber
Width.l
Height.l
EndStructure
Global TileNumber.TileNumber
Global PosX.f, PosY.f
Global TileWidth.l, TileHeight.l ;aktuelle größe der Tiles in Pixel
Global Zoom.l ;aktuelle Zoomfaktor in Prozent
Global MapX.l, MapY.l ;Koordinaten der Map
; ------------------------------------
;Map darf nicht übertrehten werden
Macro CheckMapCoordinates()
If TileWidth * TileNumber\Width - MapX * 100 / Zoom < #ScreenWidth
MapX = (TileWidth * TileNumber\Width - #ScreenWidth) * Zoom / 100 / 2
EndIf
If TileHeight * TileNumber\Height - MapY * 100 / Zoom < #ScreenHeight
MapY = TileNumber\Height * TileHeight * Zoom / 100 - #ScreenHeight * Zoom / 100
EndIf
If MapX < 0
If TileWidth * TileNumber\Width < #ScreenWidth
MapX = (TileWidth * TileNumber\Width - #ScreenWidth) * Zoom / 100 / 2
Else
MapX = 0
EndIf
EndIf
If MapY < 0 : MapY = 0 : EndIf
EndMacro
; -------------------------------------
;zeichnet die 3 Ladebalken und den aktuellen Status
Procedure DisplayState(load.l, create.f, free.l, Text$)
Protected y.l
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Default)
Box(#ScreenWidth/2 - 103, #ScreenHeight/2 - 36, 206, 22, RGB(113, 2, 0))
Box(#ScreenWidth/2 - 100, #ScreenHeight/2 - 32, load/2, 14, RGB(162, 3, 0))
Box(#ScreenWidth/2 - 103, #ScreenHeight/2 - 11, 206, 22, RGB(54, 115, 61))
Box(#ScreenWidth/2 - 100, #ScreenHeight/2 - 7, create*200, 14, RGB(80, 169, 90))
Box(#ScreenWidth/2 - 103, #ScreenHeight/2 + 14, 206, 22, RGB(130, 130, 0))
Box(#ScreenWidth/2 - 100, #ScreenHeight/2 + 18, free/2, 14, RGB(186, 186, 0))
DrawingMode(#PB_2DDrawing_Transparent | #PB_2DDrawing_XOr)
If free < 400 : y = 25 : EndIf
If create < 1 : y = 0 : EndIf
If load < 400 : y = - 25 : EndIf
DrawText(#ScreenWidth/2 - TextWidth(Text$)/2, #ScreenHeight/2 - TextHeight(Text$)/2 + y, Text$, $f0f0f0f0)
StopDrawing()
FlipBuffers(0)
EndProcedure
; --------------------------------------
;zeichnet die angegebene Szene ausgehend von den Originaltiles auf den aktuellen Buffer
Procedure DisplayTileScene(X, Y, Width, Height)
Protected TileX.l, TileY.l, DisplayX.l, DisplayY.l
x = -x
y = -y
TileX = Abs(Int(X / #OTileWidth))
TileY = Abs(Int(Y / #OTileHeight))
For DisplayX = X % #OTileWidth To Width-1 Step #OTileWidth
For DisplayY = Y % #OTileHeight To Height-1 Step #OTileHeight
If TileX >= 0 And TileX < 20 And TileY >= 0 And TileY < 20
DisplaySprite(Tile(TileX, TileY), DisplayX, DisplayY)
Else
Break
EndIf
TileY + 1
Next
TileY = Abs(Int(Y / #OTileHeight))
TileX + 1
Next
EndProcedure
; ---------------------------
;lädt die Grafiken aus den Bilddateien
Procedure InitMap()
Protected x.l, y.l, i.l, Path$
ClearScreen(0)
FlipBuffers()
ClearScreen(0)
For i = 0 To 399
ExamineKeyboard()
If KeyboardPushed(#PB_Key_All) <> #False : End : EndIf
If FindString(#Path, "[iii]", 1)
Path$ = ReplaceString(#Path, "[iii]", RSet(Str(i+1), 3, "0"))
Else
Path$ = ReplaceString(#Path, "[i]", Str(i))
EndIf
Tile(x, y) = LoadSprite(#PB_Any, Path$ , #PB_Sprite_Memory)
If Not Tile(x, y)
CloseScreen()
MessageRequester("Error", "Can't load sprite " + Path$ + "!")
End
EndIf
x + 1
If x >= 20 : y + 1 : x = 0 : EndIf
DisplayState(i+1, 0, 0, "load original tiles ... " + StrF((i+1) / 4, 0) + "%")
Next
TileNumber\Width = Round(#OTileWidth * 20 / #Sprite3DWidth, 1)
TileNumber\Height = Round(#OTileHeight * 20 / #Sprite3DHeight, 1)
Dim MapSprite(TileNumber\Width, TileNumber\Height)
Dim MapSprite3D(TileNumber\Width, TileNumber\Height)
TileWidth = #Sprite3DWidth
TileHeight = #Sprite3DHeight
Zoom = 100
EndProcedure
;erstellt die neuen Tiles mit den gewünschten Größen
Procedure CreateMap()
Protected x.l, y.l, i.l, Text$, PixX.l, PixY.l, State.f
ClearScreen(0)
FlipBuffers()
ClearScreen(0)
For x = 0 To TileNumber\Width - 1
For y = 0 To TileNumber\Height - 1
ExamineKeyboard()
If KeyboardPushed(#PB_Key_All) <> #False : End : EndIf
MapSprite(x, y) = CreateSprite(#PB_Any, #Sprite3DWidth, #Sprite3DHeight, #PB_Sprite_Texture)
If Not MapSprite(X, Y)
CloseScreen()
MessageRequester("Error", "Can't create sprite number" + Str(i+1) + "!")
End
EndIf
TransparentSpriteColor(MapSprite(x, y), RGB(255,0,255))
UseBuffer(MapSprite(x, y))
DisplayTileScene(x * #Sprite3DWidth, Y * #Sprite3DHeight, #Sprite3DWidth, #Sprite3DHeight)
MapSprite3D(x, y) = CreateSprite3D(#PB_Any, MapSprite(x, y))
If Not IsSprite3D(MapSprite3D(x, y))
CloseScreen()
MessageRequester("Error", "Can't create sprite3d number " + Str(i+1) + "!")
End
EndIf
State = (x*TileNumber\Width+y+1)/(TileNumber\Width*TileNumber\Height)
DisplayState(400, State, 0, "create new tiles ... " + StrF((State) * 100, 0) + "%")
Next
Next
EndProcedure
; gibt die am anfang geladenen Tiles wieder frei
Procedure FreeTempData()
Protected X.l, Y.l, i.l, Text$
For i = 0 To 399
FreeSprite(Tile(x, y))
x + 1
If x >= 20 : y + 1 : x = 0 : EndIf
DisplayState(400, 1, i+1, "free old tiles ... " + StrF((i+1) / 4, 0) + "%")
Next
EndProcedure
; ------------------------------------------
;zeichnet die angegebene Szene auf den aktuellen Buffer
Procedure DisplayMap(X, Y, Width, Height)
Protected TileX.l, TileY.l, DisplayX.l, DisplayY.l
Protected MoveX.l
If X < -#ScreenWidth
;MoveX = Int((-X) / #ScreenWidth) * #ScreenWidth * 100 / Zoom
EndIf
X * 100 / Zoom
Y * 100 / Zoom
TileX = Abs(Int(X / TileWidth))
TileY = Abs(Int(Y / TileHeight))
Start3D()
DisplayX = -X % TileWidth
Repeat ;For DisplayX = X % #TileWidth To Width-1 Step #TileWidth
DisplayY = -Y % TileHeight
Repeat ;For DisplayY = Y % #TileHeight To Height-1 Step #TileHeight
If TileX < TileNumber\Width And TileY < TileNumber\Height
DisplaySprite3D(MapSprite3D(TileX, TileY), MoveX + DisplayX, DisplayY)
EndIf
TileY + 1
DisplayY + TileHeight
Until DisplayY >= Height - 1
TileY = Abs(Int(Y / TileHeight))
TileX + 1
DisplayX + TileWidth
Until DisplayX >= Width-1
Stop3D()
EndProcedure
; ---------------------------
Procedure ZoomMap(Zoom.l)
Protected x.l, y.l, Width.l, Height.l
If Zoom <= 0 Or Zoom > #MaxZoom
ProcedureReturn #False
EndIf
TileWidth = 100 * #Sprite3DWidth / Zoom
TileHeight = 100 * #Sprite3DHeight / Zoom
For x = 0 To TileNumber\Width - 1
For y = 0 To TileNumber\Height - 1
ZoomSprite3D(MapSprite3D(X, Y), TileWidth, TileHeight)
Next
Next
ProcedureReturn #True
EndProcedure
Procedure Init()
InitSprite()
InitSprite3D()
Sprite3DQuality(#Sprite3DQuality)
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
If Not OpenScreen(#ScreenWidth, #ScreenHeight, 32, "")
MessageRequester("Error", "Can't open screen! (" + Str(#ScreenWidth) + " X " + Str(#ScreenHeight))
End
EndIf
InitMap()
CreateMap()
FreeTempData()
Zoom = 1000
ZoomMap(Zoom)
MapX = #StartX
MapY = #StartY
CheckMapCoordinates()
EndProcedure
;-Programmstart
Define RelativZoom.l
Define ButtonStateLeft.l, tempZoom.l, ZoomStart.l, X.l, Y.l
Define ButtonStateRight.l
Define.l MouseX, MouseY, OldMouseX, OldMouseY, tempMapX, tempMapY, tempX, tempY
Define FPS.l, FPSCounter.l, FPSTimer.l, LoopTime.l, Timer.l
Init()
Repeat
If Not ExamineMouse()
;bei hoher PC-Auslastung (geringer FPS) funktioniert ExamineMouse() nicht richtig
Beep_(1000, 100)
EndIf
;Zoom per gedrückter linker Maustaste
If MouseButton(#PB_MouseButton_Left)
If ButtonStateLeft
Zoom = tempZoom + (MouseY() - ZoomStart) * 2
MapX = tempX + (tempZoom - Zoom) * #ScreenWidth/200
MapY = tempY + (tempZoom - Zoom) * #ScreenHeight/200
If Zoom < #MinZoom : Zoom = #MinZoom : EndIf
If Zoom > #MaxZoom : Zoom = #MaxZoom : EndIf
CheckMapCoordinates()
ZoomMap(Zoom)
ClearScreen(0)
Else
tempZoom = Zoom
tempX = MapX
tempY = MapY
ZoomStart = MouseY()
ButtonStateLeft = 1
EndIf
ElseIf ButtonStateLeft
ButtonStateLeft = 0
TempZoom = 0
tempX = 0
tempY = 0
ZoomStart = 0
EndIf
; ---------------------------
If MouseButton(#PB_MouseButton_Right)
If ButtonStateRight = 0
MouseX = MouseX()
MouseY = MouseY()
ButtonStateRight = 1
tempMapX = MapX
tempMapY = MapY
EndIf
If OldMouseX <> MouseX() Or OldMouseY <> MouseY()
MapX = tempMapX - (MouseX() - MouseX) * Zoom / 100
MapY = tempMapY - (MouseY() - MouseY) * Zoom / 100
EndIf
OldMouseX = MouseX()
OldMouseY = MouseY()
CheckMapCoordinates()
ElseIf ButtonStateRight
ButtonStateRight = 0
EndIf
If TileWidth * TileNumber\Width - MapX * 100 / Zoom < #ScreenWidth
ClearScreen(0)
EndIf
;Karte anzeigen
DisplayMap(MapX, MapY, #ScreenWidth, #ScreenHeight);, #ScreenWidth * Zoom, #ScreenHeight * Zoom)
FPSCounter + 1
If ElapsedMilliseconds() >= FPSTimer + 1000 : FPS = FPSCounter : FPSCounter = 0 : FPSTimer = ElapsedMilliseconds() : EndIf
;GUI
StartDrawing(ScreenOutput())
DrawingMode(0)
DrawText(5, 5, "FPS: " + Str(FPS), $ffffff, 0)
DrawText(75, 5, "Zoom: " + Str(Zoom) + " %", $ffffff, 0)
DrawText(190, 5, "Sprites: " + Str(TileNumber\Width) + " x " + Str(TileNumber\Height), $ffffff, 0)
DrawText(300, 5, "MapX/MapY: " + Str(MapX) + " / " + Str(MapY), $ffffff, 0)
DrawText(600, 5, "MouseRight: " + Str(ButtonStateRight), $ffffff, 0)
Circle(MouseX(), MouseY(), 2, $FFFFFF)
StopDrawing()
FlipBuffers()
;Zeitberechnung
LoopTime = ElapsedMilliseconds() - Timer
Timer = ElapsedMilliseconds()
;Tastatur, per Any-Key aus dem ganzen raus gehen
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_All) <> #False
End
-
- Beiträge: 630
- Registriert: 05.05.2005 19:06
so nen proggi das eine pixelwelt downloadet habe ich auch shcon mal gecodet, nur bei dieser seite:
http://oink.elrellano.com/casa.php
die aber allerdings gerade offline ist, wenn man das casa allerdings wegnimmt und in der navi auf pixel geht, sieht man eine kleines bildchen
das ging dort (265x256 ca.) um 24x24 bilder... also
0-0
0-1
...
1-0
1-1
...
24-24
so. das war leicht zu downloadne und ich konnte es auch gut anzeigen. aber etwas steht fest: für so eine pixelwelt, muss man schon ziemlich viel freizeit haben!
Gruss
PMTheQuick
http://oink.elrellano.com/casa.php
die aber allerdings gerade offline ist, wenn man das casa allerdings wegnimmt und in der navi auf pixel geht, sieht man eine kleines bildchen
das ging dort (265x256 ca.) um 24x24 bilder... also
0-0
0-1
...
1-0
1-1
...
24-24
so. das war leicht zu downloadne und ich konnte es auch gut anzeigen. aber etwas steht fest: für so eine pixelwelt, muss man schon ziemlich viel freizeit haben!
Gruss
PMTheQuick
- zoidberg
- Beiträge: 219
- Registriert: 06.12.2004 23:15
- Computerausstattung: Acer 6530
Mit Ubuntu 9.04 64 Bit als Hauptsystem und
Windows Vista 32Bit Home Premium zum spielen. - Wohnort: GM
- Kontaktdaten:
Ich hab auch mal was in Iso Ansicht gepixelt. Nur ein Haus, aber es ist unser Haus (wo ich wohne).
Das steht jetzt in Iso City.
http://www.kennethfejer.com/isocity/
und so sieht es aus:
Iso finde ich auch voll cool.
Gruß, Steffen
Das steht jetzt in Iso City.
http://www.kennethfejer.com/isocity/
und so sieht es aus:
Iso finde ich auch voll cool.
Gruß, Steffen
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: Zu viel vorm Bildschirm gesessen?
Hatte damals da so einige Stunden mit stöbern verbracht und wollte mal wieder in Erinnerungen schwelgen.
Weiß zufällig jemand, ob's die Bilddateien noch irgendwo online gibt ... oder ... hat die evtl. noch jemand auf seiner Platte?
Weiß zufällig jemand, ob's die Bilddateien noch irgendwo online gibt ... oder ... hat die evtl. noch jemand auf seiner Platte?
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: Zu viel vorm Bildschirm gesessen?
Super klasse ... vielen lieben Dank.#NULL hat geschrieben:Viel Spaß
Das Ding ist einfach super ... da kann man stöbern bis zum Abwinken.
Kaum vorzustellen, wie viele Stunden, Wochen, Monate der an dem Bild gesessen haben muss.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)