Bestimmte bilder erneuern ?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

brandy

Betreff: Bestimmte bilder erneuern ?

BeitragSa, Sep 08, 2007 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Entschuldigung erstmal für die möglicherweise kryptische überschrift , mir fiel nix besseres ein. Desweiteren möchte ich anmerken dass ich die SuFu nicht benutzt habe da ich nicht wusste, wonach ich suchen sollte. Falls so ein thread schon existiert, entschuldigt bitte.

Nun zu mir: Ich bin noch relativ neu im Programmiergeschehen, habe mich allerdings schon mit diversen tutorials befasst, im speziellen mit "Rob's BB Kurs".

Ich wolte mir mal, nachdem ich kleinere programme geschrieben habe, etwas größeres Vornehmen. Mehr oder weniger. Ich wollte einen simplen "schießstand" programmieren mit zufällig auftauchenden gegnern und später auch highscores usw.

Mein Problem ist, dass ich nicht weiß wie ich es fertigbringen soll, gegner solange stehen zu lassen,, bis sie tot sind. Ich kann das hier hier schlecht erklären, also poste ich mal einen teil meines codes:


Code: [AUSKLAPPEN]

Graphics 640, 480, 16, 2
HidePointer
SeedRnd(MilliSecs())

SetBuffer BackBuffer()
Global bg1 = LoadImage("hintergrund1.png")
Global bg2 = LoadImage("hintergrund2.png")
Global bg3 = LoadImage("hintergrund.png")
Global cursor = LoadImage("cursor.png")
Global target = LoadImage("target.png")
MidHandle cursor

Repeat
If x = 640 Then
   DrawImage bg1, 0, 0 
EndIf
If x = 1024 Then
   DrawImage bg2, 0, 0
EndIf
If x = 1280 Then
   DrawImage bg3, 0, 0
EndIf
Flip

MaskImage cursor, 255, 0, 255
DrawImage cursor, MouseX(), MouseY()
Flip

MaskImage target, 255, 0, 255
DrawImage target, Rnd(0, x), Rnd(y/2.08, y)
Flip

Until KeyHit(1)



Hier wäre es evtl. noch wichtig zu erwähnen, dass dem ganzen ein menü für auflösung vorangegangen ist, weshalb jetzt für jede auflösung ein hintergrundbild geladen wird.

Mein problem hierbei ist, dass bei jedem durchlauf der random-befehl erneut ausgeführt wird und der gegner sonstwo erscheint. Wie kann ich nun schreiben, dass der computer den gegner erneut an der selben stelle erscheinen lässt, d.h. kann ich einen random-wert irgendwie abspeichern (ausser in einer textdatei möglicherweise) ?
Ich hätte allerdings lieber eine erklärung und die angabe bestimter befehle als ein fertiges codesegment.


[/code]
 

ChristianK

BeitragSa, Sep 08, 2007 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Um die Random-Werte zu speichern, musst du Variablen benutzen.
Du speicherst also für jeden Gegner die Position in einer Variable und zeichnest das Bild an der gespeicherten Position.

Und noch was zu deinem Code. Du solltest Flip am Ende der Schleife benutzen. Und zwar genau einmal.
Außerdem brauchst du MaskImage nur einmal nach dem Laden des Bildes auszuführen.
Hier mal eine "verbesserte" Version mit Variablen. Wenn du die linke Maustaste drückst, wird eine neue Position generiert.

Code: [AUSKLAPPEN]
Graphics 640, 480, 16, 2
HidePointer
SeedRnd(MilliSecs())

SetBuffer BackBuffer()
Global bg1 = LoadImage("hintergrund1.png")
Global bg2 = LoadImage("hintergrund2.png")
Global bg3 = LoadImage("hintergrund.png")

Global cursor = LoadImage("cursor.png")
MaskImage cursor, 255, 0, 255

Global target = LoadImage("target.png")
MaskImage target, 255, 0, 255

MidHandle cursor

Local position_x, position_y ; Variablen deklarieren

Repeat

   Cls ; Bildschirm löschen

   If x = 640 Then
      DrawImage bg1, 0, 0 
   EndIf

   If x = 1024 Then
      DrawImage bg2, 0, 0
   EndIf

   If x = 1280 Then
      DrawImage bg3, 0, 0
   EndIf
   
   If MouseHit( 1 )
      position_x = Rand( 0, 600 ) ; Neue Position speichern
      position_y = Rand( 0, 400 )
   End If

   DrawImage target, position_x, position_y ; Bild an gespeicherter Position zeichnen

   DrawImage cursor, MouseX(), MouseY()

   Flip ; Nur einmal Flippen
   
Until KeyHit(1)
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Noobody

BeitragSa, Sep 08, 2007 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach doch den Random-Wert Global, dann wird er nicht jeden Schleifendurchlauf gelöscht.
Lass ihn dann nur neu berechnen, wenn der Gegner tot ist (kannst du in der Trefferabfrage einbauen).
Ausserdem ist es nicht besonders speichersparend, wenn man drei Bilder lädt, wo man nur eines braucht.
Entweder schon beim Laden die Abfrage nach x einbauen oder statt für jede Auflösung ein Bild zu laden, kannst du auch einfach eines laden und es dann mit ScaleImage auf die gewünschte Grösse skalieren.

EDIT: Da war wohl jemand schneller als ich ^^
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

brandy

BeitragSa, Sep 08, 2007 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für beiden antworten.
Eigentlich hätte ich selbst draufkommen müssen -.-.
Noch ne frage: geht das auch mit der mausposition, für einschusslöcher?
 

ChristianK

BeitragSa, Sep 08, 2007 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Na klar! Für alle Funktionen, die einen Wert zurückgeben.

Code: [AUSKLAPPEN]
mx = MouseX( )
my = MouseY( )
...
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

brandy

BeitragSa, Sep 08, 2007 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist klar, nur würde ich gerne mehrere einschusslöcher machen, muss ich das dann über types oder arrays regeln?




und gleich noch eine frage hab ich da.
Ich weiß zwar die notwendigen parameter für den imagecollide befehl, jedoch nicht was sie im einzelnen bedeuten.
If ImagesCollide(bild1, x1, y1, frame1, bild2, x2, y2, frame2)

bild1 is klar, bild2 auch, doch der rest?

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Sep 08, 2007 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Ja.
2. Sieh in der Hilfe oder auf blitzbase.de nach.
3. Wenn du das ein oder andere Tutorial aufmerksam gelesen hättest, hättest du dort alle deine Fragen beantwortet gesehen.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

0penguin0

BeitragSa, Sep 08, 2007 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
brandy hat Folgendes geschrieben:
Das ist klar, nur würde ich gerne mehrere einschusslöcher machen, muss ich das dann über types oder arrays regeln?


aMul hat Folgendes geschrieben:
1. Ja.


er meinte types (hoffentlich^^)
i never finish anyth
 

brandy

BeitragSo, Sep 09, 2007 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke ich hab auf blitzbase nachgesehen.
Ich hab zwar noch einige schwierigkeiten mit den types, aber ich denke dass ich das einigermaßen schnell in den griff bekommen werde.
Danke für eure schnellen antworten Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group