Hello D Ogre,
I have played with the trigger mechanism for quite a few hours now (atleast 6 or so) and have decided to not use the single click stuff, because I do want it so that you can hold down the mouse button. I have tried the other methods, but can not get to work properly. I can get it to partially work, but not right. Your suggested code that has the offset in the laser y position:
does spread out the lasers, but it also makes them start at varing distances from the front of the ship, depending if the last laser went off screen or hit an invader. If I take out the "-shot*20" it acts really quirky. Sometimes multiple laser shot and sometimes they dont, and sometimes they shot in groups of two or three. I tried to implement the last suggestion, but could not get it either. Here is my complete code, maybe you can give me more ideas with the whole thing instead of just snippits.
REMSTART
*****************************
* My First Game Attempt *
* Space Invader Type Game *
* with help from D Ogre *
*****************************
REMEND
REM *** initialize screen ***
HIDE MOUSE
SYNC ON
SYNC RATE 60
REM *** load graphics ***
REM invaders
LOAD BITMAP "invaders.bmp",1
GET IMAGE 1,0,0,29,29
GET IMAGE 2,30,0,59,29
GET IMAGE 3,60,0,89,29
REM rapid fire powerup
GET IMAGE 4,97,64,113,82
REM ship
GET IMAGE 100,90,90,119,119
REM laser
GET IMAGE 101,73,110,77,119
REM explosion
LOAD BITMAP "explode.bmp",4
GET IMAGE 110,0,0,29,29
GET IMAGE 111,30,0,59,29
GET IMAGE 112,60,0,89,29
GET IMAGE 113,90,0,119,29
REM blank image after explosion
INK RGB(0,0,0),0
BOX 0,0,29,29
GET IMAGE 114,0,0,29,29
REM delete garbage
DELETE BITMAP 1
DELETE BITMAP 4
SET CURRENT BITMAP 0
REM grab screen size
screenx=SCREEN WIDTH()
screeny=SCREEN HEIGHT()
REM *** arrays ***
REM invader arrays
DIM ship(18)
DIM bomber(18)
DIM bombx(18)
DIM bomby(18)
DIM explode(18)
DIM frame(18)
DIM delay(18)
REM ship arrays
DIM fire(10)
DIM lsrx(10)
DIM lsry(10)
REM *** starting of new game variables ***
new_game:
CLS
level=0
lives=3
score=0
pu=0
REM *** starting new level variables ***
new_game_level:
destroyed=0
explode=0
fire=0
offsetx=30
offsety=50
speed=2
movex=speed+level
bombspeed=10+level*2
pu=0
powerup=1
REM *** setup sprites ***
REM create invader rows
n=0
min=0
max=0
FOR j=1 TO 3
INC n
INC min,6
INC max,6
FOR i=min-5 TO max
SET SPRITE i,0,1
SPRITE i,0,0,1
ship(i)=n
NEXT i
NEXT j
REM ship
SET SPRITE 100,0,1
SPRITE 100,MOUSEX(),MOUSEY(),100
POSITION MOUSE 320,450
REM laser
SET SPRITE 101,0,1
SPRITE 101,0,0,101
SPRITE 101,0,0-SPRITE HEIGHT(101),101
REM set text size
SET TEXT SIZE 20
Rem *** game action loop ***
REPEAT
CLS
GOSUB screen
GOSUB invaders
GOSUB ship
GOSUB powerups
SYNC
UNTIL destroyed=18 OR lives=0
REM increase level when 18 invaders destroyed
IF lives>0
INC level
SET TEXT SIZE 40
FOR l=1 TO 30
INK RGB(RND(128)+127,RND(128)+127,RND(128)+127),0
CENTER TEXT screenx/2,screeny/2,"LEVEL "+STR$(level)+" COMPLETED !!!"
WAIT 10:SYNC
NEXT l
GOTO new_game_level
REM if lives are 0 then game over
ELSE
DO
SET TEXT SIZE 40
CENTER TEXT screenx/2,screeny/2,"GAME OVER"
SET TEXT SIZE 25
CENTER TEXT screenx/2,screeny-290/2,"Your Final Score was "+STR$(score)
CENTER TEXT screenx/2,screeny-240/2,"You Made it to Level "+STR$(level+1)
SET TEXT SIZE 10
CENTER TEXT screenx/2,screeny-115/2,"Press the ESC Key to Quit"
CENTER TEXT screenx/2,screeny-90/2,"or"
CENTER TEXT screenx/2,screeny-65/2,"Press Enter to Try Again"
SYNC
IF RETURNKEY()=1 THEN GOTO new_game
IF ESCAPEKEY()=1 THEN EXIT
LOOP
ENDIF
GOTO new_game_level
REM *** gosubs ***
REM score, title and level
screen:
INK RGB(255,255,255),0
CENTER TEXT screenx/2,5,"INVADER CLONE"
TEXT 50,5,"SCORE: "+str$(score)
TEXT 500,5,"LIVES: "+str$(lives)
TEXT 500,450,"LEVEL: "+str$(level+1)
INK RGB(0, 0, 255), 0
DrawRect(0, 0, 639, 479)
INK RGB(255, 255, 255), 0
FOR d = 1 TO 10
DOT RND(639), RND(479)
NEXT d
RETURN
REM space invaders
invaders:
invader=0
offsetx=offsetx+movex
FOR y=0 TO 2
FOR x=0 TO 5
INC invader
IF explode(invader)=1
ship(invader)=frame(invader)
IF TIMER()>delay(invader)
frame(invader)=frame(invader)+1
IF frame(invader)>114 THEN INC destroyed:explode(invader)=0
delay(invader)=TIMER()+60
ENDIF
ENDIF
IF RND(150)=75 AND bomber(invader)=0 AND SPRITE IMAGE(invader)<4
rem play sound here for bomb dropping
bomber(invader)=1
bombx(invader)=SPRITE X(invader)+12
bomby(invader)=SPRITE Y(invader)+SPRITE HEIGHT(invader)
ENDIF
IF bomber(invader)=1
SPRITE invader+18,bombx(invader),bomby(invader),101
bomby(invader)=bomby(invader)+bombspeed
IF SPRITE HIT(invader+18,100)>0 AND SPRITE IMAGE(100)=100
SPRITE invader+18,bombx(invader),screeny+1,101
rem sound here for ship explosion
bomber(invader)=0
status=110
killed=1
delay2=TIMER()+60
ELSE
IF bomby(invader)>screeny
SPRITE invader+18,bombx(invader),screeny+1,101
bomber(invader)=0
ENDIF
ENDIF
ENDIF
invadx=offsetx+(SPRITE WIDTH(invader)*x)*1.5
invady=offsety+(SPRITE HEIGHT(invader)*y)*1.5
SPRITE invader,invadx,invady,ship(invader)
NEXT x
NEXT y
REM if any invader hits edge all goes the other way
FOR invader = 1 TO 18
IF SPRITE X(invader)<30 AND SPRITE IMAGE(invader)<110
movex=speed+level
ENDIF
NEXT invader
FOR invader = 1 TO 18
IF SPRITE X(invader)>570 AND SPRITE IMAGE(invader)<110
movex=(speed+level)*-1
ENDIF
NEXT invader
RETURN
REM ship movement
ship:
my=MOUSEY()
mx=MOUSEX()
IF my<220 THEN my=220
IF my>450 THEN my=450
IF mx>610 THEN mx=610
IF killed=0
status=100
FOR shot=1 TO powerup
IF MOUSECLICK()=1 AND FIRE(shot)=0 AND EXPLODE(shot)=0
lsrx(shot)=mx+12
lsry(shot)=my-shot*20
rem play sound here for ship laser
FIRE(shot)=1
ENDIF
IF FIRE(shot)=1
SPRITE 100+shot,lsrx(shot),lsry(shot),101
lsry(shot)=lsry(shot)-20
INVADER_HIT=CHECK_ENEMY_COLLISION(shot)
IF INVADER_HIT>0
SPRITE 100+shot,lsrx(shot),0-SPRITE HEIGHT(100+shot),101
rem play sound here for invader explosion
INC score,10
frame(INVADER_HIT)=110
explode(INVADER_HIT)=1
fire(shot)=0
delay(INVADER_HIT)=TIMER()+60
ELSE
IF lsry(shot)<0
SPRITE 100+shot,lsrx(shot),0-SPRITE HEIGHT(100+shot),101
fire(shot)=0
ENDIF
ENDIF
ENDIF
NEXT shot
ELSE
IF TIMER()>delay2
INC status
delay2=TIMER()+60
IF status>114
DEC lives
killed=0
IF lives>0
SET TEXT SIZE 40
INK RGB(255,255,255),0
CENTER TEXT screenx/2,screeny/2,"GET READY"
SYNC
SET TEXT SIZE 20
WAIT 3000
POSITION MOUSE 320,450
ENDIF
ENDIF
ENDIF
ENDIF
SPRITE 100,mx,my,status
RETURN
REM rapid fire power up
powerups:
IF RND(20)=5 AND pu=0
pux=RND(620)
puy=10
pu=1
ENDIF
IF pu=1
SPRITE 300,pux,puy,4
puy=puy+5
IF SPRITE HIT(100,300)>0
powerup=5
SPRITE 300,pux,490,4
pu=0
ELSE
IF pu=1 AND puy>480
SPRITE 300,pux,490,4
pu=0
ENDIF
ENDIF
ENDIF
RETURN
REM *** Functions ***
REM draw screen border
FUNCTION DrawRect(left,top,right,bottom)
LINE left,top,right,top
LINE right,top,right,bottom
LINE right,bottom,left,bottom
LINE left,bottom,left,top
ENDFUNCTION
Rem Game Collision
FUNCTION CHECK_ENEMY_COLLISION(laser)
FOR enemies=1 to 18
IF SPRITE HIT(100+laser,enemies)>0 AND SPRITE IMAGE(enemies)<110
EXITFUNCTION enemies
ENDIF
NEXT enemies
ENDFUNCTION 0
REM reset bombers
FUNCTION resetbomber
FOR invader = 1 TO 18
IF SPRITE EXIST(invader)=1
bomber(invader)=0
SPRITE invader+18,bombx(invader),500,101
ENDIF
NEXT invader
ENDFUNCTION
Thanks again,
David