1. Shooting Multiple Bullets

Hello all,

I am having a slight problem. I am trying to shoot multiple bullets, but I can only fire one.

atom Width=1024 
atom Height=720 
constant TRUE=1 
constant FALSE=0 
 
InitWindow(Width,Height,"Shump") 
 
SetTargetFPS(60) 
 
atom black = bytes_to_int({0,0,0,0}) 
 
atom red = bytes_to_int({255,0,0,255}) 
 
atom bullet_x = GetScreenWidth() / 2 
atom bullet_y = GetScreenHeight() / 2 
 
atom bullet_speed = 0.030 
 
integer bullet_visible = FALSE 
 
sequence bullets = {} 
 
while not WindowShouldClose() do 
 
	if IsKeyPressed(KEY_SPACE) and bullet_visible = FALSE then 
		bullet_visible = TRUE 
	end if 
	 
	if (bullet_visible) then 
		bullet_x += bullet_speed 
	end if 
	 
	if (bullet_x >= GetScreenWidth()) then 
		bullet_visible = FALSE 
	end if 
	 
	BeginDrawing() 
	 
	ClearBackground(black) 
	 
	if (bullet_visible = TRUE) then 
			DrawCircleV(bullet_x,bullet_y,20,red) 
	end if 
	 
	EndDrawing() 
 
end while 
 
CloseWindow() 
new topic     » topic index » view message » categorize

2. Re: Shooting Multiple Bullets

 
atom Width=1024  
atom Height=720  
constant X = 1, Y = 2 
  
InitWindow(Width,Height,"Shump")  
  
SetTargetFPS(60)  
  
atom black = bytes_to_int({0,0,0,0})  
  
atom red = bytes_to_int({255,0,0,255})  
  
atom bullet_speed = 0.030  
  
sequence bullets = {}  
  
while not WindowShouldClose() do  
  
    if IsKeyPressed(KEY_SPACE) then  
 
        atom bullet_x = GetScreenWidth() / 2  
        atom bullet_y = GetScreenHeight() / 2  
        bullets = append(bullets, {bullet_x, bullet_y}) 
         
    end if  
  
    for i = length(bullets) to 1 by -1 do 
     
        bullets[i][X] += bullet_speed  
         
        if (bullets[i][X] >= GetScreenWidth()) then  
         
            bullets = remove(bullets, i) 
            continue 
             
        end if  
          
        BeginDrawing()  
          
        ClearBackground(black)  
 
        DrawCircleV(bullets[i][X], bullets[i][Y], 20, red)  
          
        EndDrawing()  
 
    end for 
  
end while  
  
CloseWindow() 
 
new topic     » goto parent     » topic index » view message » categorize

3. Re: Shooting Multiple Bullets

Thank you. However I had to fix a couple of things. Like putting the for loop in between the begin and end drawing functions. Also, when the last bullet of the array is done, there is a subscript value out of bounds error.

Value 1 is out of bounds, reading from a sequence length of 0 in subscript #1 of "bullets"

without warning 
 
include std/machine.e 
include std/get.e 
include std/convert.e 
 
include EuRaylib.ew 
 
include flags.e 
 
atom Width=1024 
atom Height=720 
constant TRUE=1 
constant FALSE=0 
 
InitWindow(Width,Height,"Shump") 
 
SetTargetFPS(60) 
 
atom black = bytes_to_int({0,0,0,0}) 
 
atom red = bytes_to_int({255,0,0,255}) 
 
atom bullet_speed = 5.0 
 
integer bullet_visible = FALSE 
constant X=1,Y=2 
 
sequence bullets = {} 
 
while not WindowShouldClose() do 
 
	if IsKeyPressed(KEY_SPACE) then 
		atom bullet_x = GetScreenWidth() / 2 
		atom bullet_y = GetScreenHeight() / 2 
		bullets = append(bullets,{bullet_x,bullet_y}) 
	end if 
 
	BeginDrawing() 
	 
	ClearBackground(black) 
	 
	for i = length(bullets) to 1 by -1 do 
		bullets[i][X] += bullet_speed 
		 
		if (bullets[i][X] >= GetScreenWidth()) then 
			bullets = remove(bullets,i) 
		end if 
		 
		DrawCircleV(bullets[i][X],bullets[i][Y],20,red) 
	end for 
	 
	EndDrawing() 
 
end while 
 
CloseWindow() 
new topic     » goto parent     » topic index » view message » categorize

4. Re: Shooting Multiple Bullets

Thank you. However I had to fix a couple of things. Like putting the for loop in between the begin and end drawing functions. 

Yes, sorry i had no way to test my code and it was not the thing you asked about so i overlooked that.

Also, when the last bullet of the array is done, there is a subscript value out of bounds error. 
Value 1 is out of bounds, reading from a sequence length of 0 in subscript #1 of "bullets" 

This statement is not true. Copy my code without changing anything (don't remove continue) except from moving BeginDraw/ClearBackground/EndDraw functions outside for loop :)

new topic     » goto parent     » topic index » view message » categorize

5. Re: Shooting Multiple Bullets

	for i = length(bullets) to 1 by -1 do  
		bullets[i][X] += bullet_speed  
		  
		if (bullets[i][X] >= GetScreenWidth()) then  
			bullets = remove(bullets,i)  
		end if  
		  
		DrawCircleV(bullets[i][X],bullets[i][Y],20,red)  
	end for  

If you remove from an array (bullets) when you have a for loop iterating over it, you shouldn't try to draw that bullet in the DrawCircleV line:

	for i = length(bullets) to 1 by -1 do  
		bullets[i][X] += bullet_speed  
		  
		if (bullets[i][X] >= GetScreenWidth()) then  
			bullets = remove(bullets,i) 
                        -- bullets[i] may no longer exist or 
                        -- it refers to something that has already been drawn. 
                        -- Go to the next iteration now! 
                        continue 
		end if 
		  
		DrawCircleV(bullets[i][X],bullets[i][Y],20,red)  
	end for  
new topic     » goto parent     » topic index » view message » categorize

6. Re: Shooting Multiple Bullets

My apologies. I overlooked the continue keyword in the for loop. Adding that and it works fine now. Thank you both.

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu