Drehzahlmesser - wie wird das am elegantesten gelöst??

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Kommt drauf an in welche Richtung (RotateSprite3D() :wink: )
Benutzeravatar
Ypser
XMas-Contest-Gewinner '03
Beiträge: 128
Registriert: 29.08.2004 14:35
Computerausstattung: Win7
Wohnort: Ingelheim
Kontaktdaten:

Beitrag von Ypser »

Ja! hat geschrieben:Wenn man ein 3DSprite um 90° drehen würde, wäre es
nicht sichtbar, weil es keine 3te Dimension hat. Das meinte ich damit..

Wollte nur nicht so weit ausholen ;)
Wie wäre es einfach mit ausprobieren, anstatt hier solchen Schmarrn zu schreiben? 8)
Bild
Benutzeravatar
Ja!
Beiträge: 271
Registriert: 02.01.2006 16:13
Wohnort: Stuttgart

Beitrag von Ja! »

Ach kommt schon, Ihr wisst doch was ich meine!
Stellt Euch nicht so dumm, wie ich aussehe! ähh ja..
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Ich dachte hier geht es darum einen Forumbenutzer bei seinem Problem zu helfen??? :o
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Ja!
Beiträge: 271
Registriert: 02.01.2006 16:13
Wohnort: Stuttgart

Beitrag von Ja! »

roherter hat geschrieben:Ich dachte hier geht es darum einen Forumbenutzer bei seinem Problem zu helfen??? :o
Das ist so, als ob Du von 10 Menschen, die an einem
Tisch sitzen, verlangen würdest, daß alle über das gleiche Thema reden,
ohne abzuschweifen.

Außerdem ist es doch nicht schlimm, wenn man in einem Thread gleich mehrere Probleme/Fragen behandeln kann.
Dem Fragesteller wurde ja auch schon zur genüge geholfen, denke ich.

..und nichts für ungut, ist nicht böse gemeint :)
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

schon ne lösung gefunden?

Beitrag von hiltwin »

also, ich würde den anaclox-code von wichtel nehmen ...

Code: Alles auswählen

; Variablen und Konstanten initialisieren

#version="(c) oppi 2003, V1.70"
#appname="ANACLOX"
#ininame="anaclox.ini"

Global width, height, winx, winy
Global box.l,s, PI2.f, PI.f, xm, ym, radius
Global tickcol.l, seccol.l, mincol.l, hcol.l, backcol.l, boxcol.l, jewcol.l, txtcol.l 
Global tid.l, info$, font.l,s.l,os.l
Global flags.l

PI2=ATan(1)*8
PI=ATan(1)*4

Structure xy
  xa.l
  ya.l
  xe.l
  ye.l
  xb.l
  yb.l
  xc.l
  yc.l
  xf.l
  yf.l
EndStructure

Dim ticks.xy(60)
Dim secs.xy(60)
Dim mins.xy(60)
Dim hrs.xy(60)
Dim M$(12)
M$(1)="JAN"
M$(2)="FEB"
M$(3)="MAR"
M$(4)="APR"
M$(5)="MAY"
M$(6)="JUN"
M$(7)="JUL"
M$(8)="AUG"
M$(9)="SEP"
M$(10)="OCT"
M$(11)="NOV"
M$(12)="DEZ"



;- GUI Konstanten

#win=0
#clock=0

#set=0
#OnTop=0
#ShowDay=1
#ShowMonth=2
#ShowYear=3
#ShowInfo=4
#setInfo=5
#default=8
#ver=9
#quit=10

#seccol=11
#mincol=12
#hrscol=13
#jewcol=14
#txtcol=15
#backcol=16
#boxcol=17
#tickcol=18


LoadImage(1,"hinter.bmp")

Procedure LoadPrefs(ininame.s)
  OpenPreferences(ininame)
  info$  =ReadPreferenceString("info",#version)
  width  =ReadPreferenceLong("width",300)  
  height =ReadPreferenceLong("height",300)  
  winx   =ReadPreferenceLong("winx",GetSystemMetrics_(#SM_CXSCREEN)/2-width/2) 
  winy   =ReadPreferenceLong("winy",GetSystemMetrics_(#SM_CYSCREEN)/2-height/2)
  boxcol =ReadPreferenceLong("boxcol",$FFFFFF)
  backcol=ReadPreferenceLong("backcol",$FFFFFF)
  tickcol=ReadPreferenceLong("tickcol",$AAAAAA)
  jewcol =ReadPreferenceLong("jewcol",$00FFFF)
  seccol =ReadPreferenceLong("seccol",$0000FF)
  mincol =ReadPreferenceLong("mincol",$00FF00)
  hcol   =ReadPreferenceLong("hcol",$FF0000)
  txtcol =ReadPreferenceLong("txtcol",$111111)
  flags  =ReadPreferenceLong("flags",1+2+16)
  ClosePreferences()
EndProcedure

Procedure savePrefs(ininame.s)
  CreatePreferences(ininame)
  WritePreferenceString("info",info$)
  WritePreferenceLong("width",WindowWidth())  
  WritePreferenceLong("height",WindowHeight())  
  WritePreferenceLong("winx",WindowX()) 
  WritePreferenceLong("winy",WindowY())
  WritePreferenceLong("boxcol",boxcol)
  WritePreferenceLong("backcol",backcol)
  WritePreferenceLong("tickcol",tickcol)
  WritePreferenceLong("jewcol",jewcol)
  WritePreferenceLong("seccol",seccol)
  WritePreferenceLong("mincol",mincol)
  WritePreferenceLong("hcol",hcol)
  WritePreferenceLong("txtcol",txtcol)
  WritePreferenceLong("flags",flags)
  ClosePreferences()
EndProcedure

Procedure resetPrefs(ininame.s)
  CreatePreferences(ininame)
  ClosePreferences()
  LoadPrefs(ininame)  
EndProcedure

Procedure DrawClock()
  xm=WindowWidth()/2 : ym=WindowHeight()/2
  If ym<xm : radius=ym*0.98 : Else : radius=xm*0.98 : EndIf 
  font = LoadFont(0, "comic sans ms", radius*0.06) 
  ;- Koordinaten berechnen
  a.f=PI2 : t=0
  While a >= 0
   ticks(t)\xa=Sin(a+PI)*(radius*0.91)+xm
   ticks(t)\ya=Cos(a+PI)*(radius*0.91)+ym
   ticks(t)\xb=Sin(a+PI+PI/40)*(radius*0.89)+xm
   ticks(t)\yb=Cos(a+PI+PI/40)*(radius*0.89)+ym
   ticks(t)\xc=Sin(a+PI-PI/40)*(radius*0.89)+xm
   ticks(t)\yc=Cos(a+PI-PI/40)*(radius*0.89)+ym
   ticks(t)\xf=Sin(a+PI)*(radius*0.89)+xm
   ticks(t)\yf=Cos(a+PI)*(radius*0.89)+ym
   ticks(t)\xe=Sin(a+PI)*(radius*0.87)+xm
   ticks(t)\ye=Cos(a+PI)*(radius*0.87)+ym

   secs(t)\xa=Sin(a+PI)*(radius*0.10)+xm
   secs(t)\ya=Cos(a+PI)*(radius*0.10)+ym
   secs(t)\xe=Sin(a+PI)*(radius*0.84)+xm
   secs(t)\ye=Cos(a+PI)*(radius*0.84)+ym
   secs(t)\xf=Sin(a+PI)*(radius*0.75)+xm
   secs(t)\yf=Cos(a+PI)*(radius*0.75)+ym

   mins(t)\xa=Sin(a+PI)*(radius*0.10)+xm
   mins(t)\ya=Cos(a+PI)*(radius*0.10)+ym
   mins(t)\xb=Sin(a+PI+PI/40)*(radius*0.60)+xm
   mins(t)\yb=Cos(a+PI+PI/40)*(radius*0.60)+ym
   mins(t)\xc=Sin(a+PI-PI/40)*(radius*0.60)+xm
   mins(t)\yc=Cos(a+PI-PI/40)*(radius*0.60)+ym
   mins(t)\xf=Sin(a+PI)*(radius*0.60)+xm
   mins(t)\yf=Cos(a+PI)*(radius*0.60)+ym
   mins(t)\xe=Sin(a+PI)*(radius*0.80)+xm
   mins(t)\ye=Cos(a+PI)*(radius*0.80)+ym

   hrs(t)\xa=Sin(a+PI)*(radius*0.10)+xm
   hrs(t)\ya=Cos(a+PI)*(radius*0.10)+ym
   hrs(t)\xb=Sin(a+PI+PI/20)*(radius*0.50)+xm
   hrs(t)\yb=Cos(a+PI+PI/20)*(radius*0.50)+ym
   hrs(t)\xc=Sin(a+PI-PI/20)*(radius*0.50)+xm
   hrs(t)\yc=Cos(a+PI-PI/20)*(radius*0.50)+ym
   hrs(t)\xf=Sin(a+PI)*(radius*0.50)+xm
   hrs(t)\yf=Cos(a+PI)*(radius*0.50)+ym
   hrs(t)\xe=Sin(a+PI)*(radius*0.70)+xm
   hrs(t)\ye=Cos(a+PI)*(radius*0.70)+ym

   a-PI2/60
   t+1
  Wend

  ;- Ziffernblatt
  box = CreateImage(0, 2*xm,2*ym) 
  box = CopyImage(1,0)
  StartDrawing(ImageOutput()) 
;  Box(0, 0,2*xm, 2*ym,boxcol) 
  DrawingMode(4)

  Circle(xm,ym,radius,tickcol)
  Circle(xm,ym,radius*0.95,backcol)
  DrawingMode(0)
  Circle(xm,ym,radius*0.09,tickcol)
  FillArea(xm+radius-2,ym,backcol,tickcol)
  For t=0 To 59
    If t=0 Or t=15 Or t=30 Or t=45
      LineXY(ticks(t)\xa,ticks(t)\ya,ticks(t)\xb,ticks(t)\yb,tickcol)
      LineXY(ticks(t)\xb,ticks(t)\yb,ticks(t)\xe,ticks(t)\ye,tickcol)
      LineXY(ticks(t)\xe,ticks(t)\ye,ticks(t)\xc,ticks(t)\yc,tickcol)
      LineXY(ticks(t)\xc,ticks(t)\yc,ticks(t)\xa,ticks(t)\ya,tickcol)
      FillArea(ticks(t)\xf,ticks(t)\yf,tickcol,jewcol) 
    ElseIf t=5 Or t=10 Or t=20 Or t=25 Or t=35 Or t=40 Or t=50 Or t=55
      Circle(ticks(t)\xf,ticks(t)\yf,radius*0.02,jewcol)
      DrawingMode(4)
      Circle(ticks(t)\xf,ticks(t)\yf,radius*0.02,tickcol)
      DrawingMode(0)
    Else
     LineXY(ticks(t)\xa,ticks(t)\ya,ticks(t)\xe,ticks(t)\ye,tickcol)
    EndIf 
  Next
  StopDrawing()
  CopyImage(0,2)
EndProcedure

Procedure tick(value.l)
  Repeat
    s=Second(Date())
    If s<>os
      m=Minute(Date())
      h=Hour(Date())
      If h > 12 : h=h-12 : EndIf
      h=h*5+m/12
      If h > 60 : h=h-60 : EndIf
      d$=""
      
      UseImage(0)
      StartDrawing(ImageOutput()) 
      DrawImage(UseImage(2),0,0)
      DrawingMode(4)

      Circle(xm,ym,radius*0.85,backcol)
      Circle(xm,ym,radius*0.09,tickcol)
      DrawingMode(1)
      If flags&16
        FrontColor(Red(txtcol),Green(txtcol),Blue(txtcol))
        BackColor(Red(backcol),Green(backcol),Blue(backcol))
        DrawingFont(font)
        l=TextLength(info$)
        Locate(xm-l/2,ym+radius*0.40)
        DrawText(info$)
      EndIf

  
      If flags&2 : d$=Str(Day(Date())) : EndIf
      If flags&2 And flags&4 : d$=" "+d$ : EndIf
      If flags&4 : d$=M$( Month(Date() ))+d$ : EndIf
      If (flags&2 Or flags&4) And flags&8 : d$+", " : EndIf
      If flags&8 : d$+Str(Year(Date())) : EndIf


      If d$
        DrawingFont(font)
        dl=TextLength(d$)
        dh=TextLength("Mx")
        Box(xm-dl/2*1.5,ym-radius*0.62,dl*1.5,dh*1.5,jewcol)
        DrawingMode(4)
        Box(xm-dl/2*1.5,ym-radius*0.62,dl*1.5,dh*1.5,tickcol)

        DrawingMode(0)
        Locate(xm-dl/2,ym-radius*0.60)
        FrontColor(Red(txtcol),Green(txtcol),Blue(txtcol))
        BackColor(Red(jewcol),Green(jewcol),Blue(jewcol))
        DrawText(d$)
      EndIf
      
;       ;- neue Zeiger malen
      LineXY(mins(m)\xa,mins(m)\ya,mins(m)\xb,mins(m)\yb,mincol)
      LineXY(mins(m)\xb,mins(m)\yb,mins(m)\xe,mins(m)\ye,mincol)
      LineXY(mins(m)\xe,mins(m)\ye,mins(m)\xc,mins(m)\yc,mincol)
      LineXY(mins(m)\xc,mins(m)\yc,mins(m)\xa,mins(m)\ya,mincol)
      FillArea(mins(m)\xf,mins(m)\yf,mincol,mincol) 

      LineXY(hrs(h)\xa,hrs(h)\ya,hrs(h)\xb,hrs(h)\yb,hcol)
      LineXY(hrs(h)\xb,hrs(h)\yb,hrs(h)\xe,hrs(h)\ye,hcol)
      LineXY(hrs(h)\xe,hrs(h)\ye,hrs(h)\xc,hrs(h)\yc,hcol)
      LineXY(hrs(h)\xc,hrs(h)\yc,hrs(h)\xa,hrs(h)\ya,hcol)
      FillArea(hrs(h)\xf,hrs(h)\yf,hcol,hcol) 

      LineXY(secs(s)\xa,secs(s)\ya,secs(s)\xe,secs(s)\ye,seccol)
      Circle(secs(s)\xf,secs(s)\yf,radius*0.03,seccol)

 
      StopDrawing()
      
      SetGadgetState(0,box)
      ;SetGadgetState(0,UseImage(2))
      os=s
 ;     Delay(800); ein bischen warten, damit repeat until nicht soviel loopt
    EndIf
    Delay(1)  
  ForEver
EndProcedure

Procedure ToggleOnTop()
  If GetMenuItemState(#set,#OnTop)
    SetWindowPos_(WindowID(),#HWND_TOPMOST,0,0,0,0,#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOSIZE) 
  Else
    SetWindowPos_(WindowID(),#HWND_NOTOPMOST,0,0,0,0,#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOSIZE) 
  EndIf  
EndProcedure


;-main
LoadPrefs(#ininame)
box = CreateImage(0, width,height) 
CopyImage(1,0)


;-create window
OpenWindow(#win,winx,winy,width,height,#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar,#appname)
CreateGadgetList(WindowID(0))
ImageGadget(#clock,0,0,width,height,box)
CreatePopupMenu(#set)
 MenuTitle(#appname+" settings")
 MenuItem(#OnTop,"always on top")
  SetMenuItemState(#set,#OnTop,flags&1) 
  ToggleOnTop()
 MenuItem(#ShowDay,"show day")
  SetMenuItemState(#set,#ShowDay,flags&2)
 MenuItem(#ShowMonth,"show month")
  SetMenuItemState(#set,#ShowMonth,flags&4)
 MenuItem(#ShowYear,"show year")
  SetMenuItemState(#set,#ShowYear,flags&8)
 MenuItem(#ShowInfo,"show info")
  SetMenuItemState(#set,#ShowInfo,flags&16)
 OpenSubMenu("change colors")
  MenuItem(#seccol,"seconds")
  MenuItem(#mincol,"minutes")
  MenuItem(#hrscol,"hours")
  MenuItem(#jewcol,"jewels")
  MenuItem(#txtcol,"text")
  MenuItem(#tickcol,"border")
  MenuItem(#backcol,"background")
  MenuItem(#boxcol,"box")
 CloseSubMenu()
 MenuItem(#setInfo,"change info")
 MenuBar()
 MenuItem(#default,"set defaults")
 MenuBar()
 MenuItem(#quit, "close")
 MenuItem(#ver,#version)
 

  DisableMenuItem(#ver,1)
 
  
;-draw clock
DrawClock()
tid=CreateThread(@tick(),0)
;SetWindowCallback(@SizeCallback())

;event loop
Repeat
  EventID = WaitWindowEvent()
  Select EventID
    Case #PB_Event_SizeWindow
      PauseThread(tid) 
      winx=WindowX() : winy=WindowY() 
      height=WindowHeight() : width=WindowWidth()
      If height<50 : winy-(50-height) : height=50 : EndIf
      If height>600 : height=600 : EndIf
      If width>800 : width=800 : EndIf
      
      MoveWindow(winx,winy) : ResizeWindow(width,height)
      os=s-1 : DrawClock() 
      ResumeThread(tid) 
    
    Case #WM_SIZE 
      ; PauseThread(tid) 
      ; winx=WindowX() : winy=WindowY() 
      ; height=WindowHeight() : width=WindowWidth()
      ; If height<50 : winy-(50-height) : height=50 : EndIf
      ; MoveWindow(winx,winy) : ResizeWindow(width,height)
      ; os=s-1 : DrawClock() 
      ; ResumeThread(tid) 
    Case #WM_RButtonDown 
      popx.l=WindowX()+WindowMouseX()
      popy.l=WindowY()+WindowMouseY()
      DisplayPopupMenu(0,WindowID(0),popx,popy) 
;      Case #PB_EventGadget
;        GadgetID = EventGadgetID()
;        Select GadgetID
;     
;        EndSelect
    Case #PB_EventMenu
      MenuID = EventMenuID()
      Select MenuID
        Case #quit
          
        Case #OnTop
          SetMenuItemState(#set,#OnTop,GetMenuItemState(#set,#OnTop)!1) 
          ToggleOnTop()  
          flags!1
        Case #ShowDay
          SetMenuItemState(#set,#ShowDay,GetMenuItemState(#set,#ShowDay)!1) 
          flags!2
        Case #ShowMonth
          SetMenuItemState(#set,#ShowMonth,GetMenuItemState(#set,#ShowMonth)!1) 
          flags!4
        Case #ShowYear
          SetMenuItemState(#set,#ShowYear,GetMenuItemState(#set,#ShowYear)!1) 
          flags!8
        Case #ShowInfo
          SetMenuItemState(#set,#ShowInfo,GetMenuItemState(#set,#ShowInfo)!1) 
          flags!16
        Case #setInfo
          Repeat
          info$=InputRequester(#appname+" info text edit","your text has: "+Str(Len(info$))+" chars, max. 30 chars are allowed",info$)
          Until Len(info$)<30
          
        Case #default
          resetPrefs(#ininame)  
;          setwindowpos_(WindowID(),#HWND_TOP,winx,winy,width,height,#SWP_SHOWWINDOW) 
          PauseThread(tid)
          MoveWindow(winx,winy) : ResizeWindow(width,height)
          SetMenuItemState(#set,#OnTop,flags&1) 
          SetMenuItemState(#set,#ShowDay,flags&2)
          SetMenuItemState(#set,#ShowMonth,flags&4)
          SetMenuItemState(#set,#ShowYear,flags&8)
          SetMenuItemState(#set,#ShowInfo,flags&16)
          os=s-1 : DrawClock() 
          ResumeThread(tid) 
          ToggleOnTop()
        Case #seccol
          seccol=ColorRequester()
        Case #mincol
          mincol=ColorRequester()
        Case #hrscol
          hcol=ColorRequester()
        Case #jewcol
          jewcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
        Case #txtcol
          txtcol=ColorRequester()
        Case #tickcol
          tickcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
        Case #backcol
          backcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
        Case #boxcol
          boxcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
      EndSelect
  EndSelect
Until EventID = #PB_EventCloseWindow
savePrefs(#ininame)
CloseWindow(0)
dein bild passt du so an, dass es in den hintergrund passt ..

die anaclox.ini datei hat folgenden inhalt:

Code: Alles auswählen

info = www.meineurl.de
width = 500
height = 500
winx = 262
winy = 50
boxcol = 16777215
backcol = 1118481
tickcol = 1118481
jewcol = 65535
seccol = 255
mincol = 16711680
hcol = 16711680
txtcol = 1118481
flags = 26
und dann schaust du dir gut an, wie das ganze funktioniert. das programm eignet sich super zum nachvollziehen und verändern.

du nimmst folgende anpassung vor:

1.) du modifizierst das programm so, dass es nicht mehr die aktuelle zeit nutzt
2.) du schmeisst die beiden zeiger, die du nicht magst, raus
3.) du übergibst, je nach deiner gerade aktuellen U/min, den Wert an die Variable für Deine Uhr
Bsp: Die U/Min 4000 soll auf "2" Uhr oben stehen - so muss die Variable für den Sekundenzeiger den Wert "10" annehmen - ist die U/Min = 0 und die U/Min = 0 soll auf "8 Uhr" stehen, dass musst Du die Variable so belegen, dass sie auf 40 Sekunden steht ...

Viel Spass!
kdeparade
Beiträge: 41
Registriert: 16.01.2006 21:08

Beitrag von kdeparade »

Danke !
da hast Du Dir aber mächtig Mühe gegeben.
Werde es gleich mal testen.
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

ne ...

Beitrag von hiltwin »

... die wirklich ganze arbeit und damit das lob gebührt wichtel - ich hab nur die idee dazu beigesteuert, wie du das ganze für dich nutzbar machen kannst - das war 1 minute nachdenken, 1 minute im script-archiv gucken und eine minute hier posten - kein grosser aufwand

viel erfolg beim drehzahlmesser - falls du probleme hast, wie du das angehen sollst, kannst du dich gerne noch mal melden.
aber wie gesagt - der code eignet sich bestens zum spielen und experimentieren ...
Antworten