Grafik überschreiben

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

skey-z

Betreff: Grafik überschreiben

BeitragSa, Feb 05, 2005 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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_

BeitragSa, Feb 05, 2005 4:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe dich nicht ganz, ich nehme an du willst:

Arrow Bei programm start eine graphic agezeigt bekommen
Arrow Bei maus klick soll eine andere angezeigt werden

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

BeitragSa, Feb 05, 2005 7:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ? Shocked immer vor der Hauptschleife(genau wie die letzten 2 Punkte.)

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... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/
 

Gerhard

BeitragSa, Feb 05, 2005 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 05, 2005 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 05, 2005 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 05, 2005 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/

skey-z

BeitragSo, Feb 06, 2005 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Feb 06, 2005 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 06, 2005 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 08, 2005 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann geschlossen werden

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group