<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - Bomberman Klon (Community Tutorial) BMAX</title>
		<link>https://www.blitzforum.de/worklogs/394/</link>
		<description>Worklog von KirkZero</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Wed, 27 Oct 2010 07:44:38 +0200</pubDate>
		<lastBuildDate>Wed, 27 Oct 2010 07:44:38 +0200</lastBuildDate>

		<item>
			<title>Back to the... oh man...</title>
			<link>https://www.blitzforum.de/worklogs/394/#2982</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2982</guid>
			<author>KirkZero</author>
			<description>sooo...&lt;br /&gt;Hab mich nun dran versucht mich wieder in meinen Code einzulesen...&lt;br /&gt;Ist garnicht so einfach... will aber das Projekt nicht aufgeben.&lt;br /&gt;(auch wenn es nur ein kleines Licht ist unter den ganzen gro&amp;szlig;en Sachen hier)&lt;br /&gt;&lt;br /&gt;Denke, ich brauch da noch ein wenig Zeit...&lt;br /&gt;werde mein eigenes Worklog mal von unten bis oben durchgehen, denke, wenn ich dann wieder klar komme... dann hab ich mein ziel erreicht... ein kleines Tutorial *freu*&lt;br /&gt;&lt;br /&gt;ToDo:&lt;br /&gt;&lt;br /&gt;- Das Men&amp;uuml;&lt;br /&gt;- Multiplayer an einem Rechner&lt;br /&gt;- Singleplayer&lt;br /&gt;&lt;br /&gt;Das Men&amp;uuml; wird einfach ausfallen... &lt;br /&gt;- primitives Sound an/aus&lt;br /&gt;- Vollbild an/aus&lt;br /&gt;- singleplayer&lt;br /&gt;- multiplayer&lt;br /&gt;&lt;br /&gt;der multiplayer Part wird ein einfaches Deathmatch werden...&lt;br /&gt;&lt;br /&gt;der Singleplayer eine Art &amp;quot;verteidige den H&amp;uuml;gel&amp;quot; oder so... (was man dann auch zu zweit im coop spielen kann)&lt;br /&gt;&lt;br /&gt;Das erstmal soweit von mir...&lt;br /&gt;&lt;br /&gt;Gehe dann mal wieder &amp;quot;Code Lesen&amp;quot; &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Wed, 27 Oct 2010 07:44:38 +0200</pubDate>
		</item>

		<item>
			<title>Animation des Spielers</title>
			<link>https://www.blitzforum.de/worklogs/394/#2891</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2891</guid>
			<author>KirkZero</author>
			<description>&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9370&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das ist die SpielerGrafik, sie besteht aus 20 einzelbildern zu je 32x32 Pixeln. Das allererste Bild (oben links) ist Frame 0 und das letzte (unten rechts) ist Frame 19. Daraus folgt:&lt;br /&gt;das 1. Bild f&amp;uuml;r Bewegung nach oben ist Frame 0 (linkes Bild 1. Reihe)&lt;br /&gt;das 1. Bild f&amp;uuml;r Bewegung nach rechts ist Frame 5 (linkes Bild 2. Reihe)&lt;br /&gt;das 1. Bild f&amp;uuml;r Bewegung nach unten ist Frame 10 (linkes Bild 3. Reihe)&lt;br /&gt;das 1. Bild f&amp;uuml;r Bewegung nach links ist Frame 15 (linkes Bild 4. Reihe)&lt;br /&gt;&lt;br /&gt;Daf&amp;uuml;r nehm ich wieder einmal ein paar Konstante:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Const ANIOBEN			:Int = 0		'StartFrame f&amp;uuml;r Bewegung nach oben&lt;br /&gt;	Const ANIUNTEN			:Int = 10		'StartFrame f&amp;uuml;r Bewegung nach unten&lt;br /&gt;	Const ANILINKS			:Int = 15		'StartFrame f&amp;uuml;r Bewegung nach links&lt;br /&gt;	Const ANIRECHTS		:Int = 5		'StartFrame f&amp;uuml;r Bewegung nach rechts&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9370&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die linken 3 Bilder jeder Reihe sind f&amp;uuml;r die Bewegungsanimation zust&amp;auml;ndig, die rechten 2 Bilder werden erstmal nicht gebraucht, die kommen vielleicht noch sp&amp;auml;ter und w&amp;auml;ren dann f&amp;uuml;r einen &amp;quot;Special Move&amp;quot; &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Somit m&amp;uuml;sste man also immer, wenn der Robo nach oben f&amp;auml;hrt, nacheinander frame 0, dann frame 1, und zum schluss Frame 2 anzeigen lassen.&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Const BEWEGUNGSFRAMES	:Int = 2	'Bewegung besteht aus 3 Frames (0, 1 und 2)&lt;br /&gt;	&lt;br /&gt;	Field SpielerFrame		:Int = 0	'Aktuelles Frame des Spielers&lt;br /&gt;	Field BewegungsFrame	:Int = 0	'Aktuelles Frame der Bewegung&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Die Konstante BEWEGUNGSFRAMES gibt an, wieviele Frames jede Richtung hat. Auch wenn dort die Zahl 2 steht, hat sie dennoch 3, da ja bei 0 angefangen wird zu z&amp;auml;hlen.&lt;br /&gt;&lt;br /&gt;SpielerFrame ist das aktuelle Frame, welches dann auch gezeichnet wird. Es setzt sich aus einer der 4 Konstanten (ANIOBEN, ANIUNTEN,ANILINKS und ANIRECHTS) + dem BewegungsFrame zusammen.&lt;br /&gt;(BewegungsFrame speichert dabei nur den aktuellen Frame der Bewegung, welcher entweder 0,1 oder 2 ist. Ist er &amp;gt; 2 (also &amp;gt; BEWEGUNGSFRAMES) dann wird er wieder auf 0 gesetzt)&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]BewegungsFrame:+1&lt;br /&gt;If BewegungsFrame &amp;gt; BEWEGUNGSFRAMES Then BewegungsFrame=0[/syntax]&lt;br /&gt;&lt;br /&gt;Das ganze packe ich nun in die Methode Bewegung() von TSpieler.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x		:Int 'Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y		:Int&lt;br /&gt;		Local fx		:Int 'Tempor&amp;auml;re Speicher f&amp;uuml;r zu pr&amp;uuml;fende Felder&lt;br /&gt;		Local fy		:Int 'ist fy=-1 wird oberes vom aktuellen Feld gepr&amp;uuml;ft&lt;br /&gt;&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;		&lt;br /&gt;		BewegungsFrame:+1&lt;br /&gt;		If BewegungsFrame &amp;gt; BEWEGUNGSFRAMES Then BewegungsFrame=0&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				fy=-1	'oberes Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANIOBEN+BewegungsFrame&lt;br /&gt;			Case UNTEN&lt;br /&gt;				fy=+1	'unteres Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANIUNTEN+BewegungsFrame&lt;br /&gt;			Case LINKS&lt;br /&gt;				fx=-1	'linkes Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANILINKS+BewegungsFrame&lt;br /&gt;			Case RECHTS&lt;br /&gt;				fx=+1	'rechtes Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANIRECHTS+BewegungsFrame&lt;br /&gt;		End Select&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und jetzt muss ich SpielerFrame noch in der Zeichnen() Methode unterbringen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Zeichnen()&lt;br /&gt;		'DrawRect (xFeld*TS,yFeld*TS,TS,TS) 'Erstmal auskommentiert... vorerst klappt ja alles &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,SpielerFrame)&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;hund hier die Komplette TSpieler.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field SpielerNr		:Int 'Welcher Spieler bin ich? 1,2,3 oder 4&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2 'man bewegt sich immer um 2 Pixel pro Bewegung&lt;br /&gt;	&lt;br /&gt;	Field FeuerKraft		:Int = 2 'Reichweite der Explosionen einer Bombe (2 Felder in alle Richtungen)&lt;br /&gt;	Field BombenMenge		:Int = 1 'Anzahl an Bomben, die der Spieler gleichzeitig legen kann&lt;br /&gt;	Field MaxBombenMenge	:Int = 5 'egal wieviele Items man sammelt, man kann nie mehr legen, als hier verzeichnet&lt;br /&gt;	Field GelegteBomben		:Int 'Wieviel hat der Spieler bereits gelegt und sind noch nicht explodiert?&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Const ANIOBEN			:Int = 0		'StartFrame f&amp;uuml;r Bewegung nach oben&lt;br /&gt;	Const ANIUNTEN			:Int = 10		'StartFrame f&amp;uuml;r Bewegung nach unten&lt;br /&gt;	Const ANILINKS			:Int = 15		'StartFrame f&amp;uuml;r Bewegung nach links&lt;br /&gt;	Const ANIRECHTS		:Int = 5		'StartFrame f&amp;uuml;r Bewegung nach rechts&lt;br /&gt;	&lt;br /&gt;	Const BEWEGUNGSFRAMES	:Int = 2	'Bewegung besteht aus 3 Frames (0, 1 und 2)&lt;br /&gt;	&lt;br /&gt;	Field SpielerFrame		:Int = 0	'Aktuelles Frame des Spielers&lt;br /&gt;	Field BewegungsFrame	:Int = 0	'Aktuelles Frame der Bewegung&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 20&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Bewegung wieder erlaubt (Zeit)&lt;br /&gt;			If 		KeyDown(Taste_Hoch[SpielerNr])	'wenn Taste f&amp;uuml;r OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(OBEN)&lt;br /&gt;			ElseIf 	KeyDown(Taste_Runter[SpielerNr])	'wenn Taste f&amp;uuml;r UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(UNTEN)&lt;br /&gt;			ElseIf 	KeyDown(Taste_Links[SpielerNr])	'wenn Taste f&amp;uuml;r LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(LINKS)&lt;br /&gt;			ElseIf 	KeyDown(Taste_Rechts[SpielerNr])	'wenn Taste f&amp;uuml;r RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(RECHTS)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		If KeyHit(Taste_Aktion[SpielerNr])	'wenn Taste f&amp;uuml;r Aktion gedr&amp;uuml;ckt wird&lt;br /&gt;			BombeLegen() 					'dann Methode zum Bombenlegen aufrufen&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method BombeLegen()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = NIX 'wenn aktuelles Feld leer ist&lt;br /&gt;			If GelegteBomben &amp;lt; BombenMenge And GelegteBomben &amp;lt; MaxBombenMenge&lt;br /&gt;			'wenn bisher weniger Bomben gelegt als man kann UND als man darf&lt;br /&gt;				TBombe.Erstellen(SpielerNr,xFeld,yFeld,FeuerKraft) 'Bombe erstellen&lt;br /&gt;				GelegteBomben:+1 'um 1 erh&amp;ouml;hen, da ja nun eine bombe gelegt wurde&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x		:Int 'Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y		:Int&lt;br /&gt;		Local fx		:Int 'Tempor&amp;auml;re Speicher f&amp;uuml;r zu pr&amp;uuml;fende Felder&lt;br /&gt;		Local fy		:Int 'ist fy=-1 wird oberes vom aktuellen Feld gepr&amp;uuml;ft&lt;br /&gt;&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;		&lt;br /&gt;		BewegungsFrame:+1&lt;br /&gt;		If BewegungsFrame &amp;gt; BEWEGUNGSFRAMES Then BewegungsFrame=0&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				fy=-1	'oberes Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANIOBEN+BewegungsFrame&lt;br /&gt;			Case UNTEN&lt;br /&gt;				fy=+1	'unteres Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANIUNTEN+BewegungsFrame&lt;br /&gt;			Case LINKS&lt;br /&gt;				fx=-1	'linkes Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANILINKS+BewegungsFrame&lt;br /&gt;			Case RECHTS&lt;br /&gt;				fx=+1	'rechtes Feld pr&amp;uuml;fen&lt;br /&gt;				SpielerFrame=ANIRECHTS+BewegungsFrame&lt;br /&gt;		End Select&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld+fx,yFeld+fy].Inhalt = NIX 'wenn auf dem zu pr&amp;uuml;fenden Feld NIX ist&lt;br /&gt;		&lt;br /&gt;			If fy &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld oben oder unten, dann auf Autobewegung checken&lt;br /&gt;				If 		xFeld*TS &amp;lt; xPos	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;				Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;				Else&lt;br /&gt;					y=fy*Speed			'passt es genau, dann um Speed Pixel nach fy bewegen&lt;br /&gt;				End If &lt;br /&gt;			End If&lt;br /&gt;			&lt;br /&gt;			If fx &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld links oder rechts, dann auf Autobewegung checken&lt;br /&gt;				If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;				Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;				Else&lt;br /&gt;					x=fx*Speed			'passt es genau, dann um Speed Pixel nach fx bewegen&lt;br /&gt;				End If&lt;br /&gt;			End If&lt;br /&gt;				&lt;br /&gt;		Else If fy &amp;lt;&amp;gt; 0 And yMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			y=fy*Speed&lt;br /&gt;		Else If fx &amp;lt;&amp;gt; 0 And xMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			x=fx*Speed&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;		&lt;br /&gt;	Method MapFeld() 'berechnet aktuelles Map.Feld[,]&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		If yMod &amp;lt; (TS/2) Then yFeld=(yPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If yMod &amp;gt; (TS/2) Then yFeld=(yPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		If xMod &amp;lt; (TS/2) Then xFeld=(xPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If xMod &amp;gt; (TS/2) Then xFeld=(xPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Update()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Item = ITEM_AUFGEDECKT 'wenn aufgedecktes Item auf SpielerFeld&lt;br /&gt;			For Local Item:TItem = EachIn TItem.ItemListe 'jedes erstellte Item durchgehen&lt;br /&gt;				If xFeld=Item.xFeld And yFeld=Item.yFeld 'wenn richtiges Item gefunden&lt;br /&gt;					Map.Feld[xFeld,yFeld].Item = 0 'ItemFlag auf 0&lt;br /&gt;					Item.Sammler = SpielerNr 'Spieler der es gesammelt hat festlegen&lt;br /&gt;				End If&lt;br /&gt;			Next&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;		&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		'DrawRect (xFeld*TS,yFeld*TS,TS,TS) 'Erstmal auskommentiert... vorerst klappt ja alles &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,SpielerFrame)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (SpielerNr:Int,xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.SpielerNr	= SpielerNr 'welcher Spieler bin ich?&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und schon bewegen sich die Ketten des Robos und er schaut immer in die richtige Richtung &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hier nochmal ein Zitat von Xeres:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;Was mir aufgefallen ist: Dein Spieler Bild hat 4x die Frames die es br&amp;auml;uchte; F&amp;uuml;r die Top-down Ansicht w&amp;uuml;rde ein Frame-Strip reichen und der Rest lie&amp;szlig;e sich durch SetRotation erreichen. Um die, sagen wir &amp;quot;Rotationseffekte&amp;quot; (Drehung um die obere, linke Ecke), zu vermeiden, verwende ich eigentlich immer AutoMidHandle - also gebe immer die Mitte der zu zeichnenden Objekte an, um die auch die Drehung stattfindet. Das ist vermutlich reine Gew&amp;ouml;hnungssache, hat aber seine Vorteile.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ich habe das jetzt zwar anders gemacht, aber in meinen zuk&amp;uuml;nftigen Projekten werde ich es mal auf die Art (SetRotation) versuchen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vielen Dank f&amp;uuml;rs Lesen!</description>
			<pubDate>Wed, 08 Sep 2010 19:06:46 +0200</pubDate>
		</item>

		<item>
			<title>Tastenbelegung und Spieler 2</title>
			<link>https://www.blitzforum.de/worklogs/394/#2889</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2889</guid>
			<author>KirkZero</author>
			<description>Erstmal liegt wieder eine Fehlerkorrektur an. Danke an Hummelpups!!!&lt;br /&gt;Ich habe mit der Art und Weise, mit der ich im letzten Eintrag die Items auf der Map versteckt habe, ziemlichen Mist gebaut.&lt;br /&gt;Sie werden nicht wirklich sch&amp;ouml;n gleichm&amp;auml;ssig verteilt.&lt;br /&gt;&lt;br /&gt;Zitat von Hummelpups:&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;KirkZero, bei deinem &amp;quot;Item setz algo&amp;quot; hast du es dir unn&amp;ouml;tig schwer&lt;br /&gt;und auch noch falsch gemacht. Deine Items laut wahrscheinlichkeitsrechnung&lt;br /&gt;so gesetzt:&lt;br /&gt;&lt;br /&gt;links dein Algo, rechts meiner &lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://0x25.de/tmp/items.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nun hab ich mir Hummelpups Art mal angeschaut. Die Wahrscheinlichkeit ist nicht nur sch&amp;ouml;n gleichm&amp;auml;ssig, sondern die L&amp;ouml;sung ist auch um einiges eleganter.&lt;br /&gt;Somit entsteht eine Neue Methode in TKarte.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method ItemsVerteilen:TKarte (Item:Int,Menge:Int,Map:TKarte)&lt;br /&gt;		For Local Nr:Int = 1 To Menge&lt;br /&gt;			Local x:Int&lt;br /&gt;			Local y:Int&lt;br /&gt;			Repeat&lt;br /&gt;				x=Rand (1,MX)&lt;br /&gt;				y=Rand (1,MY)&lt;br /&gt;				If Map.Feld[x,y].Inhalt = SBLOCK And Map.Feld[x,y].Item = 0&lt;br /&gt;				'wenn auf aktuellem Feld ein Softblock ist, UND noch KEIN Item&lt;br /&gt;					Map.Feld[x,y].Item = Item 'Item verstecken&lt;br /&gt;					Exit 'Repeat... Forever... Schleife verlassen&lt;br /&gt;				End If&lt;br /&gt;			Forever&lt;br /&gt;		Next&lt;br /&gt;		Return Map&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;An die Methode werden (von links nach rechts) &amp;uuml;bergeben:&lt;br /&gt;- das Item, welches versteckt werden soll&lt;br /&gt;- die Menge, also wie viele sollen von der Sorte versteckt werden&lt;br /&gt;- die Map, auf der die Items versteckt werden sollen&lt;br /&gt;&lt;br /&gt;und zur&amp;uuml;ck gibt sie die mit Items gef&amp;uuml;llte Map &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;ich rufe sie in der Erstellen() Funktion dann so auf:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]		NeueMap.ItemsVerteilen (ITEM_BOMBE,AnzahlBomben,NeueMap)&lt;br /&gt;		NeueMap.ItemsVerteilen (ITEM_FEUER,AnzahlFeuer,NeueMap)[/syntax]&lt;br /&gt;&lt;br /&gt;und hier die komplette TKarte.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Const NIX		:Int = 0		'F&amp;uuml;r den Inhalt der Felder&lt;br /&gt;Const SBLOCK	:Int = 1		'einfacher zu merken als pure Zahlen&lt;br /&gt;Const BOMBE	:Int = 5&lt;br /&gt;Const HBLOCK	:Int = 10&lt;br /&gt;&lt;br /&gt;Type TKarte&lt;br /&gt;&lt;br /&gt;	Field Feld		:TFeld[,] 'Dynamisches Array f&amp;uuml;r die Map, damit keine Gr&amp;ouml;&amp;szlig;enbeschr&amp;auml;nkungen entstehen&lt;br /&gt;	Field MX			:Int 'Breite der Map&lt;br /&gt;	Field MY			:Int 'H&amp;ouml;he der Map&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		For Local Y:Int=1 To MX&lt;br /&gt;			For Local X:Int=1 To MY&lt;br /&gt;				Feld[X,Y].Update(X,Y) 'Aktuelles Feld auf Richtigkeit pr&amp;uuml;fen&lt;br /&gt;				Feld[X,Y].Zeichnen(X,Y) '&amp;Uuml;bergibt X und Y Werte an Feld.Zeichnen&lt;br /&gt;			Next&lt;br /&gt;		Next&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TKarte(MX:Int,MY:Int,Boden:Int,HardBl:Int,SoftBl:Int)&lt;br /&gt;		Local NeueMap:TKarte = New TKarte 'hier  wird die neue Map erstmal Tempor&amp;auml;r gespeichert&lt;br /&gt;		&lt;br /&gt;		NeueMap.Feld=New TFeld[MX+1,MY+1] 'Map Dimensionieren&lt;br /&gt;		NeueMap.MX=MX 'Breite der Map speichern&lt;br /&gt;		NeueMap.MY=MY 'H&amp;ouml;he der Map speichern&lt;br /&gt;		'#############################################&lt;br /&gt;		'#		STANDARTMAP ERSTELLEN			#&lt;br /&gt;		'#############################################&lt;br /&gt;		For Local Y:Int=1 To MY 		'jedes Feld von 1 bis zur H&amp;ouml;he der Map&lt;br /&gt;			For Local X:Int=1 To MX 	'jedes Feld von 1 bis zur Breite der Map&lt;br /&gt;				NeueMap.Feld[X,Y] = TFeld.Erstellen(Boden) 	'die einzelnen Felder werden erstellt&lt;br /&gt;													'siehe TFeld.Erstellen Funktion&lt;br /&gt;				If X=1 Or Y=1 Or X=MX Or Y=MY Then &lt;br /&gt;					NeueMap.Feld[X,Y].BlockTile	=HardBl&lt;br /&gt;					NeueMap.Feld[X,Y].Inhalt 	=HBLOCK&lt;br /&gt;				End If&lt;br /&gt;				'haben X oder Y eine Wert, welcher den Rand der Map darstellt, so wird das&lt;br /&gt;				'BlockTile auf einen HardBlock gesetzt. Auf diese Weise zeichne ich den Rand&lt;br /&gt;				'der Map&lt;br /&gt;				&lt;br /&gt;				If X=3 Or X=5 Or X=7 Or X=9 Or X=11 Or X=13 Then&lt;br /&gt;					If Y=3 Or Y=5 Or Y=7 Or Y=9 Or Y=11 Or Y=13 Then&lt;br /&gt;						NeueMap.Feld[X,Y].BlockTile	=HardBl&lt;br /&gt;						NeueMap.Feld[X,Y].Inhalt 	=HBLOCK&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				'haben der X und der Y Wert eine Position erreicht, die wichtig f&amp;uuml;r das&lt;br /&gt;				'Schachbrett&amp;auml;hnliche Muster sind, so wird ebenfalls ein HardBlock an die&lt;br /&gt;				'Position gesetzt&lt;br /&gt;			Next&lt;br /&gt;		Next&lt;br /&gt;		'#############################################&lt;br /&gt;		'#	MAP MIT 100 SOFTBL&amp;Ouml;CKEN F&amp;Uuml;LLEN		#&lt;br /&gt;		'#	DABEI SPIELER-STARTECKEN FREI LASSEN	#&lt;br /&gt;		'#############################################&lt;br /&gt;		Local BlockZahl:Int = 100	'100 Softbl&amp;ouml;cke sollen gesetzt werden&lt;br /&gt;		Repeat					'eine Schleife, die solange l&amp;auml;uft, bis 100 SoftBl&amp;ouml;cke gesetzt worden sind&lt;br /&gt;			For Local Y:Int=1 To MY		'ich gehe wieder die ganze Map durch&lt;br /&gt;				For Local X:Int=1 To MX&lt;br /&gt;					Local Check:Int=0	'setze Check auf 0&lt;br /&gt;					If Y=2 Or Y=3 Or Y=MY-2 Or Y=MY-1 Then Check:+1		'f&amp;uuml;r die StartEcken&lt;br /&gt;					If X=2 Or X=3 Or X=MX-2 Or X=MX-1 Then Check:+1		'wie zuvor beschrieben&lt;br /&gt;					If BlockZahl=0 Or (Y=8 And X=8) Then Check=2&lt;br /&gt;					'habe ich schon 100 Bl&amp;ouml;cke gesetzt ODER ist das aktuelle Feld grade die Mitte&lt;br /&gt;					'Dann Check auf 2 setzen, damit kein Block gesetzt wird.&lt;br /&gt;					If Check&amp;lt;2 Then&lt;br /&gt;						If NeueMap.Feld[X,Y].BlockTile=0 And Rand(0,2)=1 Then&lt;br /&gt;						'wenn auf aktuellem Feld noch kein Block ist und Rand(0,2)=1 dann neuen Block setzen&lt;br /&gt;							NeueMap.Feld[X,Y].BlockTile	=SoftBl&lt;br /&gt;							NeueMap.Feld[X,Y].Inhalt		=SBLOCK&lt;br /&gt;							BlockZahl:-1 'gesetzten Block abziehen (denn ich will ja nur 100 haben)&lt;br /&gt;						End If&lt;br /&gt;					End If&lt;br /&gt;				Next&lt;br /&gt;			Next&lt;br /&gt;		Until (BlockZahl=0) 'wenn 100 Softbl&amp;ouml;cke gesetzt wurden Schleife verlassen und Map zur&amp;uuml;ck geben.&lt;br /&gt;		'#############################################&lt;br /&gt;		'#		MAP MIT ITEMS F&amp;Uuml;LLEN			#&lt;br /&gt;		'# ITEMS D&amp;Uuml;RFEN NUR AUF FELDER MIT SOFTBLOCK	#&lt;br /&gt;		'#############################################&lt;br /&gt;		Local AnzahlBomben	:Int = 10 'wieviel von welchem Item sollen vorkommen?&lt;br /&gt;		Local AnzahlFeuer	:Int = 10&lt;br /&gt;		&lt;br /&gt;		NeueMap.ItemsVerteilen (ITEM_BOMBE,AnzahlBomben,NeueMap)&lt;br /&gt;		NeueMap.ItemsVerteilen (ITEM_FEUER,AnzahlFeuer,NeueMap)&lt;br /&gt;				&lt;br /&gt;		Return NeueMap	 'hiermit gebe ich die tempor&amp;auml;r erstellte Map zur&amp;uuml;ck&lt;br /&gt;	End Function&lt;br /&gt;	&lt;br /&gt;	Method ItemsVerteilen:TKarte (Item:Int,Menge:Int,Map:TKarte)&lt;br /&gt;		For Local Nr:Int = 1 To Menge&lt;br /&gt;			Local x:Int&lt;br /&gt;			Local y:Int&lt;br /&gt;			Repeat&lt;br /&gt;				x=Rand (1,MX)&lt;br /&gt;				y=Rand (1,MY)&lt;br /&gt;				If Map.Feld[x,y].Inhalt = SBLOCK And Map.Feld[x,y].Item = 0&lt;br /&gt;				'wenn auf aktuellem Feld ein Softblock ist, UND noch KEIN Item&lt;br /&gt;					Map.Feld[x,y].Item = Item 'Item verstecken&lt;br /&gt;					Exit&lt;br /&gt;				End If&lt;br /&gt;			Forever&lt;br /&gt;		Next&lt;br /&gt;		Return Map&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;End Type [/syntax]&lt;br /&gt;&lt;br /&gt;Nochmals danke an Hummelpups!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bevor ich nun allerdings einen 2. Spieler erstelle... erstmal eine neue Datei f&amp;uuml;r die Variablen, welche die Tastenbelegung der einzelnen Spieler speichern sollen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'Tastaturbelegung&lt;br /&gt;&lt;br /&gt;Global Taste_Hoch		:Int[5]&lt;br /&gt;Global Taste_Runter		:Int[5]&lt;br /&gt;Global Taste_Links		:Int[5]&lt;br /&gt;Global Taste_Rechts		:Int[5]&lt;br /&gt;Global Taste_Aktion		:Int[5]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'Tasten Spieler 1 (Spieler[1])&lt;br /&gt;&lt;br /&gt;Taste_Hoch	[1] = KEY_W&lt;br /&gt;Taste_Runter	[1] = KEY_S&lt;br /&gt;Taste_Links	[1] = KEY_A&lt;br /&gt;Taste_Rechts	[1] = KEY_D&lt;br /&gt;Taste_Aktion	[1] = KEY_SPACE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'Tasten Spieler 2 (Spieler[2])&lt;br /&gt;&lt;br /&gt;Taste_Hoch	[2] = KEY_UP&lt;br /&gt;Taste_Runter	[2] = KEY_DOWN&lt;br /&gt;Taste_Links	[2] = KEY_LEFT&lt;br /&gt;Taste_Rechts	[2] = KEY_RIGHT&lt;br /&gt;Taste_Aktion	[2] = KEY_RCONTROL[/syntax]&lt;br /&gt;&lt;br /&gt;Speichern im Ordner Includes unter dem Namen TastaturBelegung.bmx und in der MainGame.bmx includieren:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TBombe.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TExplosion.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TItem.bmx&amp;quot;&lt;br /&gt;&lt;br /&gt;Include &amp;quot;INCLUDES/TastaturBelegung.bmx&amp;quot;[/syntax]&lt;br /&gt;&lt;br /&gt;Ich werde das mit den Tasten sp&amp;auml;ter noch versuchen anders zu regeln, vieleicht &amp;uuml;ber eine ini datei oder &amp;uuml;bers Men&amp;uuml;. Aber erstmal mach ich es so.&lt;br /&gt;&lt;br /&gt;Nun muss ich noch die Steuerung() Methode von TSpieler anpassen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'Statt so:&lt;br /&gt;If KeyDown(KEY_UP) 'wenn Taste f&amp;uuml;r OBEN gedr&amp;uuml;ckt&lt;br /&gt;&lt;br /&gt;'heisst es nun so:&lt;br /&gt;If KeyDown(Taste_Hoch[SpielerNr]) 'wenn Taste f&amp;uuml;r OBEN gedr&amp;uuml;ckt [/syntax]&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Bewegung wieder erlaubt (Zeit)&lt;br /&gt;			If 		KeyDown(Taste_Hoch[SpielerNr])	'wenn Taste f&amp;uuml;r OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(OBEN)&lt;br /&gt;			ElseIf 	KeyDown(Taste_Runter[SpielerNr])	'wenn Taste f&amp;uuml;r UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(UNTEN)&lt;br /&gt;			ElseIf 	KeyDown(Taste_Links[SpielerNr])	'wenn Taste f&amp;uuml;r LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(LINKS)&lt;br /&gt;			ElseIf 	KeyDown(Taste_Rechts[SpielerNr])	'wenn Taste f&amp;uuml;r RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(RECHTS)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		If KeyHit(Taste_Aktion[SpielerNr])	'wenn Taste f&amp;uuml;r Aktion gedr&amp;uuml;ckt wird&lt;br /&gt;			BombeLegen() 					'dann Methode zum Bombenlegen aufrufen&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und schon l&amp;auml;uft Spieler 1 mit  den Tasten W A S D und Leertaste zum Bomben legen&lt;br /&gt;&lt;br /&gt;Jetzt kann ich Spieler 2 erstellen.&lt;br /&gt;MainGame.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Spieler[1] = TSpieler.Erstellen(1,2,2,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt&lt;br /&gt;Spieler[2] = TSpieler.Erstellen(2,14,14,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt[/syntax]&lt;br /&gt;&lt;br /&gt;Spieler 2 erh&amp;auml;lt erstmal die gleiche Grafik wie Spieler 1.&lt;br /&gt;SpielerNr ist 2 und er startet unten rechts (x=14 und y=14)&lt;br /&gt;&lt;br /&gt;Da Spieler 2 allerdings noch nicht in der Hauptschleife integriert ist, passiert auch nix weiter. Also ab in die Hauptschleife mit ihm:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	For Local I:Int = 1 To 2&lt;br /&gt;		Spieler[I].Steuerung()&lt;br /&gt;		Spieler[I].Update()&lt;br /&gt;		Spieler[I].Zeichnen()&lt;br /&gt;	Next[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;und hier die ganze MainGame.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'MainGame.bmx&lt;br /&gt;&lt;br /&gt;SuperStrict 'zwingt mich, sauber zu programmieren &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;Framework 	brl.max2d&lt;br /&gt;Import 		brl.Timer&lt;br /&gt;Import 		brl.Random&lt;br /&gt;Import 		brl.D3D9Max2D&lt;br /&gt;Import 		brl.PNGLoader  &lt;br /&gt;&lt;br /&gt;AppTitle = &amp;quot;Bomberman Klon (Community Tutorial)&amp;quot;&lt;br /&gt;&lt;br /&gt;'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TBombe.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TExplosion.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TItem.bmx&amp;quot;&lt;br /&gt;&lt;br /&gt;Include &amp;quot;INCLUDES/TastaturBelegung.bmx&amp;quot;&lt;br /&gt;&lt;br /&gt;'------------------------------ Grafikmodus			----------&lt;br /&gt;Const 	BREITE	:Int	= 800&lt;br /&gt;Const 	HOEHE	:Int	= 600	'Ich setze die Bildschirmbreite und H&amp;ouml;he als Konstante&lt;br /&gt;Global 	Vollbild	:Int	= False	'Ob Vollbild oder nicht, soll sp&amp;auml;ter der User entscheiden, darum keine Konstante&lt;br /&gt;&lt;br /&gt;SetGraphicsDriver D3D9Max2DDriver()&lt;br /&gt;&lt;br /&gt;Graphics BREITE, HOEHE, Vollbild 'Bildschirmmodus wird gesetzt&lt;br /&gt;'AutoMidHandle(1)&lt;br /&gt;'------------------------------ Vorbereitungen		----------&lt;br /&gt;Const 	TS		:Int = 32 'Tilegr&amp;ouml;&amp;szlig;e (32*32)&lt;br /&gt;&lt;br /&gt;Global 	Frames	:TTimer = CreateTimer (120) 'damit das Spiel auf jedem Rechner gleichschnell l&amp;auml;uft setze ich einen Timer&lt;br /&gt;&lt;br /&gt;SeedRnd (MilliSecs()) 'Da ich den &amp;quot;Zufall&amp;quot; im Spiel ben&amp;ouml;tige,f&amp;uuml;ttere ich ihn schonmal mit der Zeit seit dem Systemstart&lt;br /&gt;'------------------------------ Grafiken laden    	----------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'------------------------------ Sounds laden    	----------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'------------------------------ Type-Erstellungen	----------&lt;br /&gt;Global Map:TKarte = TKarte.Erstellen(15,15,0,1,2)&lt;br /&gt;Global Spieler:TSpieler [5] 'es soll maximal 4 Spieler geben, [5] weil es bei 0 anf&amp;auml;ngt&lt;br /&gt;&lt;br /&gt;Spieler[1] = TSpieler.Erstellen(1,2,2,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt&lt;br /&gt;Spieler[2] = TSpieler.Erstellen(2,14,14,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 2 wird erstellt&lt;br /&gt;&lt;br /&gt;'------------------------------ Hauptschleife		----------&lt;br /&gt;Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Explosion:TExplosion = EachIn TExplosion.ExplosionsListe 'jede erstellte Explosion durchgehen&lt;br /&gt;		Explosion.Update()&lt;br /&gt;		Explosion.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Item:TItem = EachIn TItem.ItemListe 'jedes erstellte Item durchgehen&lt;br /&gt;		Item.Update()&lt;br /&gt;		Item.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local I:Int = 1 To 2&lt;br /&gt;		Spieler[I].Steuerung()&lt;br /&gt;		Spieler[I].Update()&lt;br /&gt;		Spieler[I].Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;Sauber... ab jetzt ist man zu zweit unterwegs &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Glaub, jetzt komm ich beim n&amp;auml;chsten mal nicht drum rum, die Spieler endlich mal zu animieren...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vielen dank f&amp;uuml;rs Lesen!!! *winke*</description>
			<pubDate>Wed, 08 Sep 2010 03:02:20 +0200</pubDate>
		</item>

		<item>
			<title>Items... ich will sie endlich einsammeln</title>
			<link>https://www.blitzforum.de/worklogs/394/#2887</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2887</guid>
			<author>KirkZero</author>
			<description>Jetzt soll man auch endlich Items einsammeln k&amp;ouml;nnen.&lt;br /&gt;Hier schonmal die Grafik der Items (Item.png):&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9452&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;wird im Ordner GFX unter dem Namen Item.png abgespeichert &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Ich benutze hier erstmal nur die ersten beiden Items (Bombe und Feuerkraft)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Erstmal eine neue Datei angelegt... TItem.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Const ITEM_AUFGEDECKT	:Int = -1 'Werte f&amp;uuml;r die Items in Konstante setzen&lt;br /&gt;Const ITEM_BOMBE		:Int = 1  'erspart mir wieder den Umgang mit Zahlen&lt;br /&gt;Const ITEM_FEUER		:Int = 2 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Type TItem&lt;br /&gt;	&lt;br /&gt;	Const 	ITEMFRAMES	:Int=3 'Anzahl der Frames der ItemGrafik&lt;br /&gt;	Global 	ItemIMG		:TImage = LoadAnimImage(&amp;quot;gfx/items.png&amp;quot;,TS,TS,0,ITEMFRAMES)&lt;br /&gt;	&lt;br /&gt;	Global ItemListe		:TList = CreateList() 'eine globale Liste f&amp;uuml;r alle Items anlegen&lt;br /&gt;	&lt;br /&gt;	Field xFeld		:Int 'Koordinaten des Items auf dem Feld&lt;br /&gt;	Field yFeld		:Int&lt;br /&gt;	Field Item		:Int 'Welches Item ist es? (I_BOMBE, I_FEUER, usw)&lt;br /&gt;	Field Sammler		:Int 'wer hat das Item eingesammelt?&lt;br /&gt;&lt;br /&gt;	Method Update()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawImage (ItemIMG,xFeld*TS,yFeld*TS,Item)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TItem (xFeld:Int,yFeld:Int,Item:Int)&lt;br /&gt;		Local NeuesItem:TItem = New TItem&lt;br /&gt;		&lt;br /&gt;		NeuesItem.xFeld = xFeld&lt;br /&gt;		NeuesItem.yFeld = yFeld&lt;br /&gt;		NeuesItem.Item = Item&lt;br /&gt;		&lt;br /&gt;		ItemListe.AddLast(NeuesItem) 'neues Item der globalen ItemListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;End Type[/syntax]&lt;br /&gt;&lt;br /&gt;Denke mal, die Kommentare sagen soweit alles und ansonsten ist das ganze ja fast genauso, wie bei den Bomben. Die Update() Methode ist noch leer, kommt aber noch. Die Konstanten ganz am Anfang erleichtern mir nur wieder den Umgang mit Zahlen und werden ausserhalb des Types angelegt, damit ich sie &amp;uuml;berall benutzen kann.&lt;br /&gt;&lt;br /&gt;diese Datei kommt wieder in den INCLUDES Ordner.&lt;br /&gt;Noch schnell in der MainGame.bmx includieren:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TBombe.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TExplosion.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TItem.bmx&amp;quot;&lt;br /&gt;&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Nun muss ich nat&amp;uuml;rlich auch ein paar der Items auf der Map verstecken. Das erledige ich in der Erstellen() Funktion von TKarte.bmx unter der Stelle, an der ich die SoftBl&amp;ouml;cke auf der KArte gesetzt habe:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]		'#############################################&lt;br /&gt;		'#		MAP MIT ITEMS F&amp;Uuml;LLEN			#&lt;br /&gt;		'# ITEMS D&amp;Uuml;RFEN NUR AUF FELDER MIT SOFTBLOCK	#&lt;br /&gt;		'#############################################&lt;br /&gt;		Local AnzahlBomben	:Int = 10 'wieviel von welchem Item sollen vorkommen?&lt;br /&gt;		Local AnzahlFeuer	:Int = 10&lt;br /&gt;		&lt;br /&gt;		Repeat 'BombenItems verstecken&lt;br /&gt;			For Local Y:Int=1 To MY&lt;br /&gt;				For Local X:Int=1 To MX&lt;br /&gt;					If AnzahlBomben &amp;gt; 0 'wenn noch Items zu verstecken sind, dann&lt;br /&gt;						If NeueMap.Feld[X,Y].Inhalt = SBLOCK And NeueMap.Feld[X,Y].Item = 0&lt;br /&gt;						'wenn auf aktuellem Feld ein Softblock ist, UND noch KEIN Item&lt;br /&gt;							If Rand (0,20) = 10 Then 'bei der richtigen Zufallszahl...&lt;br /&gt;								NeueMap.Feld[X,Y].Item = ITEM_BOMBE 'Item verstecken&lt;br /&gt;								AnzahlBomben:-1 'gelegtes Item von den noch zu legenden abziehen&lt;br /&gt;							End If&lt;br /&gt;						End If&lt;br /&gt;					End If&lt;br /&gt;				Next&lt;br /&gt;			Next&lt;br /&gt;		Until (AnzahlBomben=0)&lt;br /&gt;		&lt;br /&gt;		Repeat 'FeuerItems verstecken&lt;br /&gt;			For Local Y:Int=1 To MY&lt;br /&gt;				For Local X:Int=1 To MX&lt;br /&gt;					If AnzahlFeuer &amp;gt; 0 'wenn noch Items zu verstecken sind, dann&lt;br /&gt;						If NeueMap.Feld[X,Y].Inhalt = SBLOCK And NeueMap.Feld[X,Y].Item = 0&lt;br /&gt;						'wenn auf aktuellem Feld ein Softblock ist, UND noch KEIN Item&lt;br /&gt;							If Rand (0,20) = 10 Then 'bei der richtigen Zufallszahl...&lt;br /&gt;								NeueMap.Feld[X,Y].Item = ITEM_FEUER 'Item verstecken&lt;br /&gt;								AnzahlFeuer:-1 'gelegtes Item von den noch zu legenden abziehen&lt;br /&gt;							End If&lt;br /&gt;						End If&lt;br /&gt;					End If&lt;br /&gt;				Next&lt;br /&gt;			Next&lt;br /&gt;		Until (AnzahlFeuer=0)[/syntax]&lt;br /&gt;&lt;br /&gt;Vielleicht fragt sich ja der ein oder andere, warum ich Zufallszahlen von 0 bis 20 nehme und nicht wie bei den Softbl&amp;ouml;cken 0 bis 2. Ganz einfach, wenn ich einen kleinen Wertebereich habe, kommt meine gew&amp;auml;hlte Zahl h&amp;auml;ufiger, als bei einem gro&amp;szlig;em Wertebereich. Die Folge w&amp;auml;re, das so ziemlich alle Items im Oberen linken Teil der Karte versteckt w&amp;auml;ren und nicht auf der ganzen Map.&lt;br /&gt;&lt;br /&gt;hier noch die vollst&amp;auml;ndige Erstellen() Funktion von TKarte.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Function Erstellen:TKarte(MX:Int,MY:Int,Boden:Int,HardBl:Int,SoftBl:Int)&lt;br /&gt;		Local NeueMap:TKarte = New TKarte 'hier  wird die neue Map erstmal Tempor&amp;auml;r gespeichert&lt;br /&gt;		&lt;br /&gt;		NeueMap.Feld=New TFeld[MX+1,MY+1] 'Map Dimensionieren&lt;br /&gt;		NeueMap.MX=MX 'Breite der Map speichern&lt;br /&gt;		NeueMap.MY=MY 'H&amp;ouml;he der Map speichern&lt;br /&gt;		'#############################################&lt;br /&gt;		'#		STANDARTMAP ERSTELLEN			#&lt;br /&gt;		'#############################################&lt;br /&gt;		For Local Y:Int=1 To MY 		'jedes Feld von 1 bis zur H&amp;ouml;he der Map&lt;br /&gt;			For Local X:Int=1 To MX 	'jedes Feld von 1 bis zur Breite der Map&lt;br /&gt;				NeueMap.Feld[X,Y] = TFeld.Erstellen(Boden) 	'die einzelnen Felder werden erstellt&lt;br /&gt;													'siehe TFeld.Erstellen Funktion&lt;br /&gt;				If X=1 Or Y=1 Or X=MX Or Y=MY Then &lt;br /&gt;					NeueMap.Feld[X,Y].BlockTile	=HardBl&lt;br /&gt;					NeueMap.Feld[X,Y].Inhalt 	=HBLOCK&lt;br /&gt;				End If&lt;br /&gt;				'haben X oder Y eine Wert, welcher den Rand der Map darstellt, so wird das&lt;br /&gt;				'BlockTile auf einen HardBlock gesetzt. Auf diese Weise zeichne ich den Rand&lt;br /&gt;				'der Map&lt;br /&gt;				&lt;br /&gt;				If X=3 Or X=5 Or X=7 Or X=9 Or X=11 Or X=13 Then&lt;br /&gt;					If Y=3 Or Y=5 Or Y=7 Or Y=9 Or Y=11 Or Y=13 Then&lt;br /&gt;						NeueMap.Feld[X,Y].BlockTile	=HardBl&lt;br /&gt;						NeueMap.Feld[X,Y].Inhalt 	=HBLOCK&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				'haben der X und der Y Wert eine Position erreicht, die wichtig f&amp;uuml;r das&lt;br /&gt;				'Schachbrett&amp;auml;hnliche Muster sind, so wird ebenfalls ein HardBlock an die&lt;br /&gt;				'Position gesetzt&lt;br /&gt;			Next&lt;br /&gt;		Next&lt;br /&gt;		'#############################################&lt;br /&gt;		'#	MAP MIT 100 SOFTBL&amp;Ouml;CKEN F&amp;Uuml;LLEN		#&lt;br /&gt;		'#	DABEI SPIELER-STARTECKEN FREI LASSEN	#&lt;br /&gt;		'#############################################&lt;br /&gt;		Local BlockZahl:Int = 100	'100 Softbl&amp;ouml;cke sollen gesetzt werden&lt;br /&gt;		Repeat					'eine Schleife, die solange l&amp;auml;uft, bis 100 SoftBl&amp;ouml;cke gesetzt worden sind&lt;br /&gt;			For Local Y:Int=1 To MY		'ich gehe wieder die ganze Map durch&lt;br /&gt;				For Local X:Int=1 To MX&lt;br /&gt;					Local Check:Int=0	'setze Check auf 0&lt;br /&gt;					If Y=2 Or Y=3 Or Y=MY-2 Or Y=MY-1 Then Check:+1		'f&amp;uuml;r die StartEcken&lt;br /&gt;					If X=2 Or X=3 Or X=MX-2 Or X=MX-1 Then Check:+1		'wie zuvor beschrieben&lt;br /&gt;					If BlockZahl=0 Or (Y=8 And X=8) Then Check=2&lt;br /&gt;					'habe ich schon 100 Bl&amp;ouml;cke gesetzt ODER ist das aktuelle Feld grade die Mitte&lt;br /&gt;					'Dann Check auf 2 setzen, damit kein Block gesetzt wird.&lt;br /&gt;					If Check&amp;lt;2 Then&lt;br /&gt;						If NeueMap.Feld[X,Y].BlockTile=0 And Rand(0,2)=1 Then&lt;br /&gt;						'wenn auf aktuellem Feld noch kein Block ist und Rand(0,2)=1 dann neuen Block setzen&lt;br /&gt;							NeueMap.Feld[X,Y].BlockTile	=SoftBl&lt;br /&gt;							NeueMap.Feld[X,Y].Inhalt		=SBLOCK&lt;br /&gt;							BlockZahl:-1 'gesetzten Block abziehen (denn ich will ja nur 100 haben)&lt;br /&gt;						End If&lt;br /&gt;					End If&lt;br /&gt;				Next&lt;br /&gt;			Next&lt;br /&gt;		Until (BlockZahl=0) 'wenn 100 Softbl&amp;ouml;cke gesetzt wurden Schleife verlassen und Map zur&amp;uuml;ck geben.&lt;br /&gt;		'#############################################&lt;br /&gt;		'#		MAP MIT ITEMS F&amp;Uuml;LLEN			#&lt;br /&gt;		'# ITEMS D&amp;Uuml;RFEN NUR AUF FELDER MIT SOFTBLOCK	#&lt;br /&gt;		'#############################################&lt;br /&gt;		Local AnzahlBomben	:Int = 10 'wieviel von welchem Item sollen vorkommen?&lt;br /&gt;		Local AnzahlFeuer	:Int = 10&lt;br /&gt;		&lt;br /&gt;		Repeat 'BombenItems verstecken&lt;br /&gt;			For Local Y:Int=1 To MY&lt;br /&gt;				For Local X:Int=1 To MX&lt;br /&gt;					If AnzahlBomben &amp;gt; 0 'wenn noch Items zu verstecken sind, dann&lt;br /&gt;						If NeueMap.Feld[X,Y].Inhalt = SBLOCK And NeueMap.Feld[X,Y].Item = 0&lt;br /&gt;						'wenn auf aktuellem Feld ein Softblock ist, UND noch KEIN Item&lt;br /&gt;							If Rand (0,20) = 10 Then 'bei der richtigen Zufallszahl...&lt;br /&gt;								NeueMap.Feld[X,Y].Item = ITEM_BOMBE 'Item verstecken&lt;br /&gt;								AnzahlBomben:-1 'gelegtes Item von den noch zu legenden abziehen&lt;br /&gt;							End If&lt;br /&gt;						End If&lt;br /&gt;					End If&lt;br /&gt;				Next&lt;br /&gt;			Next&lt;br /&gt;		Until (AnzahlBomben=0)&lt;br /&gt;		&lt;br /&gt;		Repeat 'FeuerItems verstecken&lt;br /&gt;			For Local Y:Int=1 To MY&lt;br /&gt;				For Local X:Int=1 To MX&lt;br /&gt;					If AnzahlFeuer &amp;gt; 0 'wenn noch Items zu verstecken sind, dann&lt;br /&gt;						If NeueMap.Feld[X,Y].Inhalt = SBLOCK And NeueMap.Feld[X,Y].Item = 0&lt;br /&gt;						'wenn auf aktuellem Feld ein Softblock ist, UND noch KEIN Item&lt;br /&gt;							If Rand (0,20) = 10 Then 'bei der richtigen Zufallszahl...&lt;br /&gt;								NeueMap.Feld[X,Y].Item = ITEM_FEUER 'Item verstecken&lt;br /&gt;								AnzahlFeuer:-1 'gelegtes Item von den noch zu legenden abziehen&lt;br /&gt;							End If&lt;br /&gt;						End If&lt;br /&gt;					End If&lt;br /&gt;				Next&lt;br /&gt;			Next&lt;br /&gt;		Until (AnzahlFeuer=0)&lt;br /&gt;&lt;br /&gt;		Return NeueMap	 'hiermit gebe ich die tempor&amp;auml;r erstellte Map zur&amp;uuml;ck&lt;br /&gt;	End Function&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Jetzt, wo die Items auf der Map verteilt sind, muss ich sie nur noch erstellen, sobald ein Softblock, unter dem sich ein Item befindet, zerst&amp;ouml;rt wird. Das wird in der Update() Methode von TFeld.bmx erledigt:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update(x:Int,y:Int)&lt;br /&gt;		If Inhalt = NIX And BlockTile &amp;gt; 0'wenn NIX im Feld aber ein BlockTile da ist&lt;br /&gt;			BlockTile = 0 'BlockTile l&amp;ouml;schen&lt;br /&gt;		End If&lt;br /&gt;		If Inhalt = NIX And Item &amp;gt; 0'wenn NIX im Feld und ein Item wurde freigelegt&lt;br /&gt;			TItem.Erstellen(x,y,Item) 'Item erstellen&lt;br /&gt;			Item = ITEM_AUFGEDECKT 'und als aufgedeckt markieren.&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Der Methode m&amp;uuml;ssen nun Parameter &amp;uuml;bergeben werden, damit das Item auch seine x und y Koordinaten bekommt. Also muss der Aufruf der Update() Methode von TFeld ebenfalls angepasst werden.&lt;br /&gt;Aufgerufen wird sie in TKarte.bmx in der Methode Zeichnen. Also passe ich den Aufruf dort an:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Zeichnen()&lt;br /&gt;		For Local Y:Int=1 To MX&lt;br /&gt;			For Local X:Int=1 To MY&lt;br /&gt;				Feld[X,Y].Update(X,Y) 'Aktuelles Feld auf Richtigkeit pr&amp;uuml;fen&lt;br /&gt;				Feld[X,Y].Zeichnen(X,Y) '&amp;Uuml;bergibt X und Y Werte an Feld.Zeichnen&lt;br /&gt;			Next&lt;br /&gt;		Next&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Erstellt werden die Items nun... doch ich muss sie auch in der Hauptschleife von MainGame Zeichnen lassen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Explosion:TExplosion = EachIn TExplosion.ExplosionsListe 'jede erstellte Explosion durchgehen&lt;br /&gt;		Explosion.Update()&lt;br /&gt;		Explosion.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Item:TItem = EachIn TItem.ItemListe 'jedes erstellte Item durchgehen&lt;br /&gt;		Item.Update()&lt;br /&gt;		Item.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	Spieler[0].Zeichnen()&lt;br /&gt;	Spieler[0].Steuerung()&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;Ich rufe hier auch schonmal die Update() Methode von TItem mit auf, auch wenn diese noch &amp;quot;leer&amp;quot; ist. Da ich die Update() Methode aber auch gleich noch bearbeite, brauch ich sie dann nicht mehr in die Hauptschleife einf&amp;uuml;gen.&lt;br /&gt;&lt;br /&gt;Ab jetzt erscheinen die Items, sobald man einen Block zerst&amp;ouml;rt, unter dem eines versteckt ist &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Nun gehts ans einsammeln...&lt;br /&gt;Dazu erh&amp;auml;lt TSpieler.bmx auch erstmal eine &amp;quot;leere&amp;quot; Update() Methode:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;diese binde ich auch gleich in die Hauptschleife ein:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Explosion:TExplosion = EachIn TExplosion.ExplosionsListe 'jede erstellte Explosion durchgehen&lt;br /&gt;		Explosion.Update()&lt;br /&gt;		Explosion.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Item:TItem = EachIn TItem.ItemListe 'jedes erstellte Item durchgehen&lt;br /&gt;		Item.Update()&lt;br /&gt;		Item.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	Spieler[0].Steuerung()&lt;br /&gt;	Spieler[0].Update()&lt;br /&gt;	Spieler[0].Zeichnen()&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;nun muss ich in der Update() Methode (von TSpieler.bmx) nur noch abfragen, ob das aktuelle Feld, auf dem sich der Spieler befindet, den Flag ITEM_AUFGEDECKT hat. Ist das der Fall, so gehe ich die TList der Items durch und &amp;uuml;berpfr&amp;uuml;fe, welches Item die selben FeldKoordinaten wie der Spieler hat und gebe an das Item weiter, wer es gesammelt hat. Ausserdem entfehrne ich den Flag ITEM_AUFGEDECKT damit kein andere Spieler das Item mehr sammeln kann:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Item = ITEM_AUFGEDECKT 'wenn aufgedecktes Item auf SpielerFeld&lt;br /&gt;			For Local Item:TItem = EachIn TItem.ItemListe 'jedes erstellte Item durchgehen&lt;br /&gt;				If xFeld=Item.xFeld And yFeld=Item.yFeld 'wenn richtiges Item gefunden&lt;br /&gt;					Map.Feld[xFeld,yFeld].Item = 0 'ItemFlag auf 0&lt;br /&gt;					Item.Sammler = SpielerNr 'Spieler der es gesammelt hat festlegen&lt;br /&gt;				End If&lt;br /&gt;			Next&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;Jetzt weiter zur bisher &amp;quot;leeren&amp;quot; Update() Methode von TItem.bmx. Da ich ja nun dem Item &amp;uuml;bergebe, wer es gesammelt hat, werden dort, dem Spieler, die eingesammelten Items und ihre F&amp;auml;higkeiten gutgeschrieben. Dazu frage ich ab, ob das Item einen Sammler hat. Ist das der Fall, so wird jeh nach eingesammeltem Item (Select... Case...) der entsprechende Bonus freigegeben. Das Item muss dann nat&amp;uuml;rlich auch gel&amp;ouml;scht werden:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		If Sammler &amp;gt; 0 'wenn jemand das Item eingesammelt hat&lt;br /&gt;			Select Item&lt;br /&gt;				Case ITEM_BOMBE&lt;br /&gt;					'Spieler kann eine Bombe mehr legen&lt;br /&gt;				Case ITEM_FEUER&lt;br /&gt;					'Spieler erh&amp;auml;lt mehr FeuerKraft&lt;br /&gt;			End Select&lt;br /&gt;			&lt;br /&gt;			ItemListe.Remove(Self) 'Item aus Liste l&amp;ouml;schen&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;und nu hab ich richtig Mist gebaut. Spieler1 kann niemals Items einsammeln... und warum nicht? Weil Spieler1 beim Erstellen seiner Variable SpielerNr den Wert = 0 zugewiesen bekommt. Da das Item nur eingesammelt werden kann, wenn Sammler (=SpielerNr) gr&amp;ouml;&amp;szlig;er ist als 0 wird das nie funktionieren.&lt;br /&gt;Also stehen wieder ein paar &amp;Auml;nderungen an der MainGame.bmx an. So wird Spieler1 zur Zeit erstellt:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'------------------------------ Type-Erstellungen	----------&lt;br /&gt;Global Map:TKarte = TKarte.Erstellen(15,15,0,1,2)&lt;br /&gt;Global Spieler:TSpieler [4] 'es soll maximal 4 Spieler geben&lt;br /&gt;Spieler[0] = TSpieler.Erstellen(0,2,2,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt[/syntax]&lt;br /&gt;&lt;br /&gt;Spieler[0] wird also zu Spieler[1] und die SpielerNr welche in der Erstellen() Funktion &amp;uuml;bergeben wird muss ebenfalls 1 werden:&lt;br /&gt;&lt;br /&gt;Spieler[&lt;b&gt;1&lt;/b&gt;] = TSpieler.Erstellen(&lt;b&gt;1&lt;/b&gt;,2,2,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt&lt;br /&gt;&lt;br /&gt;(&amp;Auml;nderungen &lt;b&gt;FETT&lt;/b&gt; hervorgehoben.)&lt;br /&gt;&lt;br /&gt;Wenn es weiterhin 4 spieler geben soll, muss nat&amp;uuml;rlich auch das Array Spieler[] anders dimensioniert werden. So ist es grad noch falsch:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Global Spieler:TSpieler [4] 'es soll maximal 4 Spieler geben[/syntax]&lt;br /&gt;&lt;br /&gt;So ist es dann richtig:&lt;br /&gt;&lt;br /&gt;Global Spieler:TSpieler [&lt;b&gt;5&lt;/b&gt;] 'es soll maximal 4 Spieler geben, [5] weil es bei 0 anf&amp;auml;ngt&lt;br /&gt;&lt;br /&gt;(&amp;Auml;nderung wieder &lt;b&gt;FETT&lt;/b&gt; hervorgehoben.)&lt;br /&gt;&lt;br /&gt;und nat&amp;uuml;rlich muss das ganze nun in der Hauptschleife auch nicht mehr mit Spieler[0], sondern mit Spieler[1] aufgerufen werden... so wie hier:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Spieler[1].Steuerung()&lt;br /&gt;	Spieler[1].Update()&lt;br /&gt;	Spieler[1].Zeichnen()[/syntax]&lt;br /&gt;&lt;br /&gt;damit alles komplett ist... hier nochmal die komplette MainGame.bmx wie sie sein muss:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'MainGame.bmx&lt;br /&gt;&lt;br /&gt;SuperStrict 'zwingt mich, sauber zu programmieren &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;Framework 	brl.max2d&lt;br /&gt;Import 		brl.Timer&lt;br /&gt;Import 		brl.Random&lt;br /&gt;Import 		brl.D3D9Max2D&lt;br /&gt;Import 		brl.PNGLoader  &lt;br /&gt;&lt;br /&gt;AppTitle = &amp;quot;Bomberman Klon (Community Tutorial)&amp;quot;&lt;br /&gt;&lt;br /&gt;'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TBombe.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TExplosion.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TItem.bmx&amp;quot;&lt;br /&gt;&lt;br /&gt;'------------------------------ Grafikmodus			----------&lt;br /&gt;Const 	BREITE	:Int	= 800&lt;br /&gt;Const 	HOEHE	:Int	= 600	'Ich setze die Bildschirmbreite und H&amp;ouml;he als Konstante&lt;br /&gt;Global 	Vollbild	:Int	= False	'Ob Vollbild oder nicht, soll sp&amp;auml;ter der User entscheiden, darum keine Konstante&lt;br /&gt;&lt;br /&gt;SetGraphicsDriver D3D9Max2DDriver()&lt;br /&gt;&lt;br /&gt;Graphics BREITE, HOEHE, Vollbild 'Bildschirmmodus wird gesetzt&lt;br /&gt;'AutoMidHandle(1)&lt;br /&gt;'------------------------------ Vorbereitungen		----------&lt;br /&gt;Const 	TS		:Int = 32 'Tilegr&amp;ouml;&amp;szlig;e (32*32)&lt;br /&gt;&lt;br /&gt;Global 	Frames	:TTimer = CreateTimer (120) 'damit das Spiel auf jedem Rechner gleichschnell l&amp;auml;uft setze ich einen Timer&lt;br /&gt;&lt;br /&gt;SeedRnd (MilliSecs()) 'Da ich den &amp;quot;Zufall&amp;quot; im Spiel ben&amp;ouml;tige,f&amp;uuml;ttere ich ihn schonmal mit der Zeit seit dem Systemstart&lt;br /&gt;'------------------------------ Grafiken laden    	----------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'------------------------------ Sounds laden    	----------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'------------------------------ Type-Erstellungen	----------&lt;br /&gt;Global Map:TKarte = TKarte.Erstellen(15,15,0,1,2)&lt;br /&gt;Global Spieler:TSpieler [5] 'es soll maximal 4 Spieler geben, [5] weil es bei 0 anf&amp;auml;ngt&lt;br /&gt;Spieler[1] = TSpieler.Erstellen(1,2,2,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt&lt;br /&gt;&lt;br /&gt;'------------------------------ Hauptschleife		----------&lt;br /&gt;Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Explosion:TExplosion = EachIn TExplosion.ExplosionsListe 'jede erstellte Explosion durchgehen&lt;br /&gt;		Explosion.Update()&lt;br /&gt;		Explosion.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Item:TItem = EachIn TItem.ItemListe 'jedes erstellte Item durchgehen&lt;br /&gt;		Item.Update()&lt;br /&gt;		Item.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	Spieler[1].Steuerung()&lt;br /&gt;	Spieler[1].Update()&lt;br /&gt;	Spieler[1].Zeichnen()&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;sooooo... nun funktioniert auch das Item sammeln... wenn ich nun &amp;uuml;ber ein Item laufe, verschwindet es. Mehr passiert allerdings noch nicht. Damit aber etwas passiert, muss ich nun wieder die Update() Methode von TItem.bmx bearbeiten und die Select... Case... Bedingung mit Code f&amp;uuml;llen.&lt;br /&gt;&lt;br /&gt;Sammelt der Spieler eine extra Bombe (ITEM_BOMBE) so muss ich einfach nur dem Sammelden Spieler die Variable BombenMenge um 1 erh&amp;ouml;hen. Sammelt er Feuer (ITEM_FEUER) so erh&amp;ouml;he ich ihm einfach die Variable FeuerKraft um 1.&lt;br /&gt;&lt;br /&gt;Die neue Update() Methode von TItem.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		If Sammler &amp;gt; 0 'wenn jemand das Item eingesammelt hat&lt;br /&gt;			Select Item&lt;br /&gt;				Case ITEM_BOMBE&lt;br /&gt;					Spieler[Sammler].BombenMenge:+1 'Spieler kann eine Bombe mehr legen&lt;br /&gt;				Case ITEM_FEUER&lt;br /&gt;					Spieler[Sammler].FeuerKraft:+1 'Spieler erh&amp;auml;lt mehr FeuerKraft&lt;br /&gt;			End Select&lt;br /&gt;			&lt;br /&gt;			ItemListe.Remove(Self) 'Item aus Liste l&amp;ouml;schen&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und was soll ich sagen... ES FUNKTIONIERT!!!! *freu*&lt;br /&gt;&lt;br /&gt;es sei noch kurz angemerkt, das egal, wieviele ITEM_BOMBE man sammelt, man kann nie mehr als 5 legen, da ich das vorher in TSpieler.bmx so festgelegt habe:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Field MaxBombenMenge	:Int = 5 'egal wieviele Items man sammelt, man kann nie mehr legen, als hier verzeichnet[/syntax]&lt;br /&gt;&lt;br /&gt;wer also mehr legen will, muss hier den Wert erh&amp;ouml;hen  &lt;img src=&quot;/forum/images/smiles/icon_idea.gif&quot; alt=&quot;Idea&quot; /&gt; &lt;br /&gt;&lt;br /&gt;So... ab jetzt kann man Items sammeln. Sind zwar bisher nur 2, aber das l&amp;auml;sst sich ja leicht &amp;auml;ndern &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;und nun gibts mal wieder den KOMPLETTEN Code (inklusive .exe) bis zu diesem Punkt zum Downloaden:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=9457&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/upload/file.php?id=9457&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ich bedanke mich mal wieder f&amp;uuml;rs Lesen... und wie immer gilt: Anregungen und Kritik (positiv, wie negativ) sowie Verbesserungsvorschl&amp;auml;ge sind sehr gerne gesehen!!!&lt;/b&gt;</description>
			<pubDate>Tue, 07 Sep 2010 00:21:59 +0200</pubDate>
		</item>

		<item>
			<title>Vorbereitungen für die Items</title>
			<link>https://www.blitzforum.de/worklogs/394/#2884</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2884</guid>
			<author>KirkZero</author>
			<description>Auf zu den Items:&lt;br /&gt;&lt;br /&gt;erstmal neues Field in TFeld.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Field Item		:Int 'bekommt den Wert des Items, wenn kein Item, dann = 0[/syntax]&lt;br /&gt;&lt;br /&gt;Sollte sp&amp;auml;ter unter dem SoftBlock/auf dem Feld ein Item sein, so entspricht der Wert des Feldes, welches Item dort liegt.&lt;br /&gt;&lt;br /&gt;Auch TSpieler ben&amp;ouml;tigt neue Fields:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Field SpielerNr		:Int 'Welcher Spieler bin ich? 1,2,3 oder 4&lt;br /&gt;Field BombenMenge		:Int = 1 'Anzahl an Bomben, die der Spieler gleichzeitig legen kann&lt;br /&gt;Field MaxBombenMenge	:Int = 5 'egal wieviele Items man sammelt, man kann nie mehr legen, als hier verzeichnet&lt;br /&gt;Field GelegteBomben		:Int 'Wieviel hat der Spieler bereits gelegt und sind noch nicht explodiert?[/syntax]&lt;br /&gt;&lt;br /&gt;BombenMenge sollte klar sein. Bedeutet, wieviele Bomben der Spieler gleichzeitig auf der Map legen kann.&lt;br /&gt;MaxBombenMenge steht daf&amp;uuml;r, wieviele Bomben man ALLGEMEIN &amp;uuml;berhaupt legen darf... unabh&amp;auml;ngig davon, wieviele Items,welche einem mehr Bomben geben, man eingesammelt hat.&lt;br /&gt;In der Variable gelegte Bomben wird festgehalten, wieviele Bomben der Spieler bereits gelegt hat, welche noch nicht explodiert sind.&lt;br /&gt;&lt;br /&gt;Jede neu erstellte Klasse TSpieler soll nun bei der Erstellung mit auf den Weg bekommen, welcher Spieler er eigentlich ist.  dieser Wert wird in SpielerNr gespeichert.&lt;br /&gt;&lt;br /&gt;Hier die neue Erstellen() Funktion von TSpieler:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Function Erstellen:TSpieler (SpielerNr:Int,xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.SpielerNr	= SpielerNr 'welcher Spieler bin ich?&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nun noch ein paar &amp;Auml;nderungen an der MainGame.bmx. Da der Spieler nun seine SpielerNr mitbekommen soll, muss die Erstellen() Funktion anders aufgerufen werden. Ausserdem ist der Spieler nun ein Array:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'------------------------------ Type-Erstellungen	----------&lt;br /&gt;Global Map:TKarte = TKarte.Erstellen(15,15,0,1,2)&lt;br /&gt;Global Spieler:TSpieler [4] 'es soll maximal 4 Spieler geben&lt;br /&gt;Spieler[0] = TSpieler.Erstellen(0,2,2,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt[/syntax]&lt;br /&gt;&lt;br /&gt;Hauptschleife noch anpassen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Explosion:TExplosion = EachIn TExplosion.ExplosionsListe 'jede erstellte Explosion durchgehen&lt;br /&gt;		Explosion.Update()&lt;br /&gt;		Explosion.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	Spieler[0].Zeichnen()&lt;br /&gt;	Spieler[0].Steuerung()&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;und schon l&amp;auml;uft das ganze wieder.&lt;br /&gt;&lt;br /&gt;Jetzt muss ich noch jeder Bombe, die ich lege ebenfalls mit auf den Weg geben, welcher Spieler sie gelegt hat. TBombe bekommt also ein neues Field und eine angepasste Erstellen() Funktion:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]&lt;br /&gt;Field Besitzer		:Int 'wer hat die Bombe gelegt ?[/syntax]&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Function Erstellen:TBombe(Besitzer:Int,xFeld:Int,yFeld:Int,FeuerKraft:Int) 'neue Bombe wird erstellt&lt;br /&gt;		Local NeueBombe:TBombe = New TBombe&lt;br /&gt;		&lt;br /&gt;		NeueBombe.Besitzer = Besitzer 'Wer hat die Bombe gelegt?&lt;br /&gt;		NeueBombe.xFeld=xFeld 'Koordinaten der neuen Bombe &amp;uuml;bergeben&lt;br /&gt;		NeueBombe.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		NeueBombe.FeuerKraft=FeuerKraft&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Inhalt = BOMBE 'wichtig! Inhalt des Feldes auf Bombe setzen&lt;br /&gt;		BombenListe.AddLast(NeueBombe) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function[/syntax]&lt;br /&gt;&lt;br /&gt;und den Aufruf in TSpieler ebenfalls angepasst:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method BombeLegen()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = NIX 'wenn aktuelles Feld leer ist&lt;br /&gt;			TBombe.Erstellen(SpielerNr,xFeld,yFeld,FeuerKraft)&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Wo ich schonmal bei der Methode BombeLegen bin...&lt;br /&gt;Ich m&amp;ouml;chte ja, das der Spieler nur so viele Bomben legen kann, wie er Items daf&amp;uuml;r eingesammelt hat und dazu noch nicht mehr als in der Variablen MaxBombenMenge angegeben. Also muss eine If Abfrage her:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method BombeLegen()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = NIX 'wenn aktuelles Feld leer ist&lt;br /&gt;			If GelegteBomben &amp;lt; BombenMenge And GelegteBomben &amp;lt; MaxBombenMenge&lt;br /&gt;			'wenn bisher weniger Bomben gelegt als man kann UND als man darf&lt;br /&gt;				TBombe.Erstellen(SpielerNr,xFeld,yFeld,FeuerKraft) 'Bombe erstellen&lt;br /&gt;				GelegteBomben:+1 'um 1 erh&amp;ouml;hen, da ja nun eine bombe gelegt wurde&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;Startet man nun das Programm, so kann man nur eine Bombe legen. Wenn diese explodiert kann man allerdings keine weitere legen, da die Variable GelegteBomben nach der Explosion nicht wieder um 1 reduziert wird.&lt;br /&gt;Das erledige ich in TBombe.bmx in der Update() Methode:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;&lt;br /&gt;		If MilliSecs() &amp;gt; BombenTimer+BombenIntervall&lt;br /&gt;			BombenCountDown:-1 'Intervall erreicht, CountDown um 1 verringern&lt;br /&gt;			BombenTimer=MilliSecs()&lt;br /&gt;			If BombenFrame &amp;lt; BOMBENFRAMES-1&lt;br /&gt;				BombenFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Explosion = True 'Explosion auf Feld&lt;br /&gt;			BombenCountDown = 0 'Bombe zur Explosion bringen&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		If BombenCountDown &amp;lt;=0 'CountDown ist abgelaufen *BOOOM*&lt;br /&gt;			Spieler[Besitzer].GelegteBomben:-1 'damit der Spieler wieder neue Bomben legen kann&lt;br /&gt;			BombenListe.Remove(Self) 'Bombe aus Liste l&amp;ouml;schen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX 'wichtig! Inhalt des Feldes auf NIX zur&amp;uuml;ck setzen&lt;br /&gt;			TExplosion.Erstellen(xFeld,yFeld,FeuerKraft) 'Explosion wird erstellt&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Diese Stelle sorgt daf&amp;uuml;r, das der Spieler nach der Explosion der Bombe auch wieder weitere legen kann:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]		If BombenCountDown &amp;lt;=0 'CountDown ist abgelaufen *BOOOM*&lt;br /&gt;			Spieler[Besitzer].GelegteBomben:-1 'damit der Spieler wieder neue Bomben legen kann&lt;br /&gt;			BombenListe.Remove(Self) 'Bombe aus Liste l&amp;ouml;schen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX 'wichtig! Inhalt des Feldes auf NIX zur&amp;uuml;ck setzen&lt;br /&gt;			TExplosion.Erstellen(xFeld,yFeld,FeuerKraft) 'Explosion wird erstellt&lt;br /&gt;		End If[/syntax]&lt;br /&gt;&lt;br /&gt;Noch kurz ein Testlauf....&lt;br /&gt;Funktioniert perfekt &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;nun ist alles soweit f&amp;uuml;r die ersten beiden Items vorbereitet &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;Es handelt sich dabei um ein Item, welches die Feuerkraft erh&amp;ouml;ht und das andere die Anzahl der Bomben, die man legen kann.&lt;br /&gt;Diese gibts aber erst im n&amp;auml;chsten Eintrag&lt;br /&gt;&lt;br /&gt;Hier nochmal alle .bmx Dateien, die ich bearbeitet habe:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TFeld&lt;br /&gt;	Const 	BODENFRAMES	:Int=5&lt;br /&gt;	Const 	BLOCKFRAMES	:Int=3&lt;br /&gt;	Global 	BodenTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/boden.png&amp;quot;,TS,TS,0,BODENFRAMES)&lt;br /&gt;	Global 	BlockTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/block.png&amp;quot;,TS,TS,0,BLOCKFRAMES)&lt;br /&gt;	&lt;br /&gt;	Field BodenTile	:Int 'die Bodenfliesen. Index f&amp;uuml;r AnimImage welches die Bodenfliesen enth&amp;auml;lt&lt;br /&gt;	Field BlockTile	:Int 'die Bl&amp;ouml;cke. Index f&amp;uuml;r AnimImage. 0=erstes Tile im AnimImage leerer/durchsichtiger Block&lt;br /&gt;	Field Inhalt		:Int '0=begehbar/kein Block, 1=zerst&amp;ouml;rbarer Block, 5=Bombe, 10=unzerst&amp;ouml;bar/unpassierbar&lt;br /&gt;	Field Explosion	:Int 'wird auf true gesetzt, solange eine Explosion auf dem Feld ist&lt;br /&gt;	Field Item		:Int 'bekommt den Wert des Items, wenn kein Item, dann = 0&lt;br /&gt;	&lt;br /&gt;	Method Update()&lt;br /&gt;		If Inhalt = NIX And BlockTile &amp;gt; 0'wenn NIX im Feld aber ein BlockTile da ist&lt;br /&gt;			BlockTile = 0 'BlockTile l&amp;ouml;schen&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen(x:Int,y:Int) 'die Arraywerte f&amp;uuml;r X und Y werden &amp;uuml;bergeben&lt;br /&gt;		DrawImage(BodenTilesIMG,x*TS,y*TS,BodenTile) 'und beim Zeichnen mit der TileSize (TS=32)&lt;br /&gt;		DrawImage(BlockTilesIMG,x*TS,y*TS,BlockTile) 'multipliziert, damit sie den richtigen Abstand zueinander haben&lt;br /&gt;&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TFeld(Boden:Int) 'BodenTile wird &amp;uuml;bergeben&lt;br /&gt;		Local NeuesFeld:TFeld = New TFeld&lt;br /&gt;		NeuesFeld.BodenTile=Boden&lt;br /&gt;		Return NeuesFeld		&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;End Type[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field SpielerNr		:Int 'Welcher Spieler bin ich? 1,2,3 oder 4&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2 'man bewegt sich immer um 2 Pixel pro Bewegung&lt;br /&gt;	&lt;br /&gt;	Field FeuerKraft		:Int = 2 'Reichweite der Explosionen einer Bombe (2 Felder in alle Richtungen)&lt;br /&gt;	Field BombenMenge		:Int = 1 'Anzahl an Bomben, die der Spieler gleichzeitig legen kann&lt;br /&gt;	Field MaxBombenMenge	:Int = 5 'egal wieviele Items man sammelt, man kann nie mehr legen, als hier verzeichnet&lt;br /&gt;	Field GelegteBomben		:Int 'Wieviel hat der Spieler bereits gelegt und sind noch nicht explodiert?&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 20&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause 'wenn Bewegung wieder erlaubt (Zeit)&lt;br /&gt;			If 		KeyDown(KEY_UP) 'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(OBEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_DOWN) 'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(UNTEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_LEFT) 'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(LINKS)&lt;br /&gt;			ElseIf 	KeyDown(KEY_RIGHT) 'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(RECHTS)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		If KeyHit(KEY_LCONTROL)		'wenn linke STRG Taste gedr&amp;uuml;ckt wird&lt;br /&gt;			BombeLegen() 			'dann Methode zum Bombenlegen aufrufen&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method BombeLegen()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = NIX 'wenn aktuelles Feld leer ist&lt;br /&gt;			If GelegteBomben &amp;lt; BombenMenge And GelegteBomben &amp;lt; MaxBombenMenge&lt;br /&gt;			'wenn bisher weniger Bomben gelegt als man kann UND als man darf&lt;br /&gt;				TBombe.Erstellen(SpielerNr,xFeld,yFeld,FeuerKraft) 'Bombe erstellen&lt;br /&gt;				GelegteBomben:+1 'um 1 erh&amp;ouml;hen, da ja nun eine bombe gelegt wurde&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x		:Int 'Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y		:Int&lt;br /&gt;		Local fx		:Int 'Tempor&amp;auml;re Speicher f&amp;uuml;r zu pr&amp;uuml;fende Felder&lt;br /&gt;		Local fy		:Int 'ist fy=-1 wird oberes vom aktuellen Feld gepr&amp;uuml;ft&lt;br /&gt;&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				fy=-1	'oberes Feld pr&amp;uuml;fen&lt;br /&gt;			Case UNTEN&lt;br /&gt;				fy=+1	'unteres Feld pr&amp;uuml;fen&lt;br /&gt;			Case LINKS&lt;br /&gt;				fx=-1	'linkes Feld pr&amp;uuml;fen&lt;br /&gt;			Case RECHTS&lt;br /&gt;				fx=+1	'rechtes Feld pr&amp;uuml;fen&lt;br /&gt;		End Select&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld+fx,yFeld+fy].Inhalt = NIX 'wenn auf dem zu pr&amp;uuml;fenden Feld NIX ist&lt;br /&gt;		&lt;br /&gt;			If fy &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld oben oder unten, dann auf Autobewegung checken&lt;br /&gt;				If 		xFeld*TS &amp;lt; xPos	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;				Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;				Else&lt;br /&gt;					y=fy*Speed			'passt es genau, dann um Speed Pixel nach fy bewegen&lt;br /&gt;				End If &lt;br /&gt;			End If&lt;br /&gt;			&lt;br /&gt;			If fx &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld links oder rechts, dann auf Autobewegung checken&lt;br /&gt;				If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;				Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;				Else&lt;br /&gt;					x=fx*Speed			'passt es genau, dann um Speed Pixel nach fx bewegen&lt;br /&gt;				End If&lt;br /&gt;			End If&lt;br /&gt;				&lt;br /&gt;		Else If fy &amp;lt;&amp;gt; 0 And yMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			y=fy*Speed&lt;br /&gt;		Else If fx &amp;lt;&amp;gt; 0 And xMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			x=fx*Speed&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method MapFeld() 'berechnet aktuelles Map.Feld[,]&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		If yMod &amp;lt; (TS/2) Then yFeld=(yPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If yMod &amp;gt; (TS/2) Then yFeld=(yPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		If xMod &amp;lt; (TS/2) Then xFeld=(xPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If xMod &amp;gt; (TS/2) Then xFeld=(xPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		'DrawRect (xFeld*TS,yFeld*TS,TS,TS) 'Erstmal auskommentiert... vorerst klappt ja alles &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (SpielerNr:Int,xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.SpielerNr	= SpielerNr 'welcher Spieler bin ich?&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TBombe&lt;br /&gt;	Const 	BOMBENFRAMES	:Int=3 'Anzahl der Frames der BombenGrafik&lt;br /&gt;	Global 	BombenIMG		:TImage = LoadAnimImage(&amp;quot;gfx/bombe.png&amp;quot;,TS,TS,0,BOMBENFRAMES)&lt;br /&gt;&lt;br /&gt;	Global BombenListe	:TList = CreateList() 'eine globale Liste f&amp;uuml;r alle Bomben anlegen&lt;br /&gt;	&lt;br /&gt;	Field Besitzer		:Int 'wer hat die Bombe gelegt ?&lt;br /&gt;	Field xFeld		:Int 'Koordinaten der Bombe auf dem Feld&lt;br /&gt;	Field yFeld		:Int&lt;br /&gt;	&lt;br /&gt;	Field FeuerKraft	:Int 'Reichweite der Explosionen einer Bombe&lt;br /&gt;	&lt;br /&gt;	Field BombenFrame		:Int = 0 'Aktuelles Frame der BombenGrafik (0=erstes Frame)&lt;br /&gt;	Field BombenCountDown	:Int = 3 'jede Bombe soll nach 3 Sekunden (oder Intervallen) explodieren&lt;br /&gt;	Field BombenIntervall	:Int = 1000 'der Intervall mit dem runtergez&amp;auml;hlt wird (1000 = 1 Sekunde)&lt;br /&gt;	Field BombenTimer		:Int = MilliSecs() 'aktuelle Zeit setzen&lt;br /&gt;	&lt;br /&gt;	Method Update()&lt;br /&gt;&lt;br /&gt;		If MilliSecs() &amp;gt; BombenTimer+BombenIntervall&lt;br /&gt;			BombenCountDown:-1 'Intervall erreicht, CountDown um 1 verringern&lt;br /&gt;			BombenTimer=MilliSecs()&lt;br /&gt;			If BombenFrame &amp;lt; BOMBENFRAMES-1&lt;br /&gt;				BombenFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Explosion = True 'Explosion auf Feld&lt;br /&gt;			BombenCountDown = 0 'Bombe zur Explosion bringen&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		If BombenCountDown &amp;lt;=0 'CountDown ist abgelaufen *BOOOM*&lt;br /&gt;			Spieler[Besitzer].GelegteBomben:-1 'damit der Spieler wieder neue Bomben legen kann&lt;br /&gt;			BombenListe.Remove(Self) 'Bombe aus Liste l&amp;ouml;schen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX 'wichtig! Inhalt des Feldes auf NIX zur&amp;uuml;ck setzen&lt;br /&gt;			TExplosion.Erstellen(xFeld,yFeld,FeuerKraft) 'Explosion wird erstellt&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawImage (BombenIMG,xFeld*TS,yFeld*TS,BombenFrame)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TBombe(Besitzer:Int,xFeld:Int,yFeld:Int,FeuerKraft:Int) 'neue Bombe wird erstellt&lt;br /&gt;		Local NeueBombe:TBombe = New TBombe&lt;br /&gt;		&lt;br /&gt;		NeueBombe.Besitzer = Besitzer 'Wer hat die Bombe gelegt?&lt;br /&gt;		NeueBombe.xFeld=xFeld 'Koordinaten der neuen Bombe &amp;uuml;bergeben&lt;br /&gt;		NeueBombe.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		NeueBombe.FeuerKraft=FeuerKraft&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Inhalt = BOMBE 'wichtig! Inhalt des Feldes auf Bombe setzen&lt;br /&gt;		BombenListe.AddLast(NeueBombe) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function&lt;br /&gt;End Type[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]&lt;br /&gt;'MainGame.bmx&lt;br /&gt;&lt;br /&gt;SuperStrict 'zwingt mich, sauber zu programmieren &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;Framework 	brl.max2d&lt;br /&gt;Import 		brl.Timer&lt;br /&gt;Import 		brl.Random&lt;br /&gt;Import 		brl.D3D9Max2D&lt;br /&gt;Import 		brl.PNGLoader  &lt;br /&gt;&lt;br /&gt;AppTitle = &amp;quot;Bomberman Klon (Community Tutorial)&amp;quot;&lt;br /&gt;&lt;br /&gt;'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TBombe.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TExplosion.bmx&amp;quot;&lt;br /&gt;&lt;br /&gt;'------------------------------ Grafikmodus			----------&lt;br /&gt;Const 	BREITE	:Int	= 800&lt;br /&gt;Const 	HOEHE	:Int	= 600	'Ich setze die Bildschirmbreite und H&amp;ouml;he als Konstante&lt;br /&gt;Global 	Vollbild	:Int	= False	'Ob Vollbild oder nicht, soll sp&amp;auml;ter der User entscheiden, darum keine Konstante&lt;br /&gt;&lt;br /&gt;SetGraphicsDriver D3D9Max2DDriver()&lt;br /&gt;&lt;br /&gt;Graphics BREITE, HOEHE, Vollbild 'Bildschirmmodus wird gesetzt&lt;br /&gt;'AutoMidHandle(1)&lt;br /&gt;'------------------------------ Vorbereitungen		----------&lt;br /&gt;Const 	TS		:Int = 32 'Tilegr&amp;ouml;&amp;szlig;e (32*32)&lt;br /&gt;&lt;br /&gt;Global 	Frames	:TTimer = CreateTimer (120) 'damit das Spiel auf jedem Rechner gleichschnell l&amp;auml;uft setze ich einen Timer&lt;br /&gt;&lt;br /&gt;SeedRnd (MilliSecs()) 'Da ich den &amp;quot;Zufall&amp;quot; im Spiel ben&amp;ouml;tige,f&amp;uuml;ttere ich ihn schonmal mit der Zeit seit dem Systemstart&lt;br /&gt;'------------------------------ Grafiken laden    	----------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'------------------------------ Sounds laden    	----------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'------------------------------ Type-Erstellungen	----------&lt;br /&gt;Global Map:TKarte = TKarte.Erstellen(15,15,0,1,2)&lt;br /&gt;Global Spieler:TSpieler [4] 'es soll maximal 4 Spieler geben&lt;br /&gt;Spieler[0] = TSpieler.Erstellen(0,2,2,&amp;quot;GFX/robo1.png&amp;quot;,20) 'Spieler 1 wird erstellt&lt;br /&gt;&lt;br /&gt;'------------------------------ Hauptschleife		----------&lt;br /&gt;Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Explosion:TExplosion = EachIn TExplosion.ExplosionsListe 'jede erstellte Explosion durchgehen&lt;br /&gt;		Explosion.Update()&lt;br /&gt;		Explosion.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	Spieler[0].Zeichnen()&lt;br /&gt;	Spieler[0].Steuerung()&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Danke f&amp;uuml;rs Lesen!!!</description>
			<pubDate>Sun, 05 Sep 2010 00:59:18 +0200</pubDate>
		</item>

		<item>
			<title>Die Bombe kann... BOOOM ;)</title>
			<link>https://www.blitzforum.de/worklogs/394/#2879</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2879</guid>
			<author>KirkZero</author>
			<description>So, die Explosionen sollen nun auch etwas kaputt machen...&lt;br /&gt;n&amp;auml;mlich andere Bomben und SoftBl&amp;ouml;cke.&lt;br /&gt;&lt;br /&gt;Zuerst mal sollen andere Bomben zur Explosion gebracht werden.&lt;br /&gt;Ich setze jedesmal, wenn ich eine Explosion erstelle (siehe vorigen WorklogEintrag) dem Field Explosion den flag True:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Map.Feld[xFeld,yFeld].Explosion = True[/syntax]&lt;br /&gt;&lt;br /&gt;nun muss ich einfach in der Update() Methode von TBombe.bmx jedesmal pr&amp;uuml;fen, ob das Feld, auf dem die Bombe liegt im Field Explosion den wert True hat, ist dem so, so lasse ich die Bombe Explodieren:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;&lt;br /&gt;		If MilliSecs() &amp;gt; BombenTimer+BombenIntervall&lt;br /&gt;			BombenCountDown:-1 'Intervall erreicht, CountDown um 1 verringern&lt;br /&gt;			BombenTimer=MilliSecs()&lt;br /&gt;			If BombenFrame &amp;lt; BOMBENFRAMES-1&lt;br /&gt;				BombenFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Explosion = True 'Explosion auf Feld&lt;br /&gt;			BombenCountDown = 0 'Bombe zur Explosion bringen&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		If BombenCountDown &amp;lt;=0 'CountDown ist abgelaufen *BOOOM*&lt;br /&gt;			BombenListe.Remove(Self) 'Bombe aus Liste l&amp;ouml;schen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX 'wichtig! Inhalt des Feldes auf NIX zur&amp;uuml;ck setzen&lt;br /&gt;			TExplosion.Erstellen(xFeld,yFeld,FeuerKraft) 'Explosion wird erstellt&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und schon entz&amp;uuml;nden Explosionen andere Bomben &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;b&gt;Anmerkung von mir:&lt;/b&gt; auf diese Weise pr&amp;uuml;fe ich sp&amp;auml;ter auch, ob ein Spieler in einer Explosion steht  &lt;img src=&quot;/forum/images/smiles/icon_idea.gif&quot; alt=&quot;Idea&quot; /&gt; &lt;br /&gt;&lt;br /&gt;Nun will ich auch, dass eine Explosion, die auf eine Bombe trifft, sich nicht weiter fortpflanzt:&lt;br /&gt;Ich weise jedesmal, wenn ich eine Bombe lege (siehe vorigen WorklogEintrag) dem Inhalt des Feldes den Wert der Konstante BOMBE zu:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Map.Feld[xFeld,yFeld].Inhalt = BOMBE[/syntax]&lt;br /&gt;&lt;br /&gt;Somit muss ich also nur rausfinden, ob der Inhalt des Feldes, auf dem ich eine neue Explosion erstelle den Wert der Konstante BOMBE betr&amp;auml;gt:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]If Map.Feld[xFeld,yFeld].Inhalt = BOMBE Then[/syntax]&lt;br /&gt;&lt;br /&gt;ist das der Fall, soll die FeuerKraft auf 0 gesetzt werden, damit sich die Explosion nicht weiter ausbreitet.&lt;br /&gt;Das Ganze kommt nun mit in die Erstellen Funktion von TExplosion:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Function Erstellen:TExplosion(xFeld:Int,yFeld:Int,FeuerKraft:Int,ExplosionsRichtung:Int=ALLE) &lt;br /&gt;		Local NeueExplosion:TExplosion = New TExplosion&lt;br /&gt;		&lt;br /&gt;		NeueExplosion.xFeld=xFeld 'Koordinaten der neuen Explosion &amp;uuml;bergeben&lt;br /&gt;		NeueExplosion.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = BOMBE 'wenn Bombe auf Feld&lt;br /&gt;			FeuerKraft=0 'auf 0 setzen, Explosion soll sich nicht weiter fortpflanzen&lt;br /&gt;		Else&lt;br /&gt;			NeueExplosion.FeuerKraft=FeuerKraft 				'ansonsten Feuerkraft und&lt;br /&gt;			NeueExplosion.ExplosionsRichtung=ExplosionsRichtung 	'Richtung in die sie sich &amp;quot;fortpflanzt&amp;quot; &amp;uuml;bergeben&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Explosion = True 'wichtig! Inhalt des Feldes auf true setzen&lt;br /&gt;		ExplosionsListe.AddLast(NeueExplosion) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Das war einfacher, als ich anfangs dachte  &lt;img src=&quot;/forum/images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; /&gt; &lt;br /&gt;Jetzt lassen sich Kettenreaktionen ausl&amp;ouml;sen &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;so, nun gehts den SoftBl&amp;ouml;cken an den Kragen.&lt;br /&gt;Da die Map z.Z. keine Softbl&amp;ouml;cke enth&amp;auml;lt (hatte den Wert auf 0 gesetzt, damit ich die Bewegung besser testen konnte), werd ich nun wieder ein paar einf&amp;uuml;gen. Dazu einfach die Erstellen Funktion von TKarte.bmx bearbeiten:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]		'#############################################&lt;br /&gt;		'#	MAP MIT 100 SOFTBL&amp;Ouml;CKEN F&amp;Uuml;LLEN		#&lt;br /&gt;		'#	DABEI SPIELER-STARTECKEN FREI LASSEN	#&lt;br /&gt;		'#############################################&lt;br /&gt;		Local BlockZahl:Int = 50	'100 Softbl&amp;ouml;cke sollen gesetzt werden[/syntax]&lt;br /&gt;&lt;br /&gt;ich lasse nun einfach mal 50 zuf&amp;auml;llige Softbl&amp;ouml;cke erstellen.&lt;br /&gt;&lt;br /&gt;Ich muss nun einfach nur pr&amp;uuml;fen, ob der inhalt des Feldes ein softblock ist, dann die Fortpflanzung der Explosion stoppen und den Inhalt des Feldes auf NIX setzen:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]		If Map.Feld[xFeld,yFeld].Inhalt = SBLOCK 'wenn SoftBlock auf Feld&lt;br /&gt;			FeuerKraft=0 'auf 0 setzen, Explosion soll sich nicht weiter fortpflanzen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX&lt;br /&gt;		End If[/syntax]&lt;br /&gt;&lt;br /&gt;Das ganze kommt in die Update() Methode der TExplosion.bmx und zwar ganz am Anfang (es soll ja die Fortpflanzung verhindert werden):&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = SBLOCK 'wenn SoftBlock auf Feld&lt;br /&gt;			FeuerKraft=0 'auf 0 setzen, Explosion soll sich nicht weiter fortpflanzen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX&lt;br /&gt;		End If&lt;br /&gt;&lt;br /&gt;		If MilliSecs() &amp;gt; ExplosionsTimer+ExplosionsIntervall&lt;br /&gt;			ExplosionsTimer=MilliSecs()&lt;br /&gt;			&lt;br /&gt;			If Feuerkraft &amp;gt; 0&lt;br /&gt;				FeuerKraft:-1 'um 1 reduzieren, damit korrekter Wert an n&amp;auml;chste Explosion gegeben wird&lt;br /&gt;				&lt;br /&gt;				If ExplosionsRichtung = OBEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld,yFeld-1].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld,yFeld-1,FeuerKraft,OBEN) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = UNTEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld,yFeld+1].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld,yFeld+1,FeuerKraft,UNTEN) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = LINKS Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld-1,yFeld].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld-1,yFeld,FeuerKraft,LINKS) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = RECHTS Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld+1,yFeld].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld+1,yFeld,FeuerKraft,RECHTS) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				&lt;br /&gt;				FeuerKraft=0 'auf 0 setzen, damit keine endlos Fortpflanzung entsteht&lt;br /&gt;			End If&lt;br /&gt;			&lt;br /&gt;			If ExplosionsFrame &amp;lt; EXPLOFRAMES-1&lt;br /&gt;				ExplosionsFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			Else 'wenn max Explosionsframes erreicht sind, Explosion l&amp;ouml;schen&lt;br /&gt;				ExplosionsListe.Remove(Self) 'Explosion aus Liste l&amp;ouml;schen&lt;br /&gt;				Map.Feld[xFeld,yFeld].Explosion = False 'Wichtig! Feld auf false setzen&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;Jetzt wird bei einer Explosion auf einem Softblock der Inhalt auf NIX gesetzt, und man kann durchlaufen... der Block bleibt aber weiterhin sichtbar. Das liegt daran, das der Inhalt des Feldes nichts mit dessen Grafik zu tun hat. Eine Update() Methode in TFeld.bmx schafft da abhilfe:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		If Inhalt = NIX And BlockTile &amp;gt; 0'wenn NIX im Feld aber ein BlockTile da ist&lt;br /&gt;			BlockTile = 0 'BlockTile l&amp;ouml;schen&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;so... diese Update() Methode rufe ich in der Zeichnen() Methode von TKarte.bmx auf:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Zeichnen()&lt;br /&gt;		For Local Y:Int=1 To MX&lt;br /&gt;			For Local X:Int=1 To MY&lt;br /&gt;				Feld[X,Y].Update() 'Aktuelles Feld auf Richtigkeit pr&amp;uuml;fen&lt;br /&gt;				Feld[X,Y].Zeichnen(X,Y) '&amp;Uuml;bergibt X und Y Werte an Feld.Zeichnen&lt;br /&gt;			Next&lt;br /&gt;		Next&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;und schon werden Felder, welche den Inhalt NIX haben, aber dennoch BlockTiles besitzen korrigiert. Die Update() Methode von TFeld werde ich sp&amp;auml;ter noch f&amp;uuml;r andere Sachen benutzen  &lt;img src=&quot;/forum/images/smiles/icon_idea.gif&quot; alt=&quot;Idea&quot; /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Noch einen WICHTIGE Fehlerkorrektur:&lt;/b&gt;&lt;br /&gt;Ich habe grade gemerkt, das es m&amp;ouml;glich ist, das ein Feld den Status Explosion = True zu fr&amp;uuml;h verlieren kann, wenn sich Explosionen auf einem Feld &amp;uuml;berschneiden. Um das zu umgehen, setze ich den Status am Anfang der Update() Methode von TExplosion immer wieder erneut auf True!!!:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Explosion = True 	'muss immer erneut gesetzt werden, da &amp;uuml;berschneidende&lt;br /&gt;										'Explosionen den Status zu fr&amp;uuml;h aufheben k&amp;ouml;nnen&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = SBLOCK 'wenn SoftBlock auf Feld&lt;br /&gt;			FeuerKraft=0 'auf 0 setzen, Explosion soll sich nicht weiter fortpflanzen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX&lt;br /&gt;		End If&lt;br /&gt;&lt;br /&gt;		If MilliSecs() &amp;gt; ExplosionsTimer+ExplosionsIntervall&lt;br /&gt;			ExplosionsTimer=MilliSecs()&lt;br /&gt;			&lt;br /&gt;			If Feuerkraft &amp;gt; 0&lt;br /&gt;				FeuerKraft:-1 'um 1 reduzieren, damit korrekter Wert an n&amp;auml;chste Explosion gegeben wird&lt;br /&gt;				&lt;br /&gt;				If ExplosionsRichtung = OBEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld,yFeld-1].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld,yFeld-1,FeuerKraft,OBEN) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = UNTEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld,yFeld+1].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld,yFeld+1,FeuerKraft,UNTEN) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = LINKS Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld-1,yFeld].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld-1,yFeld,FeuerKraft,LINKS) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = RECHTS Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld+1,yFeld].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld+1,yFeld,FeuerKraft,RECHTS) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				&lt;br /&gt;				FeuerKraft=0 'auf 0 setzen, damit keine endlos Fortpflanzung entsteht&lt;br /&gt;			End If&lt;br /&gt;			&lt;br /&gt;			If ExplosionsFrame &amp;lt; EXPLOFRAMES-1&lt;br /&gt;				ExplosionsFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			Else 'wenn max Explosionsframes erreicht sind, Explosion l&amp;ouml;schen&lt;br /&gt;				ExplosionsListe.Remove(Self) 'Explosion aus Liste l&amp;ouml;schen&lt;br /&gt;				Map.Feld[xFeld,yFeld].Explosion = False 'Wichtig! Feld auf false setzen&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;Ausserdem kann nun endlich mal das DrawRect weg, welches mir visuell anzeigt, auf welchem Feld sich der Spieler grad befindet. Dazu kommentiere ich den Befehl einfach erstmal aus (vielleicht brauche ich es ja sp&amp;auml;ter nocheinmal) das erledige ich dann in der Zeichnen() Methode von TSpieler:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Zeichnen()&lt;br /&gt;		'DrawRect (xFeld*TS,yFeld*TS,TS,TS) 'Erstmal auskommentiert... vorerst klappt ja alles &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0)&lt;br /&gt;	End Method&lt;br /&gt;[/syntax] &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download (Code und .EXE) bis hier hin: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=9438&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/upload/file.php?id=9438&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nun werden Softbl&amp;ouml;cke gesprengt... andere Bomben zur Explosion gebracht und mich bringt es nun zu der  &amp;Uuml;berlegung:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ITEMS&lt;/b&gt; &lt;br /&gt;wie machen? Hardcode oder durch script?&lt;br /&gt;Jetzt brauch ich ein bissel Hilfe... Hardcoded w&amp;auml;re das alles kein Problem... aber, da ich ja auch was lernen will, w&amp;uuml;rde ich diese gerne per Script oder sonstiges (externe Datei) ins Spiel bringen.&lt;br /&gt;Welche M&amp;ouml;glichkeiten w&amp;auml;ren sinnvoll???&lt;br /&gt;Gibt es ein tolles Tutorial (englisch oder deutsch ist egal) oder hat da jemand ne tolle Anregung?&lt;br /&gt;&lt;br /&gt;Hoffe in der Richtung auf zahlreiche Kommentare und Anregungen... und nat&amp;uuml;rlich d&amp;uuml;rft ihr mir wie immer auf die Finger hauen, wenn ich bisher mist gebaut habe... &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Ich bedanke mich schonmal und mach mir jetzt nen Bier auf *plopp*</description>
			<pubDate>Thu, 02 Sep 2010 01:05:56 +0200</pubDate>
		</item>

		<item>
			<title>Die Bombe tickt</title>
			<link>https://www.blitzforum.de/worklogs/394/#2873</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2873</guid>
			<author>KirkZero</author>
			<description>Lasst mich endlich Bomben legen &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Vorerst soll dies mittels der linken steuerungstaste (STRG) geschehen. Also Steuerungsmethode erweitert und da ich dort auch die Methode BombeLegen() aufrufe... ist diese auch gleich mit dabei:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause 'wenn Bewegung wieder erlaubt (Zeit)&lt;br /&gt;			If 		KeyDown(KEY_UP) And MilliSecs() 'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(OBEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() 'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(UNTEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() 'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(LINKS)&lt;br /&gt;			ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() 'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(RECHTS)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		If KeyHit(KEY_LCONTROL) 'wenn linke STRG Taste gedr&amp;uuml;ckt wird&lt;br /&gt;			BombeLegen() 'dann Methode zum Bombenlegen aufrufen&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method BombeLegen()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = NIX 'wenn aktuelles Feld leer ist&lt;br /&gt;		&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;Noch passiert nix, da die Methode BombeLegen nicht wirklich etwas macht... es wird lediglich abgefragt, ob das aktuelle Feld leer ist. Sollte dies der Fall sein, soll eine neue Bombe gelegt werden.&lt;br /&gt;&lt;br /&gt;Also neue Datei angelegt: &lt;b&gt;TBombe.bmx&lt;/b&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TBombe&lt;br /&gt;	&lt;br /&gt;End Type[/syntax]&lt;br /&gt;im INCLUDES Ordner speichern und in der MainGame.bmx per include einbinden:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TBombe.bmx&amp;quot;&lt;br /&gt;[/syntax] &lt;br /&gt;&lt;br /&gt;nun f&amp;uuml;lle ich TBombe.bmx mit ein wenig Zeugs &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TBombe&lt;br /&gt;	Const 	BOMBENFRAMES	:Int=3 'Anzahl der Frames der BombenGrafik&lt;br /&gt;	Global 	BombenIMG		:TImage = LoadAnimImage(&amp;quot;gfx/bombe.png&amp;quot;,TS,TS,0,BOMBENFRAMES)&lt;br /&gt;&lt;br /&gt;	Global BombenListe:TList = CreateList() 'eine globale Liste f&amp;uuml;r alle Bomben anlegen&lt;br /&gt;&lt;br /&gt;	Field xFeld	:Int 'Koordinaten der Bombe auf dem Feld&lt;br /&gt;	Field yFeld	:Int&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawImage (BombenIMG,xFeld*TS,yFeld*TS,0)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TBombe(xFeld:Int,yFeld:Int) 'neue Bombe wird erstellt&lt;br /&gt;		Local NeueBombe:TBombe = New TBombe&lt;br /&gt;		&lt;br /&gt;		NeueBombe.xFeld=xFeld 'Koordinaten der neuen Bombe &amp;uuml;bergeben&lt;br /&gt;		NeueBombe.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Inhalt = BOMBE 'wichtig! Inhalt des Feldes auf Bombe setzen&lt;br /&gt;		BombenListe.AddLast(NeueBombe) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function&lt;br /&gt;End Type[/syntax]&lt;br /&gt;&lt;br /&gt;-eine Konstante f&amp;uuml;r die Anzahl der Frames die die Grafik der Bombe hat&lt;br /&gt;-die Grafik der Bombe wird geladen (global)&lt;br /&gt;-ich erstelle eine globale TList, in der alle neu erstellten Bomben gespeichert werden&lt;br /&gt;-nat&amp;uuml;rlich ben&amp;ouml;tigt jede Bombe ihre Koordinaten&lt;br /&gt;&lt;br /&gt;Grafik der Bombe:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9413&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;dann noch die Zeichnen() Methode, wie bei allen anderen Klassen auch und nat&amp;uuml;rlich die Erstellen() Funktion, in der ich eine neue Bombe erstelle, die Koordinaten &amp;uuml;bergebe und sie in die TList einf&amp;uuml;ge.&lt;br /&gt;Dabei ist auch wichtig, Map.Feld[xFeld,yFeld].Inhalt auf eine Bombe zu setzen.&lt;br /&gt;&lt;br /&gt;Aufgerufen wird die Erstellen() Funktion in TSpieler.bmx in der Methode BombeLegen():&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method BombeLegen()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = NIX 'wenn aktuelles Feld leer ist&lt;br /&gt;			TBombe.Erstellen(xFeld,yFeld)&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;nun noch in der MainGame.bmx eine Schleife eingef&amp;uuml;gt, welche jede Bombe der TList durchgeht und diese dann zeichnet:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]&lt;br /&gt;Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	Spieler1.Zeichnen()&lt;br /&gt;	Spieler1.Steuerung()&lt;br /&gt;	&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts im Fenster gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax] &lt;br /&gt;&lt;br /&gt;und schon kann man, wenn man das Programm startet, lustig Bomben auf dem Spielfeld legen.&lt;br /&gt; (Da der Inhalt der Map auf Bombe gesetzt wird, sobald man eine legt, kann man nun auch nicht mehr &amp;uuml;ber solche Felder dr&amp;uuml;ber laufen, sobald man sie, nach dem legen, komplett verlassen hat)&lt;br /&gt;Mehr passiert aber noch nicht.&lt;br /&gt;&lt;br /&gt;Jetzt soll die Bombe nach 3 Sekunden einfach verschwinden. Ein Paar zus&amp;auml;tliche Fields und eine Update() Methode sollen das f&amp;uuml;r mich erledigen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TBombe&lt;br /&gt;	Const 	BOMBENFRAMES	:Int=3 'Anzahl der Frames der BombenGrafik&lt;br /&gt;	Global 	BombenIMG		:TImage = LoadAnimImage(&amp;quot;gfx/bombe.png&amp;quot;,TS,TS,0,BOMBENFRAMES)&lt;br /&gt;&lt;br /&gt;	Global BombenListe:TList = CreateList() 'eine globale Liste f&amp;uuml;r alle Bomben anlegen&lt;br /&gt;&lt;br /&gt;	Field xFeld	:Int 'Koordinaten der Bombe auf dem Feld&lt;br /&gt;	Field yFeld	:Int&lt;br /&gt;	&lt;br /&gt;	Field BombenFrame		:Int = 0 'Aktuelles Frame der BombenGrafik (0=erstes Frame)&lt;br /&gt;	Field BombenCountDown	:Int = 3 'jede Bombe soll nach 3 Sekunden (oder Intervallen) explodieren&lt;br /&gt;	Field BombenIntervall	:Int = 1000 'der Intervall mit dem runtergez&amp;auml;hlt wird (1000 = 1 Sekunde)&lt;br /&gt;	Field BombenTimer		:Int = MilliSecs() 'aktuelle Zeit setzen&lt;br /&gt;	&lt;br /&gt;	Method Update()&lt;br /&gt;		&lt;br /&gt;		If MilliSecs() &amp;gt; BombenTimer+BombenIntervall&lt;br /&gt;			BombenCountDown:-1 'Intervall erreicht, CountDown um 1 verringern&lt;br /&gt;			BombenTimer=MilliSecs()&lt;br /&gt;			If BombenFrame &amp;lt; BOMBENFRAMES-1&lt;br /&gt;				BombenFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		If BombenCountDown=0 'CountDown ist abgelaufen *BOOOM*&lt;br /&gt;			BombenListe.Remove(Self) 'Bombe aus Liste l&amp;ouml;schen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX 'wichtig! Inhalt des Feldes auf NIX zur&amp;uuml;ck setzen&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawImage (BombenIMG,xFeld*TS,yFeld*TS,BombenFrame)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TBombe(xFeld:Int,yFeld:Int) 'neue Bombe wird erstellt&lt;br /&gt;		Local NeueBombe:TBombe = New TBombe&lt;br /&gt;		&lt;br /&gt;		NeueBombe.xFeld=xFeld 'Koordinaten der neuen Bombe &amp;uuml;bergeben&lt;br /&gt;		NeueBombe.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Inhalt = BOMBE 'wichtig! Inhalt des Feldes auf Bombe setzen&lt;br /&gt;		BombenListe.AddLast(NeueBombe) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function&lt;br /&gt;End Type[/syntax] &lt;br /&gt;Denke mal, die Kommentare im Code sollten gen&amp;uuml;gen... ansonsten fragen &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Update() Methode in die MainGame.bmx eingef&amp;uuml;gt:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	Spieler1.Zeichnen()&lt;br /&gt;	Spieler1.Steuerung()&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts im Fenster gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax] &lt;br /&gt;&lt;br /&gt;und schon verschwinden die gelegten Bomben nach 3 Sekunden wieder.&lt;br /&gt;Ist aber laaaangweilig... will Explosionen...  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt; &lt;br /&gt;&lt;br /&gt;Also, neue Datei erstellt. TExplosion.bmx:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TExplosion&lt;br /&gt;	&lt;br /&gt;End Type[/syntax]&lt;br /&gt;im Verzeichnis INCLUDES speichern und in der MainGame.bmx per Include einbinden:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TBombe.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TExplosion.bmx&amp;quot;[/syntax]&lt;br /&gt;&lt;br /&gt;Da ja jeder Spieler sp&amp;auml;ter Items einsammeln kann, welche die Feuerkraft erh&amp;ouml;hen, und diese f&amp;uuml;r Bomben sowie f&amp;uuml;r die Explosion wichtig ist, f&amp;uuml;hren wir die nun schonmal ein. Das neue Feld nenne ich passenderweise mal FeuerKraft &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Zuerst f&amp;uuml;r den Spieler in TSpieler.bmx&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2 'man bewegt sich immer um 2 Pixel pro Bewegung&lt;br /&gt;	&lt;br /&gt;	Field FeuerKraft		:Int = 2 'Reichweite der Explosionen einer Bombe (2 Felder in alle Richtungen)&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Der wert soll an jede gelegte Bombe &amp;uuml;bergeben werden, somit brauchen wir das Feld auch in der TBombe.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TBombe&lt;br /&gt;	Const 	BOMBENFRAMES	:Int=3 'Anzahl der Frames der BombenGrafik&lt;br /&gt;	Global 	BombenIMG		:TImage = LoadAnimImage(&amp;quot;gfx/bombe.png&amp;quot;,TS,TS,0,BOMBENFRAMES)&lt;br /&gt;&lt;br /&gt;	Global BombenListe	:TList = CreateList() 'eine globale Liste f&amp;uuml;r alle Bomben anlegen&lt;br /&gt;&lt;br /&gt;	Field xFeld		:Int 'Koordinaten der Bombe auf dem Feld&lt;br /&gt;	Field yFeld		:Int&lt;br /&gt;	&lt;br /&gt;	Field FeuerKraft	:Int 'Reichweite der Explosionen einer Bombe&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und nun muss ich den Wert beim legen einer Bombe nat&amp;uuml;rlich auch an die Bombe &amp;uuml;bergeben. Also erstellen Funktion in TBombe.bmx angepasst:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Function Erstellen:TBombe(xFeld:Int,yFeld:Int,FeuerKraft:int) 'neue Bombe wird erstellt&lt;br /&gt;		Local NeueBombe:TBombe = New TBombe&lt;br /&gt;		&lt;br /&gt;		NeueBombe.xFeld=xFeld 'Koordinaten der neuen Bombe &amp;uuml;bergeben&lt;br /&gt;		NeueBombe.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		NeueBombe.FeuerKraft=FeuerKraft&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Inhalt = BOMBE 'wichtig! Inhalt des Feldes auf Bombe setzen&lt;br /&gt;		BombenListe.AddLast(NeueBombe) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und den Aufruf der Funktion in TSpieler ebenfalls anpassen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method BombeLegen()&lt;br /&gt;		If Map.Feld[xFeld,yFeld].Inhalt = NIX 'wenn aktuelles Feld leer ist&lt;br /&gt;			TBombe.Erstellen(xFeld,yFeld,FeuerKraft)&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt; &lt;br /&gt;nun wird die FeuerKraft des Spielers an die Bomben die er legt weitergegeben *freu*&lt;br /&gt;&lt;br /&gt;nun auf zur Explosion!!! erstmal die verwendete Grafik:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9424&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Diese geh&amp;ouml;rt nat&amp;uuml;rlich in den Ordner GFX und nennt sich Explosion.png&lt;br /&gt;&lt;br /&gt;so, jetzt ab zur TExplosion.bmx. Diese &amp;auml;hnelt der TBombe.bmx sehr ich denke, das ich dann dazu erstmal nichts weiter sagen muss:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TExplosion&lt;br /&gt;	Const 	EXPLOFRAMES	:Int=49 'Anzahl der Frames der ExplosionsGrafik&lt;br /&gt;	Global 	ExplosionsIMG	:TImage = LoadAnimImage(&amp;quot;gfx/explosion.png&amp;quot;,TS,TS,0,EXPLOFRAMES)&lt;br /&gt;&lt;br /&gt;	Global ExplosionsListe	:TList = CreateList() 'eine globale Liste f&amp;uuml;r alle Explosionen anlegen&lt;br /&gt;&lt;br /&gt;	Field xFeld		:Int 'Koordinaten der Explosion auf dem Feld&lt;br /&gt;	Field yFeld		:Int&lt;br /&gt;	&lt;br /&gt;	Field FeuerKraft	:Int 'Reichweite der Explosionen&lt;br /&gt;	&lt;br /&gt;	Field ExplosionsFrame	:Int = 0 'Aktuelles Frame der ExplosionsGrafik (0=erstes Frame)&lt;br /&gt;	Field ExplosionsIntervall:Int = 25 'der Intervall mit dem die Frames gewechselt werden&lt;br /&gt;	Field ExplosionsTimer	:Int = MilliSecs() 'aktuelle Zeit setzen&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawImage (ExplosionsIMG,xFeld*TS,yFeld*TS,ExplosionsFrame)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TExplosion(xFeld:Int,yFeld:Int,FeuerKraft:Int) 'neue Explosion wird erstellt&lt;br /&gt;		Local NeueExplosion:TExplosion = New TExplosion&lt;br /&gt;		&lt;br /&gt;		NeueExplosion.xFeld=xFeld 'Koordinaten der neuen Explosion &amp;uuml;bergeben&lt;br /&gt;		NeueExplosion.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		NeueExplosion.FeuerKraft=FeuerKraft&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Explosion = True 'wichtig! Inhalt des Feldes auf true setzen&lt;br /&gt;		ExplosionsListe.AddLast(NeueExplosion) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type[/syntax] &lt;br /&gt;&lt;br /&gt;jetzt noch die passende Update() Methode um die Frames zu aktualisieren und die Explosion zu l&amp;ouml;schen, sobald sie zu ende ist:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		&lt;br /&gt;		If MilliSecs() &amp;gt; ExplosionsTimer+ExplosionsIntervall&lt;br /&gt;			ExplosionsTimer=MilliSecs()&lt;br /&gt;			If ExplosionsFrame &amp;lt; EXPLOFRAMES-1&lt;br /&gt;				ExplosionsFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			Else 'wenn max Explosionsframes erreicht sind, Explosion l&amp;ouml;schen&lt;br /&gt;				ExplosionsListe.Remove(Self) 'Explosion aus Liste l&amp;ouml;schen&lt;br /&gt;				Map.Feld[xFeld,yFeld].Explosion = False 'Wichtig! Feld auf false setzen&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WICHTIG:&lt;/b&gt;&lt;br /&gt;Map.Feld[xFeld,yFeld].Explosion&lt;br /&gt;ist ein neues Field in der TFeld.bmx, dieses hatte ich dort bisher immer auskommentiert, da ich es nun aber benutze, &amp;auml;ndere ich das schnell noch:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TFeld&lt;br /&gt;	Const 	BODENFRAMES	:Int=5&lt;br /&gt;	Const 	BLOCKFRAMES	:Int=3&lt;br /&gt;	Global 	BodenTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/boden.png&amp;quot;,TS,TS,0,BODENFRAMES)&lt;br /&gt;	Global 	BlockTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/block.png&amp;quot;,TS,TS,0,BLOCKFRAMES)&lt;br /&gt;	&lt;br /&gt;	Field BodenTile	:Int 'die Bodenfliesen. Index f&amp;uuml;r AnimImage welches die Bodenfliesen enth&amp;auml;lt&lt;br /&gt;	Field BlockTile	:Int 'die Bl&amp;ouml;cke. Index f&amp;uuml;r AnimImage. 0=erstes Tile im AnimImage leerer/durchsichtiger Block&lt;br /&gt;	Field Inhalt		:Int '0=begehbar/kein Block, 1=zerst&amp;ouml;rbarer Block, 5=Bombe, 10=unzerst&amp;ouml;bar/unpassierbar&lt;br /&gt;	Field Explosion	:Int 'wird auf true gesetzt, solange eine Explosion auf dem Feld ist&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;so... nun muss nur noch eine Explosion erstellt werden, sobald die gelegte Bombe sich nach 3 Sekunden aufl&amp;ouml;st &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;Das erledige ich in der Update() Methode von TBombe.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		&lt;br /&gt;		If MilliSecs() &amp;gt; BombenTimer+BombenIntervall&lt;br /&gt;			BombenCountDown:-1 'Intervall erreicht, CountDown um 1 verringern&lt;br /&gt;			BombenTimer=MilliSecs()&lt;br /&gt;			If BombenFrame &amp;lt; BOMBENFRAMES-1&lt;br /&gt;				BombenFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		If BombenCountDown=0 'CountDown ist abgelaufen *BOOOM*&lt;br /&gt;			BombenListe.Remove(Self) 'Bombe aus Liste l&amp;ouml;schen&lt;br /&gt;			Map.Feld[xFeld,yFeld].Inhalt = NIX 'wichtig! Inhalt des Feldes auf NIX zur&amp;uuml;ck setzen&lt;br /&gt;			TExplosion.Erstellen(xFeld,yFeld,FeuerKraft) 'Explosion wird erstellt&lt;br /&gt;		End If[/syntax]&lt;br /&gt;&lt;br /&gt;So, damit man das Ganze nun auch sehen kann... m&amp;uuml;ssen die Update() und Zeichnen() Methoden noch in die Hauptschleife der MainGame.bmx eingef&amp;uuml;gt werden:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Repeat&lt;br /&gt;	Cls 'Backbuffer l&amp;ouml;schen&lt;br /&gt;	&lt;br /&gt;	Map.Zeichnen() 'die Zeichen Methode von Map wird ausgef&amp;uuml;hrt&lt;br /&gt;	Spieler1.Zeichnen()&lt;br /&gt;	Spieler1.Steuerung()&lt;br /&gt;	For Local Bombe:TBombe = EachIn TBombe.BombenListe 'jede erstellte Bombe durchgehen&lt;br /&gt;		Bombe.Update()&lt;br /&gt;		Bombe.Zeichnen()&lt;br /&gt;	Next&lt;br /&gt;	&lt;br /&gt;	For Local Explosion:TExplosion = EachIn TExplosion.ExplosionsListe 'jede erstellte Explosion durchgehen&lt;br /&gt;		Explosion.Update()&lt;br /&gt;		Explosion.Zeichnen()&lt;br /&gt;	Next	&lt;br /&gt;&lt;br /&gt;	WaitTimer (Frames)	'da Frames=120 wird die Hauptschleife 60 mal pro Sekunde durchlaufen&lt;br /&gt;	Flip (0) 'Backbuffer wird sichtbar (0)=kein VSync&lt;br /&gt;	&lt;br /&gt;Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts im Fenster gedr&amp;uuml;ckt wird&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;und schon gibts ne tolle Explosion, nachdem die Bombe verschwindet. Jedoch ber&amp;uuml;cksichtige ich momentan die Feuerkraft noch nicht. Die Explosion soll sich in benachbarte Felder &amp;quot;fortpflanzen&amp;quot; das erledige ich in der Update() Methode von TExplosion, aber erstmal brauche ich ein neues Field und wieder ein paar Konstanten um mir den Umgang mit Zahlen zu ersparen (TExplosion.bmx):&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Field FeuerKraft		:Int 'Reichweite der Explosionen&lt;br /&gt;	Field ExplosionsRichtung	:Int 'Richtung, in die Explosion sich &amp;quot;fortpflanzt&amp;quot;&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0 'nur wieder um nicht mit Zahlen&lt;br /&gt;	Const UNTEN			:Int = 1 'hantieren zu m&amp;uuml;ssen&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	Const ALLE			:Int = 5&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;FeuerKraft ist klar.... das hatte ich schon. Neu ist&lt;br /&gt;Field ExplosionsRichtung	:Int hier wird gespeichert, in welche Richtung sich die aktuelle Explosion &amp;quot;fortpflanzt&amp;quot; und die Konstanten geben dabei die Richtung an.&lt;br /&gt;ALLE wird nur beim erstellen einer Bombe benutzt, da sich die erste Explosion in alle Richtungen &amp;quot;fortpflanzen muss&amp;quot;&lt;br /&gt;&lt;br /&gt;Dazu passe ich kurz noch die Erstellen Funktion der TExplosion.bmx an, damit ich die ExplosionsRichtung an die NeueExplosion &amp;uuml;bergeben kann:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Function Erstellen:TExplosion(xFeld:Int,yFeld:Int,FeuerKraft:Int,ExplosionsRichtung:Int=ALLE) 'neue Explosion wird erstellt&lt;br /&gt;		Local NeueExplosion:TExplosion = New TExplosion&lt;br /&gt;		&lt;br /&gt;		NeueExplosion.xFeld=xFeld 'Koordinaten der neuen Explosion &amp;uuml;bergeben&lt;br /&gt;		NeueExplosion.yFeld=yFeld&lt;br /&gt;		&lt;br /&gt;		NeueExplosion.FeuerKraft=FeuerKraft 				'Feuerkraft&lt;br /&gt;		NeueExplosion.ExplosionsRichtung=ExplosionsRichtung 	'und Richtung in die sie sich &amp;quot;fortpflanzt&amp;quot;&lt;br /&gt;		&lt;br /&gt;		Map.Feld[xFeld,yFeld].Explosion = True 'wichtig! Inhalt des Feldes auf true setzen&lt;br /&gt;		ExplosionsListe.AddLast(NeueExplosion) 'neue Bombe der globalen BombenListe hinzuf&amp;uuml;gen&lt;br /&gt;	End Function&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Wird die Erstellen Funktion ohne den Parameter ExplosionsRichtung aufgerufen, so ist dieser automatisch auf ALLE gesetzt (ist praktisch, denn ich brauche jetzt den Aufruf der Funktion, in TBombe.bmx nicht bearbeiten)&lt;br /&gt;&lt;br /&gt;Jetzt ist alles f&amp;uuml;rs &amp;quot;Fortpflanzen&amp;quot; soweit vorbereitet. Hier nun die Fortpflanzung in der Update() Methode der TExplosion.bmx:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Update()&lt;br /&gt;		&lt;br /&gt;		If MilliSecs() &amp;gt; ExplosionsTimer+ExplosionsIntervall&lt;br /&gt;			ExplosionsTimer=MilliSecs()&lt;br /&gt;			&lt;br /&gt;			If Feuerkraft &amp;gt; 0&lt;br /&gt;				FeuerKraft:-1 'um 1 reduzieren, damit korrekter Wert an n&amp;auml;chste Explosion gegeben wird&lt;br /&gt;				&lt;br /&gt;				If ExplosionsRichtung = OBEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					TExplosion.Erstellen(xFeld,yFeld-1,FeuerKraft,OBEN)&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = UNTEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					TExplosion.Erstellen(xFeld,yFeld+1,FeuerKraft,UNTEN)&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = LINKS Or ExplosionsRichtung = ALLE&lt;br /&gt;					TExplosion.Erstellen(xFeld-1,yFeld,FeuerKraft,LINKS)&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = RECHTS Or ExplosionsRichtung = ALLE&lt;br /&gt;					TExplosion.Erstellen(xFeld+1,yFeld,FeuerKraft,RECHTS)&lt;br /&gt;				End If&lt;br /&gt;				&lt;br /&gt;				FeuerKraft=0 'auf 0 setzen, damit keine endlos Fortpflanzung entsteht&lt;br /&gt;			End If&lt;br /&gt;			&lt;br /&gt;			If ExplosionsFrame &amp;lt; EXPLOFRAMES-1&lt;br /&gt;				ExplosionsFrame:+1 'Frame um 1 erh&amp;ouml;hen, solange Anzahl an Frames der Grafik noch nicht erreicht&lt;br /&gt;			Else 'wenn max Explosionsframes erreicht sind, Explosion l&amp;ouml;schen&lt;br /&gt;				ExplosionsListe.Remove(Self) 'Explosion aus Liste l&amp;ouml;schen&lt;br /&gt;				Map.Feld[xFeld,yFeld].Explosion = False 'Wichtig! Feld auf false setzen&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;[/syntax] &lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]If ExplosionsRichtung = OBEN Or ExplosionsRichtung = ALLE&lt;br /&gt;	TExplosion.Erstellen(xFeld,yFeld-1,FeuerKraft,OBEN)&lt;br /&gt;End If[/syntax]&lt;br /&gt;&lt;br /&gt;Kurz erkl&amp;auml;rt:&lt;br /&gt;Wenn die ExplosionsRichtung nach OBEN oder in ALLE Richtungen gehen soll, dann wird eine neue Explosion ein yFeld weiter oben, mit um 1 reduzierter FeuerKraft (da vor der IF Abfrage FeuerKraft:-1) erstellt, welche sich weiterhin nach OBEN fortpflanzen soll.&lt;br /&gt;&lt;br /&gt;Und schon hab ich sch&amp;ouml;ne Explosionen in der Gr&amp;ouml;&amp;szlig;e der FeuerKraft&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9430&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wie man sieht, gehen diese Explosionen noch durch alle W&amp;auml;nde durch... aber das behebe ich mal kurz. Es m&amp;uuml;ssen in der Update() Methode lediglich noch ein paar IF Abfragen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]				If ExplosionsRichtung = OBEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld,yFeld-1].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld,yFeld-1,FeuerKraft,OBEN) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = UNTEN Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld,yFeld+1].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld,yFeld+1,FeuerKraft,UNTEN) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = LINKS Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld-1,yFeld].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld-1,yFeld,FeuerKraft,LINKS) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;				If ExplosionsRichtung = RECHTS Or ExplosionsRichtung = ALLE&lt;br /&gt;					If Map.Feld[xFeld+1,yFeld].Inhalt &amp;lt;&amp;gt; HBLOCK 'wenn in ExplosionsRichtung KEIN HardBlock&lt;br /&gt;						TExplosion.Erstellen(xFeld+1,yFeld,FeuerKraft,RECHTS) 'neue Explosion in Richtung&lt;br /&gt;					End If&lt;br /&gt;				End If&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;ab jetzt werden die Explosionen von HardBl&amp;ouml;cken gestoppt&lt;br /&gt;&lt;br /&gt;Im n&amp;auml;chsten Eintrag sollen die Explosionen dann SoftBl&amp;ouml;cke zerst&amp;ouml;ren und andere Bomben zur Explosion bringen... und es gilt wie immer:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Ich w&amp;uuml;rde mich &amp;uuml;belst &amp;uuml;ber positive wie auch negative Kritik und Verbesserungsvorschl&amp;auml;ge freuen, Danke &lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download (Code und .EXE) bis hier hin:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=9431&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/upload/file.php?id=9431&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Danke f&amp;uuml;rs lesen &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;</description>
			<pubDate>Wed, 01 Sep 2010 00:59:13 +0200</pubDate>
		</item>

		<item>
			<title>Kollision mit der TileMap</title>
			<link>https://www.blitzforum.de/worklogs/394/#2867</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2867</guid>
			<author>KirkZero</author>
			<description>Bevor es nun an die Kollision mit der TileMap geht, erstmal noch eine kleine Verbesserung. Danke f&amp;uuml;r den Hinweis &lt;b&gt;@n-Halbleiter&lt;/b&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;Deine Steuerungsmethode l&amp;auml;sst sich sch&amp;ouml;n beschleunigen (wenn auch nur minimal). Du musst das &amp;quot; And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause&amp;quot; bei jeder If-Abfrage entfernen und dann die gesamte If-Abfrage f&amp;uuml;r die Tasten in eine Andere mit der Bedingung &amp;quot;MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause&amp;quot; schachteln.&lt;br /&gt;&lt;br /&gt;Die Methode w&amp;uuml;rde damit wie folgt aussehen:&lt;br /&gt;&amp;lt;code&amp;gt;&lt;br /&gt;Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause&lt;br /&gt;If KeyDown(KEY_UP) 'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;yPos:-Speed&lt;br /&gt;BewegungsTimer = MilliSecs()&lt;br /&gt;ElseIf KeyDown(KEY_DOWN) 'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;yPos:+Speed&lt;br /&gt;BewegungsTimer = MilliSecs()&lt;br /&gt;ElseIf KeyDown(KEY_LEFT) 'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;xPos:-Speed&lt;br /&gt;BewegungsTimer = MilliSecs()&lt;br /&gt;ElseIf KeyDown(KEY_RIGHT) 'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;xPos:+Speed&lt;br /&gt;BewegungsTimer = MilliSecs()&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;End Method&lt;br /&gt;&amp;lt;/code&amp;gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Somit sieht die Steuerungs Methode nun so aus:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause&lt;br /&gt;			If	KeyDown(KEY_UP) 'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(OBEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_DOWN) 'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(UNTEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_LEFT) 'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(LINKS)&lt;br /&gt;			ElseIf 	KeyDown(KEY_RIGHT) 'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(RECHTS)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Jetzt gehts an die Kollision mit der TileMap &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ich beziehe mich hier immer auf die Datei TSpieler.bmx! Sollte das einmal nicht der Fall sein, so werde ich es ausdr&amp;uuml;cklich betonen &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ich habe im letzten Worklog mit der Methode MapFeld() berechnet, auf welchem Tile der Map ich mich eigentlich grade befinde. Wenn ich mich nun nach Oben bewegen will, muss ich pr&amp;uuml;fen, ob das Feld &amp;uuml;ber mir &amp;uuml;berhaupt begehbar ist:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x	:Int ' Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y	:Int&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld-1].Inhalt = NIX 'wenn oben NIX ist, dann nach oben bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				End If&lt;br /&gt;[/syntax]&lt;br /&gt;und das Gleiche nat&amp;uuml;rlich f&amp;uuml;r die anderen Richtungen:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x	:Int ' Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y	:Int&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld-1].Inhalt = NIX 'wenn oben NIX ist, dann nach oben bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case UNTEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld+1].Inhalt = NIX 'wenn unten NIX ist, dann nach unten bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				End If&lt;br /&gt;			Case LINKS&lt;br /&gt;				If Map.Feld[xFeld-1,yFeld].Inhalt = NIX 'wenn links NIX ist, dann nach links bewegen&lt;br /&gt;					x=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case RECHTS&lt;br /&gt;				If Map.Feld[xFeld+1,yFeld].Inhalt = NIX 'wenn rechts NIX ist, dann nach rechts bewegen&lt;br /&gt;					x=+Speed&lt;br /&gt;				End If&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;Sobald man sich nun ein bissel hin und her bewegt, merkt man schnell... das ist wohl so noch nicht ganz richtig. Denn, sobald das Feld aktualisiert wird, wird bei einer weiteren Bewegung in der selben Richtung, gleich das n&amp;auml;chste Feld abgefragt. Sollte dies dann jedoch nicht begehbar sein, kann man das aktuelle Feld nicht komplett betreten. (ohjeh... hab ich mal wieder bl&amp;ouml;d erkl&amp;auml;rt)&lt;br /&gt;Man h&amp;auml;ngt also irgendwann fest.&lt;br /&gt;&lt;br /&gt;Das Problem l&amp;ouml;se ich nun wieder mittels Mod:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x	:Int ' Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y	:Int&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld-1].Inhalt = NIX 'wenn oben NIX ist, dann nach oben bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				Else If (yPos Mod TS) &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case UNTEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld+1].Inhalt = NIX 'wenn unten NIX ist, dann nach unten bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				Else If (yPos Mod TS) &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				End If&lt;br /&gt;			Case LINKS&lt;br /&gt;				If Map.Feld[xFeld-1,yFeld].Inhalt = NIX 'wenn links NIX ist, dann nach links bewegen&lt;br /&gt;					x=-Speed&lt;br /&gt;				Else If (xPos Mod TS) &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case RECHTS&lt;br /&gt;				If Map.Feld[xFeld+1,yFeld].Inhalt = NIX 'wenn rechts NIX ist, dann nach rechts bewegen&lt;br /&gt;					x=+Speed&lt;br /&gt;				Else If (xPos Mod TS) &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=+Speed&lt;br /&gt;				End If&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;Wer damit nun aber ein wenig rumspielt, wird bemerken, es sind immernoch fehlerhafte Bewegungen m&amp;ouml;glich. Bewegt man sich z.B. zu Beginn nur ein kleines St&amp;uuml;ck nach rechts und dann nach unten, so ist der Spieler ja zum Teil in einem unbegehbaren Block. Bewegt man sich dann nochmals nach rechts, kann man sogar einen unbegehbaren komplett betreten.&lt;br /&gt;&lt;br /&gt;Ein St&amp;uuml;ck nach rechts bewegen:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9397&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dann nach unten&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9398&lt;br /&gt;&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;und wenn man sich nun nach rechts bewegt, landet man komplett auf einem unbegehbarem Feld&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9399&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bevor ich mich allerdings diesem Problem widme, erweitere ich erstmal die Methode Bewegung() um 2 Lokale Variablen. Da ich nun auch dort mit Mod arbeite.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So schauts nun aus:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x		:Int ' Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y		:Int&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld-1].Inhalt = NIX 'wenn oben NIX ist, dann nach oben bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case UNTEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld+1].Inhalt = NIX 'wenn unten NIX ist, dann nach unten bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				End If&lt;br /&gt;			Case LINKS&lt;br /&gt;				If Map.Feld[xFeld-1,yFeld].Inhalt = NIX 'wenn links NIX ist, dann nach links bewegen&lt;br /&gt;					x=-Speed&lt;br /&gt;				Else If xMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case RECHTS&lt;br /&gt;				If Map.Feld[xFeld+1,yFeld].Inhalt = NIX 'wenn rechts NIX ist, dann nach rechts bewegen&lt;br /&gt;					x=+Speed&lt;br /&gt;				Else If xMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=+Speed&lt;br /&gt;				End If&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Und nun zu dem genannten Problem.&lt;br /&gt;Sollte ich nun diese Position haben:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=9397&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;und ich bewege mich nun nach unten, so m&amp;ouml;chte ich, das der Spieler sich automatisch solange nach links bewegt, bis eine Bewegung nach unten m&amp;ouml;glich ist.&lt;br /&gt;(Nach links deshalb, weil mein aktuelles Feld sich links vom Sprite befindet.)&lt;br /&gt;&lt;br /&gt;Dazu pr&amp;uuml;fe ich ersteinmal, ob meine aktuelle Feldkoordinate (mit der Tilesize multipliziert) kleiner ist, als meine aktuelle Pixelkoordinate:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]			Case UNTEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld+1].Inhalt = NIX 'wenn unten NIX ist&lt;br /&gt;					If xFeld*TS &amp;lt; xPos 'ist (Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						x=-Speed 'dann um &amp;quot;Speed&amp;quot; Pixel nach links bewegen&lt;br /&gt;					Else 'passt es genau, dann um &amp;quot;Speed&amp;quot; Pixel nach unten bewegen&lt;br /&gt;						y=+Speed&lt;br /&gt;					End If&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				End If&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und nun das Ganze auch f&amp;uuml;r den fall, das mein aktuelles Feld rechts von mir ist und ich mich dann automatisch nach rechts bewegen muss, bis ich genau in die l&amp;uuml;cke nach unten passe:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]			Case UNTEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld+1].Inhalt = NIX 'wenn unten NIX ist&lt;br /&gt;					If 		xFeld*TS &amp;lt; xPos 'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						x=-Speed 'dann um Speed Pixel nach links bewegen&lt;br /&gt;					Else If 	xFeld*TS &amp;gt; xPos 'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						x=+Speed 'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;					Else 'passt es genau, dann um Speed Pixel nach unten bewegen&lt;br /&gt;						y=+Speed&lt;br /&gt;					End If&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				End If&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;und nun f&amp;uuml;r alle Richtungen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld-1].Inhalt = NIX 'wenn oben NIX ist, nach oben bewegen&lt;br /&gt;					If 		xFeld*TS &amp;lt; xPos 	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;					Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;					Else 					'passt es genau, dann um Speed Pixel nach oben bewegen&lt;br /&gt;						y=-Speed&lt;br /&gt;					End If&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case UNTEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld+1].Inhalt = NIX 'wenn unten NIX ist&lt;br /&gt;					If 		xFeld*TS &amp;lt; xPos 	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;					Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;					Else&lt;br /&gt;						y=+Speed				'passt es genau, dann um Speed Pixel nach unten bewegen&lt;br /&gt;					End If&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				End If&lt;br /&gt;			Case LINKS&lt;br /&gt;				If Map.Feld[xFeld-1,yFeld].Inhalt = NIX 'wenn links NIX ist, nach links bewegen&lt;br /&gt;					If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;					Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;					Else&lt;br /&gt;						x=-Speed				'passt es genau, dann um Speed Pixel nach links bewegen&lt;br /&gt;					End If&lt;br /&gt;				Else If xMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case RECHTS&lt;br /&gt;				If Map.Feld[xFeld+1,yFeld].Inhalt = NIX 'wenn rechts NIX ist, nach rechts bewegen&lt;br /&gt;					If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;					Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;					Else&lt;br /&gt;						x=+Speed				'passt es genau, dann um Speed Pixel nach rechts bewegen&lt;br /&gt;					End If&lt;br /&gt;				Else If xMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=+Speed&lt;br /&gt;				End If&lt;br /&gt;		End Select&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;b&gt;Anmerkung von mir:&lt;/b&gt; um die Kommentare usw richtig einger&amp;uuml;ckt zu sehen, am besten den Code Kopieren und in die IDE einf&amp;uuml;gen... dann sollte es &amp;uuml;bersichtlicher sein.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT  ########## &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;########## &lt;/b&gt;&lt;br /&gt;ich habe das ganze grad nochmal sch&amp;ouml;n zusammengefasst... das spart Code und gibt wieder mehr &amp;Uuml;bersicht! *freu*&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x		:Int 'Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y		:Int&lt;br /&gt;		Local fx		:Int 'Tempor&amp;auml;re Speicher f&amp;uuml;r zu pr&amp;uuml;fende Felder&lt;br /&gt;		Local fy		:Int 'ist fy=-1 wird oberes vom aktuellen Feld gepr&amp;uuml;ft&lt;br /&gt;&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				fy=-1	'oberes Feld pr&amp;uuml;fen&lt;br /&gt;			Case UNTEN&lt;br /&gt;				fy=+1	'unteres Feld pr&amp;uuml;fen&lt;br /&gt;			Case LINKS&lt;br /&gt;				fx=-1	'linkes Feld pr&amp;uuml;fen&lt;br /&gt;			Case RECHTS&lt;br /&gt;				fx=+1	'rechtes Feld pr&amp;uuml;fen&lt;br /&gt;		End Select&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld+fx,yFeld+fy].Inhalt = NIX 'wenn auf dem zu pr&amp;uuml;fenden Feld NIX ist&lt;br /&gt;		&lt;br /&gt;			If fy &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld oben oder unten, dan auf Autobewegung checken&lt;br /&gt;				If 		xFeld*TS &amp;lt; xPos 	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;				Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;				Else&lt;br /&gt;					y=fy*Speed			'passt es genau, dann um Speed Pixel nach fy bewegen&lt;br /&gt;				End If &lt;br /&gt;			End If&lt;br /&gt;			&lt;br /&gt;			If fx &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld oben oder unten, dan auf Autobewegung checken&lt;br /&gt;				If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;				Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;				Else&lt;br /&gt;					x=fx*Speed			'passt es genau, dann um Speed Pixel nach fx bewegen&lt;br /&gt;				End If&lt;br /&gt;			End If&lt;br /&gt;				&lt;br /&gt;		Else If fy &amp;lt;&amp;gt; 0 And yMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			y=fy*Speed&lt;br /&gt;		Else If fx &amp;lt;&amp;gt; 0 And xMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			x=fx*Speed&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;END EDIT  ########## &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt;########## &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;und hier die Komplette Spieler.bmx (ALT) ohne Zusammenfassung (siehe EDIT hier dr&amp;uuml;ber):&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 25&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause 'wenn Bewegung wieder erlaubt (Zeit)&lt;br /&gt;			If 		KeyDown(KEY_UP) And MilliSecs() 'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(OBEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() 'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(UNTEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() 'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(LINKS)&lt;br /&gt;			ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() 'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(RECHTS)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x		:Int ' Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y		:Int&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld-1].Inhalt = NIX 'wenn oben NIX ist, nach oben bewegen&lt;br /&gt;					If 		xFeld*TS &amp;lt; xPos 	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;					Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;					Else 					'passt es genau, dann um Speed Pixel nach oben bewegen&lt;br /&gt;						y=-Speed&lt;br /&gt;					End If&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case UNTEN&lt;br /&gt;				If Map.Feld[xFeld,yFeld+1].Inhalt = NIX 'wenn unten NIX ist&lt;br /&gt;					If 		xFeld*TS &amp;lt; xPos 	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;					Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;					Else&lt;br /&gt;						y=+Speed				'passt es genau, dann um Speed Pixel nach unten bewegen&lt;br /&gt;					End If&lt;br /&gt;				Else If yMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					y=+Speed&lt;br /&gt;				End If&lt;br /&gt;			Case LINKS&lt;br /&gt;				If Map.Feld[xFeld-1,yFeld].Inhalt = NIX 'wenn links NIX ist, nach links bewegen&lt;br /&gt;					If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;					Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;					Else&lt;br /&gt;						x=-Speed				'passt es genau, dann um Speed Pixel nach links bewegen&lt;br /&gt;					End If&lt;br /&gt;				Else If xMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=-Speed&lt;br /&gt;				End If&lt;br /&gt;			Case RECHTS&lt;br /&gt;				If Map.Feld[xFeld+1,yFeld].Inhalt = NIX 'wenn rechts NIX ist, nach rechts bewegen&lt;br /&gt;					If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;						y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;					Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;						y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;					Else&lt;br /&gt;						x=+Speed				'passt es genau, dann um Speed Pixel nach rechts bewegen&lt;br /&gt;					End If&lt;br /&gt;				Else If xMod &amp;lt;&amp;gt; 0 'wenn nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;					x=+Speed&lt;br /&gt;				End If&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method MapFeld() 'berechnet aktuelles Map.Feld[,]&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		If yMod &amp;lt; (TS/2) Then yFeld=(yPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If yMod &amp;gt; (TS/2) Then yFeld=(yPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		If xMod &amp;lt; (TS/2) Then xFeld=(xPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If xMod &amp;gt; (TS/2) Then xFeld=(xPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawRect (xFeld*TS,yFeld*TS,TS,TS)&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;und hier nochmal die komplette TSpieler.bmx mit der zusammengefassten Bewegungs Methode:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 20&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause 'wenn Bewegung wieder erlaubt (Zeit)&lt;br /&gt;			If 		KeyDown(KEY_UP) And MilliSecs() 'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(OBEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() 'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(UNTEN)&lt;br /&gt;			ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() 'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(LINKS)&lt;br /&gt;			ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() 'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;				Bewegung(RECHTS)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x		:Int 'Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y		:Int&lt;br /&gt;		Local fx		:Int 'Tempor&amp;auml;re Speicher f&amp;uuml;r zu pr&amp;uuml;fende Felder&lt;br /&gt;		Local fy		:Int 'ist fy=-1 wird oberes vom aktuellen Feld gepr&amp;uuml;ft&lt;br /&gt;&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				fy=-1	'oberes Feld pr&amp;uuml;fen&lt;br /&gt;			Case UNTEN&lt;br /&gt;				fy=+1	'unteres Feld pr&amp;uuml;fen&lt;br /&gt;			Case LINKS&lt;br /&gt;				fx=-1	'linkes Feld pr&amp;uuml;fen&lt;br /&gt;			Case RECHTS&lt;br /&gt;				fx=+1	'rechtes Feld pr&amp;uuml;fen&lt;br /&gt;		End Select&lt;br /&gt;		&lt;br /&gt;		If Map.Feld[xFeld+fx,yFeld+fy].Inhalt = NIX 'wenn rechts NIX ist&lt;br /&gt;		&lt;br /&gt;			If fy &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld oben oder unten, dan auf Autobewegung checken&lt;br /&gt;				If 		xFeld*TS &amp;lt; xPos 	'ist (X Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					x=-Speed 				'dann um Speed Pixel nach links bewegen&lt;br /&gt;				Else If 	xFeld*TS &amp;gt; xPos 	'ist (X Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					x=+Speed 				'dann um Speed Pixel nach rechts bewegen&lt;br /&gt;				Else&lt;br /&gt;					y=fy*Speed			'passt es genau, dann um Speed Pixel nach fy bewegen&lt;br /&gt;				End If &lt;br /&gt;			End If&lt;br /&gt;			&lt;br /&gt;			If fx &amp;lt;&amp;gt; 0 'ist das zu pr&amp;uuml;fende Feld oben oder unten, dan auf Autobewegung checken&lt;br /&gt;				If 		yFeld*TS &amp;lt; yPos	'ist (Y Feldkoordinate*TS) kleiner als Pixelkoordinate&lt;br /&gt;					y=-Speed				'dann um Speed Pixel nach oben bewegen&lt;br /&gt;				Else If	yFeld*TS &amp;gt; yPos	'ist (Y Feldkoordinate*TS) gr&amp;ouml;&amp;szlig;er als Pixelkoordinate&lt;br /&gt;					y=+Speed				'dann um Speed Pixel nach unten bewegen&lt;br /&gt;				Else&lt;br /&gt;					x=fx*Speed			'passt es genau, dann um Speed Pixel nach fx bewegen&lt;br /&gt;				End If&lt;br /&gt;			End If&lt;br /&gt;				&lt;br /&gt;		Else If fy &amp;lt;&amp;gt; 0 And yMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			y=fy*Speed&lt;br /&gt;		Else If fx &amp;lt;&amp;gt; 0 And xMod &amp;lt;&amp;gt; 0 'wenn nicht begehbar aber noch nicht ganz auf dem Feld, dann trotzdem bewegen&lt;br /&gt;			x=fx*Speed&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;		yPos:+y 'Spieler Koordinaten aktualisieren&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld[,] wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method MapFeld() 'berechnet aktuelles Map.Feld[,]&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den xPos modulus von TS (32)&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS)&lt;br /&gt;&lt;br /&gt;		If yMod &amp;lt; (TS/2) Then yFeld=(yPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If yMod &amp;gt; (TS/2) Then yFeld=(yPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		If xMod &amp;lt; (TS/2) Then xFeld=(xPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If xMod &amp;gt; (TS/2) Then xFeld=(xPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawRect (xFeld*TS,yFeld*TS,TS,TS)&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;[/syntax]&lt;br /&gt;Um ein wenig auf der Map rumzulaufen, ohne die st&amp;ouml;renden Softbl&amp;ouml;cke (um das ganze einfach mal zu testen), kann man diese ganz einfach in der &lt;b&gt;TKarte.bmx&lt;/b&gt; entfernen. &lt;br /&gt;Einfach in der Erstellen Funktion die Variable BlockZahl auf 0 setzen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]		'#############################################&lt;br /&gt;		'#	MAP MIT 100 SOFTBL&amp;Ouml;CKEN F&amp;Uuml;LLEN		#&lt;br /&gt;		'#	DABEI SPIELER-STARTECKEN FREI LASSEN	#&lt;br /&gt;		'#############################################&lt;br /&gt;		Local BlockZahl:Int = 100	'100 Softbl&amp;ouml;cke sollen gesetzt werden&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;dort bei&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Local BlockZahl:Int = 100[/syntax]&lt;br /&gt;&lt;br /&gt;einfach 0 eintragen:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Local BlockZahl:Int = 0[/syntax]&lt;br /&gt; &lt;br /&gt;und die MainGame.bmx starten. Schon kann man die ganze Sache mit mehr Freiraum testen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Diesmal gibt es wieder den kompletten Code bis hier hin (inklusive .EXE) zum Download:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=9412&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/upload/file.php?id=9412&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Das war es dann erstmal zur Pixelweise Bewegung mit TileMap Kollision. Ich bedanke mich erneut f&amp;uuml;rs Lesen und es gilt wie immer:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ich w&amp;uuml;rde mich &amp;uuml;belst &amp;uuml;ber positive wie auch negative Kritik und Verbesserungsvorschl&amp;auml;ge freuen, Danke &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Bein n&amp;auml;chsten mal lege ich dann ne Bombe &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt; oder evtl. werd ich den Spieler ersteinmal animieren... oder beides... mal sehen *wink*</description>
			<pubDate>Sun, 29 Aug 2010 23:40:50 +0200</pubDate>
		</item>

		<item>
			<title>Pixelweise Bewegung und Map.Feld Berechnungen</title>
			<link>https://www.blitzforum.de/worklogs/394/#2861</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2861</guid>
			<author>KirkZero</author>
			<description>Nun will ich mich Pixelweise bewegen...&lt;br /&gt;Dazu erh&amp;auml;lt TSpieler erstmal ein paar neue Field Eintr&amp;auml;ge und ein paar Konstante:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 10&lt;br /&gt;[/syntax]&lt;br /&gt;Neu sind nun XPos und yPos. Diese sind nun f&amp;uuml;r die Position in Pixel f&amp;uuml;r den Spieler zust&amp;auml;ndig. xFeld und yFeld bleiben allerdings weiterhin wichtig, da ich ja immer noch wissen will, auf welchem Feld der Map sich der Spieler befindet.&lt;br /&gt;Speed habe ich auf 2 gesetzt. Speed gibt an, wieviele Pixel sich der Spieler bei jeder Bewegung fortbewegt.&lt;br /&gt;die 4 Konstanten OBEN, UNTEN, LINKS und RECHTS vereinfachen mir nur wieder die Sache, dass ich nicht mit Zahlen arbeiten muss, sondern aussagekr&amp;auml;ftige Namen habe... wof&amp;uuml;r die sind, kommt sp&amp;auml;ter.&lt;br /&gt;BewegungsPause habe ich runter auf 10 gesetzt, da wir uns ja nun gleich Pixelweise bewegen wollen und 250 w&amp;auml;ren ziemlich langsame Schritte &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;die Erstellen Funktion passe ich ebenfalls an:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Function Erstellen:TSpieler (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function[/syntax]&lt;br /&gt;NeuerSpieler.xPos und NeuerSpieler.yPos erhalten nun ihre PixelKoordinaten ausgehend vom StartFELD!&lt;br /&gt;&lt;br /&gt;Hier die Zeichnen Methode:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Zeichnen()&lt;br /&gt;		DrawRect (xFeld*TS,yFeld*TS,TS,TS) 'Zeichnet ein Rechteck auch aktuellem FELD&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0) 'Zeichnet den Spieler an seinen PixelKoordinaten&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;Ich zeichne dort auch ein Rechteck. Dieses soll mir visuell veranschaulichen, auf welchem Map.Feld sich der Spieler momentan befindet (&amp;Auml;ndert sich allerdings noch nicht, kommt sp&amp;auml;ter &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt; )&lt;br /&gt;&lt;br /&gt;Jetzt noch die Steuerungs Methode angepasst:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If 		KeyDown(KEY_UP) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yPos:-Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yPos:+Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;			xPos:-Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;			xPos:+Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;und schon bewege ich mich Pixelweise &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;hier noch der Komplette Code:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 10&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If 		KeyDown(KEY_UP) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yPos:-Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yPos:+Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;			xPos:-Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;			xPos:+Speed&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawRect (xFeld*TS,yFeld*TS,TS,TS)&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Jetzt zu den 4 Konstanten OBEN, UNTEN, LINKS und RECHTS.&lt;br /&gt;Ich erstelle eine neue Methode namens Bewegung():&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x	:Int 'Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y	:Int&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				x=0&lt;br /&gt;				y=-Speed&lt;br /&gt;			Case UNTEN&lt;br /&gt;				x=0&lt;br /&gt;				y=+Speed&lt;br /&gt;			Case LINKS&lt;br /&gt;				x=-Speed&lt;br /&gt;				y=0&lt;br /&gt;			Case RECHTS&lt;br /&gt;				x=+Speed&lt;br /&gt;				y=0&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y&lt;br /&gt;		xPos:+x&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;Statt nun immer alle koordinaten&amp;auml;nderungen in der Methode Steuerung vorzunehmen, m&amp;ouml;chte ich das auf die Methode Bewegung abschieben.&lt;br /&gt;Dr&amp;uuml;cke ich nun die Rechte Pfeiltaste, Rufe ich die Methode Bewegung() so auf:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Bewegung(RECHTS)[/syntax]&lt;br /&gt;was passiert dann? die tempor&amp;auml;re Speichervariable x bekommt den positiven Wert von Speed zugewiesen. Also ist nun x=2&lt;br /&gt;Da y=0 ist wird nun also am ende von &amp;quot;Select Case&amp;quot; die yPos Variable den wert 0 addiert und die xPos Variable den wert Speed addiert. Also bewege ich mich jetzt 2 pixel nach rechts.&lt;br /&gt;Danach muss ich nat&amp;uuml;rlich den BewegungsTimer wieder auf MilliSecs() setzen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Anmerkung von mir:&lt;/b&gt; Man muss z.B. bei:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]			Case OBEN&lt;br /&gt;				x=0 'braucht nicht auf 0 gesetzt zu werden (kann also weggelassen werden)&lt;br /&gt;				y=-Speed&lt;br /&gt;[/syntax]&lt;br /&gt;x nicht den Wert 0 zuweisen, da dieser so oder so beim Aufruf der Methode erstmal 0 ist. Habe es aber erstmal der Vollst&amp;auml;ndigkeit halber trotzdem gemacht. (gleiches gilt nat&amp;uuml;rlich f&amp;uuml;r y)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;nun noch die Steuerungs Methode angepasst:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If 		KeyDown(KEY_UP) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(OBEN)&lt;br /&gt;		ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(UNTEN)&lt;br /&gt;		ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(LINKS)&lt;br /&gt;		ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(RECHTS)&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method[/syntax]&lt;br /&gt;und schon klappt alles so wie vorher auch.&lt;br /&gt;&lt;br /&gt;Kompletter Code der TSpieler.bmx:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Int 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Int&lt;br /&gt;	Field Speed			:Int = 2&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 10&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If 		KeyDown(KEY_UP) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(OBEN)&lt;br /&gt;		ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(UNTEN)&lt;br /&gt;		ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(LINKS)&lt;br /&gt;		ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(RECHTS)&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x	:Int '&lt;br /&gt;		Local y	:Int&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				x=0 'braucht nicht auf 0 gesetzt zu werden (kann also weggelassen werden)&lt;br /&gt;				y=-Speed&lt;br /&gt;			Case UNTEN&lt;br /&gt;				x=0 'braucht nicht auf 0 gesetzt zu werden (kann also weggelassen werden)&lt;br /&gt;				y=+Speed&lt;br /&gt;			Case LINKS&lt;br /&gt;				x=-Speed&lt;br /&gt;				y=0 'braucht nicht auf 0 gesetzt zu werden (kann also weggelassen werden)&lt;br /&gt;			Case RECHTS&lt;br /&gt;				x=+Speed&lt;br /&gt;				y=0 'braucht nicht auf 0 gesetzt zu werden (kann also weggelassen werden)&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y&lt;br /&gt;		xPos:+x&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawRect (xFeld*TS,yFeld*TS,TS,TS)&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Jetzt will ich auch das Feld aktualisieren, wenn der Spieler ein neues Feld betritt. Das erledige ich erstmal ganz simpel, in dem ich eine neue Methode erstelle, welche ich in der Bewegungs Methode aufrufe. Diese schaut vorerst so aus:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method MapFeld()&lt;br /&gt;		yFeld=(yPos/TS)&lt;br /&gt;		xFeld=(xPos/TS)&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;rufe ich nun diese Methode am Ende der Bewegungs Methode auf, so &amp;auml;ndern sich nun auch die Map.Feld Koordinaten.&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x	:Int ' Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y	:Int&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				y=-Speed&lt;br /&gt;			Case UNTEN&lt;br /&gt;				y=+Speed&lt;br /&gt;			Case LINKS&lt;br /&gt;				x=-Speed&lt;br /&gt;			Case RECHTS&lt;br /&gt;				x=+Speed&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;Bewegt man sich nun auf ein anderes Tile der Map, so wird nun auch das Aktuelle Feld ge&amp;auml;ndert. Das passiert zwar nun noch ungenau, da es sich erst &amp;auml;ndert, wenn sich der obere linke Punkt (die BezugsKoordinate) des Spielers auf einem neuem Tile befindet, aber das werd ich gleich noch &amp;auml;ndern.&lt;br /&gt;Bin da grad am T&amp;uuml;fteln mittels Mod()&lt;br /&gt;So... und das ist dabei rausgekommen und macht auch genau das, was ich will:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Method MapFeld()&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den yPos modulus von TS (32)&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS)&lt;br /&gt;		If yMod &amp;lt; (TS/2) Then yFeld=(yPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If yMod &amp;gt; (TS/2) Then yFeld=(yPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		If xMod &amp;lt; (TS/2) Then xFeld=(xPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If xMod &amp;gt; (TS/2) Then xFeld=(xPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;[/syntax]&lt;br /&gt;Sobald man sich &amp;uuml;ber die H&amp;auml;lfte des Feldes hinausbewegt ( (16 Mod 32)=16 also alles was &amp;uuml;ber 16 ist, gilt als &amp;uuml;ber die H&amp;auml;lfte) betritt man ein neues Tile (weiterhin in der Zeichen Methode visuell angezeigt, durch DrawRect)&lt;br /&gt;&lt;br /&gt;und hier ein kleines CodeBeispiel, was Mod macht bzw welche Werte es ausspuckt im Wertebereich meiner TileGr&amp;ouml;&amp;szlig;e(32)&lt;br /&gt;(neues Fenster in der IDE &amp;ouml;ffnen, einf&amp;uuml;gen und laufen lassen &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt; )&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Rem&lt;br /&gt;Mod is a mathematical operator that performs the Modulo function.&lt;br /&gt;End Rem&lt;br /&gt;&lt;br /&gt;For i=0 To 32 Step 2&lt;br /&gt;	Print i+&amp;quot; Mod 32=&amp;quot;+(i Mod 32)&lt;br /&gt;Next&lt;br /&gt;[/syntax]&lt;br /&gt;Mod ergibt also den nichtteilbaren Rest. 32 l&amp;auml;sst sich durch 32 teilen, darum ergibt 32 Mod 32 = 0&lt;br /&gt;34 l&amp;auml;sst sich einmal durch 32 teilen, bleiben allerdings 2 &amp;uuml;ber darum ergibt 34 Mod 32 = 2 usw...&lt;br /&gt;&lt;br /&gt;Da nun die FeldAktualisierung korrekt funktioniert, kann ich mich im n&amp;auml;chsten Worklog um die Kollision mit der TileMap k&amp;uuml;mmern.&lt;br /&gt;&lt;br /&gt;Da ich ein wenig ArchivSpeicherplatz sparen will und ich lediglich die TSpieler.bmx ge&amp;auml;ndert habe, gibt es diesmal &lt;b&gt;nur den Code der TSpieler.bmx&lt;/b&gt;&lt;br /&gt;welcher einfach in &lt;b&gt;diesen Download (der letzte komplette Download):&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=9377&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/upload/file.php?id=9377&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;eingef&amp;uuml;gt werden kann und die alte TSpieler.bmx dann ersetzt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Der komplette Code von TSpieler.bmx:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende FELD&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	Field xPos			:Float 'x und y Koordinaten f&amp;uuml;r Pixelweise Bewegung&lt;br /&gt;	Field yPos			:Float&lt;br /&gt;	Field Speed			:Int = 2&lt;br /&gt;	&lt;br /&gt;	Const OBEN			:Int = 0&lt;br /&gt;	Const UNTEN			:Int = 1&lt;br /&gt;	Const LINKS			:Int = 2&lt;br /&gt;	Const RECHTS			:Int = 3&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 10&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If 		KeyDown(KEY_UP) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(OBEN)&lt;br /&gt;		ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(UNTEN)&lt;br /&gt;		ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(LINKS)&lt;br /&gt;		ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;			Bewegung(RECHTS)&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Bewegung(Richtung:Int)&lt;br /&gt;		Local x	:Int ' Tempor&amp;auml;re Speicher&lt;br /&gt;		Local y	:Int&lt;br /&gt;		&lt;br /&gt;		Select Richtung&lt;br /&gt;			Case OBEN&lt;br /&gt;				y=-Speed&lt;br /&gt;			Case UNTEN&lt;br /&gt;				y=+Speed&lt;br /&gt;			Case LINKS&lt;br /&gt;				x=-Speed&lt;br /&gt;			Case RECHTS&lt;br /&gt;				x=+Speed&lt;br /&gt;		End Select&lt;br /&gt;		yPos:+y&lt;br /&gt;		xPos:+x&lt;br /&gt;		MapFeld() 'Aktuelles Map.Feld wird berechnet&lt;br /&gt;		BewegungsTimer = MilliSecs()&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method MapFeld()&lt;br /&gt;		Local yMod	:Int = (yPos Mod TS) 'Tempor&amp;auml;rer Speicher f&amp;uuml;r den yPos modulus von TS (32)&lt;br /&gt;		Local xMod	:Int = (xPos Mod TS)&lt;br /&gt;		If yMod &amp;lt; (TS/2) Then yFeld=(yPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If yMod &amp;gt; (TS/2) Then yFeld=(yPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		If xMod &amp;lt; (TS/2) Then xFeld=(xPos/TS)		'wenn modulus &amp;lt; als 16&lt;br /&gt;		If xMod &amp;gt; (TS/2) Then xFeld=(xPos/TS)+1		'wenn modulus &amp;gt; als 16&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawRect (xFeld*TS,yFeld*TS,TS,TS)&lt;br /&gt;		DrawImage (SpielerIMG,xPos,yPos,0)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'Start FELD Koordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.xPos 		= xFeld*TS 'Koordinaten f&amp;uuml;r Pixelweise Bewegung f&amp;uuml;llen&lt;br /&gt;		NeuerSpieler.yPos 		= yFeld*TS&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Danke f&amp;uuml;rs Lesen und wie immer gilt:&lt;br /&gt;&lt;b&gt;Ich w&amp;uuml;rde mich &amp;uuml;belst &amp;uuml;ber positive wie auch negative Kritik und Verbesserungsvorschl&amp;auml;ge freuen, Danke &lt;img src=&quot;/forum/images/smiles/icon_exclaim.gif&quot; alt=&quot;Exclamation&quot; /&gt; &lt;/b&gt;</description>
			<pubDate>Sun, 29 Aug 2010 00:17:13 +0200</pubDate>
		</item>

		<item>
			<title>Einige Änderungen des vorigen Worklogs</title>
			<link>https://www.blitzforum.de/worklogs/394/#2847</link>
			<guid>https://www.blitzforum.de/worklogs/394/#2847</guid>
			<author>KirkZero</author>
			<description>&lt;b&gt;EDIT: Dies ist nun die Editierte Version mit Kommentaren und Erkl&amp;auml;rungen. Ich werde meinen Original Text so stehen lassen, und jeweils dann da unter ein DICKES EDIT einf&amp;uuml;gen, mit den Korrekturen.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Erstmal Danke an &lt;b&gt;D2006&lt;/b&gt; f&amp;uuml;r die Hinweise, wie ich noch ein wenig mehr &amp;Uuml;bersicht f&amp;uuml;r mein Projekt bekomme und Danke auch an &lt;b&gt;Lastmayday&lt;/b&gt; f&amp;uuml;r den wirklich &lt;b&gt;ausf&amp;uuml;hrlichen&lt;/b&gt; Kommentar zu meinem Code und die von ihm gegebenen Tipps!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Daraus resultierend nehme ich folgende &amp;Auml;nderungen am Code vor:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zuersteinmal lege ich f&amp;uuml;r alle Dateien, welche ich in der MainGame.bmx durch Include einbinde, ein neues Verzeichnis namens &amp;quot;INCLUDES&amp;quot; im Hauptordner an. Dort kopiere ich alle .bmx Dateien, welche ich einbinde hinein. (das sind z.Z. TKarte.bmx, TFeld.bmx und TSpieler.bmx)&lt;br /&gt;Somit ist mein Hauptordner nun viel &amp;uuml;bersichtlicher. Noch schnell die &amp;Auml;nderung in der MainGame.bmx gemacht:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;[/syntax]&lt;br /&gt;und schon ist das Programm wieder lauff&amp;auml;hig.&lt;br /&gt;Ich werde evtl. sp&amp;auml;ter, so wie D2006 es selbst auch handhabt, eine extra &amp;quot;includes.bmx&amp;quot;, in der alle n&amp;ouml;tigen Dateien inkludiert werden und das Hauptprogramm inkludiert dann nur eben jene &amp;quot;includes.bmx&amp;quot; einf&amp;uuml;hren. Doch vorerst lasse ich es so, da ich erstmal schauen will, wie viel ich sp&amp;auml;ter noch inkludieren werde. Sollten es dann doch mehr Dateien werden, werde ich es ebenso wie D2006 machen.&lt;br /&gt;&lt;br /&gt;N&amp;auml;chste &amp;Auml;nderung: einen Fenstertitel erstellen. Zur Zeit steht als Fenstertitel nur &amp;quot;BlitzMax Application&amp;quot;. Mittels&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]AppTitle = &amp;quot;Bomberman Klon (Community Tutorial)[/syntax]&lt;br /&gt;personalisiere ich das ganze ein bissel. Das ganze setze ich direkt unter SuperStrict in der MainGame.bmx (Laut Lastmayday muss der Befehl VOR Graphics stehen!!!)&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict 'zwingt mich, sauber zu programmieren &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;AppTitle = &amp;quot;Bomberman Klon (Community Tutorial)&amp;quot;[/syntax]&lt;br /&gt;und schon steht im Fenstertitel &amp;quot;Bomberman Klon (Community Tutorial)&amp;quot; eine kleine aber feine Sache &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt; werd ich mir unbedingt angew&amp;ouml;hnen, dies immer gleich zu beginn mit einzubauen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT:   ###############&lt;/b&gt;&lt;br /&gt;Fehlerkorrektur: (Danke @Thunder)&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;- AppTitle ist nicht ein Befehl sondern eine Variable die von der IDE farblich hervorgehoben wird. &lt;/div&gt;&lt;br /&gt;&lt;b&gt;END EDIT   #############&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ebenfalls eine kleine, aber dennoch wichtige Sache, welche ich bisher auch immer vernachl&amp;auml;ssigt habe: Man kann das Programm nur mittels [ESC] beenden. Ein klick auf das Kreuz oben rechts im Fenster bewirkt z.Z. absolut garnix. Aber da es zur guten Schule geh&amp;ouml;rt, dass man Fenster auch auf diese weise schliessen kann, will ich mich da mal nicht quer stellen. In der Hauptschleife (Repeat... Until) nicht nur die bdingung der Escape taste zum beenden der Schleife setzen, sondern ebenfall, wenn man auf das Kreuz klickt.&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Until (KeyHit(KEY_ESCAPE) Or AppTerminate()) 'Programm wird beendet, sobald Escape oder Kreuz oben rechts im Fenster gedr&amp;uuml;ckt wird&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;N&amp;auml;chster Punkt. Zitat von Lastmayday:&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;in TFeld l&amp;auml;dst du bei jedem 'new' die Image noch einmal neu. Du kannst auch in einer Type Global benutzen. Dann wird das Image nur einmal geladen. &lt;/div&gt;&lt;br /&gt;Ich glaube, dass w&amp;auml;re mir selber nie aufgefallen... junge, junge... was man nicht alles f&amp;uuml;r Mist baut  &lt;img src=&quot;/forum/images/smiles/icon_redface.gif&quot; alt=&quot;Embarassed&quot; /&gt;  aber das war ja auch einer der Gr&amp;uuml;nde, warum ich das hier mache... m&amp;ouml;chte meine Fehler ausmerzen. Also &amp;auml;nder ich das gleich mal in der TFeld.bmx&lt;br /&gt;&lt;b&gt;Statt:&lt;/b&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Field BodenTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/boden.png&amp;quot;,TS,TS,0,BODENFRAMES)&lt;br /&gt;	Field BlockTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/block.png&amp;quot;,TS,TS,0,BLOCKFRAMES)[/syntax]&lt;br /&gt;sollte es &lt;b&gt;so richtig sein:&lt;/b&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]	Global 	BodenTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/boden.png&amp;quot;,TS,TS,0,BODENFRAMES)&lt;br /&gt;	Global 	BlockTilesIMG	:TImage = LoadAnimImage(&amp;quot;gfx/block.png&amp;quot;,TS,TS,0,BLOCKFRAMES)&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Und weiter gehts. Wieder ein Zitat von Lastmayday:&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;Eine extra Type f&amp;uuml;r jeden einzelnen Tspieler zu machen ist etwas zu viel des guten. Extends ist doch etwas f&amp;uuml;r Fortgeschrittene. Wie w&amp;auml;re es die Tastatur Belegung in Tspieler zu speichern? KEY_LEFT ist auch nur eine variable mit einem wert.&lt;br /&gt;&amp;lt;code&amp;gt;&lt;br /&gt;Field upkey:int, downkey:int, rightkey:int, leftkey:int&lt;br /&gt;&amp;lt;/code&amp;gt;&lt;br /&gt;und bei typischen 4 Spielern reicht auch eine kleine array/liste. &lt;/div&gt;&lt;br /&gt;Wahrscheinlich hat er Recht. Ich sollte das ganze vielleicht nicht komplizierter machen, als es sein muss. Hab mir dazu noch mal nen Kopf gemacht und es l&amp;auml;sst sich auch ohne Vererben super l&amp;ouml;sen. Mein Grund, es so zu machen, damit jeder Spieler seine eigen Steuerung bekommt, war also der falsche Ansatz.&lt;br /&gt;Damit &amp;auml;ndere ich die TSpieler.bmx wieder und es wird nix mehr vereerbt. Die neue Klasse TSpieler1 verschwindet also wieder.&lt;br /&gt;Erstmal das Original, wie es jetzt noch ist:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende Feld&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 250&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() Abstract&lt;br /&gt;		'Von dieser Klasse kann nun keine Instanz mehr gebildet werden&lt;br /&gt;		'man muss nun ihre Eigenschaften an eine andere Klasse vererben!!!&lt;br /&gt;		'die Klasse, welche erbt, muss allerdings zwingend eine Methode&lt;br /&gt;		'namens Steuerung haben!!!!&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawImage (SpielerIMG,xFeld*TS,yFeld*TS,0) &lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Type TSpieler1 Extends TSpieler 'Extends vererbt alle Eigenschaften von TSpieler an diese Klasse&lt;br /&gt;	'diese Klasse besitzt alle Felder, Funktionen und Methoden von TSpieler&lt;br /&gt;	'und MUSS eine Methode namens Steuerung haben&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'diese Methode MUSS sein... siehe oben &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;		If 		KeyDown(KEY_UP) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yFeld:-1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yFeld:+1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;			xFeld:-1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;			xFeld:+1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler1 (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler1 = New TSpieler1 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'StartKoordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;End Type[/syntax]&lt;br /&gt;Und hier die ge&amp;auml;nderte Version wieder ohne Extends:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Type TSpieler&lt;br /&gt;	&lt;br /&gt;	Field xFeld			:Int 'x und y Koordinaten f&amp;uuml;r das entsprechende Feld&lt;br /&gt;	Field yFeld			:Int 'auf dem sich der Spieler befindet&lt;br /&gt;	&lt;br /&gt;	Field SpielerIMG		:TImage 'speichert die Grafik des Spielers&lt;br /&gt;	Field BewegungsTimer	:Int = MilliSecs()&lt;br /&gt;	Field BewegungsPause	:Int = 250&lt;br /&gt;	&lt;br /&gt;	Method Steuerung() 'Enth&amp;auml;lt die Steuerungsabfrage&lt;br /&gt;		If 		KeyDown(KEY_UP) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste OBEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yFeld:-1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_DOWN) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste UNTEN gedr&amp;uuml;ckt wird&lt;br /&gt;			yFeld:+1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_LEFT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste LINKS gedr&amp;uuml;ckt wird&lt;br /&gt;			xFeld:-1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		ElseIf 	KeyDown(KEY_RIGHT) And MilliSecs() &amp;gt; BewegungsTimer+BewegungsPause	'wenn Pfeiltaste RECHTS gedr&amp;uuml;ckt wird&lt;br /&gt;			xFeld:+1&lt;br /&gt;			BewegungsTimer = MilliSecs()&lt;br /&gt;		End If&lt;br /&gt;		&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method Zeichnen()&lt;br /&gt;		DrawImage (SpielerIMG,xFeld*TS,yFeld*TS,0) &lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Function Erstellen:TSpieler (xFeld:Int,yFeld:Int,ImgPfadName:String,ImgFrames:Int)&lt;br /&gt;		Local NeuerSpieler		:TSpieler = New TSpieler 'Tempor&amp;auml;ren Spieler erstellen&lt;br /&gt;		&lt;br /&gt;		NeuerSpieler.xFeld 		= xFeld 'StartKoordinaten &amp;uuml;bergeben&lt;br /&gt;		NeuerSpieler.yFeld 		= yFeld&lt;br /&gt;		NeuerSpieler.SpielerIMG	= LoadAnimImage (ImgPfadName,TS,TS,0,ImgFrames)&lt;br /&gt;		'AnimImage laden mit h&amp;ouml;he und breite von 32 (da TS=32)&lt;br /&gt;		&lt;br /&gt;		Return NeuerSpieler 'Tempor&amp;auml;r erstellten Spieler zur&amp;uuml;ck geben&lt;br /&gt;	End Function&lt;br /&gt;&lt;br /&gt;End Type[/syntax]&lt;br /&gt;&lt;br /&gt;Jetzt kommt eine Sache, mit der ich noch absolut garnichts zu tun hatte. Zitat von Lastmayday:&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;das Thema mit Framework und Import ansprechen. Zweck ist das die exe nur mit den Modulen gebaut wird welches das Spiel ben&amp;ouml;tigt: &lt;/div&gt;&lt;br /&gt;nun gut, dann werd ich mir das jetzt mal anschauen, und das Ergebnis folgt dann nach diesem Satz &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;Expecting expression but encountered Framework&lt;/div&gt;&lt;br /&gt;*grml* ok... da muss ich wohl noch ein bissel suchen...&lt;br /&gt;&lt;b&gt;Ahhh... ok, das Ganze muss ganz am Anfang der MainGame.bmx stehen... ich hatte es unter SuperStrict eingef&amp;uuml;gt&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT:   ###############&lt;/b&gt;&lt;br /&gt;Fehlerkorrektur (Danke Thunder und Lastmayday):&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;- SuperStrict darf am Anfang stehen (ich schreibe Superstrict immer in die erste Zeile und Framework in die zweite), es darf nur keine gew&amp;ouml;hnliche Codezeile vor Framework stehen. &lt;/div&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;Framework muss eben deswegen an erster(oder zweiter -&amp;gt; SuperStrict) stelle im Code stehen um dem Compiler zu sagen das jetzt nur die Module einbinden soll die als n&amp;auml;chstes aufgef&amp;uuml;hrt sind &lt;/div&gt;&lt;br /&gt;Mein Fehler war, ich hatte nach SuperStrict noch AppTiltle stehen und dann erst Framework und Import&lt;br /&gt;&lt;b&gt;END EDIT   ###############&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Also, Sinn der Sache ist es, wie Lastmayday schon sagte, nur die Module in die .EXE datei mit einzubinden, welche auch wirklich gebraucht werden. Ich h&amp;auml;tte jetzt nicht gedacht, dass das so einen Unterschied macht, aber statt 1,28 MB ist die .EXE mit Framework und Import nur noch schlanke 442 kb gro&amp;szlig;... GENIAL &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;und hier der Code:&lt;/b&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Framework 	brl.max2d&lt;br /&gt;Import 		brl.Timer&lt;br /&gt;Import 		brl.Random&lt;br /&gt;Import 		brl.D3D7Max2D&lt;br /&gt;Import 		brl.PNGLoader  &lt;br /&gt;&lt;br /&gt;SuperStrict 'zwingt mich, sauber zu programmieren &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;AppTitle = &amp;quot;Bomberman Klon (Community Tutorial)&amp;quot;&lt;br /&gt;&lt;br /&gt;'------------------------------ includes			----------&lt;br /&gt;Include &amp;quot;INCLUDES/TKarte.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TFeld.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;INCLUDES/TSpieler.bmx&amp;quot;[/syntax]&lt;br /&gt;&lt;br /&gt;So, hab mal nen bissel in der Hilfe geschn&amp;uuml;ffelt und mir nochmals Lastmaydays kommentare angeschaut und dabei haben sich mir folgende Erkentnisse aufgetan &lt;b&gt;(Bitte korrigieren, wenn ich mit irgendetwas falsch liege)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Mein jetziges Framework basiert auf dem Modul brl.Max2D, dieses ist f&amp;uuml;r die arbeit mit DirectX?&lt;br /&gt;Will ich mit OpenGL arbeiten, so w&amp;auml;re es brl.GlMax2D.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT:   ###############&lt;/b&gt;&lt;br /&gt;Fehlerkorrektur (Danke an Thunder und mpmxyz)&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;- Das Modul Max2D hat eigentlich nur wenig mit den Treibern zu tun - es ist eher ein Universalaufsatz den man bis jetzt mit 3 offiziellen Treibern verwenden kann: D3D7Max2DDriver(), D3D9Max2DDriver(), GLMax2DDriver() (die module hei&amp;szlig;en wie die Treiberfunktionen nur ohne &amp;quot;Driver()&amp;quot;). &lt;/div&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;brl.Max2D ist ein komplett abstraktes Modul.&lt;br /&gt;Das hei&amp;szlig;t, dass es weder etwas mit OpenGl noch mit DirectX zu tun hat.&lt;br /&gt;Die Implementierung erledigen die brl.xyzMax2D-Module.&lt;br /&gt;Wenn du einfach nur so Code wegschreibst, musst du keinen Grafiktreiber setzen, da die Module ihn beim Start des Programmes selbst festlegen.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;END EDIT   ###############&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nun importiere ich alle Module, die ich ben&amp;ouml;tige.&lt;br /&gt;&lt;b&gt;brl.Timer :&lt;/b&gt; ben&amp;ouml;tige ich, da ich CreateTimer und WaitTimer im Code benutze&lt;br /&gt;&lt;b&gt;brl.Random :&lt;/b&gt; sollte klar sein. Ich arbeite ja mit einigen Zufallsfunktionen (z.B. Rand, SeedRnd, ...)&lt;br /&gt;&lt;b&gt;brl.D3D7Max2D :&lt;/b&gt; ben&amp;ouml;tige ich, um sp&amp;auml;ter (vor Graphics) den Grafiktreiber zu setzen&lt;br /&gt;&lt;b&gt;brl.PNGLoader :&lt;/b&gt; ist daf&amp;uuml;r da, um Pixmaps im PNG format zu laden ???&lt;br /&gt;&lt;br /&gt;Wieder Zitat von Lastmayday:&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;dadurch m&amp;uuml;sstest du auch den Render setzen:&lt;br /&gt;&amp;lt;code&amp;gt;&lt;br /&gt;SetGraphicsDriver D3D7Max2DDriver()&lt;br /&gt;&amp;lt;/code&amp;gt; &lt;/div&gt;&lt;br /&gt;Nun setze ich den Grafiktreiber (vor Graphics in der MainGame.bmx):&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SetGraphicsDriver D3D7Max2DDriver()&lt;br /&gt;&lt;br /&gt;Graphics BREITE , HOEHE , Vollbild 'Bildschirmmodus wird gesetzt&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;b&gt; Anmerkung von mir:&lt;/b&gt; wenn ich den Grafiktreiber nicht setze, also den Befehl &amp;quot;SetGraphicsDriver D3D7Max2DDriver()&amp;quot; einfach weglasse... startet mein Programm trotzdem ohne zu meckern. Meine Frage nun an jemand, der sich auskennt: ist es unbedingt n&amp;ouml;tig, diesen Befehl zu benutzen, oder setzt BMAX den treiber automatisch, wenn der Befehl fehlt???&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT:   ###############&lt;/b&gt;&lt;br /&gt;Anmerkungen (Danke an Thunder, Lastmayday und BladeRunner)&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;- Das Modul D3D7Max2D f&amp;uuml;hrt den Befehl SetGraphicsDriver D3D7Max2DDriver() selbst aus, wenn der Treiber korrekt geladen wurde - es sollte also gen&amp;uuml;gen einfach das Modul zu importieren.  &lt;/div&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;Du kannst auch max2d, glmax2d, DX7, DX9 und opengl gesamt importieren. Was dich dann zu SetGraphicsDriver bringt.&lt;br /&gt;&lt;br /&gt;Ein beispiel:&lt;br /&gt;&amp;lt;code&amp;gt;&lt;br /&gt;?Win32 'wird nur unter Windows gebaut&lt;br /&gt;SetGraphicsDriver D3D9Max2DDriver()&lt;br /&gt;?MacOS 'wird nur unter Mac gebaut&lt;br /&gt;SetGraphicsDriver GLMax2DDriver()&lt;br /&gt;?Linux 'wird nur unter Linux gebaut&lt;br /&gt;SetGraphicsDriver GLMax2DDriver()&lt;br /&gt;? 'wird wieder normal weiter kompiliert&lt;br /&gt;&amp;lt;/code&amp;gt;&lt;br /&gt;so h&amp;auml;ttest du gleich f&amp;uuml;r jedes OS den richtigen Render. Oder du k&amp;ouml;nntest in den Optionen dem Spieler anbieten es selbst zu Bestimmen, um zum Beispiel Grafik Fehler zu beheben.  &lt;/div&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;Ich w&amp;uuml;rde empfehlen unter Windows den dx9-Treiber zu verwenden, den Thunder schon in seinem Kommentar anf&amp;uuml;hrte. Smile&lt;br /&gt;Unter Mac/Linux bist Du zwingend auf OGL angewiesen.  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ich werde dann auf dx9 umschwenken. Einfach folgendes &amp;auml;ndern (in der MainGame.bmx)&lt;br /&gt;&lt;b&gt;brl.D3D7Max2D&lt;/b&gt; gegen &lt;b&gt;brl.D3D9Max2D&lt;/b&gt; austauschen und&lt;br /&gt;&lt;b&gt;SetGraphicsDriver D3D7Max2DDriver()&lt;/b&gt; gegen &lt;b&gt;SetGraphicsDriver D3D9Max2DDriver()&lt;/b&gt; austauschen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;END EDIT   ###############&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, und hier mal wieder der komplette Code bis hier hin (inklusive .EXE)&lt;br /&gt;die Gr&amp;ouml;&amp;szlig;e des Downloads ist durch Framework und Import geschrumpft und betr&amp;auml;gt nun nur noch feine 207 kb statt 671 kb&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=9377&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/upload/file.php?id=9377&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wenn das so weiter geht... reicht mein Speicherplatz im Archiv bestimmt bald nicht mehr aus &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Danke f&amp;uuml;r die ganzen Tipps. Ich denke, ich habe heute eine Menge gelernt!!! *freu*&lt;/b&gt;</description>
			<pubDate>Wed, 25 Aug 2010 02:04:50 +0200</pubDate>
		</item>


	</channel>
</rss>
