3DSprites Flugbahn

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

3DSprites Flugbahn

Beitrag 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 :) .
Ich benutze PureBasic 3.30
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag 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.
Ich benutze PureBasic 3.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag 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: .
Ich benutze PureBasic 3.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag 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...
Ich benutze PureBasic 3.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten