Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249579 (11015)
  Suchen
 Zurück zur Übersicht
 AutorThema: Bewegliche Objekte
Jürgen Richter
Datum:05.07.01 19:16 Antwortenals Email verschicken (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!


Rolf Koch
Datum:05.07.01 19:30 Antwortenals Email verschicken (webmaster@rokosoft.de) 


Hi
auch hier der Hinweis auf mein Spieldemo (also nur der Anfang als Democode)
http://home.t-online.de/home/rokosoft/Sas.zip
Vielleicht ist das was Du suchst.
Rolf



Frank Abbing
Datum:05.07.01 22:13 Antwortenals Email verschicken (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


Rolf Koch
Datum:05.07.01 22:21 Antwortenals Email verschicken (webmaster@rokosoft.de) 


Das hört sich wirklich saustark an Frank (mit den Bitmaps).
Wird wohl ne umfangreiche Dll werden oder?
Rolf


Frank Abbing
Datum:06.07.01 00:06 Antwortenals Email verschicken (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


Rolf Koch
Datum:06.07.01 00:28 Antwortenals Email verschicken (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!



Frank Abbing
Datum:06.07.01 00:40 Antwortenals Email verschicken (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




Gerold Flaig
Datum:06.07.01 08:30 Antwortenals Email verschicken (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


Frank Abbing
Datum: 06.07.01 11:43 Antwortenals Email verschicken (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


 Zurück zur Übersicht