Objekt gleichmäßig bewegen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

KnorxThieus

Betreff: Objekt gleichmäßig bewegen

BeitragDo, Aug 01, 2013 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

wenn ich ein Objekt (einen Text) über den Bildschirm bewege, bewegt es sich schneller, wenn das rechte Ende den Rand berührt, weil dann doch weniger berechnet werden muss?

Kann ich das einfach durch einen Timer ausgleichen, oder lieber berechnen, wieviel schon verdeckt ist?
Für Letzteres, würde diese Berechnung es tun?
BlitzBasic: [AUSKLAPPEN]
graphics_width = 800
graphics_height = 600
Graphics graphics_width, graphics_height

SetFont LoadFont("Comic Sans MS", 100)
x = -StringWidth("Hallo Welt")

Repeat
x = x + speed
Text x, 200, "Hallo Welt"

speed = (Limit(x + StringWidth("Hallo Welt"), 0, graphics_width) - x) * StringHeight("Hallo Welt") / 10000

Flip
Cls
Until KeyHit(1)



Function Limit(value, min = 0, max = 0, style = 0)
;style +1 = ignore min
; +2 = ignore max
If GetBit(style, 0) Then min = value - 1
If GetBit(style, 1) Then max = value + 1
If value < min Then
Return min
ElseIf value > max Then
Return max
Else
Return value
EndIf
End Function

Function GetBit(byte, bitnumber)
ret = byte And 2 ^ bitnumber
If ret <> 0 Then ret = 1
Return ret
End Function
(im original hatte ich viele viele texte auf einmal, da war das heftiger zu spüren)
das scheint aber trotzdem noch nicht richtig zu laufen.

Also wie ist es am elegantestem?
Bitte helft mir!

MfG,
KnorxThieus
  • Zuletzt bearbeitet von KnorxThieus am Do, Feb 06, 2014 19:21, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragDo, Aug 01, 2013 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast Du denn schonmal ausprobiert ob es schneller läuft?
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

Xeres

Moderator

BeitragDo, Aug 01, 2013 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
bewegt es sich schneller, wenn das rechte Ende den Rand berührt, weil dann doch weniger berechnet werden muss?
Hast du festgestellt, dass das so ist, oder ist das die Frage? Nein, nicht wenn man es richtig macht, würde ich sagen. Ohne Flip(0) und Timer rennt die Schleife sowieso mit tausend FPS die alle nicht angezeigt werden können - kein Wunder, wenn dann alles ungleichmäßig läuft.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDo, Aug 01, 2013 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Die einfachste Möglichkeit gleichmäßige Geschwindigkeiten in ein Spiel zu bringen ist, einen Timer takten zu lassen:

BlitzBasic: [AUSKLAPPEN]
graphics_width = 800
graphics_height = 600
Graphics graphics_width, graphics_height

SetBuferr BackBuffer()

SetFont LoadFont("Comic Sans MS", 100)
x# = -StringWidth("Hallo Welt")
speed#=2.5

FPS=CreateTimer(60)

Repeat
x = x + speed
Text x, 200, "Hallo Welt"

speed = (Limit(x + StringWidth("Hallo Welt"), 0, graphics_width) - x) * StringHeight("Hallo Welt") / 10000

Flip 0
WaitTimer FPS
Cls
Until KeyHit(1)
.....


Über die Variable speed# (als Float) und x# ebenfalls als Float kannst du dann mit Nachkommastellen ziemlich genau die gewünschte Geschwindigkeit erzeugen. Sie wird so auf allen Rechner auch genau gleich sein!!!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Do, Aug 01, 2013 13:17, insgesamt einmal bearbeitet

KnorxThieus

Betreff: !Enthält EDIT!

BeitragDo, Aug 01, 2013 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@BladeRunner & Xeres:
Jain, ich glaube es... ich wusste nicht wie man das misst.

@Midimaster:
Danke. Ich hatte deinen Tutorial auch angelesen, ich war mir aber nicht sicher... denn wenn der "flip"-Befehl Geschwindigkeit kostet, kommt ja im Endeffekt die Wartezeit vom Timer PLUS der vom flippen zusammen!
EDIT: Nein, natürlich nicht, habe mich geirrt... timer wartet, bis bestimmte zeit, ab vorherigem tick vorbei ist.
Ok. Dann mache ich das so, mit Timer. Ist ja auch Auslastungs-freundlicher.

MFG und Danke allen!

EDIT: Midimaster, wie ist das mit dem Setbuffer Backbuffer() und Flip 0, ist das wirklich nötig und wo liegen die Vorteile?
Und wie mache ich das bei FlipCanvas und SetBuffer CanvasBuffer, weil ich das ganze in einem Vollbild-Täusch-Fenster mache?
Version: BlitzPlus / Blitz+
  • Zuletzt bearbeitet von KnorxThieus am Sa, Aug 10, 2013 21:32, insgesamt einmal bearbeitet
 

Kruemelator

BeitragDo, Aug 01, 2013 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu SetBuffer Backbuffer() und Flip 0:
Nötig sind sie nicht, aber sie sorgen dafür dass das Programm auf jedem Rechner und Monitor gleich schnell läuft.
Flip oder Flip 1 warten auf den Monitor, hast du einen Monitor mir doppelt so hoher Bildrate läuft der Programm doppelt so schnell ab. Flip 0 wartet nicht sondern zeigt das Bild sofort an (des wegen Waittimer()).
SetBuffer Backbuffer() mal erstmal alles im Hintergrund (Backbuffer) und wenn Flip kommt wird es auf dem Monitor dargestellt. Ohne diesen Befehl würde dierekt auf dem Monitor gemalt, das heist die ein Hälfte des Bildes auf dem Monitor ist nach die vom Letzten Bild, erzeugt zerschnittene Bilder.

KnorxThieus

BeitragDo, Aug 01, 2013 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha, Danke! Und - wenn du BlitzPlus hast - wie ist das mit FlipCanvas? Da gibt's nur einen Buffer, den CanvasBuffer, und FlipCanvas hat da bei wert andere Beschreibungen, die ich nicht verstehe!
Version: BlitzPlus / Blitz+

Lobby

BeitragDo, Aug 01, 2013 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Canvas-Objekte nutzen automatisch einen Backbuffer, der Parameter wert von FlipCanvas macht genau das Gleiche wie der bei Flip.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

KnorxThieus

BeitragDo, Aug 01, 2013 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, also BlitzBasic: [AUSKLAPPEN]
graphics_width = 800
graphics_height = 600
win = CreateWindow("blitzcc", 0, 0, 800, 600)
can = CreateCanvas(0, 0, ClientWidth(win), ClientHeight(win), win)

SetBuffer CanvasBuffer(can)

SetFont LoadFont("Comic Sans MS", 100)
x# = -StringWidth("Hallo Welt")
speed#=2.5

FPS=CreateTimer(60)

Repeat
x = x + speed
Text x, 200, "Hallo Welt"

; speed = (Limit(x + StringWidth("Hallo Welt"), 0, graphics_width) - x) * StringHeight("Hallo Welt") / 10000 ; :D

FlipCanvas can, 0
WaitTimer FPS
Cls
Until KeyHit(1)
?

MFG
Version: BlitzPlus / Blitz+
  • Zuletzt bearbeitet von KnorxThieus am Fr, Aug 02, 2013 14:39, insgesamt einmal bearbeitet

Lobby

BeitragFr, Aug 02, 2013 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, genau so, abgesehen davon, dass du jetzt Speed einen konstanten Wert geben kannst.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

KnorxThieus

BeitragFr, Aug 02, 2013 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, das hatte ich jetzt beim Copy & Paste übersehen Embarassed

Änderungen im vorherigem Post
Version: BlitzPlus / Blitz+

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group