Algorythmus-Fehler bei Skript-Auswertung?

Für allgemeine Fragen zur Programmierung mit PureBasic.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von TheCreepyProgramer »

Hallo PureBoard,

ich habe im Moment einen komischen Fehler in meinem Programm (2D-Spiel). Das Programm soll eine Textdatei auslesen, die folgendermaßen aufgebaut ist:

Code: Alles auswählen

wall(30)
wall(1):way(28):wall(1)
Die erste Zeile wird auch richtig ausgewertet, allerdings die zweite nicht, denn es kommt folgendes beim Kompillieren heraus:
Bild

Uploaded with ImageShack.us
In der zweiten Reihe sollte allerdings links und rechts nur einmal das Mauern-Bild sein und dazwischen Weg. Einen Fehler habe ich nicht gefunden, was eigentlich heißen müsste, dass mein Gehirn verkontet ist :D

Kann mir einer helfen?

level_script.pbi:

Code: Alles auswählen

Declare GetSingleBlock(line.s, lineNumber)
Declare GetMultipleBlock(line.s, lineNumber, anzBlocks)

Procedure DrawLevelOnScreen(lvl.s)
	lFile = ReadFile(#PB_Any, ProgramPath$+"level\"+lvl+".lvl")
	lineNo = 0
	While Eof(lFile) = 0
		line$ = ReadString(lFile)
		If CountString(line$, ":") = 0
			GetSingleBlock(line$, lineNo)
		Else
			GetMultipleBlock(line$, lineNo, CountString(line$, ":"))
		EndIf
		lineNo + 1
	Wend
EndProcedure

Procedure GetSingleBlock(line.s, lineNumber)
	sWall = LoadSprite(#PB_Any, ProgramPath$+"data\wall.png")
	sWay = LoadSprite(#PB_Any, ProgramPath$+"data\way.png")
	Select StringField(line, 1, "(")
		Case "wall"
			anz = Val(RemoveString(StringField(line, 2, "("), ")"))
			For i = 0 To anz - 1
				DisplaySprite(sWall, i * 30, lineNumber * 30)
			Next
	EndSelect
EndProcedure

Procedure GetMultipleBlock(line.s, lineNumber, anzBlocks)
	sWall = LoadSprite(#PB_Any, ProgramPath$+"data\wall.png")
	sWay = LoadSprite(#PB_Any, ProgramPath$+"data\way.png")
	akt_Block = 0
	For i = 0 To anzBlocks
		part.s = StringField(line, i + 1, ":")
		Select StringField(part, 1, "(")
			Case "wall"
				anz = Val(RemoveString(StringField(line, 2, "("), ")"))
				For j = akt_Block To anz + akt_Block
					DisplaySprite(sWall, j * 30, lineNumber * 30)
				Next
				akt_Block + anz
			Case "way"
				anz = Val(RemoveString(StringField(line, 2, "("), ")"))
				For jj = akt_Block To anz + akt_Block
					DisplaySprite(sWay, j * 30, lineNumber * 30)
				Next
				akt_Block + anz
		EndSelect
	Next
EndProcedure
Die kompletten Dateien:
http://www.mediafire.com/?1vh71e3pe1a1x8v

TheCreepyProgramer
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von STARGÅTE »

Du solltest unten in der Schleife bei GetMultipleBlock() auch die Variable "part" nutzen, statt die ganze Zeile.
Du hast da im Select-Block immer noch "line" stehen.

Frage:
Wieso lädst du für jede Wand die Bilder neu ?
Es wäre besser du lädst die Grafiken vorerst und weist dann die Sprite-Nummern zu.
Jedem Feld (bzw. jedem Script-Befehl) eine eigene Grafik zu geben ist unglaubliche Speicherverschwendung
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von TheCreepyProgramer »

Danke, hat geklappt. Aber ich lade doch die Grafiken nur für jede Reihe neu, oder? Auf einem 64-bit System mit 4 GB RAM und 2,8 GHz merkt man das nicht so.
Jetzt sieht es nur so aus:
Bild

Uploaded with ImageShack.us

Hast du bitte vielleicht eine Ahnung, wie ich die letzte Grafik weg bekomme? Schonmal danke.
Edit: Wenn ich in der 2. Zeile das letzte wall(1) durch wall(0) ersetze, stimmt es.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von STARGÅTE »

Du musst auch unten bei DisplaySprite() dein "jj" nehmen wie in der Schleife, nicht "j" wie oben.
anz = Val(RemoveString(StringField(line, 2, "("), ")"))
For jj = akt_Block To anz + akt_Block
   DisplaySprite(sWay, j * 30, lineNumber * 30)
Next
akt_Block + anz
Aber ich lade doch die Grafiken nur für jede Reihe neu, oder?
Ja genau, Wozu? Wieso lädst du alle Grafiken nicht vorher ?

Noch ein Hinweis:

Code: Alles auswählen

For jj = akt_Block To anz + akt_Block
würde dir bei anz = 1 immer 2 Blöcke erstellen.
nämlich bei akt_Block und bei akt_Block+1

Dort musst du also eh noch Anpassungen vornehmen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von TheCreepyProgramer »

Okay, danke. Es geht jetzt so, wie ich es will, jedoch kann ich den Sprite "player.png" nicht bewegen.

Code: Alles auswählen

InitSprite()
InitKeyboard()
UsePNGImageDecoder()

Global ProgramPath$ = GetPathPart(ProgramFilename())

XIncludeFile "level.pbi"

hWnd = OpenWindow(#PB_Any, 0, 0, 960, 640, #Name, #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
If hWnd
	hScr = OpenWindowedScreen(WindowID(hWnd), 0, 0, 960, 640, 0, 0, 0)
	If hScr = 0
		MessageRequester(#Name, "Can't open screen!")
		End
	EndIf
	
	DrawLevelOnScreen("level1")
	
	sPlayer = LoadSprite(#PB_Any, ProgramPath$+"data\player.png")
	DisplaySprite(sPlayer, 30, 30)
	
	ExamineKeyboard()
	sPosX = 1
	sPosY = 1
	
	Repeat
		FlipBuffers()
		hEvent = WaitWindowEvent()
		Select hEvent
			Case #PB_Event_CloseWindow
				Quit = 1
		EndSelect
		If KeyboardPushed(#PB_Key_D)
			sPosX + 1
			DisplaySprite(sPlayer, sPosX * 31, sPosY * 30)
		EndIf
	Until Quit = 1
EndIf
End
Beim Drücken von "D" passiert nichts.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von STARGÅTE »

Weil du dein Projekt völlig falsch aufgebaut hast.

Alles was im Screen sein soll muss jedes mal neu gezeichnet werden, wenn der Screen aktuallisiert wird!

Im Screen WaitWindowEvent() zu nutzen hält die gesamte Anwendung auf ...

DisplaySprite(sPlayer, sPosX * 31, sPosY * 30)
muss immer ausgeführt werden, nicht nur wenn du die Taste drückst.

Genauso wie DrawLevelOnScreen().

Auch ExamineKeyboard() muss immer ausgeführt werden, in der Schleife

Hier bitte ich dich folgendes Hilfe-Thema anzuschauen:
OpenWindowedScreen()

Dort wird der "richtige" Aufbau gezeigt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von ts-soft »

<offtopic>
Wäre schön, wenn aus dem Wort Skript Code gemacht wird. PB enthält keinen Interpreter, es gibt
keine Skripte. PB-Sourcen als Skript zu bezeichnen empfinde ich als Beleidigung :freak:
</offtopic>
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von STARGÅTE »

<offtopic>
Er bezog sich ja bei dem Title aus seine Datei, in der er ein Script geschrieben hat, zum erzeugen des Levels.
</offtopic>
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von ts-soft »

STARGÅTE hat geschrieben:<offtopic>
Er bezog sich ja bei dem Title aus seine Datei, in der er ein Script geschrieben hat, zum erzeugen des Levels.
</offtopic>
Dann sei Ihm verziehn :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: Algorythmus-Fehler bei Skript-Auswertung?

Beitrag von TheCreepyProgramer »

Den Spieler kann man allerdings immer noch nicht bewegen. Aber eine frage: Wieso muss ich die Welt immer neuladen, wenn sich dieselbe nicht ändert?

Code: Alles auswählen

InitSprite()
InitKeyboard()
UsePNGImageDecoder()

Global ProgramPath$ = GetPathPart(ProgramFilename())

XIncludeFile "level.pbi"

hWnd = OpenWindow(#PB_Any, 0, 0, 960, 640, #Name, #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
If hWnd
	hScr = OpenWindowedScreen(WindowID(hWnd), 0, 0, 960, 640, 0, 0, 0)
	If hScr = 0
		MessageRequester(#Name, "Can't open screen!")
		End
	EndIf
	
	DrawLevelOnScreen("level1")
	
	sPlayer = LoadSprite(#PB_Any, ProgramPath$+"data\player.png")
	ExamineKeyboard()
	sPosX = 1
	sPosY = 1
	
	Repeat
		Repeat
			hEvent = WindowEvent()
			Select hEvent
				Case #PB_Event_CloseWindow
					End
			EndSelect
		Until hEvent = 0
		FlipBuffers()
		ClearScreen(RGB(0, 0, 0))
		DrawLevelOnScreen("level1")
		
		DisplaySprite(sPlayer, sPosX * 31, sPosY * 31)
		If KeyboardPushed(#PB_Key_D)
			sPosX + 1
		ElseIf KeyboardPushed(#PB_Key_S)
			sPosY + 1
		ElseIf KeyboardPushed(#PB_Key_A)
			sPosX - 1
		ElseIf KeyboardPushed(#PB_Key_W)
			sPosY - 1
		EndIf
	ForEver
EndIf
End
Spieler bewegt sich einfach nicht.
:iamwithstupid:
TheCreepyProgramer
Bild
Antworten