Labyrinth: Spielfigur bewegt sich nicht

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Lulu

Betreff: Labyrinth: Spielfigur bewegt sich nicht

BeitragMi, Jan 06, 2010 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir müssen in Informatik ein Spiel programmieren und da hab ich erstmal ein Labyrinth genommen.
Also eigentlich nicht sooo schwer, allerdings komm ich einfach nicht weiter.
Mein Männchen soll durch dieses Labyrinth gehen, aber irgendwie hängt das am Anfang fest und bewegt sich gar nicht mehr, höchstens ein Milimeter in jede Richtung.
Ich weiß nicht was ich falsch mache.
Vielleicht könnt ihr mir ja helfen, ich bin echt verzweifelt und muss das bis heute Abend fertig haben! Sad

Code: [AUSKLAPPEN]
 AppTitle "Find the right way!";

musik=LoadSound ("Yellowcard-Everywhere.mp3");
LoopSound musik;
PlaySound musik;


Graphics 1450, 890;
Labyrinth =LoadImage ("Labyrinth.bmp");
MaskImage Labyrinth, 0,0,0;
ScaleImage Labyrinth, 1.6,1.6;
a=10;
b=10;

Ritter =LoadImage ("ritter.bmp")
MaskImage Ritter, 255,  255, 255;
ScaleImage Ritter, 0.2,0.2;
x=2;
y=720;


SetBuffer BackBuffer();
x_pos_old=x;
y_pos_old=y;
While Not KeyHit(1);

If ImagesCollide(Ritter,x,y,0,Labyrinth,a,b,0);
EndIf;
x=x_pos_old;
y=y_pos_old;

If KeyDown(205);
x=x+5;
EndIf;
If KeyDown(203);
x=x-5;
EndIf;
If KeyDown(200);
y=y-5;
EndIf;
If KeyDown(208);
y=y+5;
EndIf;
Delay(1);
Cls;


DrawImage Labyrinth,a,b;
DrawImage Ritter,x,y;
Flip;
Wend;


Ich hab mal den ganzen Code gepostet. Ich hoffe ihr findet den Fehler! Smile

Liebe Grüße, Luisa Smile

~EDITIERT~
Bitte benutze aussagekräftigere Titel für deine Themen. Titel angepasst. MfG D2006

Nicdel

BeitragMi, Jan 06, 2010 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Du brauchst keine Strichpunkte hinter den Befehlen. Strichpunkte sind Kommentare Wink
2. Die Auflösung ist Seltsam. Nimm normale Auflösungen, wie 1280x1024 oder 1024x768.
3. Ich glaube hier ist der Fehler:
Code: [AUSKLAPPEN]
x_pos_old=x;
y_pos_old=y;

Mach das mal raus.
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

BladeRunner

Moderator

BeitragMi, Jan 06, 2010 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn euer Lehrer will das ihr ein spiel schreibt sollte er Euch vorher Grundlagen vermitteln.
Wenn er es in BB haben will sollte er auch da die Grundlagen beherrschen und weitergeben.
Ansonsten sind wir nicht da um Eure Hausaufgaben zu erledigen Wink

Dennoch viel Erfolg.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Lulu

BeitragMi, Jan 06, 2010 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir haben gewisse Grundlagen lieber Moderator, aber ich suche ja einen Fehler den ich selber nicht finde und da wir noch Ferien haben, kann ich meinen Lehrer leider nicht fragen.

Abgesehen davon, mein Männchen kann immer noch nicht laufen, ich hab die Strichpunkte jetzt entfernt.

BladeRunner

Moderator

BeitragMi, Jan 06, 2010 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
In welcher Sprache wird der Unterricht denn gehalten?
Und wenn du die ganzen Ferien Zeit hattest, warum fängst Du heut erst an?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Lulu

BeitragMi, Jan 06, 2010 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
in informatisch-deutsch! Wink
Und ich fange nicht erst heute damit an.

Holzchopf

Meisterpacker

BeitragMi, Jan 06, 2010 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm mal die ZeilenBlitzBasic: [AUSKLAPPEN]
x_pos_old=x
y_pos_old=y
in die Hauptschleife rein und schreibe den blockBlitzBasic: [AUSKLAPPEN]
If ImagesCollide(Ritter,x,y,0,Labyrinth,a,b,0)
EndIf
x=x_pos_old
y=y_pos_old
zu dem umBlitzBasic: [AUSKLAPPEN]
If ImagesCollide(Ritter,x,y,0,Labyrinth,a,b,0)
x=x_pos_old
y=y_pos_old
EndIf
und setze ihn hinter den Teil mit den Tastenabfragen.

Das bewirkt, dass er in jedem Durchgang vor der Kollisionsprüfung die alte Position speichert (die wird ja eine sein, wo die Figur nicht kollidierte) und falls er nach dem Bewegen in einer Wand landet, wieder auf die alte, gute, Position zurückgesetzt wird.

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Lulu

BeitragMi, Jan 06, 2010 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Hilfe, mein Männchen bewegt sich nun auch wieder, allerdings halten ihn meine Labyrinth-Wände nciht wirklich auf, es marschiert quer über das Labyrinth hinweg..
hier nochmal mein aktueller Code:

Code: [AUSKLAPPEN]
 AppTitle "Find the right way!";

musik=LoadSound ("Yellowcard-Everywhere.mp3");
LoopSound musik;
PlaySound musik;


Graphics 1450, 890;
Labyrinth =LoadImage ("Labyrinth.bmp");
MaskImage Labyrinth, 0,0,0;
ScaleImage Labyrinth, 1.6,1.6;
a=10;
b=10;

Ritter =LoadImage ("ritter.bmp")
MaskImage Ritter, 255,  255, 255;
ScaleImage Ritter, 0.2,0.2;
x=2;
y=760;


SetBuffer BackBuffer();
While Not KeyHit(1);

x_pos_old=x
y_pos_old=y

If ImagesCollide(Ritter,x,y,0,Labyrinth,a,b,0);
   x=x_pos_old
   y=y_pos_old
EndIf;


If KeyDown(205);
x=x+5;
EndIf;
If KeyDown(203);
x=x-5;
EndIf;
If KeyDown(200);
y=y-5;
EndIf;
If KeyDown(208);
y=y+5;
EndIf;
Delay(1);
Cls;


DrawImage Labyrinth,a,b;
DrawImage Ritter,x,y;
Flip;
Wend;

D2006

Administrator

BeitragMi, Jan 06, 2010 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Verfrachte die ImagesCollide-Prüfung nach den Teil mit den KeyDowns.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

Lulu

BeitragMi, Jan 06, 2010 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ES FUNKTIONIERT!
Vielen, vielen Dank an euch!
Danke! :* :* :*

Tankbuster

BeitragMi, Jan 06, 2010 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will dazu vielleicht noch sagen, dass diese Möglichkeit ein Labyrinth zu erstellen nicht die Beste ist.
Erstens funktioniert ImagesCollide mit manchen Treibern ja nicht, und es sieht für den Info-Lehrer viel besser aus, wenn man sowas aus Tiles erstellt.

Ich mein, ich weiß nicht, welche Anforderungen dein Lehrer stellt. Für den Anfang würde sowas ja reichen, aber wenn ich sowas abliefern würde, wär es nicht umbedingt eine tolle Note.

Ich würde das Labyrinth wie gesagt aus Tiles aufbauen. Damit kann man auch leicht Kollisionen simulieren und co.
Nja, aber da die Ferien (in NRW auf jedenfall) morgen schon zuende sind, hast du vermutlich auch zuwenig Zeit um dich da reinzuarbeiten.

Ach. und ich möchte noch anmerken, dass ich es ziemlich blöd finde, andere Leute deine Hausaufgaben machen zu lassen. Vielleicht nächstesmal nicht alles so auf den letzten Tag verschieben Wink
Twitter
Download Jewel Snake!
Windows|Android
 

Lulu

BeitragMi, Jan 06, 2010 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Hausaufgaben/Arbeit umfasst weitaus mehr als diese eine Sache, ich hatte nur eine Frage bei der ich nicht weiterkam, und ich denke genau dafür, für Frage, ist dieses Forum unter anderem da.
Und tut mir Leid, dass ich nciht so viel Ahnung von Blitzbasic und Tiles oder was auch immer habe wie ihr.
LG Wink

Holzchopf

Meisterpacker

BeitragMi, Jan 06, 2010 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Darf ich kurz fragen, was das für eine Schule ist? Ist das ein Spieledesign-bezogenes Studium /Kurs oder hat einfach ein Lehrer BlitzBasic als anfängerfreundliche Programmiersprache entdeckt? Smile
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Lulu

BeitragMi, Jan 06, 2010 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich gehe auf ein Gymnasium in die 10. Klasse und ich denke ein Lehrer hat Blitzbasic als "anfängerfreundliche Programmiersprache entdeckt"! ^^

Tankbuster

BeitragMi, Jan 06, 2010 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach dann tuts mir Leid. Hab wohl nicht alles gelesen.

Ich würde vielleicht noch ein paar Sachen an deinem Code verbessern Wink
(macht en besseren Eindruck)

So wie er jetzt läuft, verursacht er immer 100% CPU Auslastung. Um das zu beheben hilft es, einen Timer zu erstellen.

Vor der Schleife Erstellst du ihn mit
Code: [AUSKLAPPEN]
timer=WaitTimer(60)


Dann ergänzt du dein Flip durch
Code: [AUSKLAPPEN]

WaitTimer(timer)
Flip 0


Das bewirkt, dass dein Programm mit ~60 Bildern pro Sekunde läuft. Wenn du weniger haben willst, die Zahl bei CreateTimer ändern. Das ist erstens sinnvoll, weil dadurch das System geschont wird, und zweitens siehts etwas professioneller aus und macht einen besseren Eindruck auf den Lehrer.
Das Delay kannst du dann übrigens weglassen. Delay ist böse.
Weitere Infos da: https://www.blitzforum.de/foru...hp?t=25242

Dann noch ein paar Formalitäten.
Wenn du die Variablen vor der Schleife zum ersten mal aufrufst, setz noch ein Local davor, und am besten das Zeichen des Datentyps dahinter. Es wär auch gut, bevor die Schleife anfängt, alle Variablen zu definieren. Beispielsweise x_pos_old% dadurch wird gleich klar, dass es sich um einen Integer handelt. Muss man in bb nicht zwingend machen, aber in fast allen "höheren Sprachen".

BlitzBasic: [AUSKLAPPEN]
Local musik%=LoadSound ("Yellowcard-Everywhere.mp3");
LoopSound musik;
PlaySound musik;


Graphics 1450, 890;
Local Labyrinth%=LoadImage ("Labyrinth.bmp");
MaskImage Labyrinth, 0,0,0;
ScaleImage Labyrinth, 1.6,1.6;
Local a%=10;
Local b%=10;

Local Ritter%=LoadImage ("ritter.bmp")
MaskImage Ritter, 255, 255, 255;
ScaleImage Ritter, 0.2,0.2;
Local x%=2;
Local y%=760;
Local x_pos_old%
Local y_pos_old%

SetBuffer BackBuffer();
While Not KeyHit(1);
....


Das ist ordentlicher und sieht ebenfalls noch etwas professioneller aus. Wink

Und diese ";" ... naja, Geschmackssache. Ich würd sie weglassen. Ist doch viel zu umständlich immer auf die taste zu drücken Laughing

Wie gesagt, nur ein paar Schönheitstipps. Bis auf die Sache mit dem Timer, das solltest du auf jedenfall umsetzen.

MFG
Twitter
Download Jewel Snake!
Windows|Android
 

Lulu

BeitragMi, Jan 06, 2010 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Verbesserungsvorschläge! Smile
Ich hab diesen Timer mal eingefügt, aber wenn ich das Spiel dann starten will, kommt "illegal memory adress" und nur meine Musik läuft.

Mit dem "Local" davor setzen, weiß ich nicht, was das bringt. Das ist jetzt nciht böse gemeint, sondern ich hab nicht so viel Ahnung von Blitzbasic und dieses Local würde mich wahrscheinlich nur verwirren. Aber vielleicht schreib ichs später dann noch hin.

Zu dem ";" - Semikolon ... unser Lehrer meinte, das müsste dahin und man dürfe das auch nicht vergessen, deswegen mach ich das. Smile

Ansonsten noch mal vielen Dank für die Tipps! Smile

LG Very Happy

Tankbuster

BeitragMi, Jan 06, 2010 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Sagen wir so. Es gibt Lokale und Globale Variablen. Von Natur aus sind alle Variablen Lokal. Deshalb macht es technisch keinen Unterschied ob du das Local davorsetzt. Globale Variablen sind im ganzen Programm auch in Funktionen ansprechbar. Ich will dich aber auch nicht verwirren, da ich nicht weiß ob du Funktionen überhaupt schon im unterricht durchgnommen hast.

Wie sieht dein Code denn jetzt mit dem Timer aus?
Wenn du alles richtig gemacht hättest, würde der Fehler wohl nicht kommen Wink

AUßerdem gibt es den Debug Modus. Klick in Blitz oben in der Zeile auf "Program" und dann "Debug Enabled?"
Dann zeigt der Debugger dir die Fehlerhafte Zeile sofort an Wink


EDIT: Ach es muss vor der Schleife heißen Code: [AUSKLAPPEN]
timer=CreateTimer(60)
und nicht waittimer Embarassed
Twitter
Download Jewel Snake!
Windows|Android
 

Lulu

BeitragMi, Jan 06, 2010 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt kommt da "unable to set graphics mode" Kannst du mir sagen was das jetzt heißt?
Ich den Timer auch weggemacht und das kommt immer noch.
Mein Code sieht jetzt mit Timer komplatt so aus:

Code: [AUSKLAPPEN]
 AppTitle "Find the right way!";


Graphics 1200, 800, 0, 2
SetBuffer BackBuffer()

Global VSYNC = CreateTimer(60)
Global menu1 = LoadImage ("Menu1.bmp")
Global menu2 = LoadImage ("Menu2.bmp")
Global menu3 = LoadImage ("Menu3.bmp")

Global menu

menu = 1                                                         
; Menu=1 --> Hauptmenu, Menu=2 -->Rules, Menu = 3 --> Options, Leertaste zurück ins Hauptmenu

FlushKeys()                                                      
; Tastaturpuffer löschen
Repeat
   WaitTimer (VSYNC)
   Cls
   Select menu
      Case 0
         Exit
      Case 1
         DrawBlock menu1, 0, 0
      Case 2
         DrawBlock menu2, 0, 0
      Case 3
         DrawBlock menu3, 0, 0
   End Select

   ; Wenn ESC dann Programm beenden
   If KeyHit(1) Then End
   KeyControll()                                                 
   ; Funktion KeyControll aufrufen

   Flip
Forever

; Hier geht es weiter wenn du ENTER drückst!!!!!





Function KeyControll()
   ; Wenn Taste <ENTER> dann diese Schleife verlassen und nach Forever weiter --> zur Spielschleife oder
   If KeyDown(28)
      menu = 0
   ; Wenn Taste <R> oder <r> dann die RULES aufrufen
   ElseIf KeyDown(19)
      menu = 2   
   ; Wenn Taste <S> oder <s> dann die OPTIONS aufrufen
   ElseIf KeyDown(31)
      menu = 3
   ElseIf KeyDown(57)
      menu = 1
   EndIf
End Function



musik=LoadSound ("Yellowcard-Everywhere.mp3");
LoopSound musik;
PlaySound musik;


Graphics 1450, 890;
Labyrinth =LoadImage ("Labyrinth2.bmp");
MaskImage Labyrinth, 0,0,0;
ScaleImage Labyrinth, 1.6,1.6;
a=10;
b=10;

Ritter =LoadImage ("ritter.bmp")
MaskImage Ritter, 255,  255, 255;
ScaleImage Ritter, 0.3,0.3;
x=2;
y=760;


SetBuffer BackBuffer();

timer=WaitTimer(60)

While Not KeyHit(1);

x_pos_old=x
y_pos_old=y


If KeyDown(205);
x=x+3;
EndIf;
If KeyDown(203);
x=x-3;
EndIf;
If KeyDown(200);
y=y-3;
EndIf;
If KeyDown(208);
y=y+3;
EndIf;
Delay(1);
Cls;

If ImagesCollide(Ritter,x,y,0,Labyrinth,a,b,0);
   x=x_pos_old
   y=y_pos_old
EndIf;


DrawImage Labyrinth,a,b;
DrawImage Ritter,x,y;

WaitTimer(timer);
Flip 0;
Wend;


Am Anfang das, das ist mein Menü und das funktioniert auch... als einziges. ^^

Nicdel

BeitragMi, Jan 06, 2010 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Graphics 1450, 890;


Ziemlich schräg. So etwas unterstützt kein Monitor. Versuch mal 1024x768 oder geh in den Fenstermodus.
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

Tankbuster

BeitragMi, Jan 06, 2010 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach ehm...

Also ich weiß nicht, was dein Code bewirken soll, aber es ist auf jedenfall klar, dass das Spiel an sich (das Labyrinth) niemals ausgeführt wird. Es hängt sich oben in der Endlosschleife fest. Sollte das oben sowas wie ein Menü sein?


PS:"unable to set graphics mode" heißt, dass die Auflösung von 1200, 800, 0, 2 auf deinem PC nicht möglich ist.
Twitter
Download Jewel Snake!
Windows|Android

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group