Mein erstes PB-Spielchen: BallaBalla

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
ReneMiner
Beiträge: 58
Registriert: 20.07.2007 14:54
Wohnort: zwischen Westerwald und Siegerland

Beitrag von ReneMiner »

Ja- das wirkt schon etwas weicher- und man kommt auch bei den schnellen Bällen noch rechtzeitig an - Paddelspeed sollte aber doch mit wenigstens 4 anfangen (so mein Gefühl)

Ich wiederum hab inzwischen ein Problem ausgemacht was beim Starten eines Bildschirmschoners auftritt (wenn man z.B. per Joystick spielt und nicht zufällig den MediaPlayer am Laufen hat) - das FlipBuffers() muss weiter hoch und vor dem IsScreenActive() ausgeführt werden

ich habs im Anfänger-Foren-Bereich\Bildschirmschoner-Thread mal beschrieben - ich denke das kriegst Du hin
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Beitrag von Christian H »

Mir ist das Bildschirmschoner-Problem gar nicht aufgefallen.
Wir haben keinen Joystick.
Morgen bin ich aber in der Stadt, da werde ich zur Freude der Kinder einen besorgen.

Gruß Christian
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Beitrag von Christian H »

ReneMiner hat geschrieben:Ich wiederum hab inzwischen ein Problem ausgemacht was beim Starten eines Bildschirmschoners auftritt (wenn man z.B. per Joystick spielt und nicht zufällig den MediaPlayer am Laufen hat) - das FlipBuffers() muss weiter hoch und vor dem IsScreenActive() ausgeführt werden
hmm...

Eigentlich sollte es doch reichen FlipBuffers() hinter das EndIF von "If IsScreenActive()" zu schreiben.

Code: Alles auswählen

    If IsScreenActive()
      ...
      ..
      .
      
      .
      ..
      ...
      
     ; FlipBuffers() <-- alte Stelle
    
    EndIf  ; IsScreenActive()
   
    FlipBuffers()  ; <-- neue Stelle
kannst du es so mal testen?

Gruß Christian
ReneMiner
Beiträge: 58
Registriert: 20.07.2007 14:54
Wohnort: zwischen Westerwald und Siegerland

Beitrag von ReneMiner »

Ich habs eben drüben auf dem anderen Rechner aus dem Kopf nochmal eingefügt (das oben von Dir Beschriebene mit dem PaddelSpeed)
Dabei kam ich irgendwie plötzlich nicht mehr ganz an den Rand...
Zusätzlich hab ich also noch eine Variable gebraucht (ich rechne halt kein Ergebnis gerne 2mal oder öfter aus sondern merk mir's lieber), und zwar PaddelMove- eben die tatsächliche Bewegung,
Paddelspeed hab ich doch wieder bis auf 1 runter zugelassen- und das Maximum auf 15 reduziert und den PaddelSpeed sofort an anderen Stellen im Code verwendet.
im Eingabe verarbeiten siehts nun bei mir so aus:

Code: Alles auswählen

   Case #Befehl_Abfeuern
      If GameLevel = 0
        If hatJoystick
          SetGadgetText(Statusanzeige, "F1 or JoyButton 1 to Start a new Game") 
        Else
          SetGadgetText(Statusanzeige, "F1 to Start a new Game") 
        EndIf
      Else
        ResetList(Ball())
        While NextElement(Ball())
          If Ball()\Geschw = 0
            Ball()\Einschlag = #bumms_Paddel
            Ball()\Korrigieren = 0
            Ball()\Geschw = 5 + Random(GameLevel)/10
            If vorherigerBefehl= #Befehl_GehLinks
              Ball()\Richtung= 269 - 2 * PaddelSpeed
            ElseIf vorherigerBefehl = #Befehl_GehRechts
              Ball()\Richtung= 271 + 2 * PaddelSpeed
            Else
              Repeat
                Ball()\Richtung = 255 + Random(30)
              Until Ball()\Richtung <> 270 
            EndIf
          EndIf
        Wend
        SetGadgetText(Statusanzeige, "Level " + Str(GameLevel)) 
        ZusatzCount = 0
       EndIf
    Case #Befehl_GehLinks
      If vorherigerBefehl = #Befehl_GehLinks 
         If PaddelSpeed < 15
            PaddelSpeed = PaddelSpeed + 1 
         EndIf
      Else
         PaddelSpeed = 1
      EndIf
      
      If PaddelLinks >= PaddelSpeed 
         PaddelMove = PaddelSpeed
      Else
         PaddelMove = PaddelLinks
      EndIf
      
      PaddelLinks = PaddelLinks - PaddelMove 
      ResetList(Ball())
      While NextElement(Ball())
         If Ball()\Geschw = 0
            Ball()\Pos\X = Ball()\Pos\X - PaddelMove 
         EndIf
      Wend      
      
    Case #Befehl_GehRechts
      If vorherigerBefehl = #Befehl_GehRechts 
         If PaddelSpeed < 15
            PaddelSpeed = PaddelSpeed + 1 
         EndIf
      Else
         PaddelSpeed = 1
      EndIf
    
      If PaddelLinks + PaddelBreit + PaddelSpeed < 512
         PaddelMove = PaddelSpeed
      Else
         PaddelMove= 512 - (PaddelLinks + Paddelbreit)
      EndIf
      
      PaddelLinks = PaddelLinks + PaddelMove
       
      ResetList(Ball())
      While NextElement(Ball())
         If Ball()\Geschw = 0
            Ball()\Pos\X = Ball()\Pos\X + PaddelMove
         EndIf      
      Wend
      
  EndSelect
  
und die Prozedur "Umkehren" ist nun auch etwas geändert- da lassen die Bälle sich so richtig schön anschneiden und auch gezielt aus den Ecken bzw. vom Rand weglenken indem man eben kürzer oder länger gegen die Seitenwand drückt

Code: Alles auswählen

 Case  #bumms_Paddel
      neueRichtung= -1 * (Richtung - 90) + 270
      ; etwas abfälschen...
      If letzterBefehl=#Befehl_GehLinks
        neueRichtung = neueRichtung - PaddelSpeed
      ElseIf letzterBefehl = #Befehl_GehRechts
        neueRichtung = neueRichtung + PaddelSpeed
      EndIf
      ; und in senkrechte Richtung zwingen
      If neueRichtung >= 315 
        neueRichtung = neueRichtung - 3
      ElseIf neueRichtung <= 225
        neueRichtung = neueRichtung + 3
      EndIf
  EndSelect
Das mit dem Bildschirmschoner test ich doch gleich mal...
EDIT:

getestet: ja- auch so gehts, das Bild bleibt erhalten wenn man die Buffers so flippt, egal ob Screen vorher active war oder nicht - konfus - wär mir so nicht in den Sinn gekommen

Kauf den Kindern lieber ein Gamepad als einen Joystick. Würd ich sagen. Wenn Du's auch benutzen willst sollte es schon eines mit 2 Joysticks, einem Steuerkreuz und 12, davon 10 sichtbaren Buttons sein (2 Buttons sind die Jysticks die kann man runter dücken) - also der ganz normale Playstation-Standard - gibts von unzähligen Herstellern.

PS. Lassen sich gepostete Codes in diesem Forum irgendwie ein/ausklappbar machen?
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Beitrag von Christian H »

ReneMiner hat geschrieben:Kauf den Kindern lieber ein Gamepad als einen Joystick. Würd ich sagen. Wenn Du's auch benutzen willst sollte es schon eines mit 2 Joysticks, einem Steuerkreuz und 12, davon 10 sichtbaren Buttons sein (2 Buttons sind die Jysticks die kann man runter dücken) - also der ganz normale Playstation-Standard - gibts von unzähligen Herstellern.
Nach einer endlosen halben Stunde am Gamepad/Joystick-Regal haben wir uns für das "Hama Double Action Air Grip Gamepad" entschieden.

Das Problem mit dem Rand glaubte ich behoben zu haben.
Verwende jetzt aber dennoch deinen Code, da du mit PaddelMove natürlich recht hast.

Für alle Mitleser die keine lust haben alle Änderungen selber einzupflegen gibt es unter http://toter-link.de/PureBasic/BallaBal ... elease.zip eine Funktionsfähige Arbeitsversion. Die werde ich in Unregelmäßigen Abständen aktualisieren. Neue Level gibt es aber erst wenn ich meine Version der Procedure NeuesLevel() fertig habe.

Gruß Christian
ReneMiner
Beiträge: 58
Registriert: 20.07.2007 14:54
Wohnort: zwischen Westerwald und Siegerland

Beitrag von ReneMiner »

Willst Du evtl auch neue Steine und noch andere herabfallende Sachen einfügen - z.B. Schneeflocken die die Bälle ein paar Mal am Paddel anfrieren lassen (Ball()\Geschw auf 0 setzen) so das man sie neu abfeuern kann oder andere Bonus-Sachen?

Um beispielsweise das Paddel nach einem aufgefangenen Bonus-Gegenstand breiter oder schmaler zu machen müsste man wahrscheinlich einfach noch ein schmaleres und ein breiteres Bildchen vom Paddel anfertigen weil sich scheinbar die Sprite-Grösse nicht einfach per Befehl festlegen lässt sondern immer an die Grösse der Textur gebunden ist.
JPG's scheinen übrigens mit DisplayTransparentSprite nicht zu funktionieren - irgendwie fehlt die Transparenz...

Und wenn Du neue Steine einsetzen willst brauchst Du nur im NeuesLevel das "< 10" gegen "<> 10" austauschen und anfangs die Indizes für Ball- Tropf- und Paddel-Sprites etwas höher setzen.

___________________________________________________________
EDIT: Etwas Nachschlag

Da ich mich manchmal drüber geärgert hab das da Bälle durch den Schläger flogen (ja ich weiss ja das sie die magische Linie überschritten haben müssen) - aber ich meinte eben - "...den hätt ich eigentlich grade noch kriegen müssen..." hab ich noch was reingefummelt:

bei BewegeBälle,
etwa ab Line 463

Code: Alles auswählen

   ...
         Ball()\Pos\X = neuX
          Ball()\Pos\Y = neuY
        EndIf
; _________________________________________
; ab hier eingefügt:
      ElseIf NeuY > PaddelOben - SpriteHeight(#BIndex) And neuY <= PaddelOben + SpriteHeight(#PIndex)/2 And Ball()\Einschlag <> #bumms_Paddel
        If neuX >= PaddelLinks - SpriteWidth(#Bindex)/2 And neuX + SpriteWidth(#BIndex)/2 <= PaddelLinks + PaddelBreit
          Ball()\Richtung = Umkehren(Ball()\Richtung, #bumms_Ecke)
          PlaySound(6)
          Ball()\Einschlag = #bumms_Paddel
          Ball()\Korrigieren = 0
        Else
          Ball()\Pos\X = neuX
          Ball()\Pos\Y = neuY
        EndIf
; bis hier eingefügt
;_________________________________________________
      Else
        Treffer.l = SteineTesten()
...


Es fliegen zwar trotzdem manche noch "durch" - aber die waren bereits in der unteren Hälfte des Schlägers
Antworten