Grafik überschreiben
Übersicht

![]() |
skey-zBetreff: Grafik überschreiben |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, ist mein erster Post und arbeite auch noch nicht so lange mit Blitz.
Folgendes problem, ich habe eine grafik geladen, diese kopiert, damit das orginal beibehalten wird und bei jedem neuen programm aufruf die Grafik, die kopiert wurde, wieder frisch da steht. in der schleife soll nun bei einem Mausklick eine grafik auf bestehenden Grafik angezeigt und gespeichert werden. habe es schon mit allen in meinem Buch beschriebenen Mitteln, der Suche in diesem Forum und der onlinehilfe versucht zu beheben, aber die neue Grafik wird nicht abgespeichert. hier der gesamt code der Datei: Code: [AUSKLAPPEN] ;.spiel
;Include "scheibe.bb" AppTitle "spiel" Local ScreenX%=800, ScreenY%=600 Graphics ScreenX,ScreenY,32,1 SetBuffer BackBuffer() Cls scheibe=LoadImage("scheibe.jpg") ;Hintergrund laden scheibe1=CopyImage(scheibe) ;Hintergrund kopieren SaveImage scheibe1, "scheibe1.bmp";hintergrund als neue Datei speichern FreeImage scheibe1 ;kopierten Hintergrund aus dem Speicher entfernen schuss=LoadImage("schuss.png") ;Einschusslochgrafik laden kreuz=LoadImage("kreuz.png") ;Mauszeiger Laden MaskImage schuss, 255, 255, 255 ;Lochgrafik transparent machen MaskImage kreuz, 255, 255, 255 ;Mauszeiger transparent machen MidHandle kreuz ;Bezugspunkt mittig setzen MidHandle schuss ;Bezugspunkt mittig setzen wscheibe%=ImageWidth(scheibe) ;Hintergrundgrafik breite hscheibe%=ImageHeight(scheibe) ;Hintergrundgrafik öhe font=LoadFont("arial",25,0,0,0) ;Schrift Laden SetFont font ;Schrift als Standard setzen Gosub parameter ;Unterprogramm "parameter" aufrufen Repeat ;Beginn der Schleife Cls ;Bildschirminhalt leeren FreeImage scheibe1 ;noch vorhandenes Hintergrundbild aus dem Speicher entfernen Color 100, 255, 15 ;Textfarbe festlegen Text 10, 20, "Patronen: " + savail Text 10, 50, "Magazine: " + magazine Text 10, 80, "Schüsse : " + sused Text 10, 110, "Treffer : " + shit Text 10, 140, "Punkte : " + punkte scheibe1=LoadImage("scheibe1.bmp") ;kopierte Hintergrundgrafik wird geladen DrawImage scheibe1, (ScreenX/2)-(wscheibe/2),(ScreenY/2)-(hscheibe/2); grafik wird gezeichent DrawImage kreuz, MouseX(), MouseY(); mauszeiger wird an der aktuellen position gezeichnet If MouseHit(3) Then Gosub parameter; alle Variablen auf Standard setzen If MouseHit(2) And savail = 0 And magazine > 0 Then ;nachladen savail=savail+5 ;Patronen +5 magazine=magazine-1 ;Magazine -1 EndIf ;Ende der Bedingung If MouseHit(1) And savail > 0 Then ;beim Linksklick soll etwas passieren, SetBuffer ImageBuffer(scheibe1) ;Bildspeicher der Hintergrundgrafik soll gesetzt werden Viewport (ScreenX/2)-(wscheibe/2),(ScreenY/2)-(hscheibe/2),wscheibe,hscheibe ;Bildausschnitt auf Hintergrundgrafik reduzieren DrawImage schuss, MouseX(), MouseY(); Einschussloch wird an der Mausposition gezeichnet SaveBuffer ImageBuffer(scheibe1), "scheibe1.bmp" ;Hintergrund mit neuem Einschussloch speichern SetBuffer BackBuffer() ;zurück zum Bildschirmspeicher savail = savail - 1 ;Patrone-1 sused = sused + 1; SChüsse +1 EndIf ;Ende der Bedingung FlushMouse ;Mausspeicher leeren Flip ;Gesamtes Bild zeichenen Until KeyHit(1) ;Ende der Schleife WaitKey ;auf Tastendruck warten FreeImage scheibe FreeImage scheibe1 FreeImage schuss FreeImage kreuz; Alle Grafiken aus dem Speicher entfernen Return; zurück zum eigentlichen Hauptprogramm End .parameter ;Unterprogramm, festlegen der Variablen savail=5 ;Patronen=5 magazine=2 ;Magazine=2 sused=0 ;Schüsse=0 shit=0 ; Treffer=0 punkte=0 ;Punktzahl=0 Return; zurück zum Hauptprogramm ich habe keine ahnung mehr, was ich da noch machen kann, habe schon alle mir bekannten Möglichkeiten ausprobiert. |
||
![]() |
Rob_ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich verstehe dich nicht ganz, ich nehme an du willst:
![]() ![]() Und wenn ich auf dein code starre sehe ich ein kauderwelshisch. Erklär nochmal dein problem genauer. |
||
AMD Athlon 64 3500+ | Infineon 1 GB DDR RAM | nVidia Geforce 7800 GTX |
![]() |
Ebola33 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiss nicht was ich jetzt dazu sagen soll. Du hast ALLES grundlegend falsch verstanden.
1. Warum lädst du den Hintergrund, kopierst ihn dann und löschst dann das Original aus dem Speicher ? 2. Nach cls in der HAUPTSCHLEIFE löschst du jedesmal das kopierte Hintergrundbild(min. 60x pro sekunde) 3. Danach lädst du es wieder ? ![]() 4. dann : Code: [AUSKLAPPEN] SaveBuffer ImageBuffer(scheibe1), "scheibe1.bmp" ;Hintergrund mit neuem Einschussloch speichern
SetBuffer BackBuffer() ;zurück zum Bildschirmspeicher (Das passiert wirklich so oft sich das bild am Monitor aufbaut. z.B. 60Hz=60xpro sek. ´z.B. 85 hz 85 x pro sek.. u.s.w.) Das ist definitiv der falsche Weg. Ich bin sprachlos, ich weiss nicht wie ich dir helfen könnte... ausser vielleicht du schilderst mir dein Problem und ich programmier dir diesen Abschnitt....... ist nicht bös gemeint Mfg Ebola edit : genau schildern (deutsch). edit2 : sorry, es passiert natürlich nicht so oft weil die framerate aufgrund der imagespeicherung rapide in die knie geht. |
||
ansteckend... ![]() verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/ |
Gerhard |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn ich das recht verstehe, willst du
1. ein Hintergrundbild laden 2. darauf schiessen 3. die Treffer auf den Hintergrund zeichnen Dazu ist es sicherlich nicht sinnvoll, bei jedem Treffer das Hintergrundbild komplett neu zu speichern. Vielleicht könntest du die Treffer an die jeweilige Stelle über das Hintergrundbild zeichnen, indem du die Trefferkoordinaten verwendest. Wenn du Types nicht kennst müsstest du dir allerdings Gedanken über die mögliche Trefferzahl machen. |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
also Gerhard hat mich richtig verstanden,
Das Bild mit der Zielscheibe soll erst ohen treffer dargestellt werden, wenn ich dann mit der maus klicke, soll das einschussloch an der Stelle zu sehen seien. Das ist nciht das problem, aber durch cls wird es beim nächsten schlefendurchlauf wieder gelöscht, wenn ich es einfach nur in die Grafik schreibe und cls kann ich nicht weg lassen, weil ja dann auch der Mauszeiger nicht gelöscht wird. um bei jedem Programmstart, das "cleane" Bild zu verwenden, kopiere ich es und speicher es in einer eigenen datei, wo dann im Spielverlauf, die Einschusslöcher hinzugefügt werden sollen. Ich weiss, der code sieht ein wenig scheisse aus, das liegt auch daran, dass ich es extra hierfür noch einmal mit kommentaren versehen habe, damit ihr vlt besser versteht, was ich da genau bezwecke. Zudem bin ich auch noch vollnoob und das weiss ich auch, dies ist mein wirklich erstes prog/spiel, was ich etwas intensiver in angriff nehmen wollte. |
||
Gerhard |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nach dem CLS zeichnest du alles (also wirklich alles) neu. Nicht nur das Hintergrundbild und deinen Mauszeiger, sondern einfach auch alle deine Einschusslöcher.
Dazu musst du dir merken, wo ein Einschuss ist (x,y) und die Koordinaten speichern. Am besten geht das sicher mit Types. 1. beim Schuss: neues Type erstellen, x und y zuordnen 2. bei jedem Hauptschleifen-Durchgang alle erstellten Types zeichnen (nach dem Hintergrund aber vor dem Mauszeiger). 3. Irgendwann die Types wieder freigeben. |
||
![]() |
Ebola33 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, er kann ja auch direkt in den imagebuffer schreiben nur sollte er das Bild nicht jedesmal in der Hauptschleife auf Festplatte laden bzw. speichern. Es reicht wenn das im speicher gemacht wird. | ||
ansteckend... ![]() verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/ |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
das Bild einfahc nur in den imagebuffer zu schreiben, hab ich ja als erstes gemacht:
Code: [AUSKLAPPEN] SetBuffer ImageBuffer(scheibe1)
DrawImage schuss, MouseX(), MouseY() SetBuffer BackBuffer() jedoch sehe ich dann keinen einschuss. aber ich werde es noch mal mit dne Types Versuchen, wenn ich es mal richtig durchgelesen habe. |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Liegt wahrscheinlich daran das du den Schuss außerhalb des Bildes malst
Beispiel: Code: [AUSKLAPPEN] SetBuffer ImageBuffer(scheibe1)
DrawImage schuss, MouseX()-200, MouseY()-200 SetBuffer BackBuffer() drawimage Zielscheibe,200,200 Hier ein funktionierende Beispiel:Code: [AUSKLAPPEN] Graphics 800 ,600,16,1
Scheibe = Create_Zielscheibe () Loch = Create_Loch () SetBuffer BackBuffer () While Not KeyDown (1) ;######### If MouseHit (1) Then ; neuen Schuss erstellen SetBuffer ImageBuffer (scheibe) DrawImage Loch ,MouseX () - 100 ,MouseY () - 100 SetBuffer BackBuffer () End If DrawImage Scheibe ,100,100 ; Maus malen Rect MouseX () - 20 ,MouseY () - 1 ,40,2,1 Rect MouseX () - 1 ,MouseY () - 20 ,2,40,1 Flip Cls Wend End ;####### Function Create_Loch () ; erstellt das Bild Loch Local x = 15 Bild = CreateImage (x,x) SetBuffer ImageBuffer (Bild) Color 255 ,0,0 For i = 0 To x / 2 Oval i,i,x - i * 2 ,x - i * 2 Next MidHandle bild Return bild End Function Function Create_Zielscheibe () ; erstellt das Bild zielscheibe Local x = 300 Bild = CreateImage (x,x) SetBuffer ImageBuffer (Bild) For i = 0 To x / 2 Color i * 10 ,i * 10 ,i * 20 Oval i,i,x - i * 2 ,x - i * 2 Next Return bild End Function |
||
[BB2D | BB3D | BB+]
|
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Thx Rallimen, ich muss glaube ich noch ein Buch über Logic lesen, ja es lag daran, dass ich ausserhalb des bildes gemalt habe.
beim nächten prob, werde ich vorher erst mal 2 mal nachdenken, weil diesemal lag es ja nicht bzw nur zum Teil am Code sondern an mir. Aber ich bedanke mich nochmal recht herzlich für eure Hilfen |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kann geschlossen werden | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group