[b3d] Progress Disk

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ZaP

Betreff: [b3d] Progress Disk

BeitragMo, Feb 28, 2011 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800, 600, 32, 2
SetBuffer BackBuffer()


Type ProgressDisk
Field mesh
Field surface
Field max#, value#
End Type

; init zeug

Local cam = CreateCamera()
MoveEntity cam, 0.0, 3.0, 0.0
TurnEntity cam, 90.0, 0.0, 0.0


AmbientLight 255, 255, 255

Local d.ProgressDisk = CreateProgressDisc(100, 15, 0, LoadBrush("YOUR_TEXTURE_HERE.png", 2))
Local d2.ProgressDisk = CreateProgressDisc(1.0, 0.0)

MoveEntity d\mesh, -1.5, 0.0, 0.0
MoveEntity d2\mesh, 1.5, 0.0, 0.0

Local wire = False

; detail
; je kleiner, desto mehr detail, 10 ist aber völlig ausreichend
; = wie viel grad deckt ein dreieck der disk ab
Const diskdetail# = 10.0

Repeat

WireFrame wire
If KeyHit(17) Then wire = 1 - wire

; disk 1 ist tastengesteuert
If KeyDown(2) Then SetProgressDiskValue(d, d\value# - 0.25)
If KeyDown(3) Then SetProgressDiskValue(d, d\value# + 0.25)

; disk 2 ändert sich von selbst
SetProgressDiskValue(d2, Abs(Sin(MilliSecs() / 100.0)))

RenderWorld

Text 20, 20, "Linke disk: " + d\value#
Text 20, 40, "Rechte disk: " + d2\value#

Text 20, GraphicsHeight() - 80, "W: Wireframe umschalten"
Text 20, GraphicsHeight() - 60, "1: Wert der linken disk verringern"
Text 20, GraphicsHeight() - 40, "2: Wert der linken disk vergrößern"

Flip

Until KeyHit(1)


Function CreateProgressDisc.ProgressDisk(max#, initialvalue#, parent = 0, brush = 0)

Local d.ProgressDisk = New ProgressDisk

d\value# = initialvalue#
d\max# = max#

; ein mesh + surface wird für jede disk erstellt
; wahlweise kann hier ein bereits vorhandenes surface verwendet werden
; allerdings müssen dann die vertexkoordinaten angepasst werden
d\mesh = CreateMesh(parent)
d\surface = CreateSurface(d\mesh, brush)

SetProgressDiskValue(d, d\value#)

Return d

End Function


Function SetProgressDiskValue(d.ProgressDisk, value#)

ClearSurface d\surface, True, True

d\value# = value#
If d\value# > d\max# Then d\value# = d\max#
If d\value# < 0.0 Then d\value# = 0.0

Local i# = 0.0
Local n = 0

; mittleren + vertex auf 12 uhr erstellen
AddVertex(d\surface, 0.0, 0.0, 0.0, 0.5, 0.5)
AddVertex(d\surface, 0.0, 0.0, 1.0, 0.5, 1.0)

; alle 'diskdetail' grad ein vertex erstellen und ein
; dreieck mit dem mittleren vertex (0), dem letzten vertex
; und dem aktuellen vertex bilden
For i# = diskdetail# To (d\value# / d\max# * 360.0) Step diskdetail#
n = AddVertex(d\surface, Sin(i#), 0.0, Cos(i#), 0.5 + Sin(i#) / 2.0, 0.5 + Cos(i#) / 2.0)
AddTriangle(d\surface, 0, n - 1, n)
Next

; ein weiteres vertex an der genauen position des wertes der disk
; erstellen, und wieder ein dreieck bilden
; kann auskommentiert werden, aber so ist die disk 'weicher'
n = AddVertex(d\surface, Sin(d\value# / d\max# * 360.0), 0.0, Cos(d\value# / d\max# * 360.0), 0.5 + Sin(d\value# / d\max# * 360.0) / 2.0, 0.5 + Cos(d\value# / d\max# * 360.0) / 2.0)
AddTriangle(d\surface, 0, n - 1, n)

End Function


End


(3D) Progress Disk

Ja hallöchen, hier mal ein Code-Snippet, was ich Teilenswert finde, es handelt sich dabei um eine Progress Disk. Das ist so etwas wie eine Progress Bar, nur eben in Scheibenform:

user posted image

Was kann man damit machen? Angenommen, man sitzt an einem 3D echtzeit RTS, dann kann man damit z.B. den Baufortschritt bei bestimmten Einheiten anzeigen:

user posted image
Anmerkung: Das runde Ding ist durch einen Exporter verwurstet worden, und wurde noch nicht ersetzt, das Teil daneben ist halbtransparent mit alpha-channel und wird deswegen falsch gerendert.

Der Code ist Kommentiert und sollte gut verständlich sein, wenn nicht, gibt es ja noch den Thread hier zum Fragen.
Hoffe jemand kann das gebrauchen, runde Fortschrittsindikatoren sind ja seit einiger Zeit nun sehr viel beliebter als Balken Wink

~ZaP
Starfare: Worklog, Website (download)
  • Zuletzt bearbeitet von ZaP am Mi, März 09, 2011 13:41, insgesamt einmal bearbeitet

ozzi789

BeitragMi, März 09, 2011 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicherlich mal brauchbar, thx
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group