[GELÖST]Code Problem Nr. X

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

Entenfels

Betreff: [GELÖST]Code Problem Nr. X

BeitragDi, Dez 15, 2009 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo allerseits!
Ich hasse es wirklich, anderen einen Code hinwerfen zu müssen, um andere nach den Fehlern suchen zu lassen. Ich weiß nicht woran es liegt, aber ein Teil des Codes, der immer funktioniert hat, will nun seinen Dienst nicht mehr tun. Habe ich irgendwo geschlampt? Oder liegt es an BlitzPlus?
Code: [AUSKLAPPEN]
Graphics 1024, 768, 1
Const PlayerBreite=100 ;Breite der eigenen Figur
Const AngriffBreite=82 ;Dies meint die Gesamtbreite des Players abzüglich PlayerBreite
Const GegnerBreite=324 ;Breite der gegnerischen Figur
PlayerX=462
PlayerY=400
PlayerLife=100 ;Leben, das der Spieler hat in %
PlayerD#=50 ;Schaden, den der Spieler macht
PlayerRe#=0
PlayerDirection=1
PlayerL=LoadImage("Ergebnisse/StandL.png")
PlayerR=LoadImage("Ergebnisse/StandR.png")
AngriffL=LoadImage("Ergebnisse/AngriffL.png")
AngriffR=LoadImage("Ergebnisse/AngriffR.png")
DefensivL=LoadImage("Ergebnisse/VerteidigungL.png")
DefensivR=LoadImage("Ergebnisse/VerteidigungR.png")
Dim Image(1,1,2) ;l/r,No.,Ruhe/Angriff/Verteidigung
Image(0,0,0)=LoadImage("Ergebnisse/StandL.png")
Image(1,0,0)=LoadImage("Ergebnisse/StandR.png")
Image(0,0,1)=LoadImage("Ergebnisse/AngriffL.png")
Image(1,0,1)=LoadImage("Ergebnisse/AngriffR.png")
Image(0,0,2)=LoadImage("Ergebnisse/VerteidigungL.png")
Image(1,0,2)=LoadImage("Ergebnisse/VerteidigungR.png")
Image(0,1,0)=LoadImage("Ergebnisse/GegnerL.jpg")
MaskImage Image(0,1,0),255,0,255
Image(1,1,0)=LoadImage("Ergebnisse/GegnerR.jpg")
MaskImage Image(1,1,0),255,0,255
Background=LoadImage("Ergebnisse/Bg.jpg")
State=0
Type enemy
   Field X
   Field Direction
   Field Life
   Field State
   Field D#
   Field R#
End Type
Function ErstelleGegner()
   gegner.enemy=New enemy
   gegner\X=Rand(0,924)
   gegner\Direction=Rand(0,1)
   gegner\Life=100
   gegner\D=20
   gegner\R=20
End Function
Repeat
   If State>0 Then State=State-1
   If KeyHit(28) Then ErstelleGegner()
   Cls
   If KeyDown(203)
      PlayerX=PlayerX-3
      PlayerDirection=0
   End If
   If KeyDown(205)
      PlayerX=PlayerX+3
      PlayerDirection=1
   End If
   If KeyHit(57) And State=0 Then
      State=10
      For gegner.enemy=Each enemy
         If PlayerDirection=0 And gegner\X>PlayerX-AngriffBreite-Gegnerbreite And gegner\X<PlayerX+(PlayerBreite/2) Then   
            gegner\Life=gegner\Life-(PlayerD*(PlayerD/(PlayerD+gegner\R))) ;Wenn der Player nach links schaut und der Gegner sich in Schlagweite befindet, wird ihm Leben abgezogen.
         ElseIf PlayerDirection=1 And gegner\X>PlayerX+(PlayerBreite/2) And gegner\X<PlayerX+PlayerBreite+AngriffBreite Then
            gegner\Life=gegner\Life-(PlayerD*(PlayerD/(PlayerD+gegner\R))) ;Wenn der Player nach rechts schaut und der Gegner in Reichweite ist, wird ihm Leben abgezogen.
         End If
      Next
   End If
   If KeyDown(208) And State<1 Then
      PlayerD=50
      State=-1
   Else
      PlayerD=0
      State=0
   End If
   For gegner.enemy = Each enemy
      If gegner\X>PlayerX+PlayerBreite Then
         gegner\X=gegner\X-1
         gegner\Direction=0
      ElseIf gegner\X<PlayerX-GegnerBreite Then
         gegner\X=gegner\X+1
         gegner\Direction=1
      End If
   Next
   DrawBlock Background, 1, 1
   Color 0,0,0
   Text 50, 25, GetKey()
   Text 50, 50, "Leben: "+PlayerLife+"%"
   Text 50, 75, "State: "+State
   Text 50, 100, "Verteidigung: "+PlayerD
   If PlayerDirection=0
      If State>0 Then DrawImage Image(0,0,1), PlayerX-81, PlayerY
      If State=0 Then DrawImage Image(0,0,0), PlayerX, PlayerY
      If State=-1 Then DrawImage Image(0,0,2), PlayerX-114, PlayerY
   ElseIf PlayerDirection=1
      If State>0 Then DrawImage Image(1,0,1), PlayerX, PlayerY
      If State=0 Then DrawImage Image(1,0,0), PlayerX, PlayerY
      If State=-1 Then DrawImage Image(1,0,2), PlayerX, PlayerY
   End If
   For gegner.enemy = Each enemy
      If gegner\Life<=0
         gegner\Life=gegner\Life-1
         DrawImage Image(gegner\Direction,1,0), gegner\X, 400-(gegner\Life*25)
         ;Color 255,0,0
         ;Rect gegner\X, 400-(gegner\Life*3), 188, 300 ;Nur zu Testzwecken
         If gegner\Life<=-25 Then Delete gegner
      Else
         Color 255,0,0
         Rect gegner\X+44, 380, 100, 5
         Color 0,255,0
         Rect gegner\X+44, 380, gegner\Life, 5
         DrawImage Image(gegner\Direction,1,0), gegner\X, 400
         ;Color 0,0,255
         ;Rect gegner\X, 400, 188, 300 ;Nur zu Testzwecken
      End If
   Next
   If KeyDown(1) Then Ende=1
   Flip
Until Ende=1
End

Kann mir jemand helfen? Crying or Very sad
Grüße
Entenfels
Die Details sind zu 94 Prozent zutreffend, bei sechs Prozent unvermeidbarer Extrapolation.
-Artemis Fowl von Eoin Colfer
  • Zuletzt bearbeitet von Entenfels am Do, Dez 17, 2009 7:40, insgesamt einmal bearbeitet

Hummelpups

BeitragDi, Dez 15, 2009 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
was geht denn nicht mehr?

Habe die Bilder nicht.

EDIT//

Du solltest dir angewöhnen zwischen Unterschiedlichen bereichen in der Schleife
mehrere freizeilen zu setzen, zwischen tastenabfragen und zeichnen der Bilder beispielsweise.


Außerdem gehst du die Enemyliste 2 mal durch. Sollte nicht nötig sein.


Auerdem solltest du _mit Ausnahmen_ erst Berechnen und dann anzeigen.

Micha
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Tankbuster

BeitragDi, Dez 15, 2009 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, was geht denn nichtmehr?

AUßerdem sehe ich nirgendswo SetBuffer(BackBuffer()), aber ein Flip. Ziemlich ungewöhnlich.
Twitter
Download Jewel Snake!
Windows|Android

Entenfels

BeitragMi, Dez 16, 2009 7:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry Embarassed
Was nicht mehr funktioniert, ist der Teil, wo der Player schlägt:
Code: [AUSKLAPPEN]
   If KeyHit(57) And State=0 Then
      State=10
      For gegner.enemy=Each enemy
         If PlayerDirection=0 And gegner\X>PlayerX-AngriffBreite-Gegnerbreite And gegner\X<PlayerX+(PlayerBreite/2) Then   
            gegner\Life=gegner\Life-(PlayerD*(PlayerD/(PlayerD+gegner\R))) ;Wenn der Player nach links schaut und der Gegner sich in Schlagweite befindet, wird ihm Leben abgezogen.
         ElseIf PlayerDirection=1 And gegner\X>PlayerX+(PlayerBreite/2) And gegner\X<PlayerX+PlayerBreite+AngriffBreite Then
            gegner\Life=gegner\Life-(PlayerD*(PlayerD/(PlayerD+gegner\R))) ;Wenn der Player nach rechts schaut und der Gegner in Reichweite ist, wird ihm Leben abgezogen.
         End If
      Next
   End If

In BlitzPlus ist Backbuffering der Standart und muss (so weit ich weiß) nicht erst angegeben werden, das "Flip" wird aber trotzdem benötigt.
Der Rest sind Schönheitsfehler (wenn manchmal auch große), die ich behebe, wenn der Code fertig ist (Stehe bisschen unter Zeitdruck Arrow Weihnachten)
Grüße
Entenfels
Die Details sind zu 94 Prozent zutreffend, bei sechs Prozent unvermeidbarer Extrapolation.
-Artemis Fowl von Eoin Colfer

Midimaster

BeitragMi, Dez 16, 2009 9:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn eine Routine nicht macht, was Du erwartest, dann zerlege Sie in Ihre Einzelschritte und checke jeden Teil mit DEBUGLOG:

Code: [AUSKLAPPEN]
If KeyHit(57) And State=0 Then
       State=10
   DebugLog "Schuss ab"
   For gegner.enemy=Each enemy
      DebugLog "----------------"
      ;DebugLog "checke Gegner" + gegner\Nr
      DebugLog "Gegner-X=" + gegner\X
           If PlayerDirection=0
            DebugLog "Player Direction 0=links"
            If gegner\X > (PlayerX-AngriffBreite-Gegnerbreite)
               DebugLog "Gegner ist rechts vom Player-Angriffbreite"
                 If gegner\X < (PlayerX+(PlayerBreite/2))
                  DebugLog "Gegner ist nah genug"
                  Abzug= PlayerD * PlayerD / ( PlayerD + gegner\R )   
                     DebugLog "Ziehe Gegner Leben ab: " + Abzug
                  gegner\Life=gegner\Life-Abzug
               Else
                  DebugLog "Gegner doch zu weit rechts"                   
               EndIf
                  DebugLog "Gegner zu weit links"                   
            EndIf   
            ElseIf PlayerDirection=1....


Solche If-Ungetüme, wie Du sie schreibst, können leicht zur Fehlerquelle werden, zumal Du mit wenig Klammern arbeitest. So wäre es sicherer:

statt...
If X>S AND a < b+c AND c NOT 1 Then...

lieber...
If ( X>S) AND ( a < (b+c) ) AND ( c Not 1) Then ...

Es ist auch kein Nachteil bei "AND", wenn Du sie zerlegst und in einzelne Zeilen schreibst:
Code: [AUSKLAPPEN]

If  X>S Then
    If  a < (b+c) Then
         If  c Not 1 Then ...


Ich kann Dir nicht versprechen, dass dort Dein Fehler lag, aber mit den vielen DEBUGLOG kannst Du es jetzt leicht selber feststellen.

Außerdem habe ich Dir die Variable Abzug eingeführt. So kannst Du testen, ob der Wert, den Du beim Leben abziehen willst überhaupt dem entspricht, was Du Dir vorgestellt hast.

Noch'n Trick:
Ich habe den Typ Enemy um das Field "Nr" erweitert. Damit kannst Du jedem Gegner eine laufende Nummer geben, und in der Schuss-Routine erkennen, wer gerade gecheckt wird (siehe auskommentierte Zeile)


Du schreibst uns zwar, wo Du den Fehler vermutest, aber nicht, wie er sich äußert. Was geschieht? Stirbt der Gegner nicht, obwohl er müßte? Oder zu früh? Oder sind nur keine Bilder zu sehen?

Bitte etwas genauer....

Entenfels

BeitragMi, Dez 16, 2009 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tipp. Das Problem äußert sich einfach, indem dieser ganze Abschnitt nicht funktioniert. Das heißt: Alles funktioniert, nur wenn ich die Taste für Schlagen (Ich glaube Leertaste) drücke, ändert dies nichts. Nicht einmal der "State"-Wert wird verändert und das ist, was mich stutzig macht. Denn dieser Teil:
Code: [AUSKLAPPEN]
   If KeyHit(57) And State=0 Then
      State=10

müsste doch eigentlich funktionieren. Wenn ich den ASCII-Wert der gedrückten Tasten angeben lasse, sehe ich, dass die Leertaste einwandfrei funktioniert und ich bekomme ja im Programm angezeigt, dass "State" gleich 0 ist. Der einzige Fehler, den ich mir jetzt noch vorstellen kann, wäre, dass der ScanCode 57 nicht der Leertaste entspricht. Dies ist jedoch nicht der Fall. Also kann es doch nur noch an BlitzPlus liegen (Ja, ich habe die aktuelle Version). Oder habe ich was übersehen? *verzweifeltguck*
Grüße
Entenfels
Die Details sind zu 94 Prozent zutreffend, bei sechs Prozent unvermeidbarer Extrapolation.
-Artemis Fowl von Eoin Colfer

Nicdel

BeitragMi, Dez 16, 2009 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Fragst du die Taste im Programm ein weiters Mal ab?
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Pitje Puck

BeitragMi, Dez 16, 2009 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
in der Rechnung
Code: [AUSKLAPPEN]
-(PlayerD*(PlayerD/(PlayerD+gegner\R)
liegt der Hund begraben. An der Stelle willst du wohl den Schaden errechnen. Bei der Rechnung kommt seltsamer Weise immer 0 statt 70 raus. Wenn du mal zB 10 statt dem ganzen Wust benutzt, dann klappts.
Oder mach einfach -(PlayerD+gegner\R), kommt das Selbe raus.... ist auch 70 Very Happy

Midimaster

BeitragMi, Dez 16, 2009 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Wnn Du denkst, dass das mit der Leertaste nicht geht, dann füge genau da einen DEBUGLOG ein:

Code: [AUSKLAPPEN]
DEBUGLOG "Vor Keyhit State=" + state
    If KeyHit(57) And State=0 Then
        DEBUGLOG "Leertaste funktioniert"
        State=10
        ....

Midimaster

BeitragMi, Dez 16, 2009 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich ahnte dass schon, aber eigentlich hätte er selber drauf kommen sollen

Deshalb hatte ich ihm ja geschreiben er soll diese Code-Stelle mal so machen:
Code: [AUSKLAPPEN]
Abzug= PlayerD * PlayerD / ( PlayerD + gegner\R )   
DebugLog "Ziehe Gegner soviel Leben ab: " + Abzug
gegner\Life=gegner\Life-Abzug

Triton

BeitragMi, Dez 16, 2009 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es um BlitzPlus geht, gehört es auch ins dortige Forum.

Arrow Verschoben
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Entenfels

BeitragMi, Dez 16, 2009 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, erachte mich halt immer noch als blutigen NOOB Embarassed
Aber wenn es nur an der Formel läge, müsste "State" ja trotzdem auf 10 erhöht werden. Außerdem hat die Formel vorher schon einwandfrei funktioniert.
Es ist ja nicht nur so, dass der Schaden nicht abgezogen wird, sondern der ganze Teil wird überhaupt nicht aufgerufen.
Grüße
Entenfels
Die Details sind zu 94 Prozent zutreffend, bei sechs Prozent unvermeidbarer Extrapolation.
-Artemis Fowl von Eoin Colfer

Xeres

Moderator

BeitragMi, Dez 16, 2009 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Block darunter...
Code: [AUSKLAPPEN]
If KeyDown(208) And State<1 Then
      PlayerD=50
      State=-1
   Else
      PlayerD=0
      State=0
   End If

...setzt state=0 wenn du die eine Richtungstaste nicht gedrückt hältst Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragMi, Dez 16, 2009 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
" Ganz gar nicht...geht nicht". Wenn Du die DEBUGLOG alle eingebaut hast müßtest Du mindestens diese Meldungen sehen:

"Schuss ab"


siehtst Du wenigsten diese Meldungen:

----------------
checke Gegner 0
Gegner-X=123
----------------
checke Gegner 1
Gegner-X=456
...

Wenn Du gar nix von alledem siehst kann nur die Zeile...

If KeyHit(57) And State=0 Then

...falsch sein. Zerteil sie mal und setzt folgende DEBUGLOG ein:
Code: [AUSKLAPPEN]
If KeyHit(57)
    DEBUGLOG " Schuss ab!    State=" + state
    If State=0 Then
        DEBUGLOG "geht doch!"

Midimaster

BeitragMi, Dez 16, 2009 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch eine Idee:

In der Repeat-Schleife machst Du state immer um 1 kleiner. Weisst Du eigentlich, wie schnell diese Schleife durchlaufen wird? Es könnte gut sein, dass state immer innerhalb von 100msec von 10 auf 0 fällt.

Ersetze es durch:

Code: [AUSKLAPPEN]
Repeat
    if Zeit<Millisecs() then
        Zeit=Millisecs()+100
        If State>0 Then
            State=State-1
            DEBUGLOG "Autom. State runter auf " + state
        Endif
    Endif
...
 

Pitje Puck

BeitragMi, Dez 16, 2009 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon erwähnt zählt der viel zu schnell runter. Wenn das Programm nur z.B. 100 Frames pro Sekunde läuft, dauert dein Runterzählen 1/10 Sekunde. Dahin kommt das Programm aber gar nicht, da es hier:
Code: [AUSKLAPPEN]
   If KeyDown(208) And State<1 Then
      PlayerD=50
      State=-1
   Else
      PlayerD=0
      State=0
   End If

wenn die Taste 208 nicht gedrückt bleibt wieder auf 0 springt.
Gehe ich recht in der Annahme, dass du zwischen zwei Angriffen eine Zwangspause einbauen willst?
Wenn das so ist würde ich state da raus lassen. Du könntest z.B. einen Timer setzen.

Code: [AUSKLAPPEN]

timestamp= millisecs
repeat
   If millisecs-timestamp >70 then
      If KeyHit(57) And State=0 then
         machwas()
         timestamp = millisecs
      endif
   endif
forever


Edit:
Uups hat mein Vorgänger ja fast genauso....

Entenfels

Betreff: DANKE

BeitragDo, Dez 17, 2009 7:39
Antworten mit Zitat
Benutzer-Profile anzeigen
DANKE!!!
Das mit dem State=0 muss es gewesen sein Very Happy
Hätte ich eigentlich drauf kommen können.
Danke auch für alle anderen Tipps!
Gruß
Entenfels
Die Details sind zu 94 Prozent zutreffend, bei sechs Prozent unvermeidbarer Extrapolation.
-Artemis Fowl von Eoin Colfer

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group