Hier (en) ein kleines Video, wie man ein Ballerspiel machen kann.
http://www.glbasic.com/files/shump-tut.wmv
thx Gernot!!
Du bist echt der Schnellste :)
Werde Morgen nach der Arbeit gleich versuchen das Umzusetzen.
Hallo,
vielleicht ist es nach der Schicht schon zu spät, aber wo liegt hier der Fehler??
// --------------------------------- //
// Project: Cargame
// Start: Monday, September 24, 2007
// IDE Version: 5.022
TYPE SHOT
x
y
ENDTYPE
LOADBMP "bg.bmp"
LOADSPRITE "car.bmp", 0
LOADSPRITE "schuss.bmp", 1
LOCAL shots[] AS shot
WHILE TRUE
INC playerx, MOUSEAXIS(0)
playerx = MAX(MIN(playerx, 600), 32)
IF MOUSEAXIS(3) AND delay LOCAL shot AS SHOT
shot.x = playerx
shot.y = 300
DIMPUSH shots[], SHOT
delay = GETTIMERALL()+100
ENDIF
FOREACH pop IN shots[]
DEC pop.y, 5
IF pop.y<0 THEN DELETE pop
DRAWSPRITE 1, pop.x, pop.y
NEXT
DRAWSPRITE 0, playerx, 400
SHOWSCREEN
WEND
Es wird folgenes ausgegeben:
"Cargame.gbas"(28) error : wrong argument type : Type shot is not declared
:(
Vielleicht kann mir das jemand erklären?!
thx Antidote
edit:
ich habe das Shutem Up als Vorlage genommen, wie unschwer zu erkennen. ;)
Hallo Antidote
ich würde sagen das der Fehler hier liegt.
LOCAL shots[] AS shot
Denn SHOT ist von dir in Großbuchstaben definiert worden.
Gruß Heiko
mmhhh,
ja da hast Du recht, allerdings will das prg. trotzdem nicht...
Er zeigt mir den Fehler bei :
DIMPUSH shots[], SHOT
an :(
Wenn ich die "SHOT" Sache komplett rausnehme, funzt es... also ich kann die "Figur / Car" von links nach rechts bewegen!!
für DIMPUSH benötigst du ja noch mal neben dem Array eine Hilfsvariable vom Typ SHOT
also:
DIM shots[] AS SHOT
DIM shot as SHOT
DIMPUSH shots[], shot
dann sollte es gehen
ähh sehe grad, die hast du ja schon im Coding, also SHOT ist die Typ-Vereinbarung, shot ist die Variable, mit der du arbeitest.
Hallo Antdote,
du müßtest mal etwas mehr Unterscheidungen in deine Variablennamen bringen.
SHOT (Großgeschriebe) ist dein TYPE
shot (kleingeschrieben) ist deine Variable.
also mußt Du schreiben : DIMPUSH shots[], shot
Ich definiere meine TYPE immer mit einem vorgrstellten T --> TShot.
dann weis ich auch später noch das dies die TYPE-Definition war.
Gruß Heiko
HeikoJ - super Idee - werde ich für weitere Demos beherzigen.
Ja, das kenn ich auch. Man stellt der Variable den Buchstaben für den Datentyp voran.b=Boolean,i=Integer... Also bShot zum Bleistift. Dann kann man's im Programm besser lesen. Mach ich auch (manchmal).:D Und Konstanten schreibt man meistens groß.
Cheers
Ne Bee.
Locale klein schreiben Globale groß!
^^
Können so viele Bücher irren?:D Das ist ja grad der Witz Konstanten KOMPLETT GROß zu schreiben. Daran erkennt man dann, das es sich um eine Konstante und nicht um eine Variable handelt. Viele machen's angeblich so.
Beispiel:
CONST PI (Wer kennt sie nicht) ;)
CONST MEHRWEHRTSTEUER (Naja wie lange die halt konstant bleibt)
CONST ALKOHOLPEGEL (Ist bei einigen die ich kenn,echt immer konstant) :D
Na denn schönen Tag noch.:)
Cheers
OK der ALKOHOLPEGEL hat mich überzeugt!
*rofl*
Bee zustimm. Konstanten groß, aber ist ja nur eine Konvention, ansonsten jedem, wie es ihm behagt.
Hi, hatte Nachtschicht, daher kann ich erst jetzt antworten.
Vielen Dank für die Hilfe und die Tips/Hinweise. Da werde ich mich gleich mal dran machen!
Greetz
Was, an den CONST ALKOHOLPEGEL ? :D
;)
Global beginnt mit g_ (bei mir)
und Inhlate von TYPE mit m_ (member)
Hallo,
eigentlich ist es doch egal wie mann die Variablen/Konstanten definiert. Jeder sollte
da seinen eigen Stil finden und ihn dann auch konsequent umsetzen.
Man sollt aber meiner Meining nach solche Def. wie bei Antidote sein lassen.
Wer weiß hinterher schon was "SHOT" oder "shot" war. Das führt zu argen
Verwirrungen.
Des wegen war ja mein Vorschlage schon mal, die Klein/Großschreibung komplett
zu ignorieren und beides als dieselben Definition zu interpretieren.
Gruß Heiko
Wie in "normalen" Basicdialekten auch ;) Ne spass :D
Im prinzip ist es echt egal, ist ja jeden sein Bier...
Nur bei Tutorials wirds dann halt kritisch :S
Aber naja, ich werds mir mal so angewöhnen:
Constante: c_Alter
Globale : g_Levelnummer
Locale: l_time
Type : ergibt sich ja durch das LOCAL/GLOBAL Var AS Type
In der FOREACH-Schleife mach ich es immer so
FOREACH C IN Type[]
Das C steht für Check :D
Ist halt schon so drin bei mir ;)
Hallo Gernot,
das Video ist wirklich interessant. Da kann man schon einiges draus lernen. Ob du den Code ins Forum posten kannst? Ich habe keinen Drucker, muss also das Video ständig pausieren und die Parameter abschreiben.
Würde mich freuen.
// --------------------------------- //
// Project: Blaster
// Start: Thursday, April 05, 2007
// IDE Version: 4.145
// A SHOT type. It's just the position in this sample
// Ein Schuss-TYPE. Hier ist nur die Position von Bedeutung
TYPE SHOT
x
y
ENDTYPE
TYPE FOE
x
y
speed=3
amour=4
ENDTYPE
TYPE BOOM
x
y
time
ENDTYPE
// a SHOT for adding new ones later
// ein SHOT um später neue hinzuzufügen
LOCAL newshot AS SHOT
LOCAL newbug AS FOE
// The SHOTs array. Here the shots get inserted
// das SHOTs Feld. Hier kommen die Schüsse rein
LOCAL shots[] AS SHOT
LOCAL bugs[] AS FOE
LOCAL poof[] AS BOOM
LOADSPRITE "ship.png", 0
LOADSPRITE "shot.png", 1
LOADSPRITE "bug.png", 2
LOADSPRITE "boom.png", 3
playerx = 320
WHILE TRUE
// Player Movement
// Spieler Bewegung
INC playerx, MOUSEAXIS(0)
// Limit to borders
// Auf den Rand begrenzen
playerx=MAX(MIN(playerx,600),40)
// Space bar and some time since last shot?
// Leertaste und etwas Zeit seit letztem Schuss vergangen?
IF MOUSEAXIS(3) AND delay // Prepare a shot
// Schuss vorbereiten
newshot.x = playerx
newshot.y = 400
// And stuff into the array
// Und in's Feld reinpacken
DIMPUSH shots[], newshot
// Get a time when the next shot can be fired
// Zeit festlegen, wann der nächste Schuss geladen ist
delay = GETTIMERALL() + 100
ENDIF
time = GETTIMERALL()
IF time>nextbug
nextbug = time + 500
DIMPUSH bugs[], newbug
ENDIF
FOREACH bug IN bugs[]
INC bug.x, bug.speed
IF bug.x<0 OR bug.x>620
INC bug.y, 32
bug.speed = -bug.speed
ENDIF
didhit=FALSE
FOREACH pop IN shots[]
IF BOXCOLL(pop.x, pop.y, 8,8, bug.x, bug.y, 32,32)
didhit=TRUE
DELETE pop
ENDIF
NEXT
IF didhit
LOCAL p AS BOOM
p.x = bug.x
p.y = bug.y
p.time = time
DIMPUSH poof[], p
DELETE bug
ENDIF
DRAWSPRITE 2, bug.x, bug.y
NEXT
FOREACH p IN poof[]
LOCAL pos = (time - p.time) / 1000
IF pos > 1 THEN DELETE p
ALPHAMODE 1-pos
ROTOZOOMSPRITE 3, p.x, p.y, pos*1000, 1+pos*3
NEXT
ALPHAMODE 0
// Loop through all shots
// Durch alle Schüsse laufen
FOREACH pop IN shots[]
// Move shot up
// Schuss hoch bewegen
DEC pop.y, 5
// If shot reaches upper screen, remove it and continue
// Wenn Schuss am oberen Rand, dann entfernen und continue
IF pop.y<0 THEN DELETE pop
// Draw the shot
// Schuss zeichnen
DRAWSPRITE 1, pop.x, pop.y
NEXT
// Draw "player"
// "Spieler" zeichnen
DRAWSPRITE 0, playerx, 400
SHOWSCREEN
WEND
Ich hoff' dass das der richtige ist...
also ich glaub ich bin der einzige der sowas wie sub gar nich benutzt kann das sein?
naja ich mach meine variablen und co je nachdem in welcher funktion ich mich befinde. so sehen meine vars in der menu funktion so aus: Menu_Items[3], Menu_Auswahl, Menu_Selektiert, Menu_Counter etc pp
Jo. Statt Menun_xxx kann man auch:
TYPE TMenu
Items[3]
Auswahl
Selektiert
ENDTYPE
GLOBAL Menu AS TMenu
ach das wär ja übersichtlich ;)
ich programmier so weiter wie bisher :P
Der Code scheint der richtige zu sein. Nur läuft das Programm nicht. Liegt das daran, dass ich nur die Demo-Version habe?
Was geht nicht? Wenn du nur ein schwarzes Fenster siehst fehlt die Grafik. Die muß natürlich da sein. Also bei mir läufts. Ob Demo oder nicht. :)
Cheers
jow dir fehlen wohl die Grafiken ;)
Sollte normal schon laufen, wenn Gernot das hier reinpostet!
hast Du die Bilder (.png) im Ordner?
Hat jemand Lust es mal zu testen? Der Compiler läuft bei mir ohne Probleme durch. Nur ich sehe nichts außer dem Wasserzeichen.
Lads auf Z-Share!
wie dumm, na klar, die Grafiken. Garnicht drann gedacht.
Aller anfang ist schwer Shogun ist kein Beinbruch, passiert uns allen mal so leichtsinnsfehler, Jaaaaaa auch den lieben Herrn Gernot ;)
ohne Bilder wird es schwer... ;)
Very good Tutorials :nw:
Just be aware that the language has changes a lot in the 5 years since these videos were created. ;)
Hello GLB community!
I decided to do some improvements in this great tutorial made by Gernot (Kitty Hello), so I did changes to it as follows:
The Blaster GLB project, image and sound files are attached in the zip file below.
Just unzip to the directory of your choice.
Enjoy!!!
Here is the code.
// --------------------------------- //
// Project: Blaster
// Start: Thursday, April 05, 2007
// IDE Version: 4.145
// A SHOT type. It's just the position in this sample
// Ein Schuss-TYPE. Hier ist nur die Position von Bedeutung
TYPE SHOT
x
y
ENDTYPE
TYPE FOE
x
y=10
speed=3
amour=4
ENDTYPE
TYPE BOOM
x
y
time
ENDTYPE
// Variables
// a SHOT for adding new ones later
// ein SHOT um später neue hinzuzufügen
LOCAL newshot AS SHOT
LOCAL newbug AS FOE
LOCAL player_x, player_y
// Image Sizes
LOCAL player_w, player_h
LOCAL lazer_w, lazer_h
LOCAL shot_w, shot_h
LOCAL bug_w, bug_h
LOCAL boom_w, boom_h
LOCAL delay
LOCAL time, nextbug, didhit
LOCAL screenW, screenH
// Audio
GLOBAL vol = 1.0 // 0.0 low - 1.0 loud
GLOBAL pan = 0 // -1.0 left, 0 center, 1.0 right
// The SHOTs array. Here the shots get inserted
// das SHOTs Feld. Hier kommen die Schüsse rein
LOCAL shots[] AS SHOT
LOCAL bugs[] AS FOE
LOCAL poof[] AS BOOM
//Sound Files
LOADSOUND "Media/sounds/blow.wav", 0, 4 // shot
LOADSOUND "Media/sounds/explosion.wav", 1, 2 // explosion
// Images
LOADSPRITE "Media/images/lazer.png", 0
LOADSPRITE "Media/images/shot.png", 1
LOADSPRITE "Media/images/bug.png", 2
LOADSPRITE "Media/images/boom.png", 3
GETSPRITESIZE 0, lazer_w, lazer_h // lazer
GETSPRITESIZE 1, shot_w, shot_h // shot
GETSPRITESIZE 2, bug_w, bug_h // bug
GETSPRITESIZE 3, boom_w, boom_h // boom
GETSCREENSIZE screenW, screenH
// Set player X and Y position on the screen
player_x = screenW/2
player_y = screenH/3
WHILE TRUE
// Player Movement
// Spieler Bewegung
INC player_x, MOUSEAXIS(0)
// Limit to borders
// Auf den Rand begrenzen
player_x=MAX(MIN(player_x,screenW),0)
// Space bar and some time since last shot?
// Leertaste und etwas Zeit seit letztem Schuss vergangen?
IF MOUSEAXIS(3) AND delay<GETTIMERALL() // Prepare a shot
// Schuss vorbereiten
newshot.x = player_x+lazer_w/2-shot_w/2 // center shot on the cannon
newshot.y = player_y
// And stuff into the array
// Und in's Feld reinpacken
DIMPUSH shots[], newshot
play(0) // Play shooting sound!
// Get a time when the next shot can be fired
// Zeit festlegen, wann der nächste Schuss geladen ist
delay = GETTIMERALL() + 100
ENDIF
time = GETTIMERALL()
IF time>nextbug
nextbug = time + 500
LOCAL b AS FOE
DIMPUSH bugs[], b
ENDIF
FOREACH bug IN bugs[]
INC bug.x, bug.speed
IF bug.x<0 OR bug.x>screenW
INC bug.y, 32
bug.speed = -bug.speed
ENDIF
didhit=FALSE
FOREACH pop IN shots[]
IF BOXCOLL(pop.x, pop.y, 8,8, bug.x, bug.y, 32,32)
didhit=TRUE
play(1) // Play explosion sound
DELETE pop // continue to the end of the FOREACH loop
ENDIF
NEXT
IF didhit
LOCAL p AS BOOM
p.x = bug.x
p.y = bug.y-boom_h/2+bug_h/2
p.time = time
DIMPUSH poof[], p
DELETE bug
ENDIF
DRAWSPRITE 2, bug.x, bug.y // DRAW the Bug
NEXT
FOREACH p IN poof[]
LOCAL pos = (time - p.time) / 1000 // 0 ... 1
IF pos > 1 THEN DELETE p
ALPHAMODE 1-pos
// ******************************************************************
// IF you prefer the rotation effect coment DRAWSPRITE line
// and uncomment the ROTOZOOMSPRITE line below.
// ROTOZOOMSPRITE 3, p.x, p.y, pos*1000, 1+pos*3 // DRAW Explosion
DRAWSPRITE 3, p.x,p.y // DRAW Explosion
// ******************************************************************
NEXT
ALPHAMODE 0
// Loop through all shots
// Durch alle Schüsse laufen
FOREACH pop IN shots[]
// Move shot up
// Schuss hoch bewegen
DEC pop.y, 5
// If shot reaches upper screen, remove it and continue
// Wenn Schuss am oberen Rand, dann entfernen und continue
IF pop.y<0 THEN DELETE pop
// Draw the shot
// Schuss zeichnen
DRAWSPRITE 1, pop.x, pop.y // DRAW the shot
NEXT
// Draw "player"
// "Spieler" zeichnen
DRAWSPRITE 0, player_x, player_y
SHOWSCREEN
WEND
// ------------------------------------------------------------- //
// --- PLAY ---
// ------------------------------------------------------------- //
FUNCTION play: ch
PLAYSOUND (ch, pan, vol) // channel, pan, vol
ENDFUNCTION // PLAY
[attachment deleted by admin]