Wie verwendet man ein DimFeld,in das RnD gezeichent wird?EDI

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

ReLeNtLeSS

Betreff: Wie verwendet man ein DimFeld,in das RnD gezeichent wird?EDI

BeitragDo, Okt 18, 2007 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho,

ich stehe hier vor einem größeren Problem. Ich will, das auf meine Spieler (ein auto) mehrere autos vom oberen bildschirm zufahren, die werden random am anfang vom bild gespawnt.

so jetz habe ich mir gedacht, mach ich doch ein dim feld, in dem die autos gespawnt werden. allerdings, wie picke ich mir jetz die einzelnen autos raus und sage ihnen, das sie nach unten fahren sollen?

Code: [AUSKLAPPEN]

;Race
AppTitle "Race!"
Graphics 1280,1024

SetBuffer BackBuffer()

;LoadImage;Loadsound

Global auto=LoadImage("auto.bmp")
Global autoruck=LoadImage("autoruck.bmp")
Global crash=LoadImage("crash.bmp")

MaskImage auto,255,0,0
MaskImage autoruck,255,0,0
MaskImage crash,255,0,0

;Benötigte festgelegte Zustaende und Vars

Global y1=100
Global y11=400
Global y21=700

Global autox=750
Global autoy=950

Global autoruck_y=0

Dim autos$(3)

;Hautpschleife

Repeat

Text 0,0,"Pos. Auto: X: "+autox+" Y: "+autoy

auto()
strasse()
andere_autos()
kollisionen()

Flip
Cls
Until KeyHit(1)

;Functions

Function menu()
End Function

;__________________

Function strasse()

Rect 650,y1,3,100,1
Rect 650,y11,3,100,1
Rect 650,y21,3,100,1

Rect 400,0,1,1024
Rect 900,0,1,1024

y1=y1+2
y11=y11+2
y21=y21+2

If y1=1024 Then y1=0
If y11=1024 Then y11=0
If y21=1024 Then y21=0

End Function

;________________

Function auto()

DrawImage auto,autox,autoy

If KeyDown(205)=1 Then autox=autox+4
If KeyDown(203)=1 Then autox=autox-4

If autox<402 Then autox=402
If autox>862 Then autox=862

End Function

;______________________

Function andere_autos()

For i=1 To 3
 autos$(i)=1
Next

If autos$(i)=1 Then
DrawImage(autoruck,Rand(402,862),Rand(0,0))
EndIf

autoruck_y=autoruck_y+2

If autoruck_y=1024 Then autoruck_y=0

End Function

;__________________

Function kollisionen()

If ImagesOverlap(auto,autox,autoy,autoruck,autoruck_x,autoruck_y) Then
Cls
DrawImage crash,450,450
Text 450,450,"You FAIL!"
Text 700,450,"Restart? 1=Yes 2=No"

If KeyDown(2)=1 Then Text 0,15,"Restart"
If KeyDown(3)=1 Then End
WaitKey()
EndIf

End Function


Ich weis nich, wie ich das Dim-Feld richig verwende, habe dazu nirgends was gefunden.... (OH, Boardsuche und BBKurs)

MfG

P.S.: Über die Variable autoruck_y einfach mal drüber hinweg sehn, das war für mein testauto das nach unten fuhr^^
  • Zuletzt bearbeitet von ReLeNtLeSS am Do, Okt 18, 2007 20:21, insgesamt einmal bearbeitet

Dottakopf

BeitragDo, Okt 18, 2007 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Für das was du da machen willst, sind types vll besser geeignet.

Code: [AUSKLAPPEN]

;type erstellen

 info.auto = new auto
    info\car_x = rnd(0,800)
    info\car_y = -20          ;auser sichtweite




Dan brauchste noch sowas wie:
Code: [AUSKLAPPEN]


 for info.auto = each auto
     info\car_y = info\car_y + 2
     drawimage auto,info\car_x,info\car_y
 next



Mit arrys oh gott ^^ da müsste ich jetzt scho grübeln.

mfg Dottakopf

ReLeNtLeSS

BeitragDo, Okt 18, 2007 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
omg, ich hab gedacht wenn ich mich mit dem DIM feldern beschäftige reicht das

wenn du jetz schon nachdenken musst, was soll ich dann erst tuen Razz

ReLeNtLeSS

BeitragDo, Okt 18, 2007 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
so ich hab jetz den code editiert, aber meine kollisionsabfrage und das zurücksetzten funzt nimmer.....

Code: [AUSKLAPPEN]
;ForSoRace
AppTitle "ForSoRace!"
Graphics 1280,1024

SetBuffer BackBuffer()

;LoadImage;Loadsound

Global auto=LoadImage("auto.bmp")
Global autoruck=LoadImage("autoruck.bmp")
Global crash=LoadImage("crash.bmp")

MaskImage auto,255,0,0
MaskImage autoruck,255,0,0
MaskImage crash,255,0,0

;Benötigte festgelegte Zustaende und Vars

Global y1=100
Global y11=400
Global y21=700

Global autox=750
Global autoy=950

;Types

Type auto
 Field car_x
 Field car_y
End Type

 info.auto = New auto
    info\car_x = Rnd(402,862)
    info\car_y = -100

 info.auto = New auto
    info\car_x = Rnd(402,862)
    info\car_y = -20

 info.auto = New auto
    info\car_x = Rnd(402,862)
    info\car_y = -60

   

;Hautpschleife

Repeat

Text 0,0,"Pos. Auto: X: "+autox+" Y: "+autoy
Text 0,15,"Pos. Andere Autos: X: "+info\car_x+" Y: "+info\car_y

auto()
strasse()
andere_autos()
kollisionen()

Flip
Cls
Until KeyHit(1)

;Functions

Function menu()
End Function

;__________________

Function strasse()

Rect 650,y1,3,100,1
Rect 650,y11,3,100,1
Rect 650,y21,3,100,1

Rect 400,0,1,1024
Rect 900,0,1,1024

y1=y1+2
y11=y11+2
y21=y21+2

If y1=1024 Then y1=0
If y11=1024 Then y11=0
If y21=1024 Then y21=0

End Function

;________________

Function auto()

DrawImage auto,autox,autoy

If KeyDown(205)=1 Then autox=autox+4
If KeyDown(203)=1 Then autox=autox-4

If autox<402 Then autox=402
If autox>862 Then autox=862

End Function

;______________________

Function andere_autos()

 for info.auto = each auto
     info\car_y = info\car_y + 2
     DrawImage autoruck,info\car_x,info\car_y
 Next

If info\car_y=1024 Then info\car_y=0

End Function

;__________________

Function kollisionen()

If ImagesOverlap(auto,autox,autoy,autoruck,car_x,car_y) Then
Cls
DrawImage crash,450,450
Text 450,450,"You FAIL!"
Text 700,450,"Restart? 1=Yes 2=No"

If KeyDown(2)=1 Then Text 0,15,"Restart"
If KeyDown(3)=1 Then End
WaitKey()
EndIf

End Function

BladeRunner

Moderator

BeitragDo, Okt 18, 2007 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte keine Doppelpostings. Danke.

Du kannst das auch mit Dim allein erledigen.

Code: [AUSKLAPPEN]
dim auto(20,1) ;Platz für 21 Autokoordinaten

in auto(xyz,0) kommen die X-Koordinaten des jeweiligen autos, in
auto(xyz,1) die y-Koord.

nun kannst Du in deiner Hauptschleife die y-Koord jedes Autos um einen festen Wert erhöhen bis sie einen Höchstwert überschreiten (aus dem Bildschirm sind). Dann y wieder <0 setzen und ein neues x vergeben, damit die Autos nicht immer an der selben stelle ins Bild kopmmen. C'est ca.
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

ReLeNtLeSS

BeitragDo, Okt 18, 2007 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
danke werde ich mal probieren Wink


edit:

autos(von xwert dingens bis xwet dinges,0) wie mach ich das?


edit2:

nunja...
Code: [AUSKLAPPEN]
;Dim

Dim autos(20,1)

autos(402,0)
autos(car_y,1)


Code: [AUSKLAPPEN]

Function andere_autos()

car_y=car_y+2

If car_y>1024 Then car_y=-20

End Function



BB startet das proggi nich (?)

Dottakopf

BeitragDo, Okt 18, 2007 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch nix mit types gemacht ?
Types funtzen im groben in etwa so:


;type deklarieren (eigenschaften zuweisen usw) ausserhalb von schleifen !


;den type erstellen


;den type was machen lassen





;type stuff: welches du nimmst ist dir überlassen.

typ tut
https://www.blitzforum.de/foru...hp?t=25321

type kompakt OH
http://www.blitzbase.de/tutorials/shadow_2.htm

type robsite (bischen scrollen)
http://www.robsite.de/suche.php

Zu deinem Problem(types): nein blade ich arbeite nicht gegen deinen vorschlag.

Wenn du typ kollisonen abfragen willst, muss du das natürlich auch schreiben, bzw den typ ansprechen.

Code: [AUSKLAPPEN]

funciton colli()

 for info.auto = each auto
    if imagescollide(player,px,py,0,  auto_bild  ,  info\car_x, info\car_y , 0 ) then
       blubber
    end if
end function


Merke dir: Wenn du irgendwas mit einem type machen willst brauchst du immer die for bla.lol = each lol schleife !

Das erstellen kann man vereinfachen. Stell dir mal vor du lässt 200 gegner autos kommen. Machst du dan diesen block 200 mal ?

Code: [AUSKLAPPEN]

info.auto = New auto
    info\car_x = Rnd(402,862)
    info\car_y = -100
 


Natürlich ist das dan quatsch. Du baust einfach eine schleife ein, die die autos genau 200 mal erstellt.
Code: [AUSKLAPPEN]


   for x = 0 to 199
   
         info.auto = new auto
             info\car_x = rnd(0,800)
             usw..
   next



Zack peng.. so wurden 200 autos erstellt. jetzt gibst nur ein problem... Die sind alle auf einmal erstellt worden, was zur folge hat, dass plötzlich 200 autos gleichzeitig auf dich zurasen. Statt das immer mal wieder eins kommt bis 200 autos durchgefahren sind. Wenn du sowas willst, muss du bb sagen wann er ein auto erstellen soll. Also wenn zb ein counter 50 erreicht, soll ein auto erstellt werden und soll auf dich zufahren. Das sieht dan so aus und muss natürlcih in der main-loop geschehen.

Code: [AUSKLAPPEN]

function create_autos()

     counter = counter +1 
     if counter >= 50 then ;bestimmt wan bb ein auto erstellt
        counter = 0

         info.auto = new auto ;auto erstellen
            info\car_x = rnd(0,800)
            info\car_y = -20
    end if

end function


So damit du jezt nicht durcheinander kommst, sage ich dir noch wie das alles in etwa in deinem code aufgebaut sein sollte.

Code: [AUSKLAPPEN]


  n paar varriablen

  type festlegen (type auto)


  repeat
  cls

   create_autos()
   update_autos()   ;bewegt die autos nach unten
   update_spieler() ;alles was mit dem spieler zu tun hat
   kollisionen()        ;hier kommt die kollison ( spieler / type )


  flip
  until keyhit(1)



 


Hoffentlich war des nachvollziehbar.
Du kannst aber auch Bladerunners weg einschlagen, beides das gleiche

mfg Dottakopf

ReLeNtLeSS

BeitragDo, Okt 18, 2007 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen dank dotterkopf!

das nenne ich mal ausführlich und hilfreich, danke!! Wink

ich mach das mit den types un nem timer, dann ist es auh leichter festzulegen, wann die level enden oder die punktzahl zu summieren Wink

nochmal danke!

MfG

BladeRunner

Moderator

BeitragDo, Okt 18, 2007 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;Dim

Dim autos(20,1)

autos(402,0)
autos(car_y,1)

Das kann nicht funktionieren. Du dimensionierst für 21 (0-20) Autos aber rufst dann Auto Nummer 403 ab.
Diese Zahlen sind Indizes auf die Koordinaten, nicht die Koordinaten selbst.
siehe ql:dim
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

ReLeNtLeSS

BeitragDo, Okt 18, 2007 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
zu Dim:

achso.... gut weis ich jetz auch bescheit! Wink



/EDIT: Habe die Types (meines Erachtens nach) richtig eingebaut, aber es erscheinen keine Autos Question

Code: [AUSKLAPPEN]
;ForSoRace
AppTitle "ForSoRace!"
Graphics 1280,1024

SetBuffer BackBuffer()

;LoadImage;Loadsound

Global auto=LoadImage("auto.bmp")
Global autoruck=LoadImage("autoruck.bmp")
Global crash=LoadImage("crash.bmp")

MaskImage auto,255,0,0
MaskImage autoruck,255,0,0
MaskImage crash,255,0,0

;Benötigte festgelegte Zustaende und Vars

Global y1=100
Global y11=400
Global y21=700

Global autox=750
Global autoy=950

;Types

Type auto
 Field car_x
 Field car_y
End Type

;Hautpschleife

Repeat

Text 0,0,"Pos. Auto: X: "+autox+" Y: "+autoy

auto()
strasse()
create_autos()
autos_bewegen()
kollisionen()

Flip
Cls
Until KeyHit(1)

;Functions

Function menu()
End Function

;__________________

Function strasse()

Rect 650,y1,3,100,1
Rect 650,y11,3,100,1
Rect 650,y21,3,100,1

Rect 400,0,1,1024
Rect 900,0,1,1024

y1=y1+2
y11=y11+2
y21=y21+2

If y1=1024 Then y1=0
If y11=1024 Then y11=0
If y21=1024 Then y21=0

End Function

;________________

Function auto()

DrawImage auto,autox,autoy

If KeyDown(205)=1 Then autox=autox+4
If KeyDown(203)=1 Then autox=autox-4

If autox<402 Then autox=402
If autox>862 Then autox=862

End Function

;______________________

Function create_autos()

     counter = counter +1 
     If counter >= 50 Then
     counter = 0

        For x = 0 To 199
   
     info.auto = New auto
     info\car_x = Rnd(402,862)
     info\car_y = -20
     DrawImage autoruck,info\car_x,info\car_y
     Next

    End If

End Function

;__________________

Function kollisionen()


 For info.auto = Each auto
    If ImagesCollide(auto,autox,autoy,0,autoruck,info\car_x,info\car_y ,0) Then       
    Cls
    DrawImage crash,450,450
    Text 450,450,"You FAIL!"
 EndIf
    Next


End Function

;------------------------

Function autos_bewegen()

For info.auto = Each auto

info\car_y=info\car_y+2

If info\car_y=1024 Then info\car_y=-20

Next

End Function

 

Mr Hopp

BeitragDo, Okt 18, 2007 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Funktion "Auto" werden nicht existierende Variablen verwendet. Da muss auch ne For-Each Schleife rein Wink

Edit: Nein 'tschuldige habe mich verguckt... ich guck mir den Code grad nochma an und gleich kommt die korrekte Antwort Embarassed

Edit2: Soo hat ein bisschen länger gedauert. Musst unbedingt ma Codes einrücken Wink Fehler ist ganz simpel: "Counter" ist nicht global und ist somit IMMER 0. Allerdings wird erst bei 50 gespawnt Arrow dieser Fall tritt nie ein. Und wenn er dann spawnt, dann spawnt er 200 Autos gleichzeitig.... ich bezweifel, dass das so sein soll. Also "For x=0 To 199" und das dazugeghörige "next" sind überflüssig.

Edit3: Und die Autos werden nirgends gezeichnet. Nur einmal kurz beim spawnen
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.

Dottakopf

BeitragDo, Okt 18, 2007 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
hab ich das so undeutlich beschrieben ? Ich neige ja des öfteren dazu, etwas zu überhasten.

counter golbal setzen und das for x = 0 to 199 weglassen ... oder willst du, dass gleich 200 autos auf einmal kommen

Des weiterem wird dein crash logo nur n paar milisecunden angezeigt. Weil du nicht aus der main bzw. der "type schleife" raus gehst. Du muss das ganze programm anhalten. Denkanstoß

wenn menu = 0 then

- alles machen was man braucht zum zocken

wenn menu = 1 then

- nur game over zeigen


mfg Dottakopf

ReLeNtLeSS

BeitragDo, Okt 18, 2007 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
AAH GEIL!

Danke es funzt! DANKE AN EUCH ALLE! Very Happy Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group