Problem mit 32*32 und zu schneller Bewegung
Übersicht

XrazorBetreff: Problem mit 32*32 und zu schneller Bewegung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also,
Ich versuche mich für den Anfang daran, ein Bomberman zu Programmieren, als Vorlage für einen Mapeditor habe ich einen aus einem Tileeditor Tutorial genommen, welches es auf robsite gibt. So nun ist ein Tile von mir 32*32 Pixel groß und das möchte ich eigentlich auch so lassen, denn es macht das Mappen einfach und man findet viele Ressourcen, z.B. vom Rpgmaker. Das Problem ist nur, das der Charakter ja auch begrenzt ist auf diese 20*15 Tiles große map á 32*32 Tiles. Er bewegt sich so: Code: [AUSKLAPPEN] If move = 1 Then x = px * 32: y = py * 32:DrawImage char,x,y,1
If move = 2 Then x = px * 32: y = py * 32:DrawImage char,x,y,13 If move = 3 Then x = px * 32: y = py * 32:DrawImage char,x,y,5 If move = 4 Then x = px * 32: y = py * 32:DrawImage char,x,y,9 If move = 0 Then x = px * 32: y = py * 32:DrawImage char,x,y also wird dieser eine Schritt immer *32 genommen, damit auch alles passt. Die Kollision prüft immer ob das Tile(32*32) vor dem Spieler auch begehbar ist. So nun hab ich schon vieles Probiert um den Spieler langsamer zu machen, aber nichts hat geklappt wegen den blöden 32*32 Tiles. Ich hoffe die Angaben reichen, damit ihr mir helfen könnt eine Lösung zu finden. Wenn ihr noch mehr Informationen braucht, bitte sagen was. Dnake schonmal! |
||
![]() |
Willi die Rübe |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bau dir mit Hilfe von Millisecs() einen Counter, der dann z.B. nur jede Sekunde die Position des Bildes ändert. | ||
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX At the Farewell Party visit: MySpace | Homepage |
Marek |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du könntest versuchenb einen Timer zu erstellen und dann am Schleifenende auf ihn warten zu lassen.
Also so: Code: [AUSKLAPPEN] Timer=Createtimer(FPS_ZAHL) ; Hier muss rein wie viele Bilder pro Sekunde angezwigt werden ;Hauptschleifen Anfang ;Programm WaitTimer Timer ;Hauptschleifenende |
||
Wer lesen kann ist klar im Vorteil... |
Xrazor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, ich hab jetzt ne ähnliche Variante genommen, wie Marke es vorgeschlagen hat, denn ich würd zwar gern das mit Millisecs() benutzen, aber das habe ich schonmal probiert und das Check ich nicht wirklich, irgendwas mach ich da immer Falsch, deshalb es nicht klappt ![]() Danke =) |
||
![]() |
Willi die Rübe |
![]() Antworten mit Zitat ![]() |
---|---|---|
So wie Marek es schrieb kann es nicht gehen, da man damit die gesamte Framerate des Spieles und nicht des Bildes bestimmst.
Hier ein kleines Beispiel: Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() Global tm=millisecs() Repeat Cls If millisecs()-tm>1000 Then x=x+32 y=y+32 tm=millisecs() EndIf Rect x,y,32,32,1 Flip Until KeyHit(1) End |
||
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX At the Farewell Party visit: MySpace | Homepage |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Würde es so machen
int(Pos / RasterBreite) * RasterBreite ? int(3.9 / 32) * 32 0 ? int(35.7 / 32) * 32 32 ? int(95.3 / 32) * 32 64 |
||
Xrazor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Thx Willi, jetzt check ich das mit den Millisecs auch und das ist die beste Lösung
Ich hab es ja auch nur ähnlich gemacht wie Marek gesagt hat, war aber ziemlich umständlich, jetzt kann ich mich auch darum kümmern das ganze flüssig aussehen zu lassen ![]() Danke, und close bitte. |
||
HyDr0x |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie wärs damit?
Code: [AUSKLAPPEN] If KeyDown(203) And a = 0 Then If ppx = 0 Then Gosub test If map(ppx-1,ppy) = 0 Then .test bewuhrl = bewuhrl + 1 a = 1 move = 2 EndIf EndIf If a = 1 And move = 2 Then px = px - 4 zeitx2 = zeitx2 + 4 If zeitx2 = 32 Then a = 0 move = 6 zeitx2 = 0 ppx = ppx - 1 EndIf EndIf Damit kann man sehr variabel und einfach die Geschwindigkeit ändern. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
und wo ist das Return für das Gosub?
Sollte das ein GoTo gewesen sein sollen: Bitte keine Codes mehr posten, wer GoTos postet hat selbst noch sehr viel zu lernen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
HyDr0x |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Nein da sollte kein goto hin .
2. Das gosub bewirkt das wenn man sich am Rand der Karte bzw. des Rasters befindet das ja vorher mit dim map(bla,bla) erstellt wurde das Programm nicht abkackt aufgrund dessen weil sich die x Koordinate im negativen Bereich befindet. z.B.: Der Spieler befindet sich am linken Rand der Map dann wäre ppx = 0. Wenn man jetzte aber map(ppx-1,ppy) abfragt würde es einen Fehler geben weil das Dim Feld nur im Positiven Bereich erstellt wurde (was ja auch logisch ist). D.h. es gibt kein map(-1,ppy) Feld da es nur bis zur 0 definiert wurde. Da man, wenn man sich schon am äussersten Rand der map befindet, eh nicht weiter nach links bewegt benötigt man folglich auch keine Kollisionsabfrage, somit kann diese durch Gosub übersprungen werden. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
was es bewirkt ist nicht so bedeutend sondern das GoSub immer ein Return erwartet wo zum GoSub aufruf zurückgesprungen wird und den hat dein Code nicht. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
HyDr0x |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mag sein das gosub das erwartet aber es wird kein Fehler angezeigt, zumindest habe ich diese art der Steuerung schon in vielen Umgebungen angewand und sie hat immer einwandfrei gefuntzt.
Edit Ich glaub jetzt wei' ich was du meinst. Ja in diesem Falle könnte man auch das böse goTo nehmen, glaube aber das man es auch gt durch ne If abfrage ersetzten kann. Code: [AUSKLAPPEN] If KeyDown(203) And a = 0 Then If ppx = 0 Then bewuhrl = bewuhrl + 1 a = 1 move = 2 Else If map(ppx-1,ppy) = 0 Then bewuhrl = bewuhrl + 1 a = 1 move = 2 EndIf EndIf Endif If a = 1 And move = 2 Then px = px - 4 zeitx2 = zeitx2 + 4 If zeitx2 = 32 Then a = 0 move = 6 zeitx2 = 0 ppx = ppx - 1 EndIf EndIf So z.B. PS: ARGH es ist zu spät ich sollt schlafen gehen. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es wird kein Fehler angezeigt weil dein Programm ja nicht wissen kannst wann Du dein return machen willst.
Also läuft es stur weiter, merkt sich gosub um gosub bis dann irgendwann die Rücksprungtabelle zu groß wird und schmiert sang und klanglos ab. Vergiss Goto ganz und benutze Gosub nur wie es sich gehört: hinspringen, was tun lassen, mit return zurück. Oder noch besser: kapsel alles in Funktionen. Sonst wirst Du bald an deinen Codes verzweifeln. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Man kann GoTo mit ganz wenigen Ausnahmen immer mit IF und States ersetzen (und wegen der Modularität und Stabilität des Codes ist das auch vorzuziehen)
Die einzige Ausnahme die wirklich von grundlegender bedeutung sind, sind verschachtelte Loops wo man GoTo leider braucht für MultiLevel Continue / Exit. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
HyDr0x |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
eigentlich benutze ich GoTo und GoSub nie und nehme Funktionen aber in dem Beispiel fand ichs zuerst ganz nützlich, nun kann mans ja auch mit der if Abfrage ersetzen wie es einem beliebt. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group