Seite 1 von 2

Basic Ghost

Verfasst: 05.04.2010 20:19
von Marvin133
Dies ist mein aller erstes Jump n Run game nur die levels und gegner sind noch nicht verfügbar, aber trotzdem postet mal eure meinungen dazu.

Bild

Uploaded with ImageShack.us

32 Bit-Version-Download: http://purebasic-projekte.jimdo.com/downloads/

Re: Basic Ghost

Verfasst: 05.04.2010 20:41
von STARGÅTE
könntest du ein ScreenShot machen.

Ich konnte zwar den Code kompilieren, sehe aber kein LEvel ...

Es fehlt zudem eine abfrage des WindowEvent() ... dadurch friert das Fenster ein ...

Re: Basic Ghost

Verfasst: 05.04.2010 20:49
von RSBasic
@STARGÅTE
Hab für ihn jetzt ein Screenshot upgeloadet.

Re: Basic Ghost

Verfasst: 05.04.2010 20:53
von Marvin133
Entschuldige mich für den screenshot. bei mir hat das mit der print screen taste leider nicht geklappt.

Mfg. Marvin133 :)

Re: Basic Ghost

Verfasst: 10.04.2010 13:35
von Marvin133
So hier ist ein neues kleine update des spiels

http://em.q-soft.ch/files/get/4y-6ppfB4 ... -ghost.zip

Re: Basic Ghost

Verfasst: 11.04.2010 10:34
von kswb73
Macht schon einen ganz netten Eindruck. Ich würde die Steine etwas später verschwinden lassen. (vielleicht auch mit zerbrech-Animiation). Ansonsten muss man die Leertaste die ganze Zeit gedrückt halten.
Des weiteren solltest du verhindern das man außerhalb des Bildschirmes springen kann. Das heißt du scrollst entweder die Karte oder du wechselst die Karte immer wenn der Spieler den Rand berührt.

Re: Basic Ghost

Verfasst: 14.05.2010 14:35
von Marvin133

Re: Basic Ghost

Verfasst: 14.05.2010 18:19
von kswb73
Machst schon Fortschritte. Musik ist drin, neue Grafiken und was zum einsammeln.
Hier noch mal ein paar Verbesserungsvorschläge:
  • Mach entweder eine Begrenzung am Rand oder einen Kartenwechseln, sonst kann man einfach sinnlos aus dem Spielfeld springen
  • Man sollte Entweder auf der Röhe landen können oder dahinter, so das man einfach hervorlaufen kann und wie beim normalen Durchgehen an ein Ende gesetzt wird.
  • Mach die Anzeige oben links in die Ecke und nicht so weit davon weg. Außerdem würde ich sie etwas größer machen.
Dafür, dass du noch nicht so lange programmierst macht das ganze schon einen guten Eindruck (wenn ich an meine ersten Spiele denke). Ich jedenfalls drück dir die Daumen das für dein Projekt.

Re: Basic Ghost

Verfasst: 14.05.2010 21:53
von Shadow-Gamer
ganz lustig gemacht^^

ich hatte allerdings das problem, das ich den boden nicht gesehen habe@ Windows 7 1366*768

und man geht immer durch das Rohr auch wenn man mitten drin steht und sich bewegt^^

lg

Re: Basic Ghost

Verfasst: 16.05.2010 10:32
von Josef Sniatecki
Habe ich es doch gewusst... Die Kollisionsabfrage scheitert bei dir :mrgreen:
Springe ich seitlich gegen eine Wand (z.B. die über dem Rohr), dann werde ich an die Decke positioniert, weil anscheinend nur "MoveY" bei der Abfrage unter Betracht genommen wird.

Nach ein wenig Denkarbeit habe ich einen Kollisionsalgorithmus zusammengebastelt, der mir bisher noch nie gemeckert hat:

Code: Alles auswählen

Enumeration 1 ;-> Danke für den Hinweis kswb73
  #Collision_Top ;Auf den Boden geklatscht
  #Collision_Bottom ;An die Decke gesprungen
  #Collision_Left ;Gegen die linke Wand gedonnert
  #Collision_Right ;Gegen die rechte Wand gedonnert
EndEnumeration

Procedure.i Collision(AX.f, AY.f, AWidth.f, AHeight.f, ADX.f, ADY.f, BX.f, BY.f, BWidth.f, BHeight.f)
  ;By Josef Sniatecki
  
  Protected M.f, Y.f
  
  If AX < BX + BWidth And AX + AWidth > BX And AY < BY + BHeight And AY + AHeight > BY
    If ADX > 0
      If ADY > 0
        M = ADY/ADX
        Y = AY - ((AX + AWidth) - BX)*M
        If Y + AHeight > BY
          ProcedureReturn #Collision_Left
        Else
          ProcedureReturn #Collision_Top
        EndIf
      ElseIf ADY < 0
        M = ADY/ADX
        Y = AY - ((AX + AWidth) - BX)*M
        If Y < BY + BHeight
          ProcedureReturn #Collision_Left
        Else
          ProcedureReturn #Collision_Bottom
        EndIf
      Else
        ProcedureReturn #Collision_Left
      EndIf
    ElseIf ADX < 0
      If ADY < 0
        M = ADY/ADX
        Y = AY + ((BX + BWidth) - AX)*M
        If Y > BY + BHeight - 1
          ProcedureReturn #Collision_Bottom
        Else
          ProcedureReturn #Collision_Right
        EndIf
      ElseIf ADY > 0
        M = ADY/ADX
        Y = AY + ((BX + BWidth) - AX)*M
        If Y + AHeight - 1 < BY
          ProcedureReturn #Collision_Top
        Else
          ProcedureReturn #Collision_Right
        EndIf
      Else
        ProcedureReturn #Collision_Right
      EndIf
    ElseIf ADY > 0
      ProcedureReturn #Collision_Top
    ElseIf ADY < 0
      ProcedureReturn #Collision_Bottom
    EndIf
  EndIf
  
  ProcedureReturn #False
EndProcedure
AX, AY, AWidth und AHeight sind die Position und Größe deines Spielers/Ghosts. ADX und ADY ist der Bewegungsvektor deines Spielers (in deinem Fall "MoveX" und "MoveY"). Logischerweise ist BX, BY, BWidth und BHeight die Position und Größe des Gegenstandes, mit dem du eine Kollisionsabfrage durchführen möchtest (also z.B. eine Wand). Falls sich dieser Gegenstand auch bewegt, musst du diesen Bewegungsvektor vom Bewegungsvektor des Spielers abziehen (also ADX - BDX und ADY - BDY (das ergibt sich, wenn man als Bezungssystem den Gegenstand wählt)).

Zum Algorithmus: Hier werden die Vorzeichen des Vektors (ADX,ADY) in betracht genommen. Je nach Kombination der Vorzeichen des X und Y Parameters werden zwei in Frage kommende Seiten genauer geprüft. Nun leite ich aus diesem Vektor eine lineare Funktion ab, indem ich die Steigung (M = ADY/ADX) berechne. Dadurch kann ich nun den Spieler in den Moment versetzen, an dem er nur den Gegenstand BERÜHRT hat, also quasi nicht mit diesem überlappt. Nun kann ich also genau prüfen, mit welcher Seite der Spieler gegen den Gegenstand kollidierte.

Das Ergebnis ist demnach eines der vier Konstanten aus dem "Enumeration"-Block.

Also kannst du folgendermaßen schnell und leicht eine genaue Kollision zwischen zwei Rechtecken (nicht unterschiedlich rotiert) berechnen:

Code: Alles auswählen

Select Collision(PlayerX, PlayerY, PlayerWidth, PlayerHeight, PlayerMoveX, PlayerMoveY, WallX, WallY, WallWidth, WallHeight)
  Case #Collision_Top
    PlayerY = WallY - PlayerHeight
    PlayerMoveY = 0
  Case #Collision_Bottom
    PlayerY = WallY + WallHeight
    PlayerMoveY = 0
  Case #Collision_Left
    PlayerX = WallX - PlayerWidth
    PlayerMoveX = 0
  Case #Collision_Right
    PlayerX = WallX + WallWidth
    PlayerMoveX = 0
EndSelect
Viel Spaß beim Einbauen :)

Gruß Josef

EDIT: Sehe gerade, dass die Kollision im obersten Download einwandfrei funktioniert. Wie ich sehe, hast du dass mit dem zweidiemnsionalen Tile-Array gelöst. Nur komisch das beim neuen Download immer so ein zurückzucken an dem Rohr entsteht.

EDIT2: Setzt man in Version 1.3 das Feld (3, 8 ) = 1, dann bemerkt man schnell, dass bei einer seitlichen Kollision etwas nicht stimmt.