energie in functionen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Blitzprogger

Betreff: energie in functionen

BeitragSo, März 16, 2008 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
zugegeben, der titel ist nicht das wahre und passt auch nicht richtig zum thema, denoch habe ich hier noch ein problem: zuerst mal ein auszug aus meinem code:
Code: [AUSKLAPPEN]
Graphics 1280,1024,16,1
SetBuffer BackBuffer()

Global ev = LoadImage("energiebalken (v).bmp")
Global eh = LoadImage("energiebalken (h).bmp")
Global el = LoadImage("energiebalken (l).bmp")

Global energie = 2

While Not KeyDown(1)
 level1
Wend

Function level1()

While Not KeyDown(1)

 If KeyHit(57) And energie = 2 Then energie = 1
 If KeyHit(57) And energie = 1 Then energie = 0

 If energie = 2 Then DrawImage ev, 10, 50
 If energie = 1 Then DrawImage eh, 10, 50
 If energie = 0 Then DrawImage el, 10, 50

 Flip
 Cls

Wend

End Function

End

um eventuelle vorurteile abzuwenden möchte ich noch erwähnen, dass dies blos ein kleiner teil des codes ist. das problem: ist energie = 2 dann kommt das richtige, ist es = 1 auch, aber bei null kommt es nicht richtig. was mache ich falsch?

meine freundlichsten grüsse
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 16, 2008 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach dem auslesen des Tastaturpuffers, wird dieser gelöscht. Mit anderen Worten, wenn zum ersten mal If KeyHit(57) Then ... aufgerufen wird, ist danach der Puffer leer. Daher den Wert zwischenspeichern.

Wir wärs mit folgendem Code: [AUSKLAPPEN]
...

If KeyHit(57) Then
  If energie>0 Then energie=energie-1
End If

...


edit1: Außerdem würde ich es vermeiden, alles als Global zu definieren. Und schaue dir mal Arrays an (siehe dazu ql:Dim). Die lechzen geradezu für deine Vorgehensweise.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Blitzprogger

BeitragSo, März 16, 2008 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die schnelle antwort. Very Happy es funktioniert jetzt. da fällt mir grad noch was ein: welchen befehl kann ich nutzten um zu überprüfen wann eine bestimmte zeit um ist? (damit sich die energie wieder auflädt)

mfg
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink
 

Shark

BeitragSo, März 16, 2008 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat sich wohl erledigt.
Sorry
  • Zuletzt bearbeitet von Shark am So, März 16, 2008 22:30, insgesamt einmal bearbeitet

skey-z

BeitragSo, März 16, 2008 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
das musst du dir selber schreiben, siehe dazu Millisecs()
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Blitzprogger

BeitragSo, März 16, 2008 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
milisecs? für mein progg ist es eigentlich unwichtig zu wissen wann der pc gestartet wurde. ich hab mich auch gleich selbst an einem progrämmchen versucht:
Code: [AUSKLAPPEN]
global zeit = 0

function hauptschleife()
...
...
if zeit = 3000 and energie<2 then
 energie = energie + 1
 zeit = 0
endif
...
...
zeit = zeit + 1
delay 1
...
end function
warum das nicht functioniert ist mir schleierhaft. danke noch für die schnellen antworten Very Happy

meine freeundlichsten grüsse
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink
 

bruce85

BeitragMo, März 17, 2008 0:38
Antworten mit Zitat
Benutzer-Profile anzeigen
der eine NOOB!!! hat Folgendes geschrieben:
milisecs? für mein progg ist es eigentlich unwichtig zu wissen wann der pc gestartet wurde. ich hab mich auch gleich selbst an einem progrämmchen versucht:


@skey-z hat schon recht.
Natürlich kannst Du auch nach einem bestimmten zeitpunkt etwas ausführen mit Millisecs().

Hier mal ein beispiel:

Code: [AUSKLAPPEN]
Graphics 640,480
SetBuffer BackBuffer()

Global timer = MilliSecs()
Global sekunden,leben_auffuellen

Repeat
  Cls

  ;Jede sekunde ausführen
  If MilliSecs()-timer >= 1000 Then
    timer = MilliSecs()

    ;sekunden um jeweils 1 erhöhen
    sekunden = sekunden + 1
    ;Wenn sekunden >= 10 dann leben_auffuellen auf 1 setzen
    If sekunden >= 10 Then leben_auffuellen = 1 : sekunden = 0
  EndIf

  If leben_auffuellen = 1 Then
    ;hier den code um leben aufzufüllen
    Text 20,20,"Leben wird aufgefüllt!"
  EndIf

  Flip
Until KeyHit(1)

End


Ist jetzt nur ein beispiel, natürlich musst du den Code noch bei dir richtig anpassen.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
  • Zuletzt bearbeitet von bruce85 am Mo, März 17, 2008 0:50, insgesamt 2-mal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, März 17, 2008 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Millisecs zeigt dir zwar die Zeit, seit der Rechner eingeschaltet istm, aber durch zwischenspeichern der Variable, kann man ganz einfach einen Differenzbetrag errechnen. Drei Sekunden wären dann eben 3000 Millisekunden. Dein Programm wird im übrigen auf unterschiedlichen Rechnern auch geringfügig unterschiedlich schnell ablaufen. Daher empfielt es sich eben Millisecs zu nehmen.

Code: [AUSKLAPPEN]
Graphics 400,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(50)
Local MS,Warten1,Warten2


While Not KeyHit(1)
   Print "bla bla"
   MS=MilliSecs()
   
   If MS>(Warten1+1200) Then
      Print "Alle 1.2 Sekunden ein Zusatz"
      Warten1=MS
   End If
   
   If MS>(Warten2+3000) Then
      Print "Alle 3 Sekunden eine Extrawurst"
      Warten2=MS
   End If
   
   WaitTimer(Timer)
   Flip 0
;   Cls
Wend
End


Versuche nach Möglichkeit viele Funktionsaufrufe soweit es geht zu vermeiden.

edit1: Da war ich mal zu spät...
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Blitzprogger

BeitragMo, März 17, 2008 10:41
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für eure hilfe und geduld das mit dem auffüllen der energie klappt jetzt Very Happy

mfg
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

Blitzprogger

BeitragMo, März 17, 2008 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
mit dem lösen des einen problems eröffnet sich ein neues: ich habe einen gegner in das spiel gesetzt, den der held töten soll. wenn man nun die leertaste drückt und man in der nähe des feindes ist soll der sterben. das functioniert auch, jedoch nur wenn die energie voll ist ( also auf 2). der gegner soll auch sterben wenn sie auf 1 ist, tut er aber nicht. ich habe nun schon alle mjir eingeffallenen massnahmen ergriffen es zu beheben - jedoch ohne erfolg.
hier mein Code: [AUSKLAPPEN]
 
global feind = 1

function level1()
while not keydown(1)
kh = keyhit(57)
if feind = 1 then drawimage ......
if feind = 0 then drawimage ......
If px<790 And px>610 And py>500 And feind = 1 Then
  DrawImage te, 590, 200
  If energie>0 And kh Then feind = 0
 EndIf
wend
end function

das functioniert komischerweise nicht (wenn energie = 1 ist geht da nichts) was ist denn da falsch?

mfg
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink
 

Dreamora

BeitragMo, März 17, 2008 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
das hat dann aber kaum was mit dem code zu tun.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Blitzprogger

BeitragMo, März 17, 2008 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
heisst das dieser vorgang kann nicht ausgeführt werden? Sad

mfg
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, März 17, 2008 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde die ganze Reihe von Querverweisen durch Variablen recht umständlich und tragen sicherlich nicht zur Einfachheit des Codes bei.

Allein schon
Code: [AUSKLAPPEN]
if feind = 1 then drawimage ......
if feind = 0 then drawimage ......


und vor allem
Code: [AUSKLAPPEN]
  If energie>0 And kh Then feind = 0


Generell würde ich auf solche Umwälzung der Variablenwerte verzichten und alles soweit es nur geht logisch und direkt regeln. Anstelle if feind = 1 then drawimage würde ich das mit Frames oder wenn es nicht anders geht, mithilfe von Arrays regeln. Das heisst, die Framesangabe ist auch direkt der Feindzstand, oder eben mithilfe eines Dim-Arrays die Bilder einzelnd einladen und über den Index ansprechen. In beiden Fällen sparst du dir die beiden If-Abfragen.

Um deinem Problem mal direkt behilflich zu sein, so könnte das Ändern der folgenden Zeile

Code: [AUSKLAPPEN]
If px<790 And px>610 And py>500 And feind = 1 Then


durch
Code: [AUSKLAPPEN]
If px<790 And px>610 And py>500 And feind > 0 Then


schon helfen. Da ich aber nicht den ganzen Code habe, kann ich es auch nicht genau sagen. Ich weise aber nochmal darauf hin, dass ich so eine Vorgehensweise für nicht richtig erachte.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Blitzprogger

BeitragMo, März 17, 2008 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiss das das ein bischen doof tönt und vielleicht einige nerft, denoch habe ich die frage wie ich das nun anstellen soll Embarassed . wie sollte ich es ohne variablen anstellen?

meine allerfreundlichsten grüsse
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

Eingeproggt

BeitragDi, März 18, 2008 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Du sollst die ganze sache vereinfachen, indem du nicht schreibst
Code: [AUSKLAPPEN]
If energie>0 And kh Then feind = 0
If feind=0 Then DrawImage ...


Sondern

Code: [AUSKLAPPEN]
If energie>0 And kh Then DrawImage ...


mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group