Autor | Thema: Bewegliche Objekte | | Datum:05.07.01 19:16 
(jrs-brain@gmx.de) | |
Ich haben mit Profan 5.0 einige Erfolge gehabt. Z. B. habe ich das Spiel "Jeopardy" geschrieben.
(falls Interesse besteht versende ich das Spiel)
Jetzt hatte ich vor so etwas wie Moorhuhn zu schreiben. Da dies mir mit Profan nicht gelang bin ich "untreu" geworden und habe mich an C++ versucht. (Sogar mit Lehrgang an eine VHS). Nun kehre ich als reuiger Sünder zurück und frage, ob man mit Profan bewegliche Objekte per Maus bewegen kann, ohne dass es flimmert. Die Idee aus C++ sehe folgendermaßen aus:
Declare Ende%, Taste%, x%, y%
let x% = 100
let y% = 100
cls
mloadbmp "???.bmp" 'irgend eine Bitmap 640x480
mcopybmp 0,0-640,480 < 0,0,;0
whilenot (scankey,27)
mcopybmp 0,0 - 640,480
if @equ(%mousepressed,1)
let x% = %MouseX
let y% = %MouseY
endif
Ellipse @sub(x%,20),@sub(y%,20)\
- @add(x%,20)m@add(y%,20)
endwhile
Wer sich auch immer meldet, vielen Dank!
|
| | | Datum:05.07.01 22:13 
(frankabbing@12move.de) | |
Hallo,
nochmals mein Hinweis:
Flackerfreie Animationen sind ohne Doublebuffering nicht vernünftig machbar!
Stelle deine Grafiken auf einer unsichtbaren Bitmap komplett zusammen und kopiere dann erst in einem Rutsch auf den Hauptschirm, sonst wirds nichts...
Gute Nachrichten für alle Profanbesitzer ab Version 5.0. Demnächst wird meine ProSpeedDLL bis zu 16 zusätzliche Speicherbitmaps zur Verfügung stellen, die generiert werden können oder von Festplatte geladen werden.
Transparentes Kopieren von Bitmaps oder Teilen daraus wird ebenfalls möglich sein, somit können ganz simpel animierte transparente Sprites programmiert werden. Und das alles ab Profan 5.0 (4.5 kann ja leider keine 32 Bit Dll's laden, oder?).
Bis dahin,
Frank
Homepage
|
| | Datum:05.07.01 22:21 
(webmaster@rokosoft.de) | |
Das hört sich wirklich saustark an Frank (mit den Bitmaps).
Wird wohl ne umfangreiche Dll werden oder?
Rolf
|
| | Datum:06.07.01 00:06 
(frankabbing@12move.de) | |
Hallo,
7168 Bytes bisher bei 23 Funktionen. Und die Bitmap-Funktionen sind schon ziemlich fertig. Dank Assembler eine echte Knirps-Dll...
Speicherbitmaps sind in Profan noch Mangelware, finde ich, besonders für Spieleprogrammierer, und an die wendet sich die Dll ja hauptsächlich.
Und ein ansprechendes Beispielprogramm muß ja auch noch gemacht werden, puuuhhh...
Bis dahin,
Frank
|
| | Datum:06.07.01 00:28 
(webmaster@rokosoft.de) | |
Ja dann, viel Glück da bin ich sogar gespannt drauf, was da mit Bitmpas u.s.w zu machen ist.
Und: Ich freue mich drauf - weiter so Frank!
|
| | Datum:06.07.01 00:40 
(frankabbing@12move.de) | |
Danke.
Neue Funktionen, die hinzukommen sind:
StartWatch ()
Startet eine Stoppuhr, deren Stand mit ReadWatch() gelesen werden kann.
Diese Uhr ist besonders ideal für Messungen während der Programmierung einer Anwendung (wie schnell arbeitet diese Routine ?)
Die Stoppuhr braucht am Programmende nicht wieder freigegeben werden !
Ergebnisse: Long - 0
-
ReadWatch ()
Ermittelt die Anzahl der Millisekunden, die seit dem letzten Aufruf von StartWatch() vergangen sind.
Die Stoppuhr braucht am Programmende nicht wieder freigegeben werden !
Ergebnisse: Long - Anzahl der Millisekunden, die seit dem letzten Aufruf von StartWatch() vergangen sind.
Beispiel:
StartWatch()
...
... ' hier steht Profancode
...
msek&=Read Watch()
print msek&+" Millisekunden sind jetzt vergangen."
-
LoadExtBmp (S,H)
Lädt ein Bild in den Arbeitsspeicher zur späteren Benutzung. Ist S = 0, dann wird eine leere Bitmap erzeugt.
S : String mit Namen einer .BMP Grafikdatei oder 0
H : Long - Profan Variable %HDC
Ergebnisse: Long - Handle eines Memory Device Context (im Speicher gehaltene Grafikdaten-Struktur, HDC). Bei Fehler 0.
Beispiele:
1)
string bereich#,0="Picture1.bmp"
ExternHDC&=LoadExtBmp(bereich#,%HDC) ;Lädt das Bild "Picture1.bmp" in den Speicher
2)
ExternHDC&=LoadExtBmp(0,%HDC) ;Erzeugt eine leere Bitmap im Speicher
Die geladene Grafik oder Bitmap wird so lange im Speicher gehalten, bis sie durch FreeExtBmp() wieder entladen wird. Das sollte
spätestens am Programmende erfolgen, um die Resourcen wieder frei zu geben.
Momentan können bis zu 16 externe Bitmaps gleichzeitig im Speicher gehalten werden, wem das noch zu wenig ist, der melde sich bitte bei
mir.
Diese Funktion sollte erst dann aufgerufen werden, wenn Profan schon ein Fenster geöffnet hat.
-
FreeExtBmp (H)
Entlädt ein Bild aus den Arbeitsspeicher und gibt die Resourcen wieder frei.
H : Long - Rückgabewert einer mit LoadExtBmp() erzeugten Grafikdaten-Struktur (HDC)
Ergebnisse: Long - Eins oder grösser, bei Fehler 0.
Beispiel:
FreeExtBmp(ExternHDC&)
Spätestens am Programmende sollte diese Funktion für jede externe Grafikdaten-Struktur erfolgen, um die Resourcen wieder frei zu geben.
-
CopyExtBmp (Z,X1,Y1,B,H,Q,X2,X3,K)
Kopiert Teile eines Bildes oder das ganze Bild auf den Bildschirm oder in ein anderes Bild.
Z : Long - Handle der Zielbitmap, z.B. das Profan Hauptfenster
X1: Long - linke Koordinate der Zielbitmap
Y1: Long - obere Koordinate der Zielbitmap
B : Long - Breite des Rechtecks, das kopiert werden soll
H : Long - Höhe des Rechtecks, das kopiert werden soll
Q : Long - Handel der Quellbitmap
X2: Long - linke Koordinate der Quellbitmap
Y2: Long - obere Koordinate der Quellbitmap
K : Long - Kopiermodus
Ergebnisse: Long - TRUE, bei Fehler FALSE.
Der Bildschirmausschnitt der Quellbitmap beginnend bei X1,Y1 der eine Breite von B Pixel und eine Höhe von H Pixel hat, wird an die
Position X2,Y2 in die Zielbitmap kopiert. Der letzte Parameter bestimmt den Kopiermodus.
Als Handel für die Quell- und Zielbitmap kann das Profanfenster (%HDC) angegeben werden oder ein von LoadExtBmp() erhaltener Wert.
Es kann auch der HDC der Profan-internen Speicherbitmap angegeben werden, so wird er ermittelt:
Startpaint -1
SpeicherHDC&=%HDC
EndPaint
Werte für den Kopiermodus sind:
-1 = Transparent (transparente Farbe = Pixel oben rechts des Quellrechtecks)
0 = Normal kopieren
1 = Quelle und Ziel mit AND verknüpfen
2 = Quelle und Ziel mit OR verknüpfen
3 = Quelle und Ziel mit XOR verknüpfen
4 = Ziel invertieren (Quelle wird nicht berücksichtigt)
5 - 12 = weitere Verknüpfungstechniken
13 = Schwarz (default) löschen
14 = Weiß (default) löschen
Wird als Kopiermodus die -1 gewählt, dann wird die Farbe des oberen rechten Pixels des zu kopierenden Rechtecks der Quellbitmap als
transparente Farbe gewählt, im Gegensatz zum originalen Profan-Transparentmodus wo das transparente Pixel unten links gewählt wird.
Rechts oben hat aber den Vorteil, das das eigentliche Rechteck (Sprite) nicht noch um ein zusätzliches Pixel nach links hin erweitert werden
muß, was die Positionierung von Sprites unnötig erschwert. Lediglich nach rechts hin wird das Sprite um einen (unbenutzten) Pixel breiter.
Beispiel:
string bereich#,0="Pic1.bmp"
ExHDC&=LoadExtBmp(bereich#,%HDC) ;Bild in externe Bitmap laden
Breite% = %WinRight-%WinLeft
Hoehe% = %WinBottom-%WinTop
CopyExtBmp(%hdc,0,0,Breite%,Hoehe%,ExHDC&,0,0,0) ;Das externe Bild in den kompletten Hauptschirm
;kopieren.
FreeExtBmp(a1&) ;Externes Bild freigeben
|
| | Datum:06.07.01 08:30 
(GeroldFlaig@gmx.de) | |
Hallo Frank,
ich finde deine dll auch ganz klasse. Ich hätte da noch einen Vorschlag. ich kenne aus einem früheren Basic folgende Befehle: DefSprite und MoveSprite. Könnte man in die SpeedDll noch den MoveSprite mit aufnehmen? Also z.B. MoveSprite BmpAusschnitt,Zielparameter..
Gruss
Gerold
|
| | Datum: 06.07.01 11:43 
(frankabbing@12move.de) | |
Hallo,
die Idee spukt auch schon in meinem Kopf herum, Sprites in einem eigenen Threat unabhängig vom Profanprogramm zu verschieben, und auch deren Kollision abfragen...
Aber eins nach dem anderen!
Bis dahin,
Frank
|
|
|