Problem mit 32*32 und zu schneller Bewegung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Xrazor

Betreff: Problem mit 32*32 und zu schneller Bewegung

BeitragFr, Okt 12, 2007 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Okt 12, 2007 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Okt 12, 2007 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Okt 12, 2007 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Danke =)

Willi die Rübe

BeitragFr, Okt 12, 2007 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Okt 13, 2007 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Okt 13, 2007 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Danke, und close bitte.
 

HyDr0x

BeitragMo, Okt 15, 2007 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 15, 2007 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 15, 2007 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Okt 16, 2007 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Okt 16, 2007 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragDi, Okt 16, 2007 10:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Okt 16, 2007 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Okt 16, 2007 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group