Abprallen extrem

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Terror-State

Betreff: Abprallen extrem

BeitragSa, Apr 15, 2006 1:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Yeah endlich mal ein peppiger name xD Ich hab hier ein kleines proggi geschrieben, das an sich eigentlich sehr gut funktioniert.. eigentlich...
denn wenn die spielfigur das hindernis berührt, weiter will und dazu rotiert, schafft man es irgendwie, den körper über die linie zu drehen... erfordert ein klein wenig übung...

ich kann ja bei bedarf mal ein screenshot machen...

meine frage wär einfach wie ich das umgehn kann...
hier mal der code
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,2
Global frametimer = CreateTimer (50)
Global Start,Walt
Global SpielerID = 1
Const max = 50
Const H = 600
Const W = 800
Const ESC=1,Up=200,Down=208,L=203,R=205,Space=57
Dim Kreis#(360,1)
Dim Pos#(4,4)
Dim Shot#(4,5,6)

Dim Feld(20,4)
;Pos und Shots
;Pos(I,1) X
;Pos(I,2) Y
;Pos(I,3) Richtung
;Pos(I,4) Speed

Initialise()

Repeat
WaitTimer (frametimer)
Cls
Keys()
DrawPos(1)
Flip
Until KeyHit(1)


Function Keys()
X=SpielerID
If (KeyDown(Up)+KeyDown(Down)) = 0 Then
If Pos(X,4) > 0 Then Pos(X,4)=Pos(X,4)-1
If Pos(X,4) < 0 Then Pos(X,4)=Pos(X,4)+1
Else
If KeyDown(Up) Then Pos(X,4)=Pos(X,4)+1
If KeyDown(Down) Then
Pos(X,4)=Pos(X,4)-1
EndIf
EndIf
If KeyDown(L) Then Pos(X,3)=Pos(X,3)-1
If KeyDown(R) Then Pos(X,3)=Pos(X,3)+1
If Pos(X,4) >= 15 Then Pos(X,4) = 15
If Pos(X,4) <= -15 Then Pos(X,4) = -15
Pos(X,3) = (Pos(X,3)+60) Mod 60
End Function


Function DrawPos(id)
For m=1 To 20
Color 20,255,20
Rect Feld(m,1)+1,Feld(m,2),Feld(m,3)-1,1
Color 255,20,20
Rect Feld(m,1)+1,Feld(m,2)+Feld(m,4),Feld(m,3)-1,1
Color 20,20,255
Rect Feld(m,1),Feld(m,2)+1,1,Feld(m,4)-1
Color 255,20,255
Rect Feld(m,1)+Feld(m,3),Feld(m,2)+1,1,Feld(m,4)-1
Next
check = 0
m=0
Winkel = (Pos(id,3))*6
If Pos(id,4) <> 0 Then
Repeat
m=m+1
If m<=5 Then
If RectsOverlap (Pos(id,1)-1,Pos(id,2)-1,26,26,Feld(m,1)+1,Feld(m,2),Feld(m,3)-1,1) Then check = 4;Oben
If RectsOverlap (Pos(id,1)-1,Pos(id,2)-1,26,26,Feld(m,1)+1,Feld(m,2)+Feld(m,4),Feld(m,3)-1,1) Then check = 2;Unten
If RectsOverlap (Pos(id,1)-1,Pos(id,2)-1,26,26,Feld(m,1),Feld(m,2)+1,1,Feld(m,4)-1) Then check = 3;Links
If RectsOverlap (Pos(id,1)-1,Pos(id,2)-1,26,26,Feld(m,1)+Feld(m,3),Feld(m,2)+1,1,Feld(m,4)-1) Then check = 1;Rechts
EndIf
Until (check Or m=5)
EndIf

If check Then
Pos(id,1) = Pos(id,1) + (Cos#(Winkel) * -Pos(id,4)/2)
Pos(id,2) = Pos(id,2) + (Sin#(Winkel) * -Pos(id,4)/2)
Pos(id,4) = 0
Else
Pos(id,1) = Pos(id,1) + (Cos#(Winkel) * Pos(id,4)/2)
Pos(id,2) = Pos(id,2) + (Sin#(Winkel) * Pos(id,4)/2)
EndIf

If Pos(id,1) < 0 Then Pos(id,1) = W
If Pos(id,1) > W Then Pos(id,1) = 0
If Pos(id,2) < 0 Then Pos(id,2) = H
If Pos(id,2) > H Then Pos(id,2) = 0

X2 = Pos(id,1)+(25 * Cos#(Winkel))
Y2 = Pos(id,2)+(25 * Sin#(Winkel))

Color 255-(id*50),id*60,200-(id*20)
Oval Pos(id,1),Pos(id,2),24,24,1
Color 0,0,0
Line Pos(id,1)+12,Pos(id,2)+12,X2+12,Y2+12
End Function

Function Initialise()
SetBuffer BackBuffer ()
ClsColor 125,125,125
Color 25,25,25
Start = MilliSecs()
SeedRnd Start

Pos(1,1) = 200
Pos(1,2) = Rnd(100,400)
Pos(1,3) = 0
Pos(1,4) = 0


Feld(1,1) = 100
Feld(1,2) = 50
Feld(1,3) = 50
Feld(1,4) = 450
End Function
Ob friedlich oder militant, wichtig ist der Widerstand

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Apr 15, 2006 3:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Dazu zwei kleine Tipps:

1.) Wenn eine Kollision statt gefunden hat, dann berechne nicht die alte Position, sondern speichere sie noch vor der Änderung ab! Dann kopierst du also die Position zurrück, wo noch keine Kollision statt gefunden hatte. Dies ist deshlalb wichtig, da es zu Rundungsfehlern kommen kann, und manchmal halt zu deinen Ungunsten...

2.) Setze nach einer Kollision auch die Drehposition zurück.

Allerdings werden die beiden Tipps auch nicht 100% aller Fälle abdecken können. Es wird aber schon wesentlich besser sein... Ansonsten, wenn du B3D haben solltest... Da gehts ganz einfach...

Terror-State

BeitragSa, Apr 15, 2006 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
he danke ich glaub das hilft mir wirklich weiter! danke schön!
und eigentlich könnte ich wirklich auf B3D umrüsten...
Ob friedlich oder militant, wichtig ist der Widerstand

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Apr 15, 2006 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal ein 'quick&dirty' Beispiel, für eine mögliche 3D-Anwendung. Die Kollision sollte eventuell noch optimiert werden.
Es simuliert ein Ballverlauf wie bei einem Flipper...

Code: [AUSKLAPPEN]
Graphics3D 800,800,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,0,-10

CameraProjMode camera,2
CameraZoom camera,.05

light=CreateLight()
AmbientLight 120,0,0
RotateEntity light,40,0,0
LightColor light,255,255,0

object1=CreateSphere(24)
RotateEntity object1,0,0,20
PositionEntity object1,8,-3,0
ScaleEntity object1,8,2,2
EntityType object1,2

object2=CreateSphere(24)
RotateEntity object2,0,0,-20
PositionEntity object2,-8,-3,0
ScaleEntity object2,8,2,2
EntityType object2,2

object3=CreateCube()
RotateEntity object3,0,0,26.5
PositionEntity object3,16,-17.5,0
ScaleEntity object3,4,.5,2
EntityType object3,2

object4=CreateCube()
RotateEntity object4,0,0,-26.5
PositionEntity Object4,-16,-17.5,0
ScaleEntity object4,4,.5,2
EntityType object4,2

ball=CreateSphere(24)
PositionEntity ball,1,0,0
EntityType ball,1
ScaleEntity ball,.7,.7,.7
EntityRadius ball,.7

Collisions 1,2,2,2

SeedRnd MilliSecs()
xpa#=0
ypa#=0
xp#=0
yp#=0
xg#=0
yg#=Rnd(.5)




While Not KeyHit(1)
 xpa=xp
 ypa=yp
 yg=yg-0.004
 xg=xg/1.002
 yg=yg/1.002
 xp=xp+xg
 yp=yp+yg

 col=0
 If xp<-20 xp=xp+40:col=1
 If xp>+20 xp=xp-40:col=1
 If yp<-20 yp=yp+40:col=1
 If yp>+20 yp=yp-40:col=1

 TurnEntity object1,0,0,-.08
 TurnEntity object2,0,0,+.08

 UpdateWorld

 If CountCollisions(ball)>0 Then
  nx#=CollisionNX(ball,1)
  ny#=CollisionNY(ball,1)
  w1#=ATan2(yg,xg)
  w2#=ATan2(ny,nx)
  w3#=180+(w2*2)-w1
  speed#=Sqr(xg^2+yg^2)
  xg=Cos(w3)*speed/1.2
  yg=Sin(w3)*speed/1.2
  xp=xpa+Cos(w2)*.10
  yp=ypa+Sin(w2)*.10
  yg=yg-0.002
  xg=xg/1.001
  yg=yg/1.001
  xp=xp+xg
  yp=yp+yg
 End If

 If col=1 HideEntity ball Else ShowEntity ball
 PositionEntity ball,xp,yp,0

 RenderWorld
 Flip
Wend
End

EDIT: Code überarbeitet.
 

Liliput

BeitragSo, Dez 03, 2006 7:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man nun keine Schwerkraft haben möchte und eine konstante Ballgeschwindigkeit, was muß man dann ändern? Ich hab schon alles mögliche rumgefummelt, aber ich ralls mal wieder nicht *g* bei mir springt er irgendwie nur noch doller wenn ich etwas änder...

FireballFlame

BeitragSo, Dez 03, 2006 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm ... nach 15 Sekunden Code anschauen würd ich mal spontan sagen ...
du nimmst die Zeilen
Code: [AUSKLAPPEN]
yg=yg-0.004
 xg=xg/1.002
 yg=yg/1.002

raus Wink
Oder?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

Liliput

BeitragSo, Dez 03, 2006 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Embarassed stimmt funktioniert .. danke Smile
(geile smilies lol)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group