kompass/rader

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

biggicekey

Betreff: kompass/rader

BeitragMi, Dez 27, 2006 4:32
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,
hat jemand eine idee wie man einen solchen (siehe bild) kompass umsetzen könnte?
also die berechnung?
habe mir überlegt ein langes bild mit allen buchstaben zu machen und dieses vor dem bildschirm hin und herzuschieben. aber wie bekomme ich die übergänge?

danke schonmal

user posted image
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

TheProgrammer

BeitragMi, Dez 27, 2006 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hatte gerade Langeweile und hab mal was geschrieben. ^^

Code: [AUSKLAPPEN]

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

camera = CreateCamera()

; Kompass
compass_tex = CreateCompassTexture()
hud_tex     = CreateHUDTexture()


hud_sprite     = CreateSprite()
compass_sprite = CreateCompassSprite()

EntityBlend hud_sprite,3
EntityBlend compass_sprite,3

EntityOrder hud_sprite,-1
EntityOrder compass_sprite,-1

EntityFX hud_sprite,1+8
EntityFX compass_sprite,1+8

EntityTexture hud_sprite,hud_tex
EntityTexture compass_sprite,compass_tex

EntityParent hud_sprite,camera
EntityParent compass_sprite,camera

PositionEntity hud_sprite,0,3,5
PositionEntity compass_sprite,0,3,5

ScaleSprite hud_sprite,512*0.005,32*0.005
ScaleEntity compass_sprite,512*0.005,32*0.005,1

; Umgebung
For I = 1 To 100
   sphere = CreateSphere()
   EntityColor sphere,Rand(0,255),Rand(0,255),Rand(0,255)
   
   PositionEntity sphere,Rnd(-20,20),Rnd(-20,20),Rnd(-20,20)
Next

; Licht
light = CreateLight()
RotateEntity light,0,90,0

While Not KeyHit(1)
    RenderWorld

   ; Kamera
   yaw# = yaw# - MouseXSpeed()*0.1
   pitch# = pitch# + MouseYSpeed()*0.1
   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   RotateEntity camera,pitch#,yaw#,0
   
   ; >> Kompass-Texture positionieren <<
   PositionTexture compass_tex,EntityYaw(camera)/360.0,0

   Flip
Wend
ClearWorld
End




Function CreateCompassTexture()

   tex = CreateTexture(2048,32)
   
   SetBuffer TextureBuffer(tex)
      Color 0,255,0
      
      Rect 0,0,2048,1,1
      
      font = LoadFont("Lucida Console",18)
      SetFont font
   
      c=-5
      n=45
      Repeat
         Rect Float(c) * (2048.0/360.0),1,1,7,1
         If c >= 360 Then Exit
         
         Select n
         Case 45
            Text Float(n) * (2048.0/360.0),13,"N",1,0
         Case 135
            Text Float(n) * (2048.0/360.0),13,"O",1,0
         Case 225
            Text Float(n) * (2048.0/360.0),13,"S",1,0
         Case 315
            Text Float(n) * (2048.0/360.0),13,"W",1,0
         End Select
         
         c = c + 10
         n = n + 90
      Forever
      
      FreeFont font
      
   SetBuffer BackBuffer()
   
   Return tex

End Function

Function CreateHUDTexture()

   tex = CreateTexture(512,32)
   
   SetBuffer TextureBuffer(tex)

      Color 0,255,0
      Rect 0,0,1,32
      Rect 511,0,1,32
      Rect 1,0,8,1
      Rect 1,31,8,1
      Rect 503,0,8,1
      Rect 503,31,8,1
      
      For I = 0 To 3
         Line 256-I,0,256,5
         Line 256+I,0,256,5
      Next
      
   SetBuffer BackBuffer()
   
   Return tex

End Function

Function CreateCompassSprite()

   m = CreateMesh()
   s = CreateSurface(m)
   
   AddVertex(s,-1,-1,0,0,1)
   AddVertex(s,1,-1,0,0.25,1)
   AddVertex(s,-1,1,0,0,0)
   AddVertex(s,1,1,0,0.25,0)
   
   AddTriangle(s,0,2,1)
   AddTriangle(s,2,3,1)
   
   UpdateNormals m
   
   Return m

End Function


Du musst einfach nur die Kompass-Texture richtig positionieren. (PositionTexture) Den Winkel des Spielers ermittelst du mit EntityYaw().

Mfg
TheProgrammer
aktuelles Projekt: The last day of human being

5k41

BeitragMi, Dez 27, 2006 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry für die dumme frage, aber sollten Texturen nicht immer quadratisch sein, damit sie nicht extra gestreckt werden müssen?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

biggicekey

BeitragMi, Dez 27, 2006 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr geil TheProgrammer. das ging schnell. vielen dank.
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

TheProgrammer

BeitragMi, Dez 27, 2006 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Texturen müssen nicht immer quadratisch sein. Sie müssen nur Auflösungen von 32, 64, 128, etc. haben. Dabei ist die Breite aber von der Länge unabhängig. Wink
aktuelles Projekt: The last day of human being

5k41

BeitragMi, Dez 27, 2006 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
cool... wieder was dazu gelernt... ist ja eigentlich schon peinlich, dass ich das nicht wusste... trozdem seehhhrr hilfreich!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

StepTiger

BeitragMi, Dez 27, 2006 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
sie müssen nicht quadratisch sein, werden aber von der grafikkarte eh wieder in quadrate konvertiert. Wie dabei die u und v koordinaten sind, das ist der textur vollkommen egal.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

5k41

BeitragMi, Dez 27, 2006 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry für doppelpost, aber hab grad nochmal das ganze in 2D versucht... ist noch nicht ganz perfekt, aber ich muss erstmal los, vielleicht perfektioniere ichs nachher noch!
Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()

HUD     = CreateHUD()
Compass = CreateCompass(HUD)

While Not KeyDown(1)

   If KeyDown(203) Then winkel=(winkel+1) Mod 360
   If KeyDown(205) Then winkel=(winkel-1) Mod 360

   Text 0,0,winkel
   UpdateCompass(HUD,Compass,winkel,400,0)

   Flip
   Cls
Wend
End

Function CreateHUD(width=600,height=50)
   
   Local image = CreateImage(width,height)
   
   SetBuffer ImageBuffer(image)
   
   Color 0,120,0
   Rect 0,0,width,1
   Rect 0,0,1,height   
   Rect width-1,0,1,height
   Color 255,255,255

   SetBuffer BackBuffer()

   Return image

End Function

Function CreateCompass(HUD,segments=10,distance=100)

   Local width    = ImageWidth(HUD)
   Local height   = ImageHeight(HUD)
   Local image    = CreateImage((segments*4+3)*distance,height)

   SetBuffer ImageBuffer(image)

   Color 0,200,0
   
   For i=0 To segments*4+3
   
      Rect i*distance,0,1,height-40
   
      If i=0                          Then Text i*distance-StringWidth("N")/2,height-39,"N"
      If Float(i)/Float(segments)=1   Then Text i*distance-StringWidth("O")/2,height-39,"O"
      If Float(i-1)/Float(segments)=2 Then Text i*distance-StringWidth("S")/2,height-39,"S"
      If Float(i-2)/Float(segments)=3 Then Text i*distance-StringWidth("W")/2,height-39,"W"
      If Float(i-3)/Float(segments)=4 Then Text i*distance-StringWidth("N")/2,height-39,"N"
   
   Next
   
   Color 255,255,255
   
   SetBuffer BackBuffer()
   
   Return image

End Function

Function UpdateCompass(HUD,Compass,winkel,x,y)

   winkel        = winkel Mod 360
   Local width   = ImageWidth(HUD)
   Local height  = ImageHeight(HUD)
   Local width2  = ImageWidth(Compass)
   Local image   = CreateImage(width,height)

   SetBuffer ImageBuffer(image)
   
   TileImage Compass,(width2*(Float(winkel)/Float(360)))+width/2,0   
   DrawImage HUD,0,0

   SetBuffer BackBuffer()
   
   DrawImage image,x-width/2,y
   
   FreeImage image

End Function


MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

snörkl

BeitragMi, Dez 27, 2006 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry cause offtopic, aber

spielst du AA oder hast du einfach nur ein bild in google gefunden?

5k41

BeitragDo, Dez 28, 2006 0:18
Antworten mit Zitat
Benutzer-Profile anzeigen
so, nun nochmal perfekt:
Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()

HUD     = CreateHUD()
Compass = CreateCompass(HUD)

While Not KeyDown(1)
   
   If KeyDown(203) Then winkel=(winkel+1) Mod 360:Delay 50
   If KeyDown(205) Then winkel=(winkel-1) Mod 360:Delay 50
   
   Text 0,0,winkel
   UpdateCompass(HUD,Compass,winkel,400,0)
   
   Flip
   Cls
Wend
End

Function CreateHUD(width=600,height=50)
   
   Local image = CreateImage(width,height)
   
   SetBuffer ImageBuffer(image)
   
   Color 0,120,0
   Rect 0,0,width,1
   Rect 0,0,1,height   
   Rect width-1,0,1,height
   Color 255,255,255

   SetBuffer BackBuffer()

   Return image

End Function

Function CreateCompass(HUD,segments=10,distance=100,fontname$="Dungeon")
   
   Local width    = ImageWidth(HUD)
   Local height   = ImageHeight(HUD)
   Local image    = CreateImage((segments*4+4)*distance,height)
   Local font     = LoadFont(fontname$,height-(height-29))
   SetFont          font

   SetBuffer ImageBuffer(image)
   
   Color 0,200,0
   
   For i=0 To segments*4+4
      
      Rect i*distance,0,1,height-40
      
      If i                             =0 Then
         Rect i*distance-2,0,4,height-30
         Text i*distance-StringWidth("N")/2,height-29,"N"
      ElseIf Float(i-1)/Float(segments)=1 Then
         Rect i*distance-2,0,4,height-30
         Text i*distance-StringWidth("O")/2,height-29,"O"
      ElseIf Float(i-2)/Float(segments)=2 Then
         Rect i*distance-2,0,4,height-30
         Text i*distance-StringWidth("S")/2,height-29,"S"
      ElseIf Float(i-3)/Float(segments)=3 Then
         Rect i*distance-2,0,4,height-30 
         Text i*distance-StringWidth("W")/2,height-29,"W"
      ElseIf Float(i-4)/Float(segments)=4 Then
         Rect i*distance-2,0,4,height-30 
         Text i*distance-StringWidth("N")/2,height-29,"N"
      EndIf
      
   Next
   
   Color 255,255,255
   
   SetBuffer BackBuffer()
   
   FreeFont font
   
   Return image

End Function

Function UpdateCompass(HUD,Compass,winkel,x,y)

   winkel        = winkel Mod 360
   Local width   = ImageWidth(HUD)
   Local height  = ImageHeight(HUD)
   Local width2  = ImageWidth(Compass)
   Local image   = CreateImage(width,height)

   SetBuffer ImageBuffer(image)
   
   TileImage Compass,(width2*(Float(winkel)/Float(360)))+width/2,0
   DrawImage HUD,0,0

   SetBuffer BackBuffer()
   
   DrawImage image,x-width/2,y
   
   FreeImage image

End Function
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

biggicekey

BeitragDo, Dez 28, 2006 5:13
Antworten mit Zitat
Benutzer-Profile anzeigen
snörkl hat Folgendes geschrieben:
sorry cause offtopic, aber

spielst du AA oder hast du einfach nur ein bild in google gefunden?



ich bin aktiver AA Spieler. meinermeinung eines der besten spiele dieser art.
den von mir gezeigten kompass gibt es in der neuer version ja nichtmehr.
trotzdem ein fantastisches spiel.
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

NightPhoenix

BeitragDo, Dez 28, 2006 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry aber...
OFF TOPIC:

Ich Spiele auch Americas Army! Wink
Mal ne Runde zusammen zocken? Very Happy
heiße =BA=Episode-666-
häufiger Unruhestifter auf:
Urban Assault / Pipeline / CSAR / eigentlich alle ^^ aber Urban ist die geilste.
Hast du einen Clan?

MfG.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group