Probleme bei Bildwechsel in 2d

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Ziggy

Betreff: Probleme bei Bildwechsel in 2d

BeitragFr, Dez 07, 2007 7:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab ein "winziges" jump and run gebastelt.

Mein Männchen hat mehrere Waffen zur auswahl. Die Waffe kann ich mit der Taste [1] wechseln (später durch Powerup), funktioniert auch alles super.

Problem: Wenn ich bereits einige Schüsse abgegeben habe und dann die Waffe wechsel, werden die alten Schüsse ebenfalls mit den neuen Bildern gezeichnet. Das sieht natürlich doof aus.

Mein code:
Code: [AUSKLAPPEN]

[...]
Function startgame()
If KeyHit(25) Then gamemode = 4
optionsmode = 0
Cls
movement()

   For s.shot = Each shot
      s\px = s\px + wpnspeed
      DrawImage wpnimg,s\px,s\py   
      If s\px > gfxWidth-50 Then
         s\px = gfxWidth-50
         If s\frame < 6 Then         
            s\frame = s\frame + 1
            DrawImage expl1,s\px,s\py,s\frame
            s\dead = s\dead + s\frame
         EndIf
      EndIf
      If s\dead = 6 Delete s.shot
   Next
   
DrawImage player,px,py,0
End Function

Function movement()
If leftkey Then
   px = px - player_speed
   For I = 0 To 1
      DrawImage player,px,py,I
   Next
EndIf
If rightkey Then px = px + player_speed
  If upkey And jump = False Then   
    jump = True
   jumpmax# = 8
  EndIf
If shotkey Then
   If shotcount < maxshots Then
      shotcount = shotcount + 1
      PlaySound wpnsnd
      shot()
   Else
      PlaySound snd_emptywpn      
   EndIf
EndIf

If reloadkey Then
   shotcount = 0
   PlaySound snd_reload
EndIf

If KeyHit(2) Then weapon = weapon + 1
If weapon > 4 Then weapon = 1


;Rand testen
If px < 0 Then px = 0
If px > gfxWidth-64 Then px = gfxWidth-64
End Function

Function shot()
   s.shot = New shot
   s\py = py +10
   s\px = px +50
   s\speed = 8
   s\dead = 0
   s\frame = 0
End Function
[...]


Hiervon sind die Waffen abhängig:
Code: [AUSKLAPPEN]

Function weapons()
If weapon = 1 Then
   weaponname = "Handgun"
   maxshots = 12
   wpnspeed = 8
   wpnsnd = snd_shot1
   wpnimg = shot1
EndIf

If weapon = 2 Then
   weaponname$ = "Shotgun"
   maxshots = 1
   wpnspeed = 7
   wpnsnd = snd_shot2
   wpnimg = shot2
EndIf

If weapon = 3 Then
   weaponname$ = "Laser"
   maxshots = 20
   wpnspeed = 9
   wpnsnd = snd_shot3
   wpnimg = shot3
EndIf

If weapon = 4 Then
   weaponname$ = "Snowball"
   maxshots = 10
   wpnspeed = 6
   wpnsnd = snd_shot4
   wpnimg = shot4
EndIf
End Function



Die Waffenbilder werden separat in einer Funktion geladen, sollte hier nicht so wichtig sein.

Ich danke euch für eure Anregungen.

Gruß.


Edit: Ich kann mich erst heute Nachmittag wieder damit befassen, bin erst in der Schule.
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

BladeRunner

Moderator

BeitragFr, Dez 07, 2007 8:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Weg dieses Problem zu erledigen liegt darin deinen Schüssen beim Abfeuern schon einen Typ zuzuweisen, sprich eine eindeutige Informationsnummer.
Du benutzt ja schon types- erstelle einen Type für Schüsse und leg darin die gewünschten Daten wie Bild, Sound, Schaden und Geschwindigkeit ab.
Dann trägt jeder Schuss alle benötigten Informationen 'bei sich' und nichts kann verloren gehen.

EDIT: deine Abfrage auf die Waffe im unteren code kannst Du sehr schön mit einem select-case ausrüsten.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Ziggy

BeitragFr, Dez 07, 2007 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort.

Also muss ich statt nur einem Type für Schuss mehrere Anlegen?

Also Type Schuss1, Type Schuss2, und darin die Bild-Informationen speichern.


Das mit den Select...Case muss ich mir noch angewöhnen, irgendwie scheine ich auf IF's zu stehen Very Happy
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

BladeRunner

Moderator

BeitragFr, Dez 07, 2007 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, es reicht ein Type, aber dem halt mehrere Fields zuweisen anhand derer Du die schüsse unterscheiden kannst.

Bsp:
Code: [AUSKLAPPEN]
type schuss 
    field art
    field speed
end type

...

for a.schuss = each schuss

   select a\art
       case 1 a\speed = 21
       case 2 a\speed = 1
   end select
next



Das ist natürlich jetzt extremst vereinfacht...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Ziggy

BeitragFr, Dez 07, 2007 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das jetzt so umgesetzt wie du es gesagt hast...

Leider wechseln die Bilder immer noch so wie vorher.

Code: [AUSKLAPPEN]


For s.shot = Each shot
      s\px = s\px + s\speed
      Select weapon
         Case 1    s\image = img_shot1
               s\name = "Handgun"
               s\sound = snd_shot1
               s\maxshots = 12
               s\speed = 8
         Case 2    s\image = img_shot2
               s\name = "Pumpgun"
               s\sound = snd_shot2
               s\maxshots = 12
               s\speed = 8                           
         Case 3    s\image = img_shot3
               s\name = "Laser"
               s\sound = snd_shot3
               s\maxshots = 12   
               s\speed = 8                           
         Case 4    s\image = img_shot4
               s\name = "Snowball"
               s\sound = snd_shot4
               s\maxshots = 12
               s\speed = 8                              
      End Select                                    
      DrawImage s\image,s\px,s\py
      PlaySound s\sound
      If s\px > gfxWidth-50 Then
         s\px = gfxWidth-50
         If s\frame < 6 Then         
            s\frame = s\frame + 1
            DrawImage expl1,s\px,s\py,s\frame
            s\dead = s\dead + s\frame
         EndIf
      EndIf
      If s\dead = 6 Delete s.shot      
   Next



Es scheint vor Denkfehlern zu wimmeln... Shocked
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

BladeRunner

Moderator

BeitragFr, Dez 07, 2007 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst die Waffenart EINMALIG festlegen, nämlich dann wenn der Schuss erstellt wird. Danach wird nur entsprechend der Waffenart (Die ja im Type selber mit abgespeichert ist, siehe mein Beispiel) eingezeichnet.
Das Prinzip ist es bei der Geburt des Objektes seine Eigenschaften festzulegen und danach nur noch updates an den veränderlichen Daten durchzuführen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

The_Nici

BeitragFr, Dez 07, 2007 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Vorschlag:
Code: [AUSKLAPPEN]

Type schuss
   Field x
   Field y
   Field art
End Type

[...]

For a.schuss = Each schuss
   Select a\art
      Case "Micky Mouse"
            Drawimage Micky_Mouse, a\x, a\y

etcetc...
Image im Type abspeichern verbraucht nur RAM, bei 2D kann man soviel zeichnen wie man will.
 

Ziggy

Betreff: Ich habs !!!

BeitragFr, Dez 07, 2007 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe es jetzt rausbekommen.


Der Hinweis "lege die Art des Schusses beim erstellen fest" hat mich drauf gebracht.

Eure Codes haben mir leider nicht weitergeholfen, denn ihr habt die Art jedesmal in der For....Each-Schleife abgefragt. Da aber diese Schleife (wegen Each) ja für ALLE Schüsse gelten werden dort auch ALLE Schussbilder geändert (auch wenn sie schon gezeichnet sind).

Der Clou lag darin die Case...Select-Abfrage für den Waffenmodus in die For....New-Schleife reinzuhämmern.

Code: [AUSKLAPPEN]
 
Function shot()
   s.shot = New shot
   s\py = py +10
   s\px = px +50
   s\dead = 0
   s\frame = 0
   s\speed = 8
   Select weapon
      Case 1   s\image = img_shot1
      Case 2   s\image = img_shot2
      Case 3   s\image = img_shot3
      Case 4   s\image = img_shot4                              
   End Select
End Function


Dort wird dann für jeden neuen (NEW) Schuss das jeweilige Bild gewählt.

Ich vermute dass ihr genau das gemeint habt, doch da ihr jedesmal von der For...Each-Schleife geschrieben habt bin ich nicht dahinter gekommen.

Ich danke euch für eure Denkanstösse.

Gruß.
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group