Für Anfänger: Zwei Spieler mit Animation

Previous topic - Next topic

thomasp

Hi, bin absoluter GLBASIC-Neuling, nachfolgend das erste kleine Programm, vielleicht hilft es ja dem einen oder anderen bei seinen ersten Schritten. Insbesondere um zu verstehen:

- wie ein Hintergrundbild geladen wird

- wie (Sprite)Bilder geladen und wieder abgerufen werden

- dass man sich um die Darstellung der Einzelbilder einer Animation selbst kümmern muss

- wie Tastaturabfragen funktionieren

- wie einfache Kollisionsabfragen funktionieren (SPRCOLL)

- wie man Bildabfolgen in der Hauptschleife verlangsamen kann

Das kann man womöglich in GLBASIC komprimierter hinkriegen, aber jedes Feedback sehr willkommen. Und wie bei Backrezepten: ein paar Zutaten müsst Ihr mitbringen, insbesondere Graphiken. Das Programm ist auf eine Bildschirmgröße von 320 x 240 Pixel angelegt, also bitte ein entsprechendes Hintergrundbild mit dem Namen "kann-sonstwie-heissen.bmp" (siehe ganz unten im Code) in das Projektverzeichnis.

Dann die "Ninja"-Sprites: die Bilder für Spieler 1 in das Unterverzeichnis /spieler1/ und die für Spieler 2 in, logisch, /spieler2/. Die Bildfolgen heissen attack-e-0.bmp bis attack-e-12.bmp und running-e-0.bmp bis running-e-7.bmp. Entsprechend bei Spieler 2: attack-w-0.bmp bis attack-w-12.bmp und running-w-0.bmp bis running-w-7.bmp.

Diese Bilder müsst ihr nicht selber malen (hab ich auch nicht), die gibt es hier (mit leicht anderen Namen - und schön rosa anmalen, GLBASIC mag pinke Hintergründe für die Transparenz): http://reinerstileset.4players.de/humansD.html

Und jetzt endlich der Code:

Code (glbasic) Select
// --------------------------------- //
// Project: Ninja
// Start: Sunday, November 18, 2007
// IDE Version: 5.055


GOSUB init
verlangsamer = 5
WHILE TRUE
GOSUB spieler
GOSUB anim
GOSUB drawall
SHOWSCREEN
WEND
END

SUB anim:
DEC verlangsamer, 1
IF verlangsamer = 0
INC spieler1anim,1
IF spieler1anim=8
spieler1anim = 0
ENDIF
IF spieler1anim=22
IF SPRCOLL (spieler1anim, spieler1posx, spieler1posy, spieler2anim, spieler2posx, spieler2posy)
  INC spieler1punkte,50
  ENDIF
spieler1anim = 0
ENDIF
INC spieler2anim,1
IF spieler2anim=38
spieler2anim = 30
ENDIF
IF spieler2anim=52
IF SPRCOLL (spieler1anim, spieler1posx, spieler1posy, spieler2anim, spieler2posx, spieler2posy)
  INC spieler2punkte,50
  ENDIF
spieler2anim = 30
ENDIF
verlangsamer = 5
ENDIF
ENDSUB

SUB drawall:
DRAWSPRITE spieler1anim, spieler1posx, spieler1posy
DRAWSPRITE spieler2anim, spieler2posx, spieler2posy
PRINT spieler1punkte, 10,10
PRINT spieler2punkte, 50,10
ENDSUB


SUB spieler:
IF (KEY(45)=1)
INC spieler1posx,laufen
IF spieler1posx>255
spieler1posx = 255
ENDIF
ENDIF
IF (KEY(44)=1)
DEC spieler1posx,laufen
IF spieler1posx < -35
spieler1posx = -35
ENDIF
ENDIF
IF (KEY(205)=1)
INC spieler2posx,laufen
IF spieler2posx>260
spieler2posx = 260
ENDIF
ENDIF
IF (KEY(203)=1)
DEC spieler2posx,laufen
IF spieler2posx < -35
spieler2posx = -35
ENDIF
ENDIF
IF (KEY(46)=1) AND (spieler1anim<10)
spieler1anim = 10
ENDIF
IF (KEY(208)=1) AND (spieler2anim<40)
spieler2anim = 40
ENDIF

ENDSUB

SUB init:
LOCAL i
// Globals
laufen = 2
rennen = 4
// Spieler 1 (von links nach rechts)
spieler1anim = 0
spieler1posx = 10
spieler1posy = 150
spieler1punkte = 0
spieler2punkte = 0
// Spieler1 läuft
FOR i=0 TO 7
LOADSPRITE "spieler1/running-e-"+i+".bmp", 0+i  // Spieler1 läuft mit Basis-ID: 0
NEXT
// Spieler1 greift an
FOR i=0 TO 12
LOADSPRITE "spieler1/attack-e-"+i+".bmp", 10+i  // Spieler1 greift an mit Basis-ID: 10
NEXT
// Spieler 2
spieler2anim = 30
spieler2posx = 250
spieler2posy = 150
// Spieler2 läuft
FOR i=0 TO 7
LOADSPRITE "spieler2/running-w-"+i+".bmp", 30+i  // Spieler2 läuft mit Basis-ID: 30
NEXT
// Spieler2 greift an
FOR i=0 TO 12
LOADSPRITE "spieler2/attack-w-"+i+".bmp", 40+i  // Spieler2 greift an mit Basis-ID: 40
NEXT
// Hintergrundbild
LOADBMP "kann-sonstwie-heissen.bmp"  // lädt ein bild und verwendet es als Hintergrund
//
ENDSUB
Die Tasten: Y,X,C und <-, V, ->

Viel Spaß damit!

Patrick

Schranz0r

Zu umständlich meines erachtens, und ich würde Funktionen schreiben um den Spieler zu zeichen.

Function DrawPlayer: Startbild, Endbild, Standbild, AnimationSpeed

Verlangsamen der Animation macht man am besten mit :

Code (glbasic) Select
IF Timer    //Zeiche ein Bild
    Timer = GETTIMERALL()+AnimationSpeed // in Millisekunden
ENDIF
Und die Transparenz könnte man selber setzen, wenns auch nicht Pink wäre:

SETTRANSPARENCY RGB_Farbe

Aber für den einstieg doch schonmal gut geworden, auch wenns nicht wirklich ins Tutorialsforum reingehört!

Deshalb move to Codeschnipsel!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Wow nehmt ihr viel Arbeit ab. Danke Schranzor!

Schranz0r

;) ist mein Job Gernot

Siehe über meinen Avatar ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard