Seite 1 von 1

sprites bei verschiedenen Richtungen

Verfasst: 23.06.2006 23:55
von obbba
Wie kann ich hier die Variable bild.b abhängig von der Richtung, in die sich der Kreis hinbewegt, ändern?

Code: Alles auswählen

InitSprite()
InitMouse()
OpenScreen(1024,768,16,"gehzucursertest")

Structure pos
 x.w
 y.w
EndStructure

Global s.pos ,bild.b

;###################################
;{ sprites #########################


#Od=1
#NOd=2
#Nd=3
#NWd=4
#Wd=5
#SWd=6
#Sd=7
#SOd=8

CreateSprite(#Od,30,30)
CreateSprite(#NOd,30,30)
CreateSprite(#Nd,30,30)
CreateSprite(#NWd,30,30)
CreateSprite(#Wd,30,30)
CreateSprite(#SWd,30,30)
CreateSprite(#Sd,30,30)
CreateSprite(#SOd,30,30)

StartDrawing(SpriteOutput(#Nd))
 Circle(15,15,15,RGB(100,20,200))
 Box(10,0,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#NOd))
 Circle(15,15,15,RGB(100,20,200))
 Box(20,0,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#Od))
 Circle(15,15,15,RGB(100,20,200))
 Box(20,10,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#SOd))
 Circle(15,15,15,RGB(100,20,200))
 Box(20,20,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#Sd))
 Circle(15,15,15,RGB(100,20,200))
 Box(10,20,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#SWd))
 Circle(15,15,15,RGB(100,20,200))
 Box(0,20,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#Wd))
 Circle(15,15,15,RGB(100,20,200))
 Box(0,10,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#NWd))
 Circle(15,15,15,RGB(100,20,200))
 Box(0,0,10,10,RGB(200,200,50))
StopDrawing();}
;###################################

s\x=500
s\y=300

speed=5

MouseLocate(100,200)
lmx=s\x
lmy=s\y
bild=#Sd


Procedure schleifendauer(delaytime)
 passedtime=ElapsedMilliseconds()-starttime
 If passedtime < delaytime
  Delay(delaytime-passedtime)
 EndIf
 starttime=ElapsedMilliseconds()
EndProcedure


Repeat
 schleifendauer(100)
 
 ExamineMouse()
 my=MouseY()
 mx=MouseX()
  
 dx=lmx-s\x
 dy=lmy-s\y
  
 abstand=Sqr(Pow(dx,2)+Pow(dy,2))
  
 faktor=abstand/speed
 
 If faktor>0
  s\x=s\x+dx/faktor
  s\y=s\y+dy/faktor
 EndIf
  
 If MouseButton(1)
  lmx=mx
  lmy=my
  
  ;##########################
  ;##########################
  ;##########################
  ; bild=???  { atan(by/bx) ?? }
  ;##########################
  ;##########################
  ;##########################
  
 EndIf
 
 ClearScreen(0,50,20)
 

 
 DisplayTransparentSprite(bild,s\x-SpriteWidth(bild)/2,s\y-SpriteHeight(bild)/2)
 StartDrawing(ScreenOutput())
  Box(mx,my,20,20,RGB(240,10,30))
 StopDrawing()
 FlipBuffers()
 
Until MouseButton(2)

End

Verfasst: 24.06.2006 06:30
von #NULL
ich hab den winkel berechnet und aus jedem achtel der vollen umdrehung resultiert dann einer der acht bild-werte.

Code: Alles auswählen


alpha.f ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NEW


InitSprite()
InitMouse()
OpenScreen(1024,768,16,"gehzucursertest")

Structure pos
 x.w
 y.w
EndStructure

Global s.pos ,bild.b

;###################################
;{ sprites #########################


#Od=1
#NOd=2
#Nd=3
#NWd=4
#Wd=5
#SWd=6
#Sd=7
#SOd=8

CreateSprite(#Od,30,30)
CreateSprite(#NOd,30,30)
CreateSprite(#Nd,30,30)
CreateSprite(#NWd,30,30)
CreateSprite(#Wd,30,30)
CreateSprite(#SWd,30,30)
CreateSprite(#Sd,30,30)
CreateSprite(#SOd,30,30)

StartDrawing(SpriteOutput(#Nd))
 Circle(15,15,15,RGB(100,20,200))
 Box(10,0,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#NOd))
 Circle(15,15,15,RGB(100,20,200))
 Box(20,0,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#Od))
 Circle(15,15,15,RGB(100,20,200))
 Box(20,10,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#SOd))
 Circle(15,15,15,RGB(100,20,200))
 Box(20,20,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#Sd))
 Circle(15,15,15,RGB(100,20,200))
 Box(10,20,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#SWd))
 Circle(15,15,15,RGB(100,20,200))
 Box(0,20,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#Wd))
 Circle(15,15,15,RGB(100,20,200))
 Box(0,10,10,10,RGB(200,200,50))
StopDrawing()

StartDrawing(SpriteOutput(#NWd))
 Circle(15,15,15,RGB(100,20,200))
 Box(0,0,10,10,RGB(200,200,50))
StopDrawing();}
;###################################

s\x=500
s\y=300

speed=3

MouseLocate(100,200)
lmx=s\x
lmy=s\y
bild=#Sd


Procedure schleifendauer(delaytime)
 passedtime=ElapsedMilliseconds()-starttime
 If passedtime < delaytime
  Delay(delaytime-passedtime)
 EndIf
 starttime=ElapsedMilliseconds()
EndProcedure


Repeat
 schleifendauer(100)
 
 ExamineMouse()
 my=MouseY()
 mx=MouseX()
 
 dx=lmx-s\x
 dy=lmy-s\y
 
 abstand=Sqr(Pow(dx,2)+Pow(dy,2))
 
 faktor=abstand/speed
 
 If faktor>0
  s\x=s\x+dx/faktor
  s\y=s\y+dy/faktor
 EndIf
 
 If MouseButton(1)
  lmx=mx
  lmy=my
 
  ;##########################
  ;##########################
  ;##########################
  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NEW
  ;hab nur mal eben die variablen ersetzt, weil ich so einen code schon da hatte
  xd=dx
  yd=-dy
  
  If xd>0 And yd>0 : alpha=         ATan(Abs(yd)/Abs(xd)) : EndIf
  If xd>0 And yd<0 : alpha= 2*#PI - ATan(Abs(yd)/Abs(xd)) : EndIf
  If xd<0 And yd>0 : alpha=   #PI - ATan(Abs(yd)/Abs(xd)) : EndIf
  If xd<0 And yd<0 : alpha=   #PI + ATan(Abs(yd)/Abs(xd)) : EndIf
  
  If xd=0 And yd>0 : alpha=   #PI*0.5 : EndIf
  If xd=0 And yd<0 : alpha=   #PI*1.5 : EndIf
  
  grad=(alpha*180.0/#PI) ;alpha ist in rad / im bogenmass
  bild = 1+ (grad+23) / (360/8)
  If bild=9 : bild=1 : EndIf
  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NEW
  ;##########################
  ;##########################
  ;##########################
 
 EndIf
 
 ClearScreen( RGB(0,50,20) )
  
  StartDrawing( ScreenOutput() )
  DrawText(10,50, "dx "+Str(dx) )
  DrawText(10,70, "dy "+Str(dy) )
  DrawText(10,90, "alpha "+StrF(alpha) )
  DrawText(10,110, "grad "+Str(grad) )
  DrawText(10,130, "bild "+Str(bild) )
  StopDrawing()
 
  If bild>8 : Delay(3000) : EndIf

 
 DisplayTransparentSprite(bild,s\x-SpriteWidth(bild)/2,s\y-SpriteHeight(bild)/2)
 StartDrawing(ScreenOutput())
  Box(mx,my,20,20,RGB(240,10,30))
 StopDrawing()
 FlipBuffers()
 
Until MouseButton(2)

End
die winkel-sachen sind hier übrigens noch mal ausführlicher erklärt:
http://www.purebasic.fr/german/viewtopi ... ght=#98124

Verfasst: 24.06.2006 19:17
von obbba
danke.