Programming C, C++, Java, PHP, Ruby, Turing, VB
Computer Science Canada 
Programming C, C++, Java, PHP, Ruby, Turing, VB  

Username:   Password: 
 RegisterRegister   
 Hockey Problem...still
Index -> Programming, Turing -> Turing Help
View previous topic Printable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic
Author Message
@DRI@N




PostPosted: Mon May 31, 2004 6:32 pm   Post subject: Hockey Problem...still

For god sakes this aint workin ..if I shoot from somewhere on the right side of the screen it goes down...BUT Y always returns positive

(get puck and press shift to shoot)
code:


setscreen("graphics:800;800")
View.Set("offscreenonly")   
 
colorback(black)
cls

    var crowd_colour:int
   
    var x1_crowd: int
    var y1_crowd: int

   
    var counter:int:=0
    var arena_x : array 1..8 of int := init (200, 200, 250, 550,
                                   600, 600, 550, 250)
    var arena_y : array 1..8 of int := init (150, 650, 700, 700,
                                   650, 150, 100, 100)
    var Score_font:int:=Font.New ("Garamond:30")
   
    var score:int:=0
    var player_score:string:=""
    var puckx,pucky:int:=400
    var puckychange,puckxchange:int:=1
    var RD_X:int:=500
    var RD_Y:int:=200
    var chars : array char of boolean
     
    var cur_x,cur_y:int
    var totalspeed:int:=2
   
procedure Arena
loop

counter:=counter+1


randint(crowd_colour,1,255)

randint(x1_crowd,1,800)
randint(y1_crowd,1,800)

drawfilloval(x1_crowd,y1_crowd,2,2,crowd_colour)

exit when counter=30000

end loop
end Arena




function X_Velocity_Calculate(px:int,py:int):real
var xvelocity, yvelocity : real
var angle : real
var ylength : int
var xlength : int


xlength := 400-px
ylength := 620-py

if ylength = 0 then       
angle := 0

else
    angle := arctand (ylength/xlength)
end if   
xvelocity := totalspeed*cosd(angle)

if puckx>400 then
xvelocity := xvelocity *-1
 
end if

result xvelocity
end X_Velocity_Calculate

function Y_Velocity_Calculate(px:int,py:int):real
var xvelocity, yvelocity : real
var angle : real
var ylength : int
var xlength : int

xlength := 400-px
ylength := 620-py

if ylength = 0 then       
angle := 0
else
    angle := arctand (ylength/xlength)
end if

yvelocity := totalspeed*sind(angle)
result yvelocity
end Y_Velocity_Calculate


function Collision(x:real,y:real,xwall1:int,xwall2:int,ywall1:int,ywall2:int):boolean
if x < xwall2 and x >xwall1 and y > ywall2 and y <ywall1 then
result true
else
result false
end if
end Collision

function Player_Has_Puck(px:int,py:int,stickx:int,sticky:int):boolean
if px=stickx and py=sticky then
result true
else
result false
end if
end Player_Has_Puck


loop
cls
Arena
loop
Input.KeyDown (chars)

if chars (KEY_UP_ARROW) then
            RD_Y := RD_Y + 2
        elsif chars (KEY_DOWN_ARROW) then
            RD_Y := RD_Y - 2
        elsif chars (KEY_RIGHT_ARROW) then
            RD_X := RD_X + 2
        elsif chars (KEY_LEFT_ARROW) then
            RD_X := RD_X - 2
end if

if chars (KEY_SHIFT) and Player_Has_Puck(puckx,pucky,RD_X-25,RD_Y-2)=true then

puckxchange:=round(X_Velocity_Calculate(puckx,pucky))

puckychange:=round(Y_Velocity_Calculate(puckx,pucky))
end if
if RD_X=586 then
RD_X:=RD_X-8
elsif  RD_X=224 then
RD_X:=RD_X+8
end if

if RD_Y=686 then
RD_Y:=RD_Y-8
elsif  RD_Y=112 then
RD_Y:=RD_Y+8
end if

%Arena
Draw.FillPolygon (arena_x, arena_y, 8, 100) 

puckx:=puckx+puckxchange
pucky:=pucky+puckychange

cur_x:=puckx
cur_y:=pucky
%Puck
Draw.FillOval(round(puckx),round(pucky),2,2,black)

if puckx=598 or puckx=202 then
puckxchange:=puckxchange*-1
end if

if pucky=698  then
puckychange:=(puckychange div puckychange)*-1
elsif pucky=102 then
puckychange:=puckychange*-1
end if

%Puck Corners
if (pucky-450)>=puckx then
puckxchange:=puckxchange*-1
puckychange:=puckychange*-1
end if

if puckx>550 and pucky>650 and (1250-pucky)<=puckx then
puckxchange:=puckxchange*-1
puckychange:=puckychange*-1
end if

if puckx<250 and pucky<150 and (350-pucky)>=puckx then
puckxchange:=puckxchange*-1
puckychange:=puckychange*-1
end if

if puckx>550 and pucky<150 and (pucky+450)<=puckx then
puckxchange:=puckxchange*-1
puckychange:=puckychange*-1
end if
%%%%Player Corners

if (RD_Y+2-450)>=RD_X-30 then
RD_Y:=RD_Y-10
RD_X:=RD_X+10
end if

if RD_X+52>550 and RD_Y+32>650 and (1250-RD_Y+32)<=RD_X+52 then
RD_Y:=RD_Y-10
RD_X:=RD_X-10
end if

if RD_X-40<250 and RD_Y-16<150 and (350-RD_Y-16)>=RD_X-40 then
RD_Y:=RD_Y+10
RD_X:=RD_X+10
end if

if RD_X+6>550 and RD_Y-11<150 and (RD_Y-11+450)<=RD_X+6 then
RD_Y:=RD_Y+10
RD_X:=RD_X-10
end if
%%%Collison
if Collision(puckx,pucky,RD_X-34,RD_X+18,RD_Y+16,RD_Y-15)=true and puckxchange<2 and puckychange<2 and Player_Has_Puck(puckx,pucky,RD_X-25,RD_Y-2)=false then
puckx:=RD_X-25
pucky:=RD_Y-2
end if

if chars(KEY_ENTER)and puckx < RD_X+18 and puckx >RD_X-34 and pucky > RD_Y-15 and pucky <RD_Y+16 then
puckx:=cur_x
pucky:=cur_y
puckxchange:=0
puckychange:=0
end if
%%%Target(Version1Only
Draw.Box(380,600,420,640,red)
%%%%User Right Defense
Draw.Line(RD_X+14,RD_Y+7,RD_X-25,RD_Y-5,black)
Draw.Line(RD_X-25,RD_Y-5,RD_X-30,RD_Y-2,black)

Draw.FillOval(RD_X,RD_Y,5,10,9)
Draw.FillOval(RD_X,RD_Y+12,4,4,66)

Draw.Line(RD_X+4,RD_Y+8,RD_X+14,RD_Y+8,9)
Draw.Line(RD_X-4,RD_Y+8,RD_X-14,RD_Y,9)

Draw.FillOval(RD_X-14,RD_Y,2,3,9)
Draw.FillOval(RD_X+14,RD_Y+8,2,3,9)

Draw.FillOval(RD_X-6,RD_Y-11,2,5,black)
Draw.FillOval(RD_X+6,RD_Y-11,2,5,black)
%%%%%%%%%%%%%%


%ScoreBox
Draw.FillBox(340,0,460,50,black)
player_score:=intstr(score)
Font.Draw(player_score,360,10,Score_font,40)
Font.Draw(" : 0",380,10,Score_font,40)
%Timebox

%%Goal
if puckxchange=0 and puckychange=0 and cur_x >380 and cur_x <420 and cur_y >600 and cur_y <640 and puckx not=RD_X-25 and pucky not=RD_Y-2  then
%%%Faceoff%%%%
randint(puckychange,-1,1)
if puckychange=0 then
loop
randint(puckychange,-1,1)
exit when puckychange not=0
end loop
end if
%%%%%Faceoff%%%

score:=score+1
puckx:=400
pucky:=400
puckxchange:=1
RD_X:=500
RD_Y:=200
player_score:=intstr(score)

end if
%%%

View.Update

end loop
end loop
Sponsor
Sponsor
Sponsor
sponsor
rhomer




PostPosted: Mon May 31, 2004 6:42 pm   Post subject: (No subject)

Sorry i can;t help...Your code is quite confusing...

just a suggestion...use comments so other users will understan whats happenind where easier and what some variables stand for.
Tony




PostPosted: Mon May 31, 2004 6:44 pm   Post subject: (No subject)

i agree with rhomer, code is quite confusing to read.

ether way - I think the problem lies in the fact that player doesn't have to be really close to "grab" the puck. This way when you shot, the puck moves one frame but is still within the player's "grab the puck" range and gets pulled back in on the next loop.
Latest from compsci.ca/blog: Tony's programming blog. DWITE - a programming contest.
SuperGenius




PostPosted: Mon May 31, 2004 7:01 pm   Post subject: (No subject)

while playing your game the puck got outside the arena somwhow.
rhomer




PostPosted: Mon May 31, 2004 7:07 pm   Post subject: (No subject)

ya i noticed that too...if you shoot from the left side at a sharp angle then it will bounce off the top right corner and go out the left side of the rink...very annoying!
guruguru




PostPosted: Mon May 31, 2004 7:16 pm   Post subject: (No subject)

I think Tony's nailed it. As soon as you shoot, you should make a counter that is assigned how far away the puck is. Only when the distance away is greater than... say 50... is the player allowed receive the puck again.

code:

var distanceAway : real
var canGetPuck : boolean := false

loop
    distanceAway := sqrt ((puckX - playerX)**2 + (puckY - playerY)**2)
    if distanceAway > 50 then
        canGetPuck := true
    end if

    if canGetPuck then
        % check to see if puck is in reach
    end if

    if puckIsShot then
        % move puck
        canGetPuck := false
    end if
end loop


That's the basic outline and order of what should happen.
@DRI@N




PostPosted: Mon May 31, 2004 9:11 pm   Post subject: (No subject)

Believe me I've already tried it with the boolean variable...and its only going back to the stick when the slope is 1 so I need smarter way to shoot. THe problem is that whole trig thing Tony gave me with cosd and sind I dont exactly understand. If I did I could fix it..
Tony




PostPosted: Mon May 31, 2004 10:35 pm   Post subject: (No subject)

i'm afraid you'd just have to try to make the flags work again Rolling Eyes

the player should be able to pick up the puck only when the boolean variable is marked the right way. And it gets marked only when the puck is out of player's "pick up" range. Once the shot is made, the variable remains false untill is it far away to escape "pick up".

another solution would be to increase the strength of puck shot so that it would escape that pickup zone on the first frame (that'd be quite fast unless you lower that distance.
Latest from compsci.ca/blog: Tony's programming blog. DWITE - a programming contest.
Sponsor
Sponsor
Sponsor
sponsor
@DRI@N




PostPosted: Tue Jun 01, 2004 6:57 pm   Post subject: (No subject)

Yes fast shots will work.. I plan to make slapshots and wristshots. I'm sure slapshots will work because they are like 10x faster than the wrist. As for wrist do u think I could just set the puck x and ys to the corner of the collision zone and then shoot as opposed to shooting from within it or using if statements for slope. I tried making it go to the stick when slope is less than 2, but on 45 degree angles.... Evil or Very Mad
Display posts from previous:   
   Index -> Programming, Turing -> Turing Help
View previous topic Tell A FriendPrintable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic

Page 1 of 1  [ 9 Posts ]
Jump to:   


Style:  
Search: