Wie erstellt man ein Rollierendes Karussell-Menü? [gelöst]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Ecoman68

Betreff: Wie erstellt man ein Rollierendes Karussell-Menü? [gelöst]

BeitragSo, Dez 16, 2007 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich möchte gerne für mein Game ein rollierendes Karusell-Menü, wie zum Beispiel in Singstar oder Ultrastar erstellen.

Es geht mit hierbei hauptsachlich um die Drehung und die Scalierung der Grafiken.

Kann mir hierbei bitte jemand auf die Sprünge helfen? Laughing

Vielen Dank schon mal!

Cu,
Ecoman68 Twisted Evil
  • Zuletzt bearbeitet von Ecoman68 am Mo, Dez 17, 2007 19:23, insgesamt einmal bearbeitet

The_Nici

BeitragSo, Dez 16, 2007 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Echtzeitrotation und Skalierung geht gut mit Sprites, das sind 2D-Bildchen in einer 3D-Welt. Siehe dazu die Sprite-Befehle unter Blitzbase.

Loadsprite()
Rotatesprite()
Scalesprite()

PSY

BeitragSo, Dez 16, 2007 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Und natürlich sin() und cos() Surprised

ToeB

BeitragSo, Dez 16, 2007 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
So in etwa :
Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()


Dim t$(5)  ;Anzahl der Menü einträge

For i = 1 To 5
Read t(i)
Next

Global Font = LoadFont("Arial",30,0,0,0)
Global BigFont = LoadFont("Arial",50,1,0,0)

SetFont Font

Global Menu = 1
Global winkel

Repeat
If KeyHit(203) Then winkel = winkel - 1
If KeyHit(205) Then winkel = winkel + 1
For i = 1 To 5
Text 400+Cos((winkel+i)*(360/5)+90)*300,300+Sin((winkel+i)*(360/5)+90)*300,T(i),1,1
Next
Flip
Cls
Until KeyHit(1)
End


.Menu_Eintraege
Data "Spiel starten"
Data "Multiplayer"
Data "Highscore"
Data "Optionen"
Data "Beenden"


Wink

mfg Crack93
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!

Ecoman68

BeitragSo, Dez 16, 2007 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

vielen Dank erst einmal für die schnellen Antworten. Razz

Der Tipp mit den Sprites bringt mich schon weiter, denk ich mal - hatte zuerst an Cubes gedacht.

@Crack93: Nicht ganz, denn die Rotation soll eigentlich über die Z-Achse erfolgen, so daß man das vorderste Menübild horizontal zentriert am größten und die (im gedachten Kreis) dahinter liegenden entsprechend kleiner scaliert sieht. Vielen Dank für Deine Mühe! Wink

Cu,
Ecoman68 Twisted Evil

PSY

BeitragSo, Dez 16, 2007 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
kannst auch "flache" cubes nehmen, die methode ist wesentlich schneller. wobei beim menü brauchste eh nicht viel fps...

peacemaker

BeitragSo, Dez 16, 2007 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, oder gleich die geniale Draw3D-Lib benutzen (siehe Codearchiv), wobei die anderen Methoden ja auch gut sind.

MfG
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/

SpionAtom

BeitragSo, Dez 16, 2007 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Rollmenü... Kommt mir bekannt vor (Help of Monkey Island)

Hab mal den Code angepasst.

mx, my - Mitelpunkt von Menü
mr - Radius vom Menü
mv - Verhältnis vom Kreis (bei 1 ist es ein normaler Kreis, bei kleineren Werten kommt der 3d-Effekt)

Edit: Fehlerchen beseitigt... Embarassed
Code: [AUSKLAPPEN]
;Rollmenü
;von SpionAtom Dezember 2oo7

Const xr = 640, yr = 480, fps = 60

   Global mx = xr / 2
   Global my = yr / 2
   Global mr = yr / 2
   Global mv# = 0.1
   
   Const items = 8
   Global mItem$[items]
         mItem[0] = "Start"
         mItem[1] = "Laden"   
         mItem[2] = "Speichern"
         mItem[3] = "Hilfe"
         mItem[4] = "Highscore"
         mItem[5] = "Website"
         mItem[6] = "Credits"
         mItem[7] = "Ende"
         
   Dim Obj(2 * items)   
   Global oN ;Anzahl Objekte im Rad (max. 30)
   Global oI ;Radposition

   oN = items  ;Anzahl Objekte im Rad (max. 30)         

Graphics xr, yr, 0, 3: SetBuffer BackBuffer()
fps_timer = CreateTimer(fps)


   Global fontsRes = 20
   Dim fonts(fontsRes)
   For i = 0 To fontsRes: fonts(i) = LoadFont("Arial", 10 + i * 2): Next


   turnanim = 0
   turndir = 0
   FlushKeys()   
   
   
   ;Spielschleife
   Repeat

      ;Eingaben
      If KeyDown(203) And turnanim = 0 Then turnanim = 1: turndir = -1
      If KeyDown(205) And turnanim = 0 Then turnanim = 1: turndir = 1
      If KeyHit(1) Then End      


      If turnanim = 1 Then
         turnanim = 2
         s# = 360 / oN / 5
         t = 0
      End If
      If turnanim = 2 Then
         If t < 360 / oN - s Then
            s = s * 0.9: If s < 5 Then s = 5
            t = t + s
         Else
            ;Rad um eine Position drehen
            If turndir = -1 Then oI = oI + 1: If oI > oN - 1 Then oI = 0
            If turndir = 1 Then oI = oI - 1: If oI < 0 Then oI = oN - 1
            turnanim = 0
            turndir = 0
         End If
      End If
      
      
      ;Ausgaben
      Cls
      For i = oN / 2  + 1 To oN
         xx = mx - Sin(360 / oN*(i-1) + (t * turndir)) * mr
         yy = my + Cos(360 / oN*(i-1) + (t * turndir)) * mr * mv
         ;Oval xx - 3, yy - 3, 6, 6
         txt$ = mItem[(oI + i - 1) Mod (items)]
         fnt = fonts(Int((Cos(360 / oN*(i-1) + (t * turndir)) * fontsRes + fontsRes) / 2))
         SetFont fnt
         Color 55, 155, 255:   Rect xx - StringWidth(txt$) / 2 - 3, yy - StringHeight(txt$) / 2 - 3, StringWidth(txt$) + 6, StringHeight(txt$) + 6
         Color 0, 0, 255: Rect xx - StringWidth(txt$) / 2 - 3, yy - StringHeight(txt$) / 2 - 3, StringWidth(txt$) + 6, StringHeight(txt$) + 6, 0
         Color 255, 255, 255: Text xx - StringWidth(txt$) / 2, yy - StringHeight(txt$) / 2, txt$
      Next
      For i = oN / 2 To 1 Step -1
         xx = mx - Sin(360 / oN*(i-1) + (t * turndir)) * mr
         yy = my + Cos(360 / oN*(i-1) + (t * turndir)) * mr * mv
         ;Oval xx - 3, yy - 3, 6, 6
         txt$ = mItem[(oI + i - 1) Mod (items)]
         fnt = fonts(Int((Cos(360 / oN*(i-1) + (t * turndir)) * fontsRes + fontsRes) / 2))
         SetFont fnt
         Color 55, 155, 255:   Rect xx - StringWidth(txt$) / 2 - 3, yy - StringHeight(txt$) / 2 - 3, StringWidth(txt$) + 6, StringHeight(txt$) + 6
         Color 0, 0, 255: Rect xx - StringWidth(txt$) / 2 - 3, yy - StringHeight(txt$) / 2 - 3, StringWidth(txt$) + 6, StringHeight(txt$) + 6, 0
         Color 255, 255, 255
         If i = 1 And turnanim = 0 Then Color 255, 255, 0: Rect xx - StringWidth(txt$) / 2 - 3, yy - StringHeight(txt$) / 2 - 3, StringWidth(txt$) + 6, StringHeight(txt$) + 6, 0
         Text xx - StringWidth(txt$) / 2, yy - StringHeight(txt$) / 2, txt$

      Next

      Flip(0)
      WaitTimer fps_timer
   Until ende = 1
   End


(Ist noch nicht reif fürs Codearchiv, da es noch nicht so konfortabel einbindbar ist.)
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
  • Zuletzt bearbeitet von SpionAtom am So, Dez 16, 2007 20:23, insgesamt 3-mal bearbeitet

ToeB

BeitragSo, Dez 16, 2007 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht ja wie 3D aus Shocked

Geil ^^

mfg Crack93
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!

PSY

BeitragSo, Dez 16, 2007 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
machts doch nicht so kompliziert, wozu haben wir 3D Wink

Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2

texture=createtexture (64,64)
RotateTexture texture,180
SetBuffer TextureBuffer(texture)
Text 10,20,"BLUBB"
TextureBlend texture,3

SetBuffer BackBuffer()

Dim cube(6)

pivot = createpivot()
cam = createcamera()
PositionEntity cam,0,-10,-2
TurnEntity cam,-90,0,0

angle%=0

For i=1 To 6
      cube(i)=createcube(pivot)
      ScaleEntity cube(i),1,.01,1
      EntityColor cube(i),rand(255),rand(255),rand(255)
      EntityTexture cube(i),texture
Next     

For i=1 To 6
      PositionEntity cube(i),sin(60.0 * i)*5,cos(60.0 * i )*5 , 0
Next

Repeat
      If KeyDown(205) Then angle=(angle+5) Mod 360
      If KeyDown(203) Then angle=(angle-5) Mod 360
      RotateEntity pivot,0,0,angle
      For i=1 To 6
            AlignToVector cube(i),0,-10,0,2
      Next
      RenderWorld()
      Text 10,10,"USE ARROW KEYS TO ROTATE CUBES"
      Flip
Until KeyHit(1)


l8er,
PSY

Ecoman68

BeitragMo, Dez 17, 2007 2:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute,

Ihr habt echt coole Codes gepostet. Mr. Green

Ich habe den Code von PSY aufgrund der Kürze gewählt und ihn noch etwas erweitert, damit die Menüpunkte "einrasten" und die CPU nicht so beansprucht wird.

Der vollständigkeithalber poste ich ihn hier, falls jemand auch noch sowas braucht:

Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,2

texture=CreateTexture (64,64)
RotateTexture texture,180
SetBuffer TextureBuffer(texture)
Text 32,32,"Danke!",True,True
TextureBlend texture,3

SetBuffer BackBuffer()

Dim cube(9)

pivot=CreatePivot()
cam=CreateCamera()
PositionEntity cam,0,-13,0
TurnEntity cam,-90,0,0
CameraClsColor cam,255,255,255

angle%=20
anglediff%=0
anglestep%=0

pause=CreateTimer(60)

For i=1 To 9
  cube(i)=CreateCube(pivot)
  ScaleEntity cube(i),1,.01,1
  EntityColor cube(i),Rand(255),Rand(255),Rand(255)
  EntityTexture cube(i),texture
Next     

For i=1 To 9
  PositionEntity cube(i),Sin(40.0 * i)*8,Cos(40.0 * i )*8 , 0
Next

RotateEntity pivot,0,0,angle

For i=1 To 9
  AlignToVector cube(i),0,-10,0,2
Next

RenderWorld()
Flip

;*** Hauptschleife ***
Repeat
  If KeyDown(205) Then anglediff=40

  If KeyDown(203) Then anglediff=-40

  If anglediff<>0 Then
    If anglediff<0 Then
      anglestep=-5
    Else
      anglestep=5
    EndIf

    While anglediff<>0
      anglediff=anglediff-anglestep
      angle=(angle+anglestep) Mod 360

      RotateEntity pivot,0,0,angle

      For i=1 To 9
        AlignToVector cube(i),0,-10,0,2
      Next

      RenderWorld()
      Flip
    Wend
  EndIf

  WaitTimer(pause)
Until KeyHit(1)

End


Nochmals vielen Dank an PSY, SpionAtom und Crack93! Razz

Cu,
Ecoman68 Twisted Evil

SpionAtom

BeitragMo, Dez 17, 2007 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Die 3D-Variante hätte ich meiner auch bevorzugt. Ich wollt halt nur mal aufzeigen, dass es auch ohne geht. Und wer kein 3D hat, kann immer doch auf meinem aufbauen Very Happy

Edit:
Code verkürzt, keine globalen Variablen mehr drin (bis auf das Dim-feld für die Schrift)
Code: [AUSKLAPPEN]
;Rollmenü
;von SpionAtom Dezember 2oo7
Const xr = 640, yr = 480, fps = 60
Graphics xr, yr, 0, 3: SetBuffer BackBuffer()
fps_timer = CreateTimer(fps)

;>>>>>>>>>> Menüeigenschaften und Menüpunkte <<<<<<<<<<
   mx = xr / 2
   my = yr / 2
   mr = yr / 2
   mv# = 0.1
   
   items = 8
   Local mItem$[7]
         mItem[0] = "Spiel starten"
         mItem[1] = "Laden"
         mItem[2] = "Speichern"
         mItem[3] = "Hilfe"
         mItem[4] = "Highscore"
         mItem[5] = "Website"
         mItem[6] = "Credits"
         mItem[7] = "Beenden"

   ;Schrift
   fontsRes = 20
   Dim fonts(fontsRes)
   For i = 0 To fontsRes: fonts(i) = LoadFont("Arial", 10 + i * 2): Next


;>>>>>>>>>> Programmablauf <<<<<<<<<<
   turnanim = 0
   turndir = 0
   pos = 0
   steps# = 360 / items / 5
     
   Repeat
      ;Eingaben
      If KeyDown(203) And turnanim = 0 Then turnanim = 1: t = 0: turndir = -1
      If KeyDown(205) And turnanim = 0 Then turnanim = 1: t = 0: turndir = 1
      If KeyHit(1) Then End
     
      ;Drehung
      If turnanim = 1 Then
         If t < 360 / items - s Then
            steps = steps * 0.9: If steps < 5 Then steps = 5
            t = t + steps
         Else
            pos = (items + pos - turndir) Mod items
            turnanim = 0
            turndir = 0
         End If
      End If     
     
      ;Ausgaben
      Cls      
      i1 = (items - 1) / 2 + 1
      i2 = (items - 1) / 2
      While i2 >= 0
         If i1 < items Then drawItem items, i1, t, turndir, mx, my, mr, mv, pos, fontsRes, mItem[(pos + i1) Mod (items)]
        drawItem items, i2, t, turndir, mx, my, mr, mv, pos, fontsRes, mItem[(pos + i2) Mod (items)]
        i1 = i1 + 1
        i2 = i2 - 1
      Wend
      SetFont fonts(10)
      Text 0, 0, "Gewählt: " + pos
      Flip(0)
      WaitTimer fps_timer
   Forever

Function drawItem(items, i, t, td, mx, my, mr, mv#, pos, fr, txt$)
        x = mx - Sin(360 / items * i + (t * td)) * mr
         y = my + Cos(360 / items * i + (t * td)) * mr * mv
         SetFont fonts(Int((Cos(360 / items * i + (t * td)) * fr + fr) / 2))
        sw = StringWidth(txt$)
        sh = StringHeight(txt$)
         Color 55, 155, 255:  Rect x - sw / 2 - 3, y - sh / 2 - 3, sw + 6, sh + 6
         Color 0, 0, 255:     Rect x - sw / 2 - 3, y - sh / 2 - 3, sw + 6, sh + 6, 0
         Color 255, 255, 255: Text x - sw / 2, y - sh / 2, txt$
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

jonas1996

BeitragMi, Mai 13, 2009 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Eure Codes sind super!!! Laughing
Ich habe zwar 3D , finde aber das 2D Karussel besser!
Die anderen beiden sind aber auch gut.
Mfg jonas1996
iLive4myLive.de.tl
programmieren123.de.tl

the FR3AK

BeitragMi, Mai 13, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Rolling Eyes
 

aletes

BeitragMi, Mai 13, 2009 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
abgesehen davon, dass der thread schon vor 1 1/2 jahren abgelaufen ist, jonas1996

Nicdel

BeitragMi, Mai 13, 2009 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt fast immer irgendeinen, der die alten Threads wieder rausholt... Confused
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group