Jumat, 03 Februari 2023

Cannon Ball Game (Visual Basic 6)

 



Cannon.frm

Option Explicit

 

Private Const DISTANCE_SCALE = 10

Private Const CANNON_SCALE = 10

 

Private TargetX As Single

 

Private BitmapWid As Long

Private BitmapHgt As Long

Private BitmapNumBytes As Long

Private Bytes() As Byte

 

' ------------------

' Bitmap Information

' ------------------

Private Type BITMAP

    bmType As Long

    bmWidth As Long

    bmHeight As Long

    bmWidthBytes As Long

    bmPlanes As Integer

    bmBitsPixel As Integer

    bmBits As Long

End Type

Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long

Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long

 

' Get the initial velocity components from the

' speed and angle.

Private Sub GetInitialVelocity(ByRef vx As Single, ByRef vy As Single)

Const PI = 3.14159365

 

Dim angle As Single

Dim speed As Single

 

    ' Get the angle in radians and the speed.

    On Error Resume Next

    angle = CSng(txtAngle.Text) * PI / 180

    speed = CSng(txtSpeed.Text)

 

    vx = Cos(angle) * speed / DISTANCE_SCALE

    vy = -Sin(angle) * speed / DISTANCE_SCALE

End Sub

 

' Start the animation.

Private Sub PlayImages()

Const MS_PER_FRAME = 50

Const SCALED_F = 16 / DISTANCE_SCALE

 

Dim X As Single

Dim Y As Single

Dim hitx As Single

Dim hity As Single

Dim dhity As Single

Dim not_hit As Boolean

Dim vx As Single

Dim vy As Single

Dim dist As Single

Dim next_time As Long

Dim test_color As Long

 

    ' Get the initial velocity and position.

    GetInitialVelocity vx, vy

 

    ' Start the point at the end of the cannon.

    dist = Sqr(vx * vx + vy * vy)

    X = vx / dist * CANNON_SCALE

    Y = BitmapHgt + vy / dist * CANNON_SCALE

 

    not_hit = True

    next_time = GetTickCount()

    Do

        ' Subtract the force of gravity from the

        ' Y velocity component.

        vy = vy + SCALED_F

 

        ' Restore the background.

        SetBitmapBits picCanvas.Image, BitmapNumBytes, Bytes(1, 1)

 

        ' See if we will hit the house.

        If not_hit Then

            dhity = vy / vx

            hity = Y

            For hitx = X To X + vx

                ' See if (hitx, hity) is a hit.

                test_color = picCanvas.Point(hitx, hity)

                If (test_color > 0) And _

                    (test_color <> picCanvas.BackColor) _

                Then

                    not_hit = False

                    picCanvas.PaintPicture _

                        picHouseHit.Picture, TargetX, _

                        picCanvas.ScaleHeight - picHouseOk.ScaleHeight

                    DoEvents

 

                    ' Save the new background.

                    SaveBackground

                    Beep

                    Exit For

                End If

                hity = hity + dhity

            Next hitx

        End If

 

        ' Calculate the next position.

        X = X + vx

        Y = Y + vy

 

        ' Draw the projectile.

        picCanvas.PSet (X, Y), vbBlue

 

        ' Wait until it's time for the next frame.

        next_time = next_time + MS_PER_FRAME

        WaitTill next_time

    Loop While Y < BitmapHgt + 3

End Sub

 

' Start the animation.

Private Sub cmdFire_Click()

    DrawBackground

 

    PlayImages

End Sub

 

 

' Move the target.

Private Sub cmdReset_Click()

    TargetX = picCanvas.ScaleWidth * (0.3 + Rnd * 0.6)

    DrawBackground

 

    cmdFire.SetFocus

End Sub

 

Private Sub Form_Load()

    Randomize

    Show

 

    picCanvas.AutoRedraw = True

    picCanvas.ScaleMode = vbPixels

    picCanvas.DrawWidth = 3

    picCanvas.FillStyle = vbSolid

    picCanvas.BackColor = &HC0C0C0

 

    picHouseOk.ScaleMode = vbPixels

    picHouseHit.ScaleMode = vbPixels

 

    cmdReset_Click

End Sub

 

' Save the background bitmap data.

Private Sub SaveBackground()

Dim bm As BITMAP

 

    GetObject picCanvas.Image, Len(bm), bm

    BitmapWid = bm.bmWidthBytes

    BitmapHgt = bm.bmHeight

    BitmapNumBytes = BitmapWid * BitmapHgt

    ReDim Bytes(1 To bm.bmWidthBytes, 1 To bm.bmHeight)

    GetBitmapBits picCanvas.Image, BitmapNumBytes, Bytes(1, 1)

End Sub

' Draw the target and the cannon pointed in the

' direction of the current angle.

Private Sub DrawBackground()

Dim vx As Single

Dim vy As Single

Dim dist As Single

Dim bm As BITMAP

 

    ' Clear the canvas.

    picCanvas.Line (0, 0)-(picCanvas.ScaleWidth, picCanvas.ScaleHeight), picCanvas.BackColor, BF

 

    ' Get the initial velocity components.

    GetInitialVelocity vx, vy

 

    ' Draw the target.

    picCanvas.PaintPicture _

        picHouseOk.Picture, TargetX, _

        picCanvas.ScaleHeight - picHouseOk.ScaleHeight

 

    ' Draw the cannon.

    dist = Sqr(vx * vx + vy * vy)

    vx = vx / dist

    vy = vy / dist

    picCanvas.Line (0, picCanvas.ScaleHeight)-Step(vx * CANNON_SCALE, vy * CANNON_SCALE), vbBlack

 

    ' Save the background bitmap data.

    SaveBackground

End Sub

 

Private Sub txtAngle_Change()

    DrawBackground

End Sub


 


WaitTill.bas

Option Explicit

 

Declare Function GetTickCount Lib "kernel32" () As Long

' Pause until GetTickCount shows the indicated

' time. This is accurate to within one clock tick

' (55 ms), not counting variability in DoEvents

' and Windows itself.

Public Sub WaitTill(next_time As Long)

    Do

        DoEvents

    Loop While GetTickCount() < next_time

End Sub

 

 

Rabu, 01 Februari 2023

Netbeans 8.2, Java Game SpceInvaders (Shoot from left to right)

 















Alien.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package ruangangkasa1;

 

/**

 *

 * @author Acer

 */

public class Alien extends Sprite {

        private final int INITIAL_X = 400;

 

    public Alien(int x, int y) {

        super(x, y);

 

        initAlien();

    }

 

    private void initAlien() {

 

        loadImage("C:/Users/Acer/Pictures/Documents/NetBeansProjects/RuangAngkasa1/src/ruangangkasa1/alien.png");

        getImageDimensions();

    getImageDimensions();

    }

 

    public void move() {

 

        if (x < 0) {

            x = INITIAL_X;

        }

 

        x -= 1;

    }

 

   

}

 

Board.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package ruangangkasa1;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JPanel;

import javax.swing.Timer;

/**

 *

 * @author Acer

 */

public class Board extends JPanel implements ActionListener {

private Timer timer;

    private SpaceShip spaceship;

    private List<Alien> aliens;

    private boolean ingame;

    private final int ICRAFT_X = 40;

    private final int ICRAFT_Y = 60;

    private final int B_WIDTH = 400;

    private final int B_HEIGHT = 300;

    private final int DELAY = 15;

 

    private final int[][] pos = {

        {2380, 29}, {2500, 59}, {1380, 89},

        {780, 109}, {580, 139}, {680, 239},

        {790, 259}, {760, 50}, {790, 150},

        {980, 209}, {560, 45}, {510, 70},

        {930, 159}, {590, 80}, {530, 60},

        {940, 59}, {990, 30}, {920, 200},

        {900, 259}, {660, 50}, {540, 90},

        {810, 220}, {860, 20}, {740, 180},

        {820, 128}, {490, 170}, {700, 30}

    };

 

    public Board() {

 

        initBoard();

    }

 

    private void initBoard() {

 

        addKeyListener(new TAdapter());

        setFocusable(true);

        setBackground(Color.BLACK);

        ingame = true;

 

        setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));

 

        spaceship = new SpaceShip(ICRAFT_X, ICRAFT_Y);

 

        initAliens();

 

        timer = new Timer(DELAY, this);

        timer.start();

    }

 

    public void initAliens() {

       

        aliens = new ArrayList<>();

 

        for (int[] p : pos) {

            aliens.add(new Alien(p[0], p[1]));

        }

    }

 

    @Override

    public void paintComponent(Graphics g) {

        super.paintComponent(g);

 

        if (ingame) {

 

            drawObjects(g);

 

        } else {

 

            drawGameOver(g);

        }

 

        Toolkit.getDefaultToolkit().sync();

    }

 

    private void drawObjects(Graphics g) {

 

        if (spaceship.isVisible()) {

            g.drawImage(spaceship.getImage(), spaceship.getX(), spaceship.getY(),

                    this);

        }

 

        List<Missile> ms = spaceship.getMissiles();

 

        for (Missile missile : ms) {

            if (missile.isVisible()) {

                g.drawImage(missile.getImage(), missile.getX(),

                        missile.getY(), this);

            }

        }

 

        for (Alien alien : aliens) {

            if (alien.isVisible()) {

                g.drawImage(alien.getImage(), alien.getX(), alien.getY(), this);

            }

        }

 

        g.setColor(Color.WHITE);

        g.drawString("Aliens left: " + aliens.size(), 5, 15);

    }

 

    private void drawGameOver(Graphics g) {

 

        String msg = "Selesai!";

        Font small = new Font("Helvetica", Font.BOLD, 14);

        FontMetrics fm = getFontMetrics(small);

 

        g.setColor(Color.white);

        g.setFont(small);

        g.drawString(msg, (B_WIDTH - fm.stringWidth(msg)) / 2,

                B_HEIGHT / 2);

    }

 

    @Override

    public void actionPerformed(ActionEvent e) {

 

        inGame();

 

        updateShip();

        updateMissiles();

        updateAliens();

 

        checkCollisions();

 

        repaint();

    }

 

    private void inGame() {

 

        if (!ingame) {

            timer.stop();

        }

    }

 

    private void updateShip() {

 

        if (spaceship.isVisible()) {

           

            spaceship.move();

        }

    }

 

    private void updateMissiles() {

 

        List<Missile> ms = spaceship.getMissiles();

 

        for (int i = 0; i < ms.size(); i++) {

 

            Missile m = ms.get(i);

 

            if (m.isVisible()) {

                m.move();

            } else {

                ms.remove(i);

            }

        }

    }

 

    private void updateAliens() {

 

        if (aliens.isEmpty()) {

 

            ingame = false;

            return;

        }

 

        for (int i = 0; i < aliens.size(); i++) {

 

            Alien a = aliens.get(i);

           

            if (a.isVisible()) {

                a.move();

            } else {

                aliens.remove(i);

            }

        }

    }

 

    public void checkCollisions() {

 

        Rectangle r3 = spaceship.getBounds();

 

        for (Alien alien : aliens) {

           

            Rectangle r2 = alien.getBounds();

 

            if (r3.intersects(r2)) {

               

                spaceship.setVisible(false);

                alien.setVisible(false);

                ingame = false;

            }

        }

 

        List<Missile> ms = spaceship.getMissiles();

 

        for (Missile m : ms) {

 

            Rectangle r1 = m.getBounds();

 

            for (Alien alien : aliens) {

 

                Rectangle r2 = alien.getBounds();

 

                if (r1.intersects(r2)) {

                   

                    m.setVisible(false);

                    alien.setVisible(false);

                }

            }

        }

    }

 

    private class TAdapter extends KeyAdapter {

 

        @Override

        public void keyReleased(KeyEvent e) {

            spaceship.keyReleased(e);

        }

 

        @Override

        public void keyPressed(KeyEvent e) {

            spaceship.keyPressed(e);

        }

    }

 

 

}

 

Missile.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package ruangangkasa1;

 

/**

 *

 * @author Acer

 */

public class Missile extends Sprite {

    private final int BOARD_WIDTH = 390;

    private final int MISSILE_SPEED = 2;

 

    public Missile(int x, int y) {

        super(x, y);

 

        initMissile();

    }

   

    private void initMissile() {

       

        loadImage("C:/Users/Acer/Pictures/Documents/NetBeansProjects/RuangAngkasa1/src/ruangangkasa1/missile.png");

        getImageDimensions();       

    }

 

    public void move() {

       

        x += MISSILE_SPEED;

       

        if (x > BOARD_WIDTH)

            visible = false;

    }

 

   

}

 

RuangAngkasa1.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package ruangangkasa1;

import java.awt.EventQueue;

import javax.swing.JFrame;

/**

 *

 * @author Acer

 */

public class RuangAngkasa1 extends JFrame {

public RuangAngkasa1() {

       

        initUI();

    }

    /**

     * @param args the command line arguments

     */

    private void initUI() {

       

        add(new Board());

       

        setResizable(false);

        pack();

       

        setTitle("Collision");

        setLocationRelativeTo(null);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

 

    public static void main(String[] args) {

       

        EventQueue.invokeLater(() -> {

            RuangAngkasa1 ex = new RuangAngkasa1();

            ex.setVisible(true);

        });

    }

   

}

 

SpaceShip.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package ruangangkasa1;

import java.awt.event.KeyEvent;

import java.util.ArrayList;

import java.util.List;

/**

 *

 * @author Acer

 */

public class SpaceShip extends Sprite {

    private int dx;

    private int dy;

    private List<Missile> missiles;

 

    public SpaceShip(int x, int y) {

        super(x, y);

 

        initCraft();

    }

 

    private void initCraft() {

       

        missiles = new ArrayList<>();

        loadImage("C:/Users/Acer/Pictures/Documents/NetBeansProjects/RuangAngkasa1/src/ruangangkasa1/spaceship.png");

        getImageDimensions();

    }

 

    public void move() {

 

        x += dx;

        y += dy;

 

        if (x < 1) {

            x = 1;

        }

 

        if (y < 1) {

            y = 1;

        }

    }

 

    public List<Missile> getMissiles() {

        return missiles;

    }

 

    public void keyPressed(KeyEvent e) {

 

        int key = e.getKeyCode();

 

        if (key == KeyEvent.VK_SPACE) {

            fire();

        }

 

        if (key == KeyEvent.VK_LEFT) {

            dx = -1;

        }

 

        if (key == KeyEvent.VK_RIGHT) {

            dx = 1;

        }

 

        if (key == KeyEvent.VK_UP) {

            dy = -1;

        }

 

        if (key == KeyEvent.VK_DOWN) {

            dy = 1;

        }

    }

 

    public void fire() {

        missiles.add(new Missile(x + width, y + height / 2));

    }

 

    public void keyReleased(KeyEvent e) {

 

        int key = e.getKeyCode();

 

        if (key == KeyEvent.VK_LEFT) {

            dx = 0;

        }

 

        if (key == KeyEvent.VK_RIGHT) {

            dx = 0;

        }

 

        if (key == KeyEvent.VK_UP) {

            dy = 0;

        }

 

        if (key == KeyEvent.VK_DOWN) {

            dy = 0;

        }

    }

 

      

}

 

Sprite.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package ruangangkasa1;

import java.awt.Image;

import java.awt.Rectangle;

import javax.swing.ImageIcon;

/**

 *

 * @author Acer

 */

public class Sprite {

    protected int x;

    protected int y;

    protected int width;

    protected int height;

    protected boolean visible;

    protected Image image;

 

    public Sprite(int x, int y) {

 

        this.x = x;

        this.y = y;

        visible = true;

    }

 

    protected void getImageDimensions() {

 

        width = image.getWidth(null);

        height = image.getHeight(null);

    }

 

    protected void loadImage(String imageName) {

 

        ImageIcon ii = new ImageIcon(imageName);

        image = ii.getImage();

    }

 

    public Image getImage() {

        return image;

    }

 

    public int getX() {

        return x;

    }

 

    public int getY() {

        return y;

    }

 

    public boolean isVisible() {

        return visible;

    }

 

    public void setVisible(Boolean visible) {

        this.visible = visible;

    }

 

    public Rectangle getBounds() {

        return new Rectangle(x, y, width, height);

    }

 

}