Seite 1 von 1

Physik ähnlich wie in Enigma programmieren?

Verfasst: 24.05.2007 23:42
von zigapeda
Hi

ich hab mich erst daran versucht ein Spiel ähnlich wie Enigma zu programmiern.

So weit bin ich bis jetzt gekommen aber ich bin nicht zufrieden 1. mit der Fliehkraft und 2. das Abprallen von wänden klappt ja überhaupt nicht oO

Code: Alles auswählen

InitSprite()
InitMouse()
InitKeyboard()

Enumeration
  #map
EndEnumeration

movex.f
movey.f

Dim map(39,29)

ExamineDesktops()

OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"Ball")

Restore level1
CreateSprite(#map,DesktopWidth(0),DesktopHeight(0))
b = DesktopWidth(0) / 40
h = DesktopHeight(0) / 30
StartDrawing(SpriteOutput(#map))
For y = 0 To 29
  For x = 0 To 39
    Read a.b
    map(x,y) = a
    Select a
      Case 0
        Box(x * b, y * h, b, h, $000000)
      Case 1
        Box(x * b, y * h, b, h, $4499BB)
    EndSelect
  Next x
Next y
StopDrawing()


Repeat
  Delay(1)
  ClearScreen($000000)
  TransparentSpriteColor(#map,$000000)
  DisplayTransparentSprite(#map,0,0)
  ExamineKeyboard()
  ExamineMouse()
  

  If MouseDeltaX() <> 0
    movex + MouseDeltaX()
    movex / 2
  Else
    movex / 1.1
  EndIf
  If MouseDeltaY() <> 0
    movey + MouseDeltaY()
    movey / 2
  Else
    movey / 1.1
  EndIf
  ax = Round((x+movex) / b,0)
  ay = Round((y+movey) / h,0)
  If ax >= 0 And ax <= 39 And ay >= 0 And ay <= 29
   If map(ax,ay)
      movex * -1
      movey * -1
    EndIf
  EndIf
  x + movex
  y + movey
  If x < 0
    x = 0
  EndIf
  If y < 0
    y = 0
  EndIf
  If x > DesktopWidth(0)
    x = DesktopWidth(0)
  EndIf
  If y > DesktopHeight(0)
    y = DesktopHeight(0)
  EndIf
  StartDrawing(ScreenOutput())
    DrawText(0,0, Str(movex) + " - " + Str(movey))
    Circle(x, y, 10, $FFFFFF)
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)


DataSection

level1:
Data.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.b 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.b 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1
Data.b 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1
Data.b 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.b 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.b 1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1
Data.b 1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

EndDataSection
Ich hoffe Ihr könnt mir nen paar Tipps geben wie ich das ändern kann^^
Danke schon mal im Vorraus MfG Daniel

Verfasst: 25.05.2007 09:58
von Kaeru Gaman
mit "fliehkraft" meinst du wahrscheinlich die trägheit.

probiers mit anderen faktoren, bzw. vielleicht garnicht mit teilen sondern nur was abziehen.
die idee, um MouseDelta zu erhöhen, ist schonmal ganz gut,
aber auch hier wären vielleicht gewisse faktoren gut,
damit man nicht so kräftig bremsen kann.

grundsätzlich wäre es vielleicht praktisch, wenn du erstmal auf
ner oberfläche komplett ohne map nur die steuerung abstimmst.

wenn ich mich recht entsinne (hab Enigma mal vor längerem gespielt),
kommen ja später auch noch andere untergründe mit unterschiedlicher reibung hinzu.

vielleicht auch einfach mal die physik-formelsammlung auspacken,
und sich die beschleunigte bewegung, die reibung, ggf. auch impuls anschauen.


zum abprallen:
das musst du viel ausführlicher prüfen.
im grunde die koordinaten der kugel viel präziser checken,
und sowie sie auf den Rand eines besetzten nachbarfeldes auftrifft,
den betreffenden bewegungsvektor umkehren.
letzteres tust du ja, du musst halt überarbeiten, wann du das machst.


PS:
achja... und nimm ruhig Doubles. und nicht nur für die bewegung, auch für die Koordinaten und für die beschleunigung.

Verfasst: 25.05.2007 14:38
von Xaby
schau mal hier:
http://www.purebasic.fr/german/viewtopic.php?t=12712 :allright:

Anregung:

http://www.youtube.com/watch?v=x0wzjbscv3E

Versuch es erstmal in einer Richtung ordentlich hinzubekommen.
So wie die Mauszeiger-Beschleunigung unter Windows.

Die Geschwindigkeit ergibt sich aus der Differenz zwischen den Mauskoordinaten der ersten Abfrage und den Mauskoodinaten der darauf folgenden Abfrage(n).

Wenn die Differenz erheblich ist, also die Geschwindigkeit größer, dann setzt du das in deinen Mauszeiger um.

Und du brauchst Reibung, oder irgendwas, dodurch dein Gegenstand, der sich bewegen soll kontinuierlich Geschwindigkeit verliert. Damit er irgendwann aufhört, sich zu bewegen.

:allright:

Verfasst: 25.05.2007 15:57
von Xaby
Nicht ganz so schön wie bei Marble Madness oder Enigma ...
aber das kannst dir ja selbst in Zeile 78 austüfteln, wie du die richtigen Parameter ermittelst. Kannst die ganzen Sachen auch mit floats machen, sieht dann sicherlich noch um einiges geschmeidiger aus.

Code: Alles auswählen

ExamineDesktops() 

InitSprite() ; 
InitKeyboard() 
InitMouse() 

Procedure Ball(*x.Long,*y.Long,*Speedx.Long,*SpeedY.Long,*RX.Long,*RY.Long)
  #Radius=20
   
  If *x\l<#Radius Or *x\l+#Radius> DesktopWidth(0)
    *RX\l*(-1) 
    ; Zur Sicherheit
    If *x\l>200
      *x\l=DesktopWidth(0)-#Radius
    Else
      *x\l=#Radius
    EndIf  
    
  EndIf
  If *y\l<#Radius Or *y\l+#Radius> DesktopHeight(0)
    *RY\l*(-1) 
    ; Zur Sicherheit
    If *y\l>200
      *y\l=DesktopHeight(0)-#Radius
    Else
      *y\l=#Radius
    EndIf  
  EndIf 
  
  *x\l+*Speedx\l**RX\l
  *y\l+*SpeedY\l**RY\l
  If *Speedx\l>0
    *Speedx\l-1
  Else
    *Speedx\l=0
  EndIf  
  If *SpeedY\l>0
    *SpeedY\l-1
  Else
    *SpeedY\l=0
  EndIf
  
   
  Circle(*x\l,*y\l,#Radius,#Red)
  
  
EndProcedure


OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"Ball") 

; Variablen
XPos.l=DesktopWidth(0)/2
YPos.l=DesktopHeight(0)/2
SpeedX_.l=0
SpeedY_.l=0
RY_.l=0
RX_.l=0

Repeat 
  Delay(10) 
  ClearScreen(0) 
  
  ExamineKeyboard() 
  ExamineMouse() 
  
  If Not(MouseDeltaX()=0 And MouseDeltaY()=0)
  If MouseDeltaX()>0
    RX_=1
  Else
    RX_=-1
  EndIf  
  If MouseDeltaY()>0
    RY_=1
  Else
    RY_=-1
  EndIf  
  SpeedY_=10 ; die Geschwindigkeit, die dazu kommt oder abnimmt, muss hier eingetragen werden
  SpeedX_=10
  EndIf 
  
  
  StartDrawing(ScreenOutput())
  Ball(@XPos,@YPos,@SpeedX_,@SpeedY_,@RX_,@RY_)
  
  StopDrawing()
  
  
  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape) 
Zeile 78 hat geschrieben:SpeedY_=10 ; die Geschwindigkeit, die dazu kommt oder abnimmt, muss hier eingetragen werden
Hoffe, es hilft dir und es ist verständlich.
Vielleicht hast in der Zwischenzeit ja schon was hübscheres geschafft.

:allright:

Verfasst: 31.05.2007 10:17
von Xaby
Schau mal im CodeArchive:

Graphics\Sprites&Screen\SpriteCollisions

... Elastic Collision ...

:allright: