Type-Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

cleminator

Betreff: Type-Problem

BeitragMi, Apr 05, 2006 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi hab mich die letzten 2 Tage mal mit Types befasst.
Is echt schwierieges Thema phuu, jetzt hab ich mir gedacht ich programmiere einfach mal so eine kliene App mit der man Löcher in die Wand scheißen kann! Mein Probelm ist nur das wenn ich jetzt die Maustaste drücke das Loch in der Wand nur für gaaaaaaaaanz kurze Zeit sichtbar wird. Was muss ich an meinem Code änder? Liebe Grüße Clemens


BlitzBasic: [AUSKLAPPEN]
 Graphics 800,600,16,1
SetBuffer BackBuffer()

Global schussbmp = LoadImage("schuss.bmp")
Global cursor = LoadImage("cursor.bmp")

Type schuss
Field x
Field y
End Type




Repeat
Cls

DrawImage cursor,MouseX(),MouseY()

s.schuss = New schuss
s\x = MouseX()
s\y = MouseY()

If MouseHit(1) Then
DrawImage schussbmp,s\x,s\y
EndIf


Flip
Until KeyHit(1)
End
 

HW

BeitragMi, Apr 05, 2006 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, dass das Loch nur gezeichnet wird, wenn die Maustaste gedrückt wird. Danach wird es wieder durch Cls gelöscht. Außerdem solltest du die Schüsse nicht in jedem Schleifendurchlauf erstellen. Am besten wäre es, wenn du den Code zum Schuss erstellen in die If Schliefe mit dem Mousehit packst und das Drawimage in eine For Each schuss Scheife stellst. So müsste es besser funktionieren.

Chester

BeitragMi, Apr 05, 2006 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst Doublebuffering aktivieren und du darfst nicht in jeder Schleife einen neuen Type mit dem selben Handle erstelle, denn dann überschreibst du dein letzter erstellter Type. An deiner Stelle würde ich Funktionen nehmen.

Dein Code müsste so aussehen:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()

Global schussbmp = CreateImage(10,10)
Global cursor = CreateImage(10,10)

SetBuffer ImageBuffer(schussbmp)
Color 200,0,0
Rect 0,0,10,10,1
SetBuffer ImageBuffer(cursor)
Color 0,0,200
Rect 0,0,10,10,1

Type schuss
Field x
Field y
End Type
SetBuffer BackBuffer()

Repeat
Cls

DrawImage cursor,MouseX(),MouseY()


If MouseHit(1) Then
CreateSchuss()
EndIf
If MouseHit(2) Then
ResetSchuesse()
EndIf


UpdateSchuesse()
Flip
Until KeyHit(1)
End



Function CreateSchuss()
Local s.schuss = New schuss
s\x = MouseX()
s\y = MouseY()
Return Handle(s)
End Function

Function UpdateSchuesse()
For s.schuss = Each schuss
DrawImage schussbmp,s\x,s\y
Next
End Function

Function ResetSchuesse()
For s.schuss = Each schuss
Delete s
Next
End Function


Zusätzlich habe ich noch die 2 Maustaste mit "integriert" bzw. ResetSchuesse eingebaut.

MfG
ChEsTeR
 

cleminator

BeitragMi, Apr 05, 2006 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke noch eine frage:

Also in prinzip habe ich mit meinem Code nur die Daten erstellt und noch nicht die Schusslöcher
 

cleminator

BeitragMi, Apr 05, 2006 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay noch mal ne frage hab hier ein kleines Spiel programmiert, is zwar voll unübersichtlich aber brauch wieder nur eine Antwort bezüglich Types.

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()


;Laden und Kallibrieren
Global menubg = LoadImage("Menubg.bmp")
Global menu = LoadImage("menu.bmp")
Global bg = LoadImage("bg.bmp")
Global ship = LoadImage("ship.bmp")
Global rocket = LoadImage("rocket.bmp")
Global enemy = LoadImage("gegner.bmp")
MaskImage rocket,255,0,255
MaskImage ship,255,0,255
MaskImage menu,0,0,0
MaskImage enemy,255,0,255
MidHandle enemy
MidHandle ship
MidHandle rocket
;Variablen
Global menubgx = 0
Global menubgy = 0
Global bewegungsconst = 2
Global shipx = 400
Global shipy= 550
Global menge = 0

;Types
Type schuss
Field x
Field y
End Type

Type gegner
Field x
Field y
Field speed
End Type


;Funktionen

Function neuergegner()
SeedRnd = MilliSecs()
g.gegner = New gegner
g\x = Rnd(50,700)
g\y = 0
g\speed = Rnd(-1,-2)
End Function

Function updategegner()
For g.gegner = Each gegner
DrawImage enemy,g\x,g\y
g\y = g\y - g\speed
Next
End Function

Function neuerschuss()
s.schuss = New schuss
s\x = shipx
s\y = shipy
End Function

Function updateschuss()
For s.schuss = Each schuss
DrawImage rocket,s\x,s\y
s\y = s\y - 2
Next
End Function


Function drawmenu_bg()
TileImage menubg,menubgx,menubgy
menubgx= menubgx + 1
DrawImage menu,0,0
End Function

Function shipsteuerung()
If KeyDown(203) Then
shipx = shipx-5
EndIf

If KeyDown(205) Then
shipx = shipx+5
EndIf

If shipx < 28
shipx = 28
EndIf

If shipx > 800-28
shipx = 800-28
EndIf

End Function



;Menü Schleife
.menu
Repeat
Cls
SeedRnd MilliSecs()
drawmenu_bg

;steuerung
If KeyHit(59) Then
Goto credits
EndIf

If KeyHit(28) Then
Goto spiel
EndIf

Flip
Until KeyHit(1)
End


;Credits
.credits
Repeat
Cls

Flip
Until KeyHit(1)
Goto menu


;Spieleschleife
.spiel
Repeat
Cls



neuergegner


updategegner

;___________ Schiessen
If KeyHit(57) Then
neuerschuss
EndIf
updateschuss
;-------------
TileImage menubg,menubgx,menubgy
menubgy = menubgy + bewegungsconst
;-------------
DrawImage ship,shipx,shipy

shipsteuerung

Flip
Until KeyHit(1)
Goto menu


so also: Wenn ich jetzt das Spiel starte dann kommen 1000 gegner auf einmal und es werden immer mehr erstellt. ich möchte aber dass zwischen den einzelnen Gegner immer so 3 sekunden oder so abstand ist und dann erst ein neuer erstelle wird. Habs schon versucht beim erstellen eines Gegner eine Variable mit time = Millisecs() zu erstellen und danach die wieder abprüfen mit BlitzBasic: [AUSKLAPPEN]
If MilliSecs() > time + 3000 Then
neuergegner
EndIf

ist aber auch nicht gegangen, weiß jemand weiter?

Firstdeathmaker

BeitragMi, Apr 05, 2006 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Ansatz ist doch so in Ordnung!
(Ach ja, Seedrnd braucht man nur einmal am Anfang des Programmes mit einer Zufallszahl zu füttern).

Läuft es so? (Hab ja deine Bilder nicht, kann es also nicht testen)

Code: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()
SeedRnd = MilliSecs()

;Laden und Kallibrieren
Global menubg = LoadImage("Menubg.bmp")
Global menu = LoadImage("menu.bmp")
Global bg = LoadImage("bg.bmp")
Global ship = LoadImage("ship.bmp")
Global rocket = LoadImage("rocket.bmp")
Global enemy = LoadImage("gegner.bmp")
MaskImage rocket,255,0,255
MaskImage ship,255,0,255
MaskImage menu,0,0,0
MaskImage enemy,255,0,255
MidHandle enemy
MidHandle ship
MidHandle rocket
;Variablen
Global menubgx = 0
Global menubgy = 0
Global bewegungsconst = 2
Global shipx = 400
Global shipy= 550
Global menge = 0

;Types
Type schuss
        Field x
        Field y
End Type

Type gegner
        Field x
        Field y
        Field speed
End Type


;Funktionen

Global NewEnemyCreateTime
Function neuergegner()
   If NewEnemyCreateTime<Millisecs()
      g.gegner = New gegner
      g\x = Rnd(50,700)
      g\y = 0
      g\speed = Rnd(-1,-2)
      NewEnemyCreateTime = MilliSecs() + 3000
   endif
End Function

Function updategegner()
For g.gegner = Each gegner
DrawImage enemy,g\x,g\y
g\y = g\y - g\speed
Next
End Function

Function neuerschuss()
s.schuss = New schuss
s\x = shipx
s\y = shipy
End Function

Function updateschuss()
For s.schuss = Each schuss
DrawImage rocket,s\x,s\y
s\y = s\y - 2
Next
End Function


Function drawmenu_bg()
TileImage menubg,menubgx,menubgy
menubgx= menubgx + 1
DrawImage menu,0,0
End Function

Function shipsteuerung()
If KeyDown(203) Then
shipx = shipx-5
EndIf

If KeyDown(205) Then
shipx = shipx+5
EndIf

If shipx < 28
shipx = 28
EndIf

If shipx > 800-28
shipx = 800-28
EndIf

End Function



;Menü Schleife
.menu
Repeat
Cls
SeedRnd MilliSecs()
drawmenu_bg

;steuerung
If KeyHit(59) Then
Goto credits
EndIf

If KeyHit(28) Then
Goto spiel
EndIf

Flip
Until KeyHit(1)
End


;Credits
.credits
Repeat
Cls

Flip
Until KeyHit(1)
Goto menu


;Spieleschleife
.spiel
Repeat
Cls

 
 
neuergegner


updategegner

;___________ Schiessen
If KeyHit(57) Then
neuerschuss
EndIf
updateschuss
;-------------
TileImage menubg,menubgx,menubgy
menubgy = menubgy + bewegungsconst
;-------------
DrawImage ship,shipx,shipy

shipsteuerung

Flip
Until KeyHit(1)
Goto menu
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

cleminator

BeitragMi, Apr 05, 2006 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Woa super he! Dankeschön find ich echt toll von euch allen das man hier immer so gute und schnelle Antworten krigt. und Firstdeathmaker: Jop klappt so

lg clemens
 

cleminator

BeitragDo, Apr 06, 2006 8:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, hab noch mal ne Frage zum Obrigen Code!
Also habe gestern noch versucht die Racketen und die Gegner Kollidieren zu lassen, habs mit: BlitzBasic: [AUSKLAPPEN]
Function gegner_schuss_collision()
For g.gegner = Each gegner
If ImagesCollide(enemy,g.gegner\x,g.gegner\y,0,rocket,s.schuss\x,s.schuss\y,0) Then
Delete g.gegner
EndIf
Next
End Function

Jedes mal wenn ich dann das Prog starte kommt eine Fehlermeldung
"Objekt does not exist", wie kann ich die beiden images kollidieren lassen? lg clemens

5k41

BeitragDo, Apr 06, 2006 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
g.gegner\x muss glaub ich eigentlich g\x heissen... der Fehler desshalb, weil er dasobjekt gegner in g nicht findet!
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

cleminator

BeitragDo, Apr 06, 2006 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne geht trotzdem nicht, habs jetzt auf alle Varianten probiert kommt immer der fehler"Object does not exist" und wenn ich statt
s.schuss\x nur s\x eingeb kommt "variable must be a type" komisch net?

5k41

BeitragDo, Apr 06, 2006 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hrhr ich glaub ich habs! Sind die Instanzen von schuss und/oder gegner vielleicht nicht global? Ich mein das ganze ist ja ne Funktion!^^
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Chester

BeitragDo, Apr 06, 2006 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Es muss s\x heißen. Das "Variable must be a Type" kommt, weil du in der Schleife lediglich den Gegner-Type durchgehst. Du musst auch den schuss in der Schleife definieren. Oder(so würde ich es machen) wenn du den Schuss erstellst schon gleich auf Kollision prüfen.

BlitzBasic: [AUSKLAPPEN]

Function neuerschuss()
s.schuss = New schuss
s\x = shipx
s\y = shipy
For g.gegner = Each gegner
If ImagesCollide(enemy,g\x,g\y,0,rocket,s\x,sy,0) Then
Delete g.gegner
EndIf
Next

End Function

 

cleminator

BeitragDo, Apr 06, 2006 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo sie waren zwar nicht Global, hat aber immer noch nichts gebracht, mann regt mich das auf!
 

cleminator

BeitragDo, Apr 06, 2006 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
ne funzt immer noch nicht!!!! hmm also ich bin echt ratlos an was es liegen könnte!!!

5k41

BeitragDo, Apr 06, 2006 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
ok dann versuch mal die Funktionen neuergegner und neuerschuss in neuergegner.gegner und neuerschuss.schuss umzubennenen... mach das gleiche auch mit allen funktionen, welche auf die types zugreifen müssen, dann kannste dir das globalisieren auch sparen...

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Chester

BeitragDo, Apr 06, 2006 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
cleminator hat Folgendes geschrieben:
ne funzt immer noch nicht!!!! hmm also ich bin echt ratlos an was es liegen könnte!!!

Könnte evt. daran liegen, dass ich ausversehen sy statt s\y beim Imagescollide.
Änder es mal und schau mal, ob es dann funktioniert.
 

cleminator

BeitragDo, Apr 06, 2006 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Nene hab ich schon geändert gehabt, an dem lags auch net, naja. Wie bringt ihr den sonst Bilder die von Types aus gehen zum Kollidieren? kann mir jemand mal n Bsp geben oder so? lg clemens

Chester

BeitragDo, Apr 06, 2006 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,1

SeedRnd MilliSecs()



Type partikel
Field x#,y#
Field winkel
Field speed
Field rgb
End Type

Type image
Field x,y
Field time_left
Field time
Field pic_nr
Field image
Field width,height
End Type

SetBuffer BackBuffer()

Global schussbmp = CreateImage(10,10)
Global cursor = CreateImage(2,2)
Global gegner = CreateImage(10,10)
Global mx#,my#,mhit
Global anz

SetBuffer ImageBuffer(schussbmp)
Color 200,0,0
Rect 0,0,10,10,1
SetBuffer ImageBuffer(cursor)
Color 200,0,0
Rect 0,0,2,2,1
SetBuffer ImageBuffer(gegner)
Color 0,200,0
Rect 0,0,10,10,1


For tmp = 0 To 15
NewImage(gegner,Rnd(0,800),Rnd(0,600))
Next

SetBuffer BackBuffer()
HidePointer()
Repeat
Cls


mx# = MouseX()
my# = MouseY()
mhit= MouseHit(1)

Color 255,255,0
DrawImage cursor, mx#, my#

UpdateImages()
UpdatePartikel()


Flip
Until KeyHit(1):End

Function NewImage(img,x#,y#)

imgwidth = 10
imgheight = 10

i.image = New image
i\x = x#
i\y = y#

i\image = img

i\width = ImageWidth(i\image)
i\height = ImageHeight(i\image)

End Function

Function UpdateImages()
For i.image = Each image
DrawImage i\image,i\x,i\y

If ImagesCollide(i\image,i\x,i\y,0,cursor,mx#,my#,0) = 1 And mhit = 1
CreatePartikel(i\x,i\y,i\width,i\height)
Delete i.image
EndIf
Next
End Function

Function CreatePartikel(x#,y#,breite,hoehe)
LockBuffer BackBuffer()
For i = x#-(breite/2) To x#+breite Step 3
For j = y#-(hoehe/2) To y#+hoehe Step 3
rgb = ReadPixelFast(i,j)
If rgb <> 0
p.partikel = New partikel
p\x = i
p\y = j
p\winkel = Rnd(-180,180)
p\speed = 5
p\rgb = rgb
anz = anz + 1
EndIf
Next
Next
UnlockBuffer BackBuffer()
End Function

Function UpdatePartikel()
For p.partikel = Each partikel

LockBuffer BackBuffer()
WritePixelFast p\x,p\y,p\rgb
UnlockBuffer BackBuffer()

p\x = p\x - Cos(p\winkel)*p\speed
p\y = p\y - Sin(p\winkel)*p\speed

If p\x < 0 Or p\x > (800-1) Or p\y < 0 Or p\y > (600-1)
Delete p.partikel
anz = anz - 1
EndIf

Next
End Function





Das ist eine kleine Abänderung des Bildzerspringers von BlitzBase.de. Aber ich glaube, als Bsp genügt es.

MfG
ChEsTeR

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group