Text Only
|
Text with Attachments
QB64.org Forum
Active Forums => Programs => Topic started by: Zeppelin on August 04, 2019, 08:52:10 pm
Title:
Smooth Sprite Movement
Post by:
Zeppelin
on
August 04, 2019, 08:52:10 pm
Hey everyone,
Heres a good starting point or example for anyone having problems with slow or jerky sprite movement.
Code: QB64:
[Select]
[
/
cod_TITLE
"Space Invaders"
_SCREENMOVE
_MIDDLE
SCREEN
13
'320x200
'LOAD SPRITES
DIM
SHARED
alien1%
(
1000
)
DIM
SHARED
alien2%
(
1000
)
DIM
SHARED
alien3%
(
1000
)
DIM
SHARED
shield%
(
1000
)
DIM
SHARED
player%
(
1000
)
TYPE
Bullet
xPos
AS
INTEGER
yPos
AS
INTEGER
alive
AS
INTEGER
END
TYPE
DIM
SHARED
bullets
(
100
)
AS
Bullet
DIM
SHARED
deltaTime
DIM
SHARED
playerSpeed
DIM
SHARED
bulletSpeed
DIM
SHARED
lastBulletTime
DIM
SHARED
pX
CALL
LoadSprite
(
alien1%
(
)
)
CALL
LoadSprite
(
alien2%
(
)
)
CALL
LoadSprite
(
alien3%
(
)
)
CALL
LoadSprite
(
shield%
(
)
)
CALL
LoadSprite
(
player%
(
)
)
playerSpeed
=
100
bulletSpeed
=
100
FOR
n
=
1
TO
100
bullets
(
n
)
.alive
=
0
NEXT
n
CALL
DrawShields
DO
sTime
=
TIMER
CALL
MovePlayer
CALL
SpawnBullet
CALL
UpdateBullets
eTime
=
TIMER
deltaTime
=
eTime
-
sTime
LOOP
UNTIL
INKEY$
=
CHR$
(
27
)
SUB
UpdateBullets
FOR
n
=
1
TO
100
IF
bullets
(
n
)
.alive
=
1
THEN
LINE
(
bullets
(
n
)
.xPos
,
bullets
(
n
)
.yPos
)
-
(
bullets
(
n
)
.xPos
+
2
,
bullets
(
n
)
.yPos
+
4
)
,
_RGB
(
0
,
0
,
0
)
,
BF
bullets
(
n
)
.yPos
=
bullets
(
n
)
.yPos
-
(
deltaTime
*
bulletSpeed
)
LINE
(
bullets
(
n
)
.xPos
,
bullets
(
n
)
.yPos
)
-
(
bullets
(
n
)
.xPos
+
2
,
bullets
(
n
)
.yPos
+
4
)
,
_RGB
(
255
,
0
,
0
)
,
BF
_DISPLAY
IF
bullets
(
n
)
.yPos
<
0
THEN
bullets
(
n
)
.alive
=
0
LINE
(
bullets
(
n
)
.xPos
,
bullets
(
n
)
.yPos
)
-
(
bullets
(
n
)
.xPos
+
3
,
bullets
(
n
)
.yPos
+
5
)
,
_RGB
(
0
,
0
,
0
)
,
BF
END
IF
END
IF
NEXT
n
END
SUB
SUB
SpawnBullet
IF
_KEYDOWN
(
32
)
=
-
1
THEN
IF
TIMER
-
lastBulletTime
>
0.1
THEN
first
=
101
FOR
n
=
100
TO
1
STEP
-
1
IF
NOT
bullets
(
n
)
.alive
=
1
THEN
IF
n
<
first
THEN
first
=
n
END
IF
END
IF
NEXT
n
IF
first
<
101
THEN
lastBulletTime
=
TIMER
bullets
(
first
)
.alive
=
1
bullets
(
first
)
.xPos
=
pX
+
5
bullets
(
first
)
.yPos
=
170
LINE
(
bullets
(
first
)
.xPos
,
bullets
(
first
)
.yPos
)
-
(
bullets
(
first
)
.xPos
+
2
,
bullets
(
first
)
.yPos
+
4
)
,
_RGB
(
255
,
255
,
255
)
,
BF
END
IF
END
IF
END
IF
END
SUB
SUB
MovePlayer
IF
_KEYDOWN
(
100
)
=
-
1
THEN
pX
=
pX
+
(
deltaTime
*
playerSpeed
)
END
IF
IF
_KEYDOWN
(
97
)
=
-
1
THEN
pX
=
pX
-
(
deltaTime
*
playerSpeed
)
END
IF
IF
pX
<
20
THEN
pX
=
20
END
IF
IF
pX
>
300
THEN
pX
=
300
END
IF
LINE
(
pX
-
10
,
175
)
-
(
pX
+
100
,
201
)
,
_RGB
(
0
,
0
,
0
)
,
BF
PUT
(
pX
,
175
)
,
player%
(
)
_DISPLAY
END
SUB
SUB
DrawShields
FOR
x
=
0
TO
3
PUT
(
x
*
(
320
/
4
)
+
30
,
150
)
,
shield%
(
)
NEXT
x
END
SUB
SUB
LoadSprite
(
sp%
(
)
)
DIM
sprite
(
4
,
4
)
scale
=
2
FOR
y
=
0
TO
4
FOR
x
=
0
TO
4
READ
sprite
(
x
,
y
)
'Read the data
NEXT
x
NEXT
y
FOR
y
=
0
TO
4
*
scale
STEP
scale
'Factor in the scale
FOR
x
=
0
TO
4
*
scale
STEP
scale
LINE
(
x
,
y
)
-
(
x
+
scale
,
y
+
scale
)
,
sprite
(
x
/
scale
,
y
/
scale
)
,
BF
'Draw each pixel
NEXT
x
NEXT
y
GET
(
0
,
0
)
-
(
10
,
10
)
,
sp%
(
)
CLS
END
SUB
'Alien 1 Data
DATA
0
,
0
,
15
,
0
,
0
DATA
0
,
15
,
15
,
15
,
0
DATA
0
,
15
,
15
,
15
,
0
DATA
15
,
0
,
15
,
0
,
15
DATA
0
,
15
,
0
,
15
,
0
'Alien 2 Data
DATA
0
,
0
,
15
,
0
,
0
DATA
0
,
15
,
15
,
15
,
0
DATA
0
,
15
,
0
,
15
,
0
DATA
15
,
0
,
0
,
0
,
15
DATA
15
,
0
,
0
,
0
,
15
'Alien 3 Data
DATA
15
,
0
,
0
,
0
,
15
DATA
15
,
0
,
15
,
0
,
15
DATA
0
,
15
,
0
,
15
,
0
DATA
0
,
15
,
0
,
15
,
0
DATA
0
,
0
,
15
,
0
,
0
'Shield Data
DATA
0
,
15
,
15
,
15
,
0
DATA
15
,
15
,
15
,
15
,
15
DATA
15
,
15
,
0
,
15
,
15
DATA
15
,
0
,
0
,
0
,
15
DATA
15
,
0
,
0
,
0
,
15
'Player Data
DATA
0
,
0
,
0
,
0
,
0
DATA
0
,
0
,
15
,
0
,
0
DATA
0
,
15
,
15
,
15
,
0
DATA
15
,
15
,
15
,
15
,
15
DATA
15
,
15
,
15
,
15
,
15
e
]
Yes. It
is
for
a space invaders clone im making.
Zep
Text Only
|
Text with Attachments