|
Post by wraith on May 27, 2015 1:07:30 GMT -5
Hello, I'm Noob and was wondering if someone could provide an example of firing multiple shots for a simple shooter.
Here is an example of a single shot mechanic.
Help is greatly appreciated, thank you.
|
|
|
Post by riper on May 27, 2015 5:54:48 GMT -5
I don't have the clue but I've tried to modify your code. It's still not working like you want, but I'm newbie too. Maybe we can try to guess how it works.
I think that the clue is to "tag" the bullets. Reading your example I don't know how the system knows which bullet is doing what on the screen, because there's only one sprite called bullet. Maybe we can try to do some kind of array to tag any of the bullets you shoot and work with them individually.
Here the non-working code (yours modified):
'Bullet Example
ship=addsprite(1,1)
propsprite ship,6,0
x=284
y=320
enemy=addsprite(1,1)
propsprite enemy,5,0
ex=284
ey=200
DIM bullet(4) as Integer bulletcounter=0
bullet(bulletcouter)=addsprite(1,1)
propsprite bullet,7,0
shot=0
hit=0
on vblank gosub main
enable interrupt vblank
end
main:
do
movesprite ship,x,y
movesprite enemy,ex,ey
j=joypad()
if j.2 [and] x>128 then x--
if j.3 [and] x<441 then x++
previous_frame = actual_frame
actual_frame = joypad(0)
if ((actual_frame.6 = 1) AND (previous_frame.6 = 0)) then
if (shot)>0 then shot--
propsprite bullet,7,0
movesprite bullet,x,y
shot++
endif
shiftsprite bullet,0,-4
if (shot)>0 AND spriteposy(bullet)<128 then
freesprite bullet
shot--
endif
if spriteposx(bullet)<spriteposx(enemy)+8 [and] spriteposx(bullet)+8>spriteposx(enemy) [and] spriteposy(bullet)<spriteposy(enemy)+8 [and] spriteposy(bullet)+8>spriteposy(enemy) then
freesprite bullet
shot--
hit++
endif
locate 1,1: print "Hits: ";hit
locate 2,1: print "Shots on screen: ";shot
sleep 1, tvblank
loop
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on May 27, 2015 6:25:13 GMT -5
Hello, I'm Noob and was wondering if someone could provide an example of firing multiple shots for a simple shooter. Below is a ( relatively ) simple but unoptimized example. Although i suspect this will be too complicated when you're still a newbie. dim bullet(31) as integer bulletptr& = varptr&(bullet) for i=0 to 15 s = addsprite(1,1) propsprite s,7,0 next player = addsprite(1,1) propsprite player,1,0 player_x = 284 on vblank gosub main enable interrupt vblank end main: l = j j = joypad(0) player_x+= j.3-j.2 if j.4 AND l.4 = 0 then dataptr& = bullet_index<<2+bulletptr& writeint player_x writeint 320 bullet_index = bullet_index+1 AND 15 endif dataptr& = bulletptr& for i=0 to 15 readint x readint y if y > 120 then dataptr&-= 2 y-= 2 writeint y movesprite i,x,y endif next movesprite player,player_x,320 return By the way, using a "do..loop" inside your vblank routine doesn't make any sense.
|
|
|
Post by wraith on May 27, 2015 15:45:05 GMT -5
Yes thank you very much Titan !
I am very noob, later realized "DO SLEEP LOOP" should be replaced with "RETURN". My understanding was that I would need to set a array but through many attempts I was unsuccessful. I will study your code carefully.
Again thank you Titan and riper for your help.
|
|
|
Post by Sg on May 29, 2015 6:47:18 GMT -5
How it is possible to add not a bullet but a laser (little or tall ) on a horizontal plane
in this for example
i didn't find an example in bex
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on May 29, 2015 9:21:59 GMT -5
How it is possible to add not a bullet but a laser (little or tall) on a horizontal plane? Depends on how wide the laser can be. The MegaDrive can only display 320 pixels worth of sprites per scanline ( including transparent pixels and pixels of sprites that are outside of the screen ). So a horizontal laser that can encompass the entire screen like in Parodius is virtually impossible ( without sprite flickering ) .. unless you're willing to sacrifice a background layer of course.
|
|
|
Post by Sg on May 29, 2015 14:20:58 GMT -5
a little like this, but he don't go far
dim laser(5) as integer laser=0 palettes p,0,0,16 loadtiles ship,4,256 ship = addsprite(2,2) propsprite t,256,0 JoyPad: x=165 y=275 lasernum=0 lasernum++ if lasernum=32 then lasernum=0 shiftsprite laser,+4,0 if spriteposx(laser)>300 then freesprite laser laser=0 endif endif do j = joypad(0) If j.2 Then x=x-2 movesprite ship,x,y if j.3 Then x=x+2 If j.0 Then y=y-2 movesprite ship,x,y if j.1 Then y=y+2 movesprite ship,x,y if j.6 [and] laser=0 then
palettes laserpal,1,0,16 loadtiles laser,4,260 laser=addsprite(2,2) propsprite laser,260,0 movesprite laser,spriteposx(ship)+8,spriteposy(ship)+1
' laser=addsprite(2,2) ' propsprite laser,260,0 ' palettes laserpal,1,0,16 ' movesprite laser,spriteposx(ship)+8,spriteposy(ship) endif sleep 1 loop
p:
DATAINT $0e0e,$00EE,$0E0E,$000E,$0EE0,$00E0,$0E00,$0888 DATAINT $0CCC,$0088,$0808,$0008,$0880,$0080,$0800,$0000
laserpal:
DATAINT $0EEE,$00EE,$0E0E,$000E,$0EE0,$00E0,$0E00,$0888 DATAINT $0CCC,$0088,$0808,$0008,$0880,$0080,$0800,$0000
ship: DATALONG $00000000 ' Tile: 0 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $0000F000 DATALONG $0030FF00 ' Tile: 1 DATALONG $0130FFFF DATALONG $01008888 DATALONG $00308888 DATALONG $000077FF DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 ' Tile: 2 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 ' Tile: 3 DATALONG $FF000000 DATALONG $888F0000 DATALONG $777FF000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 laser: DATALONG $00000000 ' Tile: 0 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 ' Tile: 1 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 ' Tile: 2 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 ' Tile: 3 DATALONG $0FFFF000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000 DATALONG $00000000
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on May 30, 2015 10:59:03 GMT -5
"..unless you're willing to sacrifice a background layer of course" This is the option I'm going for. Soft collisions suck without heavy optimization.
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on May 30, 2015 12:27:14 GMT -5
Another alternative could be something like this ... .. so you can split the laser / beam in a way that only occupies half the pixels per scanline. You probably want to use a fancier laser animation though dim laser(15) as integer laserptr& = varptr&(laser) dataptr& = laserptr& for i=0 to 15 writeint 320 next palettes palette,0,0,16 loadtiles tiles,40,256 player = addsprite(2,3) player_x = 276 player_y = 232 player_angle = 20 jet = addsprite(1,1) for i=0 to 15 s = addsprite(1,4) t = i AND 1 propsprite s,t<<2+288,0 next on vblank gosub main enable interrupt vblank end main: j = joypad(0) x = j.3-j.2 y = j.1-j.0 player_x+= x player_y+= y if y then player_angle+= y if player_angle > 32768 then player_angle = 0 endif if player_angle > 39 then player_angle = 39 endif else if player_angle > 20 then player_angle-- else player_angle++ endif endif jet_angle = jet_angle+1 AND 15 propsprite player,player_angle>>3*6+256,0 movesprite player,player_x,player_y propsprite jet,jet_angle>>3+286,0 movesprite jet,player_x-6,player_y+4 if laser_timer > 0 then laser_timer-- elseif j.4 then laser_timer = 1 laser(laser_index) = 0 laser_index = laser_index+1 AND 15 endif dataptr& = laserptr& for i=0 to 15 readint x if player_x+x < 480 then x+= 16 dataptr&-= 2 writeint x o = i AND 1 movesprite 2+i,player_x+x-10,player_y+9-(o<<3) endif next return palette: dataint $0000,$0888,$0466,$0000,$0E84,$0ACC,$0EEE,$0688 dataint $0844,$0A20,$0E64,$0ECA,$066A,$08AE,$0006,$0000
tiles: datalong $00000000 datalong $00000002 datalong $00000882 datalong $00008642 datalong $00274483 datalong $00714835 datalong $00338333 datalong $00633211 datalong $00132155 datalong $00732155 datalong $00233271 datalong $00003333 datalong $00004832 datalong $00008483 datalong $00000883 datalong $00000000 datalong $11200000 datalong $56620000 datalong $15661000 datalong $71566612 datalong $33333337 datalong $55666655 datalong $32711111 datalong $23327771 datalong $51233CC3 datalong $17233DD3 datalong $73315555 datalong $32277777 datalong $22222222 datalong $33333000 datalong $22220000 datalong $22000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $17200000 datalong $55172000 datalong $11111700 datalong $11111500 datalong $33EE0000 datalong $33CC0000 datalong $55551200 datalong $77720000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00222200 datalong $00021111 datalong $00027177 datalong $00733448 datalong $00634483 datalong $00538832 datalong $00733333 datalong $00232155 datalong $00003333 datalong $00008448 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $222CDDDC datalong $55555D6D datalong $77775555 datalong $22222222 datalong $33322222 datalong $17233333 datalong $33322222 datalong $22200000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $DC000000 datalong $56665000 datalong $15551700 datalong $22220000 datalong $33330000 datalong $22000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00215600 datalong $00025560 datalong $00001555 datalong $00002111 datalong $00731556 datalong $00632666 datalong $00538215 datalong $00734831 datalong $00238483 datalong $00000888 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $20000000 datalong $173CDDC0 datalong $6513CD65 datalong $66513EC5 datalong $55555115 datalong $55555557 datalong $16666651 datalong $25665170 datalong $02772000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $C0000000 datalong $DC000000 datalong $55651700 datalong $21172000 datalong $20000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00277200 datalong $00066612 datalong $00021551 datalong $00001555 datalong $00737115 datalong $00636666 datalong $00531155 datalong $00732215 datalong $00238837 datalong $00008482 datalong $00008548 datalong $00000848 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $72232000 datalong $513CDDC1 datalong $553D56DD datalong $6613D55D datalong $55513ECD datalong $55565555 datalong $11555771 datalong $66666651 datalong $66666570 datalong $56651000 datalong $27720000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $17000000 datalong $C1117000 datalong $DCE22200 datalong $CCE00000 datalong $56666500 datalong $55172000 datalong $17200000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000003 datalong $00000083 datalong $00000483 datalong $00666632 datalong $00715512 datalong $00025555 datalong $00235555 datalong $00636666 datalong $00531555 datalong $00132215 datalong $00238321 datalong $00006832 datalong $00004682 datalong $00008442 datalong $00000882 datalong $00000000 datalong $22000000 datalong $77200000 datalong $77772000 datalong $22222222 datalong $7117CC17 datalong $27CCDDDC datalong $553D665D datalong $6673DD55 datalong $556733CC datalong $55555115 datalong $55555555 datalong $11111111 datalong $55666661 datalong $55666100 datalong $56512000 datalong $11120000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $77200000 datalong $C1111700 datalong $DC222200 datalong $DDE00000 datalong $CCE00000 datalong $66666500 datalong $55511200 datalong $11720000 datalong $20000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $0000009A datalong $0009AA4B datalong $009444B6 datalong $0009AA4B datalong $0000009A datalong $00000000 datalong $00000000 datalong $00009990 datalong $0099A44A datalong $09A4BBB4 datalong $9A4BBBBB datalong $09A4BBB4 datalong $0099A44A datalong $00009990 datalong $44444444 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $44444444 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $44444444 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $44444444 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $44444444 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $44444444 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $44444444 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $00000000 datalong $44444444
|
|
|
Post by wraith on May 30, 2015 18:12:50 GMT -5
WOW! That laser beam is awesome Titan.
I've been studying your rapid-fire/laser code and beginning to understand how it works, though I still have no clue how to implement hit detection in either example.
If you wouldn't mind showing us newbies how it's done? I would genuinely love to learn.
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on May 30, 2015 19:02:03 GMT -5
For collision you'll need to check the x and y coordinates of the sprites you want to collide with, and if that sprite has 7 empty pixels on the top, you'd add or subtract 7 from the Y coordinate.
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Jun 1, 2015 12:40:00 GMT -5
Would a collision map be better for tons of bullets/enemies flying around the screen?
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Jun 1, 2015 12:47:53 GMT -5
Would a collision map be better for tons of bullets/enemies flying around the screen? Are your enemies static and on a background?
|
|
|
Post by vetea on Jun 1, 2015 12:55:01 GMT -5
Even if I realize a complex Bex game, I absolute don't understand your code Titan and your technics. Nevermind.
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Jun 1, 2015 13:15:35 GMT -5
Would a collision map be better for tons of bullets/enemies flying around the screen? Are your enemies static and on a background? Oh, I was wondering if collision maps were a better option in general. I'm doing it the bad way by using the tile buffer as a collision map. So, collisions with walls and bullets are kinda chunky. The bullet is 8x8 pixels anyway. May as well do it per tile. The enemies are 24x24 sprites and I only check the tile in their center for collisions with a bullet.
|
|