[GELÖST]Code Problem Nr. X
Übersicht

![]() |
EntenfelsBetreff: [GELÖST]Code Problem Nr. X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry ![]() 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 ![]() Grüße Entenfels |
||
Die Details sind zu 94 Prozent zutreffend, bei sechs Prozent unvermeidbarer Extrapolation.
-Artemis Fowl von Eoin Colfer |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn es um BlitzPlus geht, gehört es auch ins dortige Forum.
![]() |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
![]() |
Entenfels |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, erachte mich halt immer noch als blutigen NOOB ![]() 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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
" 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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.... |
||
![]() |
EntenfelsBetreff: DANKE |
![]() Antworten mit Zitat ![]() |
---|---|---|
DANKE!!!
Das mit dem State=0 muss es gewesen sein ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group