Seite 1 von 1

3DSprites Flugbahn

Verfasst: 11.05.2007 21:02
von kreeph
Hallo Leute, ich habe vor kurzem mit 3DSprites herumexperimentiert und auf ein Pinball-ähnliches Programm gekommen. Ich habe einen Sprite, der seine Drehrichtung anpassen soll, wie er auf eine Wand (in meinem Fall der Bildschirmrand) auftrifft. Mein verkürzter Code:

Code: Alles auswählen

InitSprite():InitKeyboard():InitSprite3D():ExamineKeyboard()
OpenScreen(1024, 768, 32, "Vortex Force")
LoadSprite(0, "grün.bmp", #PB_Sprite_Texture)
CreateSprite3D(0,0)
Sprite3DQuality(0):TransparentSpriteColor(0,0,0,0) 
zx0=1:zy0=1:x0=Random(1000):y0=Random(744)

  Repeat
    FlipBuffers():ClearScreen(0,0,0)
Rotationswinkel1+1
If x0<0 And zx0<0:zx0+2:ElseIf x0>1000 And zx0>0:zx0-2:EndIf:x0+zx0*6 
If y0<0 And zy0<0:zy0+2:ElseIf y0>744 And zy0>0:zy0-2:EndIf:y0+zy0*4 

    Start3D()
     DisplaySprite3D(0,x0,y0,255)
    Stop3D()
RotateSprite3D(0,Rotationswinkel1,0)
  Until KeyboardPushed(#PB_Key_Escape)
  End   
Jetzt habe ich das Problem, dass sich der Sprite immer nur in eine Richtung dreht. Wenn er jetzt sagen wir nach rechts-oben auf eine horizontale Wand trifft, soll er sich gegen den Uhrzeigersinn drehen. Ich hoffe, das ist nicht zu kompliziert zu verstehen :D . Und nochwas, wie kann ich per API die Desktopweite und -höhe bestimmen? IN 3.30 scheints das nicht zu geben... Bitte benutzt für Antworten die Variablen in meinem Code, da er vollständig noch länger und komplizierter ist :freak: .
Danke schonmal :) .

Verfasst: 11.05.2007 23:11
von Scarabol
Hallo,

wenn du dein Sprite gegen den Uhrzeigersinn drehen willst dann zieh einfach den Winkel um den gedreht werden soll von 360 ab, also rotatesprite(360-winkel).

Probier mal GetSystemmetrics_(0) = deskopbreite und Getsystemmetrics_(1) = desktophöhe.

Gruß
Scarabol

Verfasst: 12.05.2007 06:33
von kreeph
Naja, danke erstmal. Aber der Ball kann ja auch anders abprallen. Ich hab einfach eine Variable für die Rotation eingebaut, die in jeder Repeatschleife +3 oder sowas bekommt. aber der Ball soll dann nach einer Gesetzmäßigkeit abprallen und seine Rotationsrichtung entsprechend ändern. Ich hoffe ihr versteht mich.

Verfasst: 12.05.2007 12:31
von Kaeru Gaman
für linksrum drehen nimmst du

Code: Alles auswählen

Rotationswinkel1-1 
das sollte eigentlich logisch sein.
außerdem solltest du den rotationswinkel auf 0-359 begrenzen,
also bau am besten noch ein %360 (modulo) ein.

außerdem wäre es bestimmt praktisch, wenn du ihn vor dem display rotieren würdest.

Verfasst: 12.05.2007 13:16
von kreeph
Ok also ihr habt mich wohl flasch verstanden. Ich weiß wie ich rückwärts drehe. Aber wenn z.B. ein Ninja-Stern( :freak: ) sich im Uhrzeigersinn dreht und Nord-Östlich auf eine horizontale Wand auftrifft und in die selbe Richtung weiterdreht, sieht dass einfach blöd aus. Er soll in solch einem Fall seine Drehrichtung gegen den Uhrzeigersinn ändern. Also immer wenn er ,,falsch,, auf eine Wand trifft, Drehrichtung ändern. :coderselixir:
Ich kann leider keine Bilder einfügen, sonst hätte ich das mit Paint verdeutlicht :mrgreen: .

Verfasst: 12.05.2007 14:01
von Kaeru Gaman
also nimmst du für den drehwinkel ne vaviable

Code: Alles auswählen

Rotationswinkel1 + Dreh
die musst du latürnich am anfang definieren

Code: Alles auswählen

Dreh = 1  ; oder 2
und jedesmal wenn es abprallt, negierst du den drehwinkel

Code: Alles auswählen

Dreh = -Dreh

Verfasst: 12.05.2007 15:13
von kreeph
Ja, aber er kann doch auch mal richtig abprallen. Also Uhrzeigersinn Nord-West Horizontale Wand.

edit: Und noch eine Frage: Es geht um einen Fehler in meinem Code:

Code: Alles auswählen

InitSprite():InitKeyboard():InitSprite3D():InitMouse()
OpenScreen(1024, 768, 32, "Vortex Force")
LoadFont(0,"Arial",30)
UseFont(0)

  LoadSprite(0, "grün.bmp", #PB_Sprite_Texture)

  LoadSprite(5, "grau_stern.bmp", #PB_Sprite_Texture)
  For k=0 To 5:CreateSprite3D(k,k):Next
   
  Sprite3DQuality(0):TransparentSpriteColor(0,0,0,0) 
If Random(1)=0:a=-1:Else:a=1:EndIf
zx0=a:zy0=a:x0=500:y0=Random(744)
zx5=1:zy5=1:x5=Random(1000):y5=Random(744)

  Repeat
    FlipBuffers():ClearScreen(0,0,0)
If Ballaus=0
;***********-0-**********************
If x0<115 And ySchlager<y0+50 And ySchlager>y0:zx0+2:ElseIf x0>899 And Schlagery<y0+50 And Schlagery>y0:zx0-2:EndIf:x0+zx0*3 
If y0<0 And zy0<0:zy0+2:ElseIf y0>744 And zy0>0:zy0-2:EndIf:y0+zy0*2 
;***********-1-**********************
If x5<0 And zx5<0:zx5+2:ElseIf x5>977 And zx5>0:zx5-2:EndIf:x5+zx5*8 
If y5<0 And zy5<0:zy5+2:ElseIf y5>720 And zy5>0:zy5-2:EndIf:y5+zy5*6
;************************************
EndIf
If x0>1124:Ballaus=1:ElseIf x0<-100:Ballaus=2:EndIf
StartDrawing(ScreenOutput())
Box(100,YSchlager,10,50,RGB(20,255,20))
Box(914,SchlagerY,10,50,RGB(255,20,20))
StopDrawing()

ExamineMouse():ExamineKeyboard()
ySchlager+MouseDeltaY():SchlagerY+MouseDeltaY()
If ySchlager<0:ySchlager=0:EndIf:If ySchlager>718:ySchlager=718:EndIf
If SchlagerY<0:SchlagerY=0:EndIf:If SchlagerY>718:SchlagerY=718:EndIf
    Start3D()
    
     DisplaySprite3D(0,x0,y0,255)
     DisplaySprite3D(5,x5,y5,195)
    
   Rotationswinkel+3:For k=0 To 5:RotateSprite3D(k,Rotationswinkel,0):Next
    Stop3D()
    
   StartDrawing(ScreenOutput())
      DrawingMode(1):DrawingFont(FontID())
      FrontColor(255,255,255)
      Locate(400,200):If Ballaus=1:DrawText("Grün gewinnt!"):ElseIf ballaus=2:DrawText("Rot gewinnt!"):EndIf 
      StopDrawing()


  Until KeyboardPushed(#PB_Key_Escape)
  End
  
Bei mir geht der Ball einfach manchmal durch die Schläger oder wird extrem schnell und ich weiß nicht warum und wieso...

Verfasst: 12.05.2007 16:44
von Kaeru Gaman
> Ja, aber er kann doch auch mal richtig abprallen. Also Uhrzeigersinn Nord-West Horizontale Wand.
wo ist denn dann das problem?
du musst halt ermitteln, ob er "falsch" oder "richtig" abprallt,
und dementsprechend negierst du die rotation oder nicht.
mehr noch:
du kannst die drehung auch beschleunigen oder abbremsen, je nachdem wie er abprallt,
also du solltest sowieso grundsätzlich mit ner variablen dort arbeiten.

> Bei mir geht der Ball einfach manchmal durch die Schläger oder wird extrem schnell und ich weiß nicht warum und wieso...
die kollision wird nicht richtig bzw. doppelt registriert.
du solltest ein flag setzen, damit eine berührung mit dem schläger wirklich nur 1x registriert wird.
beim "durchgehen" kann es durchaus sein, dass er eine kollision auch 2x registriert, und eben 2x die richtung umgekehrt wird.
wie gesagt, meistens ist so ein "schlägerproblem" von einer mehrfachkollision verursacht.

deinen code hab ich übrigens nich ausprobiert, war zu faul mir sprites zu malen,
zumal auch keine info vorliegt, wie groß die sein sollten....