repead schleife im hintergrund ??

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

PCfreak

Betreff: repead schleife im hintergrund ??

BeitragFr, Jun 11, 2010 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich habe mich mal an einem programm für jemanden versucht und habe folgendes problem:

ich möchte in einer repeatschleife eine repeatschleife erstellen, wobei die 2. repeatschleife im hintergrund läuft, damit die 1. repeatschleife sich immerweider wiederholen kann.

hier mal der Code:

Code: [AUSKLAPPEN]
Print ""
Color 255, 000, 000
Print "  TIPP: Du kannst das Spiel jederzeit mit"
Print "        Der Taste -Esc- beenden !"
Color 255, 255, 255
Print ""
Print ""
Print "  Hallo und Willkommen im Spiel -Keyhunter-"
Print ""
Print " Wenn du die Anleitung lesen willst, gebe  A ein!"
Print " Wenn du das Spiel beenden möchtest, gebe  E ein!"
Print " Wenn du das Spiel starten möchtest, gebe  S ein!"
Print ""
startwahl$ = Input ("  Wählen sie: ")

Select startwahl$
Case "A"
Cls
Locate 0,0
Print ""
Print "  Du steuerst das Blaue Viereck mit den"
Print "  Pfeiltasten
Print ""
Print ""
Print "  Pass auf Rote gegenstände auf, diese"
Print "  darfst du NICHT berühren!"
Print ""
Print ""
Print "  Dei Ziel ist es, mit dem Blauen"
Print "  Viereck das Gelbe feld zu erreichen."
Print ""
Print ""
Print "  Zum Starten des Spiels eine beliebige"
Print "  Taste drücken !
WaitKey

Case "E"
End
Case "S"
End Select

Function endinsek ()
  Locate 100,100 Print "Leider Verloren! Programm beendet sich in:"
  Delay (1000)
  Locate 100,110 Print "5,"
  Delay (1000)
  Locate 100,110 Print "  4,"
  Delay (1000)
  Locate 100,110 Print "    3,"
  Delay (1000)
  Locate 100,110 Print "      2,"
  Delay (1000)
  Locate 100,110 Print "        1,"
  Delay (1000)
  Locate 100,110 Print "          0"
  End
End Function

Graphics 1024,768,0,1
SetBuffer BackBuffer()

viereck = LoadImage("C:\--- ecke.bmp")
hindernis1 = LoadImage("C:\--- Hindernis1.bmp")
hindernis3 = LoadImage("C:\--- dashindernis.bmp")
ziel = LoadImage("C:\--- finish.bmp")
verloren = LoadImage("C:\--- looser.bmp")

xk = 50   
yk = 100

Repeat
Cls


MaskImage viereck, 255, 255, 255
MaskImage hindernis1, 255, 255, 255
MaskImage ziel, 255, 255, 255

DrawImage viereck,xk,yk
DrawImage ziel,400,400

 Repeat
 x2=150
 y2=260
 x2=x2+1
  DrawImage hindernis1,150,260
 
  Until d=300

  If KeyDown(203) Then xk=xk-2
  If KeyDown(205) Then xk=xk+2
  If KeyDown(208) Then yk=yk+2
  If KeyDown(200) Then yk=yk-2

 
  If ImagesCollide(viereck, xk, yk, ramen, hindernis1, 150, 260, ramen) Then
    endinsek
  End If

  If KeyDown(1) Then
    End
  End If

Flip
Until ImagesCollide(viereck,xk, yk, ramen, ziel, 400, 400, ramen)



Ich möchte sozusagen ein objekt bewegen lassen (das hindernis)

aber wenn es sich bewegt, kann ich das viereck nicht mehr steuern, da die 2. repeatschleife läuft !

hat jemand eine lösung für mich ?

Mit freundlichen Grüßen,
PCfreak
Kentnisse: QB, BB, HTML,
  • Zuletzt bearbeitet von PCfreak am Fr, Jun 11, 2010 15:38, insgesamt einmal bearbeitet

Starwar

BeitragFr, Jun 11, 2010 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo und Willkommen.
Um dir zu helfen musst du uns vorher helfen Wink
Benutzte Codeboxen [ code]unmd [ /code] ohne Leerzeichen und rücke deinen Code ein.
Wozu ist die 2. Repeatschleife?
Denkst du man könnte diese Parallel ausführen? Wenn ja muss ich dich entrtäuschen: Das Programm läuft rein linear.
Am besten beschäftigst du dich näher mit Robs Tutorial und Midimasters Ablauf-Tut
MFG

EDIT: Delay ist böse, das hält das gesamte Programm an und belastet den Prozessor zu 100%.

Midimaster

BeitragFr, Jun 11, 2010 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
hier hilft dir Kapitel III aus meinem Ablauf-Tutorial:

https://www.blitzforum.de/foru...hp?t=33584

und vielleicht Kapitel III aus mein Timer-Tutorial:

https://www.blitzforum.de/foru...hp?t=34436

dort wird dir erklärt, wie Dinge scheinbar parallell laufen können. Das Hindernis wird also nicht in einer eigenen Repeat/Until-Schleife behandelt, sondern läuft in der Hauptschleife mit. Ist ein bestimmter Zustand erreicht wird es einfach zurückgesetzt.

BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
MaskImage viereck, 255, 255, 255
...
If D<300 Then
DrawImage hindernis1, D, 260
D=D+1
Else
D=0
EndIf

If KeyDown(203) Then xk=xk-2
...
Until ImagesCollide(viereck,xk, yk, ramen, ziel, 400, 400, ramen)


läuft es dir zu schnell oder zu langsam kannst du statt D=D+1 auch ....

D=D+5

..oder

D#=D#+0.2

...schreiben. Oder eben mit Timern arbeiten. Experimentiere aber zunächst mit dieser einfachen Lösung herum.


Du hast außerdem zwei Logikfehler in deiner Hindernis-Bewegung. Soll das Hindernis sich bewegen, muss die Koordinate X2 auch im Draw-Befehl auftauchen. Zweites Problem die Abbruchbedingung richtet sich bei dir nach der Variablen D. Die wird aber in der inneren Repeat-Schleife gar nicht verändert, also wird 300 nie erreicht.

Beide Probleme zusammengefasst ergibt sich, dass du das Hindernis mit D bewegen solltest und dieses D auch um 1 erhöht wird und mit diesem D auch die Abbruchbedingung überprüft wird.
  • Zuletzt bearbeitet von Midimaster am Fr, Jun 11, 2010 15:41, insgesamt 2-mal bearbeitet
 

PCfreak

BeitragFr, Jun 11, 2010 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Starwar hat Folgendes geschrieben:


EDIT: Delay ist böse, das hält das gesamte Programm an und belastet den Prozessor zu 100%.


aber wie lasse ich die narichten denn dann im sekundentackt nacheinander ablaufen ?

@midimaster

danke =) mal ausprobieren
Kentnisse: QB, BB, HTML,

Midimaster

BeitragFr, Jun 11, 2010 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@Starwar
DELAY ist nicht böse! Es belastet den Prozessor nicht! Im Gegenteil: Es gibt Performance zurück ans System. Beweis:
BlitzBasic: [AUSKLAPPEN]
Repeat
Delay 15
Flip 0
Until KeyHit(1)

braucht (allerdings unter B3D) unter 5% Performance. Beweise mir bitte das Gegenteil mit deinem Windows Task-Manager! Ich bin mal gespannt, wann sich dieser Hoax mal endgültig in Luft auflöst. Es ist eher im Gegenteil so, dass dies:
BlitzBasic: [AUSKLAPPEN]
Repeat
Flip 0
Until KeyHit(1)

...fast schon den kompletten Rechner lahmlegt!


[EDIT]
hier hat Starwar recht: PCFreak macht es hier nicht richtig. Delay sollte nur im msec-Bereich eingesetzt werden: In der Testphase der Programme bleibt der Rechner bedienbar und er kann wenigsten das Programm killen, wenn es sich aufhängt.
  • Zuletzt bearbeitet von Midimaster am Fr, Jun 11, 2010 16:06, insgesamt einmal bearbeitet
 

PCfreak

BeitragFr, Jun 11, 2010 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach eine frage habe ich noch, äh eher 2:

1. wie mache ich dann aus dem skript eine FREILAUFENDE exe datei?

2. wie lasse ich dann das hindernis wieder zurücklaufen wieder vor wieder zurück also hin und her ?
hier ist es so heiß also bei mir zu haus dass ich einen denkfehler habe Razz bitte um hilfe

EDIT :::::

ein problem ist aufgetreten:

wenn der "block" sich bewegt und er momentan nicht an der stelle ist, wo ich mit dem viereck langehen möchte, und ich da langgehe, dass in der nähe des blocks es auch als "verloren" gilt, wieso das ?
Kentnisse: QB, BB, HTML,
  • Zuletzt bearbeitet von PCfreak am Fr, Jun 11, 2010 15:55, insgesamt einmal bearbeitet

Starwar

BeitragFr, Jun 11, 2010 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
[OFFTOPIC
@Mindimaster: Stimmt, in den neuen Versionen lastet Delay nicht zu 100% aus. Trotzdem legt Delay das PRogramm lahm. Es antwortet selbst Windows nicht mehr. Und dafür sind 5*1000ms Pause, die nur kurz unterbrochen wird viel zu viel.
[/OFFTOPIC]

1. Vollversion kaufen. Program - Create Executeable. Dabei auf relative Pfadangaben zu Dateien achten. (Mehr dazu in der Forensuche rechts)
2. guck ich mir später an.
MFG

Noch ein Edit: Statt Delay lieber einen CreateTimer(60), Waittimer und ein Flip 0

Midimaster

BeitragFr, Jun 11, 2010 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Nachrichten im Sekundentakt sind nun zu 100% Timer-Tutorial:

Sie werden ebenfalls in einer Repeat/Until-Schleife gesteuert:


BlitzBasic: [AUSKLAPPEN]
Zeit%=MilliSecs()
Repeat
Cls
If MilliSecs() < Zeit + 1*1000 Then
; texte 1
ElseIf MilliSecs() < Zeit + 2*1000 Then
; texte 2
ElseIf MilliSecs() < Zeit + 3*1000 Then
; texte 3
EndIf
Flip
....
Until MilliSecs()>Zeit+5*1000



Mit etwas Geschick könntest Du sogar die Menü-Abfrage da auch reinintegrieren. Und ganz gute Programmieren kriegen sogar Texte, Menüs und das spätere Spiel alles in die eine gleiche Repeat/Until-Schleife.

Du kannst aber zunächst mit 3 Repeat/Until-Schleifen nacheinander arbeiten:

BlitzBasic: [AUSKLAPPEN]
; 1.Schleife: Vortexte
Repeat
Cls
If MilliSecs() < Zeit + 1*1000 Then
; texte 1
...
Flip
....
Until MilliSecs()>Zeit+5*1000


2.Schleife: Spielerentscheidung
Repeat
Taste=Chr$(GetKey())
If Taste="E" Then
End
...
Until Taste="S"


3.Schleife: Das Spiel
Repeat
Cls
If MilliSecs() < Zeit + 1*1000 Then
DrawImage...
...
Flip
....
Until ImagesCollide(viereck,xk, yk, ramen, ziel, 400, 400, ramen)



Eine Richtungsteuerung kriegst du mit einer neuen Variablen Richtung% hin:
BlitzBasic: [AUSKLAPPEN]
D=D+Richtung

. Sie ist
BlitzBasic: [AUSKLAPPEN]
Richtung=+1

solange es nach rechts gehen soll, und...
BlitzBasic: [AUSKLAPPEN]
Richtung=-1

wenn es nach links gehen soll.


Nun lies mal ruhig die Tutorials, sie werden dir guttun!
 

PCfreak

BeitragFr, Jun 11, 2010 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ich stehe total auf dem schlach hier mal mein code für das 3. level (alle anderen levels klappen):
Code: [AUSKLAPPEN]
Repeat
Cls

DrawImage viereck,xk,yk
DrawImage hindernis4,hx,hy
DrawImage ziel,400,400

  If KeyDown(203) Then xk=xk-2
  If KeyDown(205) Then xk=xk+2
  If KeyDown(208) Then yk=yk+2
  If KeyDown(200) Then yk=yk-2


  If ImagesCollide(viereck, xk, yk, ramen, hindernis4, 150, 190, ramen) Then
    endinsek
  End If

  If KeyDown(1) Then
    End
  End If

Flip
Until KeyDown(1)



so ich möchte jetzt das "hindernis4" bewegen ....

bitte sage mir den code dann kann ich alles andere daraus entnehmen was ich dann brauche =)

EDIT::::
HA ich habs:

ich lasse es n icht hin und her, sondern durch den bildschirm laufen also wenn der block aus dem bildschirm rauzs ist, setze ich ihn links etwas vor dem bildschirm wieder ein genial was ? Razz Razz




EDIT 2:

wie mache ich das andere fenster also nicht das grafikfenster größer ?
Kentnisse: QB, BB, HTML,

Midimaster

BeitragFr, Jun 11, 2010 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
vergiss das zweite fenster und mach alles in dem Grafikfenster

statt print "Hallo"

Text 100,100,"Hallo"
 

PCfreak

BeitragSa, Jun 12, 2010 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah vielen dank =)

ein paar fragen habe ich noch (tut mir leid :-/) :

1. Immer wenn ich das spiel dann starte und spiele, hängt es leicht also in regelmäßigen Abständen so alle 10 Sekunden kann ich was dagegen tun ?

2. das mit dem hin und her eines objektes habe ich noch nicht verstanden

3. ich möchte es so machen, dass wenn die spielfigur ein objekt erreicht, z.b. sich eine wand bewegt.
das bekomme ich zwar hin, aber immer wen die spielfigur das objekt verlässt also nicht mehr berührt hört die bewegung auf weil die bedingung ja nicht mehr erfüllt ist.
wie kann ich eine bewegung dauerhaft schalten, obwohl das objekt nur kurz berührt WURDE?
gibt es da so einen befehl wie
BlitzBasic: [AUSKLAPPEN]
was ImagesCollide(viereck,xk, yk, ramen, ziel, xh, xh, ramen) Then .......

?
Kentnisse: QB, BB, HTML,

Midimaster

BeitragSa, Jun 12, 2010 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
10 Sekunden Hänger

Um zu dem Hänger was zu sagen, müßte man den aktuellen code sehen....




Aktion weiterlaufen

Um eine Aktion weiterlaufen zu lassen, nachdem sie einmal ausgelöt wurde, verwendest Du sogenannte Flags. Das sind ganz normale Variablen, die 0 sind, solange der Auslöser noch nicht stattgefunden hat, und die 1 werden, sobald die Kollision erfolgt ist. Die Bewegung der Wand wird also nicht mehr von der Kollision, sondern von dem Falg abhängig gemacht.

Jetzt kann die Kollision getrost aufhören, das Flag wird ja 1 bleiben und daher die Bewegung nicht mehr aufhören:
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()
Repeat
If (MouseX()<100) And (MouseY()>500) Then
BewegungStart=1
EndIf

If BewegungStart=1 Then
X=X+1
EndIf

Cls
Rect X, 0, 100, 100
Text 100,500,"Bewege die Maus in das Rechteck"
Text 100,550,"Flag: " + BewegungStart
Flip 0
Delay 15
Until KeyHit(1)




Hin und her

Dazu musst du die Variable X am Ende eben wieder kleiner werden lassen. Auch dazu dient ein Flag! Das Flag hat zunächst den Wert 1 und das wird zu X dazugezählt.

Erreicht nun X den linken Rand, dann wird das Flag zu -1 und ab sofort wird was von X abgezogen:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()
Repeat
If X>700Then
Richtung=-1
ElseIf X<1 Then
Richtung=1
EndIf

X=X+Richtung

Cls
Rect X, 0, 100, 100
Text 100,500,"X= " + X
Text 100,550,"Flag: " + Richtung
Flip 0
Delay 15
Until KeyHit(1)
 

PCfreak

BeitragSo, Jun 13, 2010 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Oa viele vielen dank =)

ich habe schon mal mit so einer art gearbeitet (damals mein 1. prog mit Qbasic) aber hatte nie gewust das man das flag nennt =)

danke und entschuldige für die störung =)

Mit freundlichen Grüßen,
PCfreak

EDIT::

achja der code ähm hier villeicht kannst du das problem finden:
BlitzBasic: [AUSKLAPPEN]
Function endinsek ()
Locate 100,100 Print "Leider Verloren!"
Delay (1000)
Locate 100,112 Print "5,"
Delay (1000)
Locate 100,112 Print " 4,"
Delay (1000)
Locate 100,112 Print " 3,"
Delay (1000)
Locate 100,112 Print " 2,"
Delay (1000)
Locate 100,112 Print " 1,"
Delay (1000)
Locate 100,112 Print " 0"
End
End Function


Print ""
Color 255, 000, 000
Print " TIPP: Du kannst das Spiel jederzeit mit"
Print " Der Taste -Esc- beenden !"
Color 255, 255, 255
Print ""
Print ""
Print " Hallo und Willkommen im Spiel -Keyhunter-"
Print ""
Print " Wenn du die Anleitung lesen willst, gebe A ein!"
Print " Wenn du das Spiel beenden möchtest, gebe E ein!"
Print " Wenn du das Spiel starten möchtest, gebe S ein!"
Print ""
startwahl$ = Input (" Waehlen sie: ")

Select startwahl$
Case "A"
Cls
Locate 0,0
Print ""
Print " Du steuerst das Blaue Viereck mit den"
Print " Pfeiltasten
Print ""
Print ""
Print " Pass auf Rote gegenstände auf, diese"
Print " darfst du NICHT berühren!"
Print ""
Print ""
Print " Dei Ziel ist es, mit dem Blauen"
Print " Viereck das Gelbe feld zu erreichen."
Print ""
Print ""
Print " Manchmal findest du grüne kreise,"
Print " sammle sie ein um zusätzliche"
Print " Punkte zu bekommen"
Print ""
Print ""
Print " Zum Starten des Spiels eine beliebige"
Print " Taste drücken !
WaitKey

Case "E"
End
Case "S"
End Select


Graphics 1024,768,0,1
SetBuffer BackBuffer()

>> Hier werden die bilder geladen habe den code absichtlich nicht geschrieben




xk = 50
yk = 100

points = 0

level = 1

live = 3

bonusbenutzt=0

MaskImage viereck, 255, 255, 255
MaskImage hindernis1, 255, 255, 255
MaskImage ziel, 255, 255, 255
MaskImage hindernis3, 255, 255, 255
MaskImage hindernis4, 255, 255, 255
MaskImage bonus, 255, 255, 255
MaskImage bonusalle, 255, 255, 255
MaskImage hindernis5, 255, 255, 255
MaskImage shoot, 255, 255, 255
MaskImage hindernis6, 255, 255, 255
MaskImage herz, 255, 255, 255
MaskImage hindernis7, 255, 255, 255

;----------------------------------------------<Level1>----------------------------------------------

Repeat
Cls


DrawImage viereck,xk,yk
DrawImage ziel,400,400
DrawImage hindernis1, 150,260

Text 1,705, "Leben : "+ live
Text 1,720, "Bonus : "+ bonusbenutzt
Text 1,735, "Punkte: "+ points
Text 1,750, "Level : "+ level


If KeyDown(203) Then xk=xk-2
If KeyDown(205) Then xk=xk+2
If KeyDown(208) Then yk=yk+2
If KeyDown(200) Then yk=yk-2


If KeyDown(1) Then
End
End If


If ImagesCollide(viereck, xk, yk, ramen, hindernis1, 150, 260, ramen) Then
live=live-1
xk = 50
yk = 100
End If
If live=-0 Then
endinsek
End If

Flip
Until ImagesCollide(viereck,xk, yk, ramen, ziel, 400, 400, ramen)

xk = 180
yk = 1

points=points+500

level=level+1

;----------------------------------------------<Level2>----------------------------------------------

Repeat
Cls

DrawImage viereck,xk,yk
DrawImage hindernis3,100,100
DrawImage ziel,440,100

Text 1,705, "Leben : "+ live
Text 1,720, "Bonus : "+ bonusbenutzt
Text 1,735, "Punkte: "+ points
Text 1,750, "Level : "+ level


If KeyDown(203) Then xk=xk-2
If KeyDown(205) Then xk=xk+2
If KeyDown(208) Then yk=yk+2
If KeyDown(200) Then yk=yk-2

If ImagesCollide(viereck, xk, yk, ramen, hindernis3, 100, 100, ramen) Then
live=live-1
xk = 100
yk = 1
End If
If live=0 Then
endinsek
End If


If KeyDown(1) Then
End
End If

Flip
Until ImagesCollide(viereck, xk, yk, ramen, ziel, 440, 100, ramen)

xk = 5
yk = 5

hx = 150
hy = 190

points=points+500

level=level+1

;----------------------------------------------<Level3>----------------------------------------------

Repeat
Cls


DrawImage viereck,xk,yk
DrawImage hindernis4,hx,hy
DrawImage ziel,400,400
DrawImage bonus,300,60

Text 1,705, "Leben : "+ live
Text 1,720, "Bonus : "+ bonusbenutzt
Text 1,735, "Punkte: "+ points
Text 1,750, "Level : "+ level

If KeyDown(203) Then xk=xk-2
If KeyDown(205) Then xk=xk+2
If KeyDown(208) Then yk=yk+2
If KeyDown(200) Then yk=yk-2


If ImagesCollide(viereck, xk, yk, ramen, hindernis4, hx, hy, ramen) Then
live=live-1
xk = 5
yk = 5
End If
If live=-0 Then
endinsek
End If

If ImagesCollide(viereck, xk, yk, ramen, bonus, 300, 60, ramen) Then
If Not bonusbenutzt=1 Then
bonusbenutzt=1
points=points+1000
End If
End If

If KeyDown(1) Then
End
End If

Flip
Until ImagesCollide(viereck, xk, yk, ramen, ziel, 400, 400, ramen)

points=points+500

level=level+1

xk = 1
yk = 1

;----------------------------------------------<Level4>----------------------------------------------

Repeat
Cls

DrawImage viereck,xk,yk
DrawImage hindernis5,100,100
DrawImage ziel,320,130

Text 1,705, "Leben : "+ live
Text 1,720, "Bonus : "+ bonusbenutzt
Text 1,735, "Punkte: "+ points
Text 1,750, "Level : "+ level


If KeyDown(203) Then xk=xk-2
If KeyDown(205) Then xk=xk+2
If KeyDown(208) Then yk=yk+2
If KeyDown(200) Then yk=yk-2



If ImagesCollide(viereck, xk, yk, ramen, hindernis5, 100, 100, ramen) Then
live=live-1
xk = 1
yk = 1
End If
If live=-0 Then
endinsek
End If

If KeyDown(57) Then
DrawImage shoot, xk, yk
End If

If KeyDown(1) Then
End
End If

Flip
Until ImagesCollide(viereck, xk, yk, ramen, ziel, 320, 130, ramen)

xk = 20
yk = 20

points=points+500

level=level+1

;----------------------------------------------<Level5>----------------------------------------------


Repeat
Cls

DrawImage viereck,xk,yk
DrawImage hindernis6,100,100
DrawImage ziel,410,190
DrawImage bonus,194,402
DrawImage bonus,342,412
DrawImage herz,1,1

Text 1,705, "Leben : "+ live
Text 1,720, "Bonus : "+ bonusbenutzt
Text 1,735, "Punkte: "+ points
Text 1,750, "Level : "+ level


If KeyDown(203) Then xk=xk-2
If KeyDown(205) Then xk=xk+2
If KeyDown(208) Then yk=yk+2
If KeyDown(200) Then yk=yk-2



If ImagesCollide(viereck, xk, yk, ramen, bonus, 194, 402, ramen) Then
If Not bonusbenutzt=2 Then
bonusbenutzt=2
points=points+1000
End If
End If
If ImagesCollide(viereck, xk, yk, ramen, bonus, 342, 412, ramen) Then
If Not bonusbenutzt=3 Then
bonusbenutzt=3
points=points+1000
End If
End If

If ImagesCollide(viereck, xk, yk, ramen, hindernis6, 100, 100, ramen) Then
live=live-1
xk = 20
yk = 20
End If
If live=-0 Then
endinsek
End If

If KeyDown(57) Then
DrawImage shoot, xk, yk
End If

If KeyDown(1) Then
End
End If

Flip
Until ImagesCollide(viereck, xk, yk, ramen, ziel, 410, 190, ramen)




EDIT 2 ::

Hier mal der ganze script zum downloaden ABER: bildercodes müssen nachgetragen also wenn du das alles in einem ordner speicherst, musst du auch im script den bilderpfad nachtragen:

http://www.mydownloads.wg.vu/e.../Spiel.rar
Kentnisse: QB, BB, HTML,
 

PCfreak

BeitragSo, Jun 13, 2010 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
wie mache ich im grafikfenster eine eingabe, die locatet also wie text 1,1, "blah" ist ?
Kentnisse: QB, BB, HTML,

Hubsi

BeitragSo, Jun 13, 2010 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit einer eigenen Inputroutine. Das ist im Prinzip nicht schwer. Wenn es Dich zum jetzigen Zeitpunkt noch überfordert (ist keine Schande) kannst Du im Codearchiv auch fertige finden. Zum selberbasteln brauchst Du:

getkey
chr

und je nachdem wie weit Du sie ausbauen willst noch diverse Stringfunktionen, siehe https://www.blitzforum.de/help/?subcat=21
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Midimaster

BeitragSo, Jun 13, 2010 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Texteingabe

auch hierzu findest Du in Kapitel IV meines Timer-Tutorial eine fertige Lösung.
https://www.blitzforum.de/foru...555#364555
Dort gibt es einen Abschnitt "Ein Texteingabe-Feld, während das Spiel weiterläuft ", der genau die von dir gesuchte Lösung ist.


Die String-Eingabe INPUT wird dabei durch die Zeichenengabe GETKEY() ersetzt. GETKEY() erwartet immer nur ein Zeichen vom User. Daraus setzt du dann den eigentlichen String zusammen und bringst ihn Stück für Stück mittels TEXT auf den Bildschirm.

logischer Ablauf (Pseudocode):
Code: [AUSKLAPPEN]
Repeat
   Zeichen=GETKEY()
   Wort=Wort+ Zeichen
   Text Wort
Until Zeichen=RETURN

Das Ende der Eingabe ist gekommen, wenn der Spieler die RETURN-Taste gedrückt hat. In dem oben genannten Beispiel wird das Ganze so in eine Funktion gepackt, dass du es später in jedes beliebige Programm einbauen kannst.

Die ganze Funktion ist für einen Anfänger nicht so superleicht zu verstehen, weil da doch noch einige Spezialdinge wie z.B. ein blinkender Cursor oder eine Möglichkeit der Fehlerkorrektur enthalten sind, aber lehrreich ist es allemal.



Dein Code
deinen Code kannst du stark verkürzen, wenn du das Tutorial "Programm-Ablauf" einmal durchlesen würdest. Dort wird dir erklärt, wie man mehrere Level nicht immer wieder neu schreiben muss. https://www.blitzforum.de/foru...716#355716

Ich rate dir dringend, den Code dahingehend umzubauen, sonst blickst du nach einiger Zeit nicht mehr durch.

Die Lösung immer wiederkehrender sehr ähnlicher Code-Teile sind "Funktionen". Mit Ihrer Hilfe beschreibst du den Teil des Programms, der immer wiederkehrt. Und durch Verändern von Variablen steuerst du dann, dass in der Funktion nicht immer das gleiche passiert.

Ich geh das mal anhand deines Codes mit dir durch:

Kern deiner Level sind diese Zeilen:

BlitzBasic: [AUSKLAPPEN]
Repeat
Cls

DrawImage viereck,xk,yk
DrawImage ziel,400,400
DrawImage hindernis1, 150,260

Text 1,705, "Leben : "+ live
Text 1,720, "Bonus : "+ bonusbenutzt
Text 1,735, "Punkte: "+ points
Text 1,750, "Level : "+ level

If KeyDown(203) Then xk=xk-2
If KeyDown(205) Then xk=xk+2
If KeyDown(208) Then yk=yk+2
If KeyDown(200) Then yk=yk-2

If KeyDown(1) Then
End
End If

If ImagesCollide(viereck, xk, yk, ramen, hindernis1, 150, 260, ramen) Then
live=live-1
xk = 50
yk = 100
End If
If live=-0 Then
endinsek
End If

Flip
Until ImagesCollide(viereck,xk, yk, ramen, ziel, 400, 400, ramen)



Schritt 1
Die schreibst Du in eine Funktion am Ende deines Codes und dort wo der ganze Code stand schreibst du nur noch den Aufruf dieser Funktion. Wir nennen die Fuktion mal Spielrunde():

BlitzBasic: [AUSKLAPPEN]
....
MaskImage hindernis6, 255, 255, 255
MaskImage herz, 255, 255, 255
MaskImage hindernis7, 255, 255, 255
;----------------------------------------
SpielRunde()

xk = 180
yk = 1

points=points+500

level=level+1
.....
.....
.....
Function Spielrunde()
Repeat
Cls

DrawImage viereck,xk,yk
DrawImage ziel,400,400
DrawImage hindernis1, 150,260

Text 1,705, "Leben : "+ live
Text 1,720, "Bonus : "+ bonusbenutzt
Text 1,735, "Punkte: "+ points
Text 1,750, "Level : "+ level

If KeyDown(203) Then xk=xk-2
If KeyDown(205) Then xk=xk+2
If KeyDown(208) Then yk=yk+2
If KeyDown(200) Then yk=yk-2

If KeyDown(1) Then
End
End If

If ImagesCollide(viereck, xk, yk, ramen, hindernis1, 150, 260, ramen) Then
live=live-1
xk = 50
yk = 100
End If
If live=-0 Then
endinsek
End If

Flip
Until ImagesCollide(viereck,xk, yk, ramen, ziel, 400, 400, ramen)
End Function


Schritt 2

Nun kommt vor den Funktionsaufruf ein Bereich, wo man abhängig vom Level bestimmte Werte setzen kann:

BlitzBasic: [AUSKLAPPEN]
....
MaskImage herz, 255, 255, 255
MaskImage hindernis7, 255, 255, 255
; hier kommen die Werte von Level 1 rein
Spielrunde()

; hier kommen die Werte von Level 2 rein
Spielrunde()

Dort werden wir später sie Unterschiede der Levels eintragen.

Schritt 3
Nun vergleichst Du, welche Zeilen eigentlich in Level 2 anders sind. Ich sehe da z.b.:
BlitzBasic: [AUSKLAPPEN]
DrawImage ziel,440,100


Daher wird jetzt in der Funktion die X-Koordinate des Ziels nicht mehr als Wert sondern als Variable geschrieben...
BlitzBasic: [AUSKLAPPEN]
DrawImage ziel,ZielX,100
....
Until ImagesCollide(viereck, xk, yk, ramen, ziel, ZielX, 100, ramen)
(Da die 440 auch bei dem Until auftaucht, änderst du sie auch dort auf ZielX um.)

...und ihr Wert wird vorher gesetzt:

BlitzBasic: [AUSKLAPPEN]

MaskImage herz, 255, 255, 255
MaskImage hindernis7, 255, 255, 255
; hier kommen die Werte von Level 1 rein
ZielX=400
Spielrunde()

; hier kommen die Werte von Level 2 rein
ZielX=440
Spielrunde()
....





Auch die Hindernisse sind andere. Also kommt auch hier in den Vor-Block:

BlitzBasic: [AUSKLAPPEN]

MaskImage herz, 255, 255, 255
MaskImage hindernis7, 255, 255, 255
; hier kommen die Werte von Level 1 rein
ZielX=400
locHindernis=Hindernis1
Spielrunde()


; hier kommen die Werte von Level 2 rein
ZielX=440
locHindernis=Hindernis3
Spielrunde()
....



und in der Funktion änderst du:
BlitzBasic: [AUSKLAPPEN]

Repeat
....
DrawImage ziel,ZielX,100
DrawImage locHindernis, hX, hY
.....
If ImagesCollide(viereck, xk, yk, ramen, locHindernis, 150, 260, ramen) Then
....
....

Im 3.Level hattest du, wie ich sehe, so etwas auch schon angedacht! Dort hast du dem Hindernis keine festen Koordinaten mehr gegeben, sondern sie hX und hY genannt. Gut gemacht! Jetzt musst du es nur auch im Level 1 und 2 so anwenden:
BlitzBasic: [AUSKLAPPEN]
....
MaskImage herz, 255, 255, 255
MaskImage hindernis7, 255, 255, 255
; hier kommen die Werte von Level 1 rein
ZielX=400
locHindernis=Hindernis1
hX=150
hY=260
Spielrunde()


; hier kommen die Werte von Level 2 rein
ZielX=440
locHindernis=Hindernis3
hX=100
hY=100
Spielrunde()
....



So arbeitest Du jetzt den gesamten Code aller Levels auf Unterschiede durch und schreibst die besser in den Vor-Block.

Ganz wichtig!

Da die Variablen jetzt im Hauptprogramm und in der Funktion zur Verfügung stehen sollen, müssen sie alle GLOBAL definiert werden. also kommen ganz an den Anfang deines Codes diese Zeilen:
BlitzBasic: [AUSKLAPPEN]
Global ZielX%, hX%, hY%, locHindernis%
Global VierEck%, Xk%, Yk%, Live%, BonusBenutzt%, Points%, Level%, Ramen%, Ziel%

und darunter auch noch alle anderen Variablen, die Du in der Funktion verwendest.
 

PCfreak

BeitragSo, Jun 13, 2010 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke =) das mit dem 3. level, wo ich diese hx, hy koordinaten gesetzt habe, das war eig. dazu gedacht das objekt zu bewegen. da ich es vergessen habe umzuändern habe ich ja schon einen vorteil geschaffen =)

ich bedanke mich für diese hilfe und werde das forum weiterempfehlen Wink

Mit freundlichen Grüßen,
PCfreak
Kentnisse: QB, BB, HTML,
 

PCfreak

BeitragMi, Jun 30, 2010 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi entschuldigt dass ich ein letztes mal störe aber ich habe mich gefragt, kann ich kommazahlen zu ganzten zahlen wandeln ?

ich habe folgenden code:

BlitzBasic: [AUSKLAPPEN]
Repeat
xzeitx# = xzeitx# + 0.02
Text 1,1, "Zeit : "+ xzeitx
Until KeyDown(1)


diese Kommazahl die raus kommt, mlchte ich auf eine ganze zahl kürzen; wie ?
Kentnisse: QB, BB, HTML,

Xeres

Moderator

BeitragMi, Jun 30, 2010 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Repeat
xzeitx# = xzeitx# + 0.02
Text 1,1, "Zeit : "+ Int(xzeitx)
Until KeyDown(1)

Siehe auch: Floor, Ceil
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)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group